diff --git a/.gitignore b/.gitignore index 13a27f8180d..96a36db9661 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,6 @@ Thumbs.db *.backup data/ cfg/ +build_log.txt /.atom-build.json diff --git a/.travis.yml b/.travis.yml index bd437b6ed7b..13a53e55568 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,10 @@ -#pretending we're C because otherwise ruby will initialize, even with "language: dm". -language: c +language: generic sudo: false env: BYOND_MAJOR="510" BYOND_MINOR="1346" + MACRO_COUNT=1021 cache: directories: @@ -16,8 +16,6 @@ addons: - libc6-i386 - libgcc1:i386 - libstdc++6:i386 - - python - - python-pip install: - pip install --user PyYaml -q @@ -31,8 +29,18 @@ script: - shopt -s globstar - (! grep 'step_[xy]' maps/**/*.dmm) - (! find nano/templates/ -type f -exec md5sum {} + | sort | uniq -D -w 32 | grep nano) + - (! grep -E "<\s*span\s+class\s*=\s*('[^'>]+|[^'>]+')\s*>" **/*.dm) + - (num=`grep -E '\\\\(red|blue|green|black|b|i[^mc])' **/*.dm | wc -l`; echo "$num escapes (expecting ${MACRO_COUNT} or less)"; [ $num -le ${MACRO_COUNT} ]) + - awk -f tools/indentation.awk **/*.dm - md5sum -c - <<< "0af969f671fba6cf9696c78cd175a14a *baystation12.int" - md5sum -c - <<< "88490b460c26947f5ec1ab1bb9fa9f17 *html/changelogs/example.yml" - - python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs + - python tools/TagMatcher/tag-matcher.py ../.. + - python tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs --dry-run - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup - - DreamMaker baystation12.dme + - cp config/example/* config/ + - scripts/dm.sh -DUNIT_TEST baystation12.dme + - grep "0 warnings" build_log.txt + - DreamDaemon baystation12.dmb -invisible -trusted -core 2>&1 | tee log.txt + - grep "All Unit Tests Passed" log.txt + - (! grep "runtime error:" log.txt) + - (! grep 'Process scheduler caught exception processing' log.txt) diff --git a/baystation12.dme b/baystation12.dme index 31d00be0457..884ad691a88 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -10,34 +10,54 @@ #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE +#include "code\_macros.dm" #include "code\global.dm" #include "code\hub.dm" #include "code\names.dm" -#include "code\setup.dm" #include "code\stylesheet.dm" #include "code\world.dm" +#include "code\__defines\_compile_options.dm" +#include "code\__defines\admin.dm" +#include "code\__defines\atmos.dm" #include "code\__defines\btime.dm" +#include "code\__defines\chemistry.dm" +#include "code\__defines\damage_organs.dm" +#include "code\__defines\dna.dm" +#include "code\__defines\gamemode.dm" +#include "code\__defines\items_clothing.dm" +#include "code\__defines\lighting.dm" +#include "code\__defines\machinery.dm" +#include "code\__defines\math_physics.dm" +#include "code\__defines\misc.dm" +#include "code\__defines\mobs.dm" #include "code\__defines\process_scheduler.dm" #include "code\__defines\regex.dm" -#include "code\__HELPERS\datum_pool.dm" -#include "code\__HELPERS\files.dm" -#include "code\__HELPERS\game.dm" -#include "code\__HELPERS\global_lists.dm" -#include "code\__HELPERS\icons.dm" -#include "code\__HELPERS\lists.dm" -#include "code\__HELPERS\logging.dm" -#include "code\__HELPERS\maths.dm" -#include "code\__HELPERS\matrices.dm" -#include "code\__HELPERS\mobs.dm" -#include "code\__HELPERS\names.dm" -#include "code\__HELPERS\sanitize_values.dm" -#include "code\__HELPERS\text.dm" -#include "code\__HELPERS\time.dm" -#include "code\__HELPERS\turfs.dm" -#include "code\__HELPERS\type2type.dm" -#include "code\__HELPERS\unsorted.dm" -#include "code\__HELPERS\vector.dm" -#include "code\_defines\chemical_effects.dm" +#include "code\__defines\research.dm" +#include "code\__defines\species_languages.dm" +#include "code\__defines\targeting.dm" +#include "code\__defines\turfs.dm" +#include "code\_helpers\areas.dm" +#include "code\_helpers\atmospherics.dm" +#include "code\_helpers\datum_pool.dm" +#include "code\_helpers\files.dm" +#include "code\_helpers\functional.dm" +#include "code\_helpers\game.dm" +#include "code\_helpers\global_lists.dm" +#include "code\_helpers\icons.dm" +#include "code\_helpers\lists.dm" +#include "code\_helpers\logging.dm" +#include "code\_helpers\maths.dm" +#include "code\_helpers\matrices.dm" +#include "code\_helpers\mobs.dm" +#include "code\_helpers\names.dm" +#include "code\_helpers\sanitize_values.dm" +#include "code\_helpers\spawn_sync.dm" +#include "code\_helpers\text.dm" +#include "code\_helpers\time.dm" +#include "code\_helpers\turfs.dm" +#include "code\_helpers\type2type.dm" +#include "code\_helpers\unsorted.dm" +#include "code\_helpers\vector.dm" #include "code\_onclick\adjacent.dm" #include "code\_onclick\ai.dm" #include "code\_onclick\click.dm" @@ -46,13 +66,16 @@ #include "code\_onclick\item_attack.dm" #include "code\_onclick\observer.dm" #include "code\_onclick\other_mobs.dm" +#include "code\_onclick\rig.dm" #include "code\_onclick\telekinesis.dm" #include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\gun_mode.dm" #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\monkey.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\other_mobs.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" @@ -102,8 +125,10 @@ #include "code\controllers\subsystems.dm" #include "code\controllers\verbs.dm" #include "code\controllers\voting.dm" +#include "code\controllers\Processes\ai.dm" #include "code\controllers\Processes\air.dm" #include "code\controllers\Processes\alarm.dm" +#include "code\controllers\Processes\chemistry.dm" #include "code\controllers\Processes\disease.dm" #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\event.dm" @@ -115,12 +140,14 @@ #include "code\controllers\Processes\nanoui.dm" #include "code\controllers\Processes\night_lighting.dm" #include "code\controllers\Processes\obj.dm" +#include "code\controllers\Processes\scheduler.dm" #include "code\controllers\Processes\Shuttle.dm" #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\Processes\wireless.dm" #include "code\controllers\ProcessScheduler\core\_stubs.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" @@ -128,10 +155,9 @@ #include "code\datums\ai_laws.dm" #include "code\datums\api.dm" #include "code\datums\browser.dm" +#include "code\datums\category.dm" #include "code\datums\computerfiles.dm" -#include "code\datums\crew.dm" #include "code\datums\datacore.dm" -#include "code\datums\datumvars.dm" #include "code\datums\discord_bot.dm" #include "code\datums\disease.dm" #include "code\datums\mind.dm" @@ -142,6 +168,7 @@ #include "code\datums\server_greeting.dm" #include "code\datums\sun.dm" #include "code\datums\supplypacks.dm" +#include "code\datums\ai\ai.dm" #include "code\datums\diseases\appendicitis.dm" #include "code\datums\diseases\beesease.dm" #include "code\datums\diseases\brainrot.dm" @@ -178,12 +205,43 @@ #include "code\datums\diseases\advance\symptoms\voice_change.dm" #include "code\datums\diseases\advance\symptoms\vomit.dm" #include "code\datums\diseases\advance\symptoms\weight.dm" +#include "code\datums\expansions\expansion.dm" +#include "code\datums\expansions\multitool\_multitool.dm" +#include "code\datums\expansions\multitool\multitool.dm" +#include "code\datums\expansions\multitool\store.dm" +#include "code\datums\expansions\multitool\circuitboards\circuitboards.dm" +#include "code\datums\expansions\multitool\circuitboards\stationalert.dm" +#include "code\datums\expansions\multitool\items\cable.dm" +#include "code\datums\expansions\multitool\items\items.dm" +#include "code\datums\expansions\multitool\machinery\cloning.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\global_iterator.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\observation\_debug.dm" +#include "code\datums\observation\destroyed.dm" +#include "code\datums\observation\moved.dm" +#include "code\datums\observation\observation.dm" +#include "code\datums\observation\task_triggered.dm" +#include "code\datums\repositories\cameras.dm" +#include "code\datums\repositories\crew.dm" +#include "code\datums\repositories\repository.dm" +#include "code\datums\uplink\ammunition.dm" +#include "code\datums\uplink\announcements.dm" +#include "code\datums\uplink\badassery.dm" +#include "code\datums\uplink\devices and tools.dm" +#include "code\datums\uplink\grenades.dm" +#include "code\datums\uplink\hardsuit_modules.dm" +#include "code\datums\uplink\highly visible and dangerous weapons.dm" +#include "code\datums\uplink\implants.dm" +#include "code\datums\uplink\medical.dm" +#include "code\datums\uplink\stealth and camouflage items.dm" +#include "code\datums\uplink\stealthy and inconspicuous weapons.dm" +#include "code\datums\uplink\telecrystals.dm" +#include "code\datums\uplink\uplink_categories.dm" +#include "code\datums\uplink\uplink_items.dm" #include "code\datums\wires\airlock.dm" #include "code\datums\wires\alarm.dm" #include "code\datums\wires\apc.dm" @@ -191,6 +249,7 @@ #include "code\datums\wires\camera.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\mulebot.dm" +#include "code\datums\wires\nuclearbomb.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\radio.dm" #include "code\datums\wires\robot.dm" @@ -199,6 +258,7 @@ #include "code\datums\wires\suit_storage_unit.dm" #include "code\datums\wires\vending.dm" #include "code\datums\wires\wires.dm" +#include "code\defines\gases.dm" #include "code\defines\obj.dm" #include "code\defines\obj\weapon.dm" #include "code\defines\procs\announce.dm" @@ -206,11 +266,11 @@ #include "code\defines\procs\dbcore.dm" #include "code\defines\procs\hud.dm" #include "code\defines\procs\radio.dm" -#include "code\defines\procs\records.dm" #include "code\defines\procs\sd_Alert.dm" #include "code\defines\procs\statistics.dm" #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" +#include "code\game\base_turf.dm" #include "code\game\periodic_news.dm" #include "code\game\response_team.dm" #include "code\game\shuttle_engines.dm" @@ -231,6 +291,7 @@ #include "code\game\antagonist\antagonist_update.dm" #include "code\game\antagonist\alien\borer.dm" #include "code\game\antagonist\alien\xenomorph.dm" +#include "code\game\antagonist\outsider\actors.dm" #include "code\game\antagonist\outsider\commando.dm" #include "code\game\antagonist\outsider\deathsquad.dm" #include "code\game\antagonist\outsider\ert.dm" @@ -266,12 +327,6 @@ #include "code\game\gamemodes\gameticker.dm" #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\setupgame.dm" -#include "code\game\gamemodes\blob\blob.dm" -#include "code\game\gamemodes\blob\theblob.dm" -#include "code\game\gamemodes\blob\blobs\core.dm" -#include "code\game\gamemodes\blob\blobs\factory.dm" -#include "code\game\gamemodes\blob\blobs\node.dm" -#include "code\game\gamemodes\blob\blobs\shield.dm" #include "code\game\gamemodes\calamity\calamity.dm" #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\changeling_powers.dm" @@ -294,7 +349,6 @@ #include "code\game\gamemodes\events\black_hole.dm" #include "code\game\gamemodes\events\clang.dm" #include "code\game\gamemodes\events\dust.dm" -#include "code\game\gamemodes\events\miniblob.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\events\wormholes.dm" #include "code\game\gamemodes\events\holidays\Christmas.dm" @@ -313,6 +367,12 @@ #include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\mixed\bughunt.dm" +#include "code\game\gamemodes\mixed\conflux.dm" +#include "code\game\gamemodes\mixed\infestation.dm" +#include "code\game\gamemodes\mixed\paranoia.dm" +#include "code\game\gamemodes\mixed\traitorling.dm" +#include "code\game\gamemodes\mixed\uprising.dm" #include "code\game\gamemodes\ninja\ninja.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm" @@ -324,7 +384,9 @@ #include "code\game\gamemodes\vampire\vampire_helpers.dm" #include "code\game\gamemodes\vampire\vampire_powers.dm" #include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\jobs\_access_defs.dm" #include "code\game\jobs\access.dm" +#include "code\game\jobs\access_datum.dm" #include "code\game\jobs\job_controller.dm" #include "code\game\jobs\jobs.dm" #include "code\game\jobs\whitelist.dm" @@ -345,7 +407,6 @@ #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\autolathe_datums.dm" #include "code\game\machinery\Beacon.dm" -#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" @@ -361,6 +422,7 @@ #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\flasher.dm" #include "code\game\machinery\floodlight.dm" +#include "code\game\machinery\floor_light.dm" #include "code\game\machinery\floorlayer.dm" #include "code\game\machinery\hologram.dm" #include "code\game\machinery\holosign.dm" @@ -376,7 +438,6 @@ #include "code\game\machinery\nuclear_bomb.dm" #include "code\game\machinery\OpTable.dm" #include "code\game\machinery\overview.dm" -#include "code\game\machinery\portable_tag_turret.dm" #include "code\game\machinery\portable_turret.dm" #include "code\game\machinery\recharger.dm" #include "code\game\machinery\rechargestation.dm" @@ -389,10 +450,10 @@ #include "code\game\machinery\status_display_ai.dm" #include "code\game\machinery\suit_storage_unit.dm" #include "code\game\machinery\supply_display.dm" +#include "code\game\machinery\supplybeacon.dm" #include "code\game\machinery\syndicatebeacon.dm" #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\turret_control.dm" -#include "code\game\machinery\turrets.dm" #include "code\game\machinery\vending.dm" #include "code\game\machinery\wall_frames.dm" #include "code\game\machinery\washing_machine.dm" @@ -413,11 +474,11 @@ #include "code\game\machinery\computer\ai_core.dm" #include "code\game\machinery\computer\aifixer.dm" #include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\arcade_orion.dm" #include "code\game\machinery\computer\atmos_alert.dm" #include "code\game\machinery\computer\atmos_control.dm" #include "code\game\machinery\computer\buildandrepair.dm" #include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\card.dm" #include "code\game\machinery\computer\cloning.dm" #include "code\game\machinery\computer\communications.dm" #include "code\game\machinery\computer\computer.dm" @@ -439,36 +500,6 @@ #include "code\game\machinery\computer\station_alert.dm" #include "code\game\machinery\computer\supply.dm" #include "code\game\machinery\computer\syndicate_specops_shuttle.dm" -#include "code\game\machinery\computer3\bios.dm" -#include "code\game\machinery\computer3\buildandrepair.dm" -#include "code\game\machinery\computer3\component.dm" -#include "code\game\machinery\computer3\computer.dm" -#include "code\game\machinery\computer3\computer3_notes.dm" -#include "code\game\machinery\computer3\file.dm" -#include "code\game\machinery\computer3\laptop.dm" -#include "code\game\machinery\computer3\lapvend.dm" -#include "code\game\machinery\computer3\networking.dm" -#include "code\game\machinery\computer3\NTOS.dm" -#include "code\game\machinery\computer3\program.dm" -#include "code\game\machinery\computer3\program_disks.dm" -#include "code\game\machinery\computer3\server.dm" -#include "code\game\machinery\computer3\storage.dm" -#include "code\game\machinery\computer3\computers\arcade.dm" -#include "code\game\machinery\computer3\computers\atmos_alert.dm" -#include "code\game\machinery\computer3\computers\camera.dm" -#include "code\game\machinery\computer3\computers\card.dm" -#include "code\game\machinery\computer3\computers\communications.dm" -#include "code\game\machinery\computer3\computers\crew.dm" -#include "code\game\machinery\computer3\computers\customs.dm" -#include "code\game\machinery\computer3\computers\HolodeckControl.dm" -#include "code\game\machinery\computer3\computers\law.dm" -#include "code\game\machinery\computer3\computers\medical.dm" -#include "code\game\machinery\computer3\computers\Operating.dm" -#include "code\game\machinery\computer3\computers\power.dm" -#include "code\game\machinery\computer3\computers\prisoner.dm" -#include "code\game\machinery\computer3\computers\robot.dm" -#include "code\game\machinery\computer3\computers\security.dm" -#include "code\game\machinery\computer3\computers\welcome.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_control.dm" #include "code\game\machinery\doors\airlock_electronics.dm" @@ -569,8 +600,8 @@ #include "code\game\objects\effects\decals\posters\bs12.dm" #include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\effects\spawners\vaultspawner.dm" #include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\bees_items.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\contraband.dm" @@ -588,6 +619,7 @@ #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\hacktool.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\magnetic_lock.dm" #include "code\game\objects\items\devices\megaphone.dm" @@ -600,10 +632,12 @@ #include "code\game\objects\items\devices\scanners.dm" #include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\suit_cooling.dm" +#include "code\game\objects\items\devices\t_scanner.dm" #include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\uplinks.dm" +#include "code\game\objects\items\devices\uplink.dm" +#include "code\game\objects\items\devices\uplink_random_lists.dm" #include "code\game\objects\items\devices\violin.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\PDA\cart.dm" @@ -624,15 +658,14 @@ #include "code\game\objects\items\stacks\nanopaste.dm" #include "code\game\objects\items\stacks\rods.dm" #include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\telecrystal.dm" #include "code\game\objects\items\stacks\sheets\leather.dm" -#include "code\game\objects\items\stacks\sheets\light.dm" -#include "code\game\objects\items\stacks\tiles\light.dm" -#include "code\game\objects\items\stacks\tiles\plasteel.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" #include "code\game\objects\items\weapons\AI_modules.dm" #include "code\game\objects\items\weapons\autopsy.dm" #include "code\game\objects\items\weapons\candle.dm" #include "code\game\objects\items\weapons\cards_ids.dm" +#include "code\game\objects\items\weapons\cards_ids_syndicate.dm" #include "code\game\objects\items\weapons\cigs_lighters.dm" #include "code\game\objects\items\weapons\clown_items.dm" #include "code\game\objects\items\weapons\cosmetics.dm" @@ -644,7 +677,6 @@ #include "code\game\objects\items\weapons\gift_wrappaper.dm" #include "code\game\objects\items\weapons\handcuffs.dm" #include "code\game\objects\items\weapons\improvised_components.dm" -#include "code\game\objects\items\weapons\kitchen.dm" #include "code\game\objects\items\weapons\manuals.dm" #include "code\game\objects\items\weapons\mop.dm" #include "code\game\objects\items\weapons\paint.dm" @@ -675,11 +707,13 @@ #include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" #include "code\game\objects\items\weapons\circuitboards\computer\holodeckcontrol.dm" #include "code\game\objects\items\weapons\circuitboards\computer\research.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\station_alert.dm" #include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" #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\mech_recharger.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" @@ -688,9 +722,11 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" +#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm" #include "code\game\objects\items\weapons\grenades\emgrenade.dm" #include "code\game\objects\items\weapons\grenades\flashbang.dm" +#include "code\game\objects\items\weapons\grenades\fragmentation.dm" #include "code\game\objects\items\weapons\grenades\grenade.dm" #include "code\game\objects\items\weapons\grenades\smokebomb.dm" #include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" @@ -722,6 +758,7 @@ #include "code\game\objects\items\weapons\storage\fancy.dm" #include "code\game\objects\items\weapons\storage\firstaid.dm" #include "code\game\objects\items\weapons\storage\internal.dm" +#include "code\game\objects\items\weapons\storage\laundry_basket.dm" #include "code\game\objects\items\weapons\storage\lockbox.dm" #include "code\game\objects\items\weapons\storage\misc.dm" #include "code\game\objects\items\weapons\storage\secure.dm" @@ -741,14 +778,13 @@ #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\electricchair.dm" #include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\fireaxe_cabinet.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" #include "code\game\objects\structures\inflatable.dm" #include "code\game\objects\structures\janicart.dm" #include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\ladders.dm" -#include "code\game\objects\structures\lamarr_cage.dm" #include "code\game\objects\structures\lattice.dm" #include "code\game\objects\structures\mirror.dm" #include "code\game\objects\structures\mop_bucket.dm" @@ -766,12 +802,16 @@ #include "code\game\objects\structures\watercloset.dm" #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\window_spawner.dm" +#include "code\game\objects\structures\alien\alien.dm" +#include "code\game\objects\structures\alien\egg.dm" +#include "code\game\objects\structures\alien\node.dm" +#include "code\game\objects\structures\alien\resin.dm" #include "code\game\objects\structures\crates_lockers\closets.dm" #include "code\game\objects\structures\crates_lockers\crates.dm" #include "code\game\objects\structures\crates_lockers\largecrate.dm" #include "code\game\objects\structures\crates_lockers\closets\coffin.dm" #include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" #include "code\game\objects\structures\crates_lockers\closets\fitness.dm" #include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" #include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" @@ -800,9 +840,20 @@ #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_changing.dm" #include "code\game\turfs\turf_flick_animations.dm" #include "code\game\turfs\unsimulated.dm" +#include "code\game\turfs\flooring\flooring.dm" +#include "code\game\turfs\flooring\flooring_decals.dm" +#include "code\game\turfs\flooring\flooring_premade.dm" +#include "code\game\turfs\initialization\init.dm" +#include "code\game\turfs\initialization\maintenance.dm" #include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\floor_acts.dm" +#include "code\game\turfs\simulated\floor_attackby.dm" +#include "code\game\turfs\simulated\floor_damage.dm" +#include "code\game\turfs\simulated\floor_icon.dm" +#include "code\game\turfs\simulated\floor_static.dm" #include "code\game\turfs\simulated\floor_types.dm" #include "code\game\turfs\simulated\wall_attacks.dm" #include "code\game\turfs\simulated\wall_icon.dm" @@ -814,14 +865,15 @@ #include "code\game\turfs\unsimulated\floor.dm" #include "code\game\turfs\unsimulated\walls.dm" #include "code\game\verbs\ooc.dm" -#include "code\game\verbs\suicide.dm" #include "code\game\verbs\who.dm" #include "code\js\byjax.dm" #include "code\js\menus.dm" +#include "code\modules\acting\acting_items.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_attack_log.dm" #include "code\modules\admin\admin_investigate.dm" #include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_secrets.dm" #include "code\modules\admin\admin_server_greeting.dm" #include "code\modules\admin\admin_verbs.dm" #include "code\modules\admin\banjob.dm" @@ -830,15 +882,54 @@ #include "code\modules\admin\create_turf.dm" #include "code\modules\admin\holder2.dm" #include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\map_capture.dm" #include "code\modules\admin\NewBan.dm" #include "code\modules\admin\player_notes.dm" #include "code\modules\admin\player_notes_sql.dm" #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\topic.dm" #include "code\modules\admin\ToRban.dm" +#include "code\modules\admin\callproc\callproc.dm" #include "code\modules\admin\DB ban\ban_mirroring.dm" #include "code\modules\admin\DB ban\functions.dm" #include "code\modules\admin\permissionverbs\permissionedit.dm" +#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" +#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" +#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" +#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" +#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" +#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" +#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" +#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" +#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" +#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" +#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" +#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" +#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" +#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" +#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" +#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\make_all_areas_powered.dm" +#include "code\modules\admin\secrets\fun_secrets\make_all_areas_unpowered.dm" +#include "code\modules\admin\secrets\fun_secrets\only_one.dm" +#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" +#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" +#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" +#include "code\modules\admin\secrets\random_events\gravity.dm" +#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" +#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" #include "code\modules\admin\verbs\adminpm.dm" @@ -871,6 +962,9 @@ #include "code\modules\admin\verbs\ticklag.dm" #include "code\modules\admin\verbs\tripAI.dm" #include "code\modules\admin\verbs\warning.dm" +#include "code\modules\admin\view_variables\helpers.dm" +#include "code\modules\admin\view_variables\topic.dm" +#include "code\modules\admin\view_variables\view_variables.dm" #include "code\modules\alarm\alarm.dm" #include "code\modules\alarm\alarm_handler.dm" #include "code\modules\alarm\atmosphere_alarm.dm" @@ -902,23 +996,41 @@ #include "code\modules\awaymissions\pamphlet.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\blob\blob.dm" #include "code\modules\cargo\randomstock.dm" #include "code\modules\cciaa\cciaa.dm" #include "code\modules\cciaa\cciaa_items.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" +#include "code\modules\client\movement.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_ambience.dm" #include "code\modules\client\preferences_factions.dm" #include "code\modules\client\preferences_gear.dm" #include "code\modules\client\preferences_notification.dm" -#include "code\modules\client\preferences_save_migration.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_spawnpoints.dm" -#include "code\modules\client\preferences_sql.dm" -#include "code\modules\client\preferences_system_control.dm" #include "code\modules\client\preferences_toggles.dm" +#include "code\modules\client\ui_style.dm" +#include "code\modules\client\preference_setup\preference_setup.dm" +#include "code\modules\client\preference_setup\preferences_sql.dm" +#include "code\modules\client\preference_setup\antagonism\01_candidacy.dm" +#include "code\modules\client\preference_setup\antagonism\02_setup.dm" +#include "code\modules\client\preference_setup\general\01_basic.dm" +#include "code\modules\client\preference_setup\general\02_language.dm" +#include "code\modules\client\preference_setup\general\03_body.dm" +#include "code\modules\client\preference_setup\general\04_equipment.dm" +#include "code\modules\client\preference_setup\general\05_background.dm" +#include "code\modules\client\preference_setup\general\06_flavor.dm" +#include "code\modules\client\preference_setup\global\01_ui.dm" +#include "code\modules\client\preference_setup\global\02_settings.dm" +#include "code\modules\client\preference_setup\global\03_language.dm" +#include "code\modules\client\preference_setup\global\04_pai.dm" +#include "code\modules\client\preference_setup\occupation\occupation.dm" +#include "code\modules\client\preference_setup\skills\skills.dm" +#include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\clothing_accessories.dm" #include "code\modules\clothing\ears\bandanna.dm" #include "code\modules\clothing\ears\skrell.dm" #include "code\modules\clothing\glasses\glasses.dm" @@ -979,7 +1091,6 @@ #include "code\modules\clothing\suits\storage.dm" #include "code\modules\clothing\suits\utility.dm" #include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\under\chameleon.dm" #include "code\modules\clothing\under\color.dm" #include "code\modules\clothing\under\miscellaneous.dm" #include "code\modules\clothing\under\shorts.dm" @@ -994,6 +1105,7 @@ #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.dm" #include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\xenos\resomi.dm" #include "code\modules\customitems\item_defines.dm" #include "code\modules\customitems\item_spawning.dm" #include "code\modules\detectivework\footprints.dm" @@ -1046,6 +1158,7 @@ #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\random_antagonist.dm" #include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\shipping_error.dm" #include "code\modules\events\space_ninja.dm" #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" @@ -1069,8 +1182,13 @@ #include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\TextFilters.dm" #include "code\modules\food\recipes_microwave.dm" +#include "code\modules\games\boardgame.dm" +#include "code\modules\games\cardemon.dm" #include "code\modules\games\cards.dm" +#include "code\modules\games\spaceball_cards.dm" +#include "code\modules\games\tarot.dm" #include "code\modules\genetics\side_effects.dm" +#include "code\modules\ghosttrap\trap.dm" #include "code\modules\holodeck\HolodeckControl.dm" #include "code\modules\holodeck\HolodeckObjects.dm" #include "code\modules\holodeck\HolodeckPrograms.dm" @@ -1086,6 +1204,7 @@ #include "code\modules\hydroponics\seed_mobs.dm" #include "code\modules\hydroponics\seed_packets.dm" #include "code\modules\hydroponics\seed_storage.dm" +#include "code\modules\hydroponics\beekeeping\beehive.dm" #include "code\modules\hydroponics\spreading\spreading.dm" #include "code\modules\hydroponics\spreading\spreading_growth.dm" #include "code\modules\hydroponics\spreading\spreading_response.dm" @@ -1137,6 +1256,7 @@ #include "code\modules\mob\animations.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\emote.dm" +#include "code\modules\mob\gender.dm" #include "code\modules\mob\hear_say.dm" #include "code\modules\mob\holder.dm" #include "code\modules\mob\inventory.dm" @@ -1179,9 +1299,11 @@ #include "code\modules\mob\language\outsider.dm" #include "code\modules\mob\language\station.dm" #include "code\modules\mob\language\synthetic.dm" +#include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\default_language.dm" #include "code\modules\mob\living\devour.dm" +#include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" @@ -1189,7 +1311,6 @@ #include "code\modules\mob\living\login.dm" #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" @@ -1199,6 +1320,7 @@ #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_defense.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\diona_base.dm" @@ -1222,6 +1344,7 @@ #include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" #include "code\modules\mob\living\carbon\alien\larva\larva.dm" #include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\powers.dm" #include "code\modules\mob\living\carbon\alien\larva\progression.dm" #include "code\modules\mob\living\carbon\brain\brain.dm" #include "code\modules\mob\living\carbon\brain\brain_item.dm" @@ -1243,6 +1366,7 @@ #include "code\modules\mob\living\carbon\human\human_damage.dm" #include "code\modules\mob\living\carbon\human\human_defense.dm" #include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_helpers.dm" #include "code\modules\mob\living\carbon\human\human_movement.dm" #include "code\modules\mob\living\carbon\human\human_organs.dm" #include "code\modules\mob\living\carbon\human\human_powers.dm" @@ -1266,11 +1390,11 @@ #include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" #include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" #include "code\modules\mob\living\carbon\human\species\station\golem.dm" +#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" #include "code\modules\mob\living\carbon\human\species\station\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\station\resomi.dm" #include "code\modules\mob\living\carbon\human\species\station\slime.dm" #include "code\modules\mob\living\carbon\human\species\station\station.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_embryo.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_facehugger.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" @@ -1295,14 +1419,16 @@ #include "code\modules\mob\living\silicon\silicon.dm" #include "code\modules\mob\living\silicon\subystems.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_movement.dm" #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\icons.dm" #include "code\modules\mob\living\silicon\ai\latejoin.dm" #include "code\modules\mob\living\silicon\ai\laws.dm" #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\nano.dm" +#include "code\modules\mob\living\silicon\ai\malf.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" @@ -1333,6 +1459,7 @@ #include "code\modules\mob\living\silicon\robot\robot_items.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" #include "code\modules\mob\living\silicon\robot\syndicate_robot.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" @@ -1389,6 +1516,47 @@ #include "code\modules\mob\new_player\preferences_setup.dm" #include "code\modules\mob\new_player\skill.dm" #include "code\modules\mob\new_player\sprite_accessories.dm" +#include "code\modules\modular_computers\laptop_vendor.dm" +#include "code\modules\modular_computers\computers\item\modular_computer.dm" +#include "code\modules\modular_computers\computers\item\processor.dm" +#include "code\modules\modular_computers\computers\item\tablet.dm" +#include "code\modules\modular_computers\computers\item\tablet_presets.dm" +#include "code\modules\modular_computers\computers\machinery\console_presets.dm" +#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" +#include "code\modules\modular_computers\computers\machinery\modular_console.dm" +#include "code\modules\modular_computers\computers\machinery\modular_laptop.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\programs\_engineering.dm" +#include "code\modules\modular_computers\file_system\programs\_medical.dm" +#include "code\modules\modular_computers\file_system\programs\card.dm" +#include "code\modules\modular_computers\file_system\programs\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" +#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" +#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\hardware.dm" +#include "code\modules\modular_computers\hardware\nano_printer.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_hard_drive.dm" +#include "code\modules\modular_computers\hardware\processor_unit.dm" +#include "code\modules\modular_computers\hardware\tesla_link.dm" +#include "code\modules\modular_computers\NTNet\NTNet.dm" +#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\multiz\_stubs.dm" +#include "code\modules\multiz\basic.dm" +#include "code\modules\multiz\movement.dm" +#include "code\modules\multiz\pipes.dm" +#include "code\modules\multiz\structures.dm" +#include "code\modules\multiz\turf.dm" #include "code\modules\nano\_JSON.dm" #include "code\modules\nano\JSON Reader.dm" #include "code\modules\nano\JSON Writer.dm" @@ -1401,9 +1569,12 @@ #include "code\modules\nano\interaction\conscious.dm" #include "code\modules\nano\interaction\contained.dm" #include "code\modules\nano\interaction\default.dm" +#include "code\modules\nano\interaction\interactive.dm" #include "code\modules\nano\interaction\inventory.dm" #include "code\modules\nano\interaction\inventory_deep.dm" +#include "code\modules\nano\interaction\outside.dm" #include "code\modules\nano\interaction\physical.dm" +#include "code\modules\nano\interaction\remote.dm" #include "code\modules\nano\interaction\self.dm" #include "code\modules\nano\interaction\zlevel.dm" #include "code\modules\nano\modules\alarm_monitor.dm" @@ -1415,8 +1586,8 @@ #include "code\modules\nano\modules\power_monitor.dm" #include "code\modules\nano\modules\rcon.dm" #include "code\modules\organs\blood.dm" +#include "code\modules\organs\misc.dm" #include "code\modules\organs\organ.dm" -#include "code\modules\organs\organ_alien.dm" #include "code\modules\organs\organ_external.dm" #include "code\modules\organs\organ_icon.dm" #include "code\modules\organs\organ_internal.dm" @@ -1424,6 +1595,12 @@ #include "code\modules\organs\pain.dm" #include "code\modules\organs\robolimbs.dm" #include "code\modules\organs\wound.dm" +#include "code\modules\organs\subtypes\diona.dm" +#include "code\modules\organs\subtypes\machine.dm" +#include "code\modules\organs\subtypes\resomi.dm" +#include "code\modules\organs\subtypes\standard.dm" +#include "code\modules\organs\subtypes\unbreakable.dm" +#include "code\modules\organs\subtypes\xenos.dm" #include "code\modules\overmap\_defines.dm" #include "code\modules\overmap\sectors.dm" #include "code\modules\overmap\ships\ship.dm" @@ -1441,6 +1618,7 @@ #include "code\modules\paperwork\paper.dm" #include "code\modules\paperwork\paper_bundle.dm" #include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\papershredder.dm" #include "code\modules\paperwork\pen.dm" #include "code\modules\paperwork\photocopier.dm" #include "code\modules\paperwork\photography.dm" @@ -1452,7 +1630,6 @@ #include "code\modules\power\cable.dm" #include "code\modules\power\cable_heavyduty.dm" #include "code\modules\power\cell.dm" -#include "code\modules\power\engine.dm" #include "code\modules\power\fractal_reactor.dm" #include "code\modules\power\generator.dm" #include "code\modules\power\generator_type2.dm" @@ -1493,7 +1670,6 @@ #include "code\modules\projectiles\effects.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\targeting.dm" #include "code\modules\projectiles\ammunition\boxes.dm" #include "code\modules\projectiles\ammunition\bullets.dm" #include "code\modules\projectiles\guns\alien.dm" @@ -1529,8 +1705,28 @@ #include "code\modules\projectiles\projectile\energy.dm" #include "code\modules\projectiles\projectile\force.dm" #include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\random_map\mining_distribution.dm" +#include "code\modules\projectiles\targeting\targeting_client.dm" +#include "code\modules\projectiles\targeting\targeting_gun.dm" +#include "code\modules\projectiles\targeting\targeting_mob.dm" +#include "code\modules\projectiles\targeting\targeting_overlay.dm" +#include "code\modules\projectiles\targeting\targeting_triggers.dm" +#include "code\modules\random_map\_random_map_setup.dm" #include "code\modules\random_map\random_map.dm" +#include "code\modules\random_map\random_map_verbs.dm" +#include "code\modules\random_map\automata\automata.dm" +#include "code\modules\random_map\automata\caves.dm" +#include "code\modules\random_map\building\building.dm" +#include "code\modules\random_map\drop\drop_types.dm" +#include "code\modules\random_map\drop\droppod.dm" +#include "code\modules\random_map\drop\droppod_doors.dm" +#include "code\modules\random_map\drop\supply.dm" +#include "code\modules\random_map\mazes\maze.dm" +#include "code\modules\random_map\mazes\maze_cell.dm" +#include "code\modules\random_map\noise\desert.dm" +#include "code\modules\random_map\noise\magma.dm" +#include "code\modules\random_map\noise\noise.dm" +#include "code\modules\random_map\noise\ore.dm" +#include "code\modules\random_map\noise\tundra.dm" #include "code\modules\reagents\Chemistry-Colours.dm" #include "code\modules\reagents\Chemistry-Holder.dm" #include "code\modules\reagents\Chemistry-Logging.dm" @@ -1583,6 +1779,7 @@ #include "code\modules\research\circuitprinter.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\mechfab_designs.dm" #include "code\modules\research\message_server.dm" #include "code\modules\research\protolathe.dm" #include "code\modules\research\rd-readme.dm" @@ -1717,20 +1914,21 @@ #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\setup_supermatter.dm" #include "code\modules\supermatter\supermatter.dm" +#include "code\modules\surgery\_defines.dm" #include "code\modules\surgery\bones.dm" -#include "code\modules\surgery\brainrepair.dm" #include "code\modules\surgery\encased.dm" -#include "code\modules\surgery\eye.dm" #include "code\modules\surgery\face.dm" #include "code\modules\surgery\generic.dm" -#include "code\modules\surgery\headreattach.dm" #include "code\modules\surgery\implant.dm" +#include "code\modules\surgery\limb_reattach.dm" #include "code\modules\surgery\organs_internal.dm" #include "code\modules\surgery\other.dm" -#include "code\modules\surgery\robolimbs.dm" +#include "code\modules\surgery\robotics.dm" #include "code\modules\surgery\slimes.dm" #include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\~defines.dm" #include "code\modules\tables\flipping.dm" #include "code\modules\tables\interactions.dm" #include "code\modules\tables\presets.dm" @@ -1760,16 +1958,18 @@ #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" #include "code\modules\web_interface\webint_procs.dm" -#include "code\TriDimension\controller.dm" -#include "code\TriDimension\controller_presets.dm" -#include "code\TriDimension\Movement.dm" -#include "code\TriDimension\Pipes.dm" -#include "code\TriDimension\Structures.dm" -#include "code\TriDimension\Structures_presets.dm" -#include "code\TriDimension\Turfs.dm" +#include "code\modules\wireless\devices.dm" +#include "code\modules\wireless\interfaces.dm" +#include "code\modules\xgm\xgm_gas_data.dm" +#include "code\modules\xgm\xgm_gas_mixture.dm" +#include "code\unit_tests\equipment_tests.dm" +#include "code\unit_tests\foundation_tests.dm" +#include "code\unit_tests\map_tests.dm" +#include "code\unit_tests\mob_tests.dm" +#include "code\unit_tests\observation_tests.dm" +#include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\zas_tests.dm" #include "code\ZAS\_docs.dm" -#include "code\ZAS\_gas_mixture_xgm.dm" -#include "code\ZAS\_xgm_gas_data.dm" #include "code\ZAS\Airflow.dm" #include "code\ZAS\Atom.dm" #include "code\ZAS\Connection.dm" @@ -1779,7 +1979,6 @@ #include "code\ZAS\Debug.dm" #include "code\ZAS\Diagnostic.dm" #include "code\ZAS\Fire.dm" -#include "code\ZAS\Gas.dm" #include "code\ZAS\Phoron.dm" #include "code\ZAS\Turf.dm" #include "code\ZAS\Variable Settings.dm" diff --git a/code/ATMOSPHERICS/_atmos_setup.dm b/code/ATMOSPHERICS/_atmos_setup.dm index 47903bfdc6d..f7e37bcfa30 100644 --- a/code/ATMOSPHERICS/_atmos_setup.dm +++ b/code/ATMOSPHERICS/_atmos_setup.dm @@ -12,14 +12,14 @@ #define PIPE_COLOR_CYAN "#00ffff" #define PIPE_COLOR_GREEN "#00ff00" #define PIPE_COLOR_YELLOW "#ffcc00" -#define PIPE_COLOR_PURPLE "#5c1ec0" +#define PIPE_COLOR_BLACK "#444444" #define CONNECT_TYPE_REGULAR 1 #define CONNECT_TYPE_SUPPLY 2 #define CONNECT_TYPE_SCRUBBER 4 #define CONNECT_TYPE_HE 8 -var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE) +var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "black" = PIPE_COLOR_BLACK) /proc/pipe_color_lookup(var/color) for(var/C in pipe_colors) diff --git a/code/ATMOSPHERICS/_atmospherics_helpers.dm b/code/ATMOSPHERICS/_atmospherics_helpers.dm index 6fc2b923dd1..26740301ff1 100644 --- a/code/ATMOSPHERICS/_atmospherics_helpers.dm +++ b/code/ATMOSPHERICS/_atmospherics_helpers.dm @@ -15,7 +15,7 @@ /obj/machinery/atmospherics/var/debug = 0 -/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in view()) +/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in range(world.view)) set name = "Toggle Debug Messages" set category = "Debug" M.debug = !M.debug diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 895aa17f09e..b5d4df814e9 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -51,7 +51,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) if(node) - if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(!T.is_plating() && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) //underlays += icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 1899ee9dfdd..c0cf15616fa 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -8,8 +8,6 @@ #define PRESSURE_CHECK_INPUT 2 #define PRESSURE_CHECK_OUTPUT 4 -#undefine - /obj/machinery/atmospherics/binary/dp_vent_pump icon = 'icons/atmos/vent_pump.dmi' icon_state = "map_dp_vent" @@ -69,7 +67,7 @@ if(!istype(T)) return - if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) + if(!T.is_plating() && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) vent_icon += "h" if(!powered()) @@ -85,7 +83,7 @@ var/turf/T = get_turf(src) if(!istype(T)) return - if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) + if(!T.is_plating() && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) return else if (node1) @@ -258,4 +256,14 @@ spawn(2) broadcast_status() - update_icon() \ No newline at end of file + update_icon() + +#undef DEFAULT_PRESSURE_DELTA + +#undef EXTERNAL_PRESSURE_BOUND +#undef INTERNAL_PRESSURE_BOUND +#undef PRESSURE_CHECKS + +#undef PRESSURE_CHECK_EXTERNAL +#undef PRESSURE_CHECK_INPUT +#undef PRESSURE_CHECK_OUTPUT diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 7604f330639..e183360b4f7 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -2,8 +2,6 @@ #define REGULATE_INPUT 1 //shuts off when input side is below the target pressure #define REGULATE_OUTPUT 2 //shuts off when output side is above the target pressure -#undefine - /obj/machinery/atmospherics/binary/passive_gate icon = 'icons/atmos/passive_gate.dmi' icon_state = "map" @@ -13,7 +11,7 @@ desc = "A one-way air valve that can be used to regulate input or output pressure, and flow rate. Does not require power." use_power = 0 - + interact_offline = 1 var/unlocked = 0 //If 0, then the valve is locked closed, otherwise it is open(-able, it's a one-way valve so it closes if gas would flow backwards). var/target_pressure = ONE_ATMOSPHERE var/max_pressure_setting = 15000 //kPa @@ -168,7 +166,7 @@ return src.add_fingerprint(usr) if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return usr.set_machine(src) ui_interact(user) @@ -242,20 +240,24 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() if (unlocked) - user << "\red You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench \the [src], turn it off first." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) + +#undef REGULATE_NONE +#undef REGULATE_INPUT +#undef REGULATE_OUTPUT diff --git a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm index 585c4a8dde6..5768def1ec1 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm @@ -88,7 +88,7 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) anchored = !anchored - user << "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor." + user << "You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor." if(anchored) if(dir & (NORTH|SOUTH)) @@ -260,7 +260,7 @@ if(istype(W, /obj/item/weapon/wrench)) anchored = !anchored turbine = null - user << "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor." + user << "You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor." updateConnection() else ..() @@ -283,4 +283,4 @@ if (usr.stat || usr.restrained() || anchored) return - src.set_dir(turn(src.dir, 90)) \ No newline at end of file + src.set_dir(turn(src.dir, 90)) diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 079dfb76cd0..16f5c0a586d 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -183,7 +183,7 @@ Thus, the two variables affect pump operation are set in New(): return src.add_fingerprint(usr) if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return usr.set_machine(src) ui_interact(user) @@ -219,20 +219,20 @@ Thus, the two variables affect pump operation are set in New(): if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && use_power) - user << "\red You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench this [src], turn it off first." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench this [src], it too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 52ab44fa74e..ac7d88301af 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -87,15 +87,15 @@ int_pressure += P.air.return_pressure() var/datum/gas_mixture/env_air = loc.return_air() if ((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "You cannot unwrench [src], it is too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it is too exerted due to internal pressure." add_fingerprint(user) return 1 - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) @@ -189,7 +189,7 @@ var/turf/T = get_turf(src) if(!istype(T)) return - if(T.intact && istype(P.node, /obj/machinery/atmospherics/pipe) && P.node.level == 1 ) + if(!T.is_plating() && istype(P.node, /obj/machinery/atmospherics/pipe) && P.node.level == 1 ) //pipe_state = icon_manager.get_atmos_icon("underlay_down", P.dir, color_cache_name(P.node)) pipe_state = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "down") else @@ -299,4 +299,4 @@ update_ports() - return null \ No newline at end of file + return null diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index c33ff799673..4f6473fccf3 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -134,22 +134,22 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() if (connected_device) - user << "\red You cannot unwrench this [src], dettach [connected_device] first." + user << "You cannot unwrench \the [src], dettach \the [connected_device] first." return 1 if (locate(/obj/machinery/portable_atmospherics, src.loc)) return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 0921d1d0aa5..e78d777cabc 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -40,7 +40,7 @@ ..() switch(filter_type) if(0) //removing hydrocarbons - filtered_out = list("phoron", "oxygen_agent_b") + filtered_out = list("phoron") if(1) //removing O2 filtered_out = list("oxygen") if(2) //removing N2 @@ -95,10 +95,10 @@ /obj/machinery/atmospherics/trinary/filter/process() ..() - + last_power_draw = 0 last_flow_rate = 0 - + if((stat & (NOPOWER|BROKEN)) || !use_power) return @@ -134,16 +134,16 @@ var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) @@ -153,7 +153,7 @@ return if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return var/dat @@ -206,7 +206,6 @@ switch(filter_type) if(0) //removing hydrocarbons filtered_out += "phoron" - filtered_out += "oxygen_agent_b" if(1) //removing O2 filtered_out += "oxygen" if(2) //removing N2 diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index a200de25a00..a163c122f01 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -109,15 +109,15 @@ var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) @@ -127,7 +127,7 @@ return src.add_fingerprint(usr) if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return usr.set_machine(src) var/dat = {"Power: [use_power?"On":"Off"]
diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index d9d85850d59..f93970a93fd 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -306,7 +306,7 @@ if(!powered()) return if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return ..() @@ -348,21 +348,21 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() if (istype(src, /obj/machinery/atmospherics/tvalve/digital)) - user << "\red You cannot unwrench this [src], it's too complicated." + user << "You cannot unwrench \the [src], it's too complicated." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) @@ -446,7 +446,7 @@ if(!powered()) return if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return ..() @@ -480,4 +480,4 @@ if(state) go_straight() else - go_to_side() \ No newline at end of file + go_to_side() diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index 0e75146adc4..79e43a8e1c3 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -69,21 +69,21 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." + if (level==1 && isturf(T) && !T.is_plating()) + user << "You must remove the plating first." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it is too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 0df3f443433..b42f519460a 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -7,8 +7,6 @@ #define PRESSURE_CHECK_EXTERNAL 1 #define PRESSURE_CHECK_INTERNAL 2 -#undefine - /obj/machinery/atmospherics/unary/vent_pump icon = 'icons/atmos/vent_pump.dmi' icon_state = "map_vent" @@ -118,7 +116,7 @@ if(!istype(T)) return - if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(!T.is_plating() && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) vent_icon += "h" if(welded) @@ -136,7 +134,7 @@ var/turf/T = get_turf(src) if(!istype(T)) return - if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(!T.is_plating() && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) return else if(node) @@ -160,7 +158,7 @@ /obj/machinery/atmospherics/unary/vent_pump/process() ..() - if (hibernate) + if (hibernate > world.time) return 1 if (!node) @@ -190,12 +188,8 @@ else //If we're in an area that is fucking ideal, and we don't have to do anything, chances are we won't next tick either so why redo these calculations? //JESUS FUCK. THERE ARE LITERALLY 250 OF YOU MOTHERFUCKERS ON ZLEVEL ONE AND YOU DO THIS SHIT EVERY TICK WHEN VERY OFTEN THERE IS NO REASON TO - - if(pump_direction && pressure_checks == PRESSURE_CHECK_EXTERNAL && controller_iteration > 10) //99% of all vents - //Fucking hibernate because you ain't doing shit. - hibernate = 1 - spawn(rand(100,200)) //hibernate for 10 or 20 seconds randomly - hibernate = 0 + if(pump_direction && pressure_checks == PRESSURE_CHECK_EXTERNAL) //99% of all vents + hibernate = world.time + (rand(100,200)) if (power_draw >= 0) @@ -358,22 +352,22 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) - user << "\blue Now welding the vent." + user << "Now welding the vent." if(do_after(user, 20)) if(!src || !WT.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(!welded) - user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") + user.visible_message("\The [user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") welded = 1 update_icon() else - user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") + user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") welded = 0 update_icon() else - user << "\blue The welding tool needs to be on to start this task." + user << "The welding tool needs to be on to start this task." else - user << "\blue You need more welding fuel to complete this task." + user << "You need more welding fuel to complete this task." return 1 else ..() @@ -401,25 +395,25 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && use_power) - user << "\red You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench \the [src], turn it off first." return 1 var/turf/T = src.loc - if (node && node.level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." + if (node && node.level==1 && isturf(T) && !T.is_plating()) + user << "You must remove the plating first." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it is too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) @@ -429,3 +423,12 @@ initial_loc.air_vent_names -= id_tag ..() return + +#undef DEFAULT_PRESSURE_DELTA + +#undef EXTERNAL_PRESSURE_BOUND +#undef INTERNAL_PRESSURE_BOUND +#undef PRESSURE_CHECKS + +#undef PRESSURE_CHECK_EXTERNAL +#undef PRESSURE_CHECK_INTERNAL diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 561a2bf7df8..028d2dac5d5 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -72,7 +72,7 @@ var/turf/T = get_turf(src) if(!istype(T)) return - if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(!T.is_plating() && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) return else if(node) @@ -127,7 +127,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/process() ..() - if (hibernate) + if (hibernate > world.time) return 1 if (!node) @@ -150,11 +150,9 @@ power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) - if(scrubbing && power_draw < 0 && controller_iteration > 10) //99% of all scrubbers + if(scrubbing && power_draw <= 0) //99% of all scrubbers //Fucking hibernate because you ain't doing shit. - hibernate = 1 - spawn(rand(100,200)) //hibernate for 10 or 20 seconds randomly - hibernate = 0 + hibernate = world.time + (rand(100,200)) if (power_draw >= 0) last_power_draw = power_draw @@ -258,25 +256,25 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && use_power) - user << "\red You cannot unwrench this [src], turn it off first." + user << "You cannot unwrench \the [src], turn it off first." return 1 var/turf/T = src.loc - if (node && node.level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." + if (node && node.level==1 && isturf(T) && !T.is_plating()) + user << "You must remove the plating first." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it is too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 533d860f573..1e883de8260 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -238,7 +238,7 @@ if(!powered()) return if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return ..() @@ -305,21 +305,21 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() if (istype(src, /obj/machinery/atmospherics/valve/digital)) - user << "\red You cannot unwrench this [src], it's too complicated." + user << "You cannot unwrench \the [src], it's too complicated." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it is too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) qdel(src) diff --git a/code/ATMOSPHERICS/mainspipe.dm b/code/ATMOSPHERICS/mainspipe.dm index a381b28c37f..520d7a55b2e 100644 --- a/code/ATMOSPHERICS/mainspipe.dm +++ b/code/ATMOSPHERICS/mainspipe.dm @@ -181,7 +181,7 @@ obj/machinery/atmospherics/mains_pipe/simple ..() // initialize internal pipes var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() hidden @@ -243,7 +243,7 @@ obj/machinery/atmospherics/mains_pipe/manifold ..() // initialize internal pipes var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() update_icon() @@ -293,7 +293,7 @@ obj/machinery/atmospherics/mains_pipe/manifold4w ..() // initialize internal pipes var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() update_icon() @@ -354,7 +354,7 @@ obj/machinery/atmospherics/mains_pipe/split N1.merge(N2) var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() update_icon() @@ -475,7 +475,7 @@ obj/machinery/atmospherics/mains_pipe/split3 N1.merge(N2) var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() update_icon() @@ -525,7 +525,7 @@ obj/machinery/atmospherics/mains_pipe/cap ..() var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() hidden @@ -649,7 +649,7 @@ obj/machinery/atmospherics/mains_pipe/valve attack_hand(mob/user as mob) if(!src.allowed(user)) - user << "\red Access denied." + user << "Access denied." return ..() @@ -704,4 +704,4 @@ obj/machinery/atmospherics/mains_pipe/valve close() else open() -*/ \ No newline at end of file +*/ diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index fd3b3aa9c5d..d5656f75fc0 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -1,8 +1,7 @@ /obj/machinery/atmospherics/pipe - var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke + var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke var/datum/pipeline/parent - var/volume = 0 force = 20 @@ -20,10 +19,12 @@ return -1 /obj/machinery/atmospherics/pipe/New() - ..() - //so pipes under walls are hidden if(istype(get_turf(src), /turf/simulated/wall) || istype(get_turf(src), /turf/simulated/shuttle/wall) || istype(get_turf(src), /turf/unsimulated/wall)) level = 1 + ..() + +/obj/machinery/atmospherics/pipe/hides_under_flooring() + return level != 2 /obj/machinery/atmospherics/pipe/proc/pipeline_expansion() return null @@ -81,22 +82,22 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." + if (level==1 && isturf(T) && !T.is_plating()) + user << "You must remove the plating first." return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "You cannot unwrench [src], it is too exerted due to internal pressure." + user << "You cannot unwrench \the [src], it is too exerted due to internal pressure." add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") new /obj/item/pipe(loc, make_from=src) for (var/obj/machinery/meter/meter in T) if (meter.target == src) @@ -185,7 +186,7 @@ initialize_directions = SOUTH|WEST /obj/machinery/atmospherics/pipe/simple/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) + if(istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() @@ -211,7 +212,7 @@ else return 1 /obj/machinery/atmospherics/pipe/simple/proc/burst() - src.visible_message("\red \bold [src] bursts!"); + src.visible_message("\The [src] bursts!"); playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) @@ -294,9 +295,8 @@ qdel(src) return - var/turf/T = get_turf(src) - if(istype(T)) - hide(T.intact) + var/turf/T = loc + if(level == 1 && !T.is_plating()) hide(1) update_icon() /obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) @@ -345,8 +345,8 @@ /obj/machinery/atmospherics/pipe/simple/visible/green color = PIPE_COLOR_GREEN -/obj/machinery/atmospherics/pipe/simple/visible/purple - color = PIPE_COLOR_PURPLE +/obj/machinery/atmospherics/pipe/simple/visible/black + color = PIPE_COLOR_BLACK /obj/machinery/atmospherics/pipe/simple/visible/red color = PIPE_COLOR_RED @@ -387,8 +387,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/green color = PIPE_COLOR_GREEN -/obj/machinery/atmospherics/pipe/simple/hidden/purple - color = PIPE_COLOR_PURPLE +/obj/machinery/atmospherics/pipe/simple/hidden/black + color = PIPE_COLOR_BLACK /obj/machinery/atmospherics/pipe/simple/hidden/red color = PIPE_COLOR_RED @@ -441,7 +441,7 @@ initialize_directions = NORTH|EAST|SOUTH /obj/machinery/atmospherics/pipe/manifold/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) + if(istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() @@ -577,8 +577,7 @@ return var/turf/T = get_turf(src) - if(istype(T)) - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() /obj/machinery/atmospherics/pipe/manifold/visible @@ -612,8 +611,8 @@ /obj/machinery/atmospherics/pipe/manifold/visible/green color = PIPE_COLOR_GREEN -/obj/machinery/atmospherics/pipe/manifold/visible/purple - color = PIPE_COLOR_PURPLE +/obj/machinery/atmospherics/pipe/manifold/visible/black + color = PIPE_COLOR_BLACK /obj/machinery/atmospherics/pipe/manifold/visible/red color = PIPE_COLOR_RED @@ -654,8 +653,8 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/green color = PIPE_COLOR_GREEN -/obj/machinery/atmospherics/pipe/manifold/hidden/purple - color = PIPE_COLOR_PURPLE +/obj/machinery/atmospherics/pipe/manifold/hidden/black + color = PIPE_COLOR_BLACK /obj/machinery/atmospherics/pipe/manifold/hidden/red color = PIPE_COLOR_RED @@ -799,7 +798,7 @@ update_icon() /obj/machinery/atmospherics/pipe/manifold4w/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) + if(istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() @@ -834,8 +833,7 @@ return var/turf/T = get_turf(src) - if(istype(T)) - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() /obj/machinery/atmospherics/pipe/manifold4w/visible @@ -869,8 +867,8 @@ /obj/machinery/atmospherics/pipe/manifold4w/visible/green color = PIPE_COLOR_GREEN -/obj/machinery/atmospherics/pipe/manifold4w/visible/purple - color = PIPE_COLOR_PURPLE +/obj/machinery/atmospherics/pipe/manifold4w/visible/black + color = PIPE_COLOR_BLACK /obj/machinery/atmospherics/pipe/manifold4w/visible/red color = PIPE_COLOR_RED @@ -910,8 +908,8 @@ /obj/machinery/atmospherics/pipe/manifold4w/hidden/green color = PIPE_COLOR_GREEN -/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple - color = PIPE_COLOR_PURPLE +/obj/machinery/atmospherics/pipe/manifold4w/hidden/black + color = PIPE_COLOR_BLACK /obj/machinery/atmospherics/pipe/manifold4w/hidden/red color = PIPE_COLOR_RED @@ -939,7 +937,7 @@ initialize_directions = dir /obj/machinery/atmospherics/pipe/cap/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) + if(istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() @@ -990,7 +988,7 @@ break var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + if(level == 1 && !T.is_plating()) hide(1) update_icon() /obj/machinery/atmospherics/pipe/cap/visible @@ -1111,20 +1109,8 @@ return if(istype(W, /obj/item/device/analyzer) && in_range(user, src)) - for (var/mob/O in viewers(user, null)) - O << "\red [user] has used the analyzer on \icon[icon]" - - var/pressure = parent.air.return_pressure() - var/total_moles = parent.air.total_moles - - user << "\blue Results of analysis of \icon[icon]" - if (total_moles>0) - user << "\blue Pressure: [round(pressure,0.1)] kPa" - for(var/g in parent.air.gas) - user << "\blue [gas_data.name[g]]: [round((parent.air.gas[g] / total_moles) * 100)]%" - user << "\blue Temperature: [round(parent.air.temperature-T0C)]°C" - else - user << "\blue Tank is empty!" + var/obj/item/device/analyzer/A = W + A.analyze_gases(src, user) /obj/machinery/atmospherics/pipe/tank/air name = "Pressure Tank (Air)" @@ -1387,7 +1373,7 @@ /obj/machinery/atmospherics/proc/add_underlay_adapter(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) //modified from add_underlay, does not make exposed underlays if(node) - if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + if(!T.is_plating() && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) diff --git a/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm b/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm deleted file mode 100644 index 7374963fba8..00000000000 --- a/code/FEA/DEBUG_REMOVE_BEFORE_RELEASE.dm +++ /dev/null @@ -1,645 +0,0 @@ -#define DEBUG - -datum/air_group/var/marker -datum/air_group/var/debugging = 0 -datum/pipe_network/var/marker - -datum/gas_mixture - var/turf/parent - -/* -turf/simulated - New() - ..() - - if(air) - air.parent = src -*/ -obj/machinery/door - verb - toggle_door() - set src in world - if(density) - open() - else - close() - -turf/space - verb - create_floor() - set src in world - new /turf/simulated/floor(src) - - create_meteor(direction as num) - set src in world - - var/obj/effect/meteor/M = new( src ) - walk(M, direction,10) - - -turf/simulated/wall - verb - create_floor() - set src in world - new /turf/simulated/floor(src) - -obj/item/weapon/tank - verb - adjust_mixture(temperature as num, target_toxin_pressure as num, target_oxygen_pressure as num) - set src in world - if(!air_contents) - usr << "\red ERROR: no gas_mixture associated with this tank" - return null - - air_contents.temperature = temperature - air_contents.oxygen = target_oxygen_pressure*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature) - air_contents.toxins = target_toxin_pressure*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature) - -turf/simulated/floor - verb - parent_info() - set src in world - if(parent) - usr << "[x],[y] parent: Processing: [parent.group_processing]" - if(parent.members) - usr << "Members: [parent.members.len]" - else - usr << "Members: None?" - if(parent.borders) - usr << "Borders: [parent.borders.len]" - else - usr << "Borders: None" - if(parent.length_space_border) - usr << "Space Borders: [parent.space_borders.len], Space Length: [parent.length_space_border]" - else - usr << "Space Borders: None" - else - usr << "\blue [x],[y] has no parent air group." - - verb - create_wall() - set src in world - new /turf/simulated/wall(src) - verb - adjust_mixture(temp as num, tox as num, oxy as num) - set src in world - var/datum/gas_mixture/stuff = return_air() - stuff.temperature = temp - stuff.toxins = tox - stuff.oxygen = oxy - - verb - boom(inner_range as num, middle_range as num, outer_range as num) - set src in world - explosion(src,inner_range,middle_range,outer_range,outer_range) - - verb - flag_parent() - set src in world - if(parent) - parent.debugging = !parent.debugging - usr << "[parent.members.len] set to [parent.debugging]" - verb - small_explosion() - set src in world - explosion(src, 1, 2, 3, 3) - - verb - large_explosion() - set src in world - explosion(src, 3, 5, 7, 5) - -obj/machinery/portable_atmospherics/canister - verb/test_release() - set src in world - set category = "Minor" - - valve_open = 1 - release_pressure = 1000 -/* -obj/machinery/atmospherics - unary - heat_reservoir - verb - toggle_power() - set src in world - set category = "Minor" - - on = !on - - update_icon() - adjust_temp(temp as num) - set src in world - set category = "Minor" - - current_temperature = temp - cold_sink - verb - toggle_power() - set src in world - set category = "Minor" - - on = !on - - update_icon() - adjust_temp(temp as num) - set src in world - set category = "Minor" - - current_temperature = temp - vent_pump - verb - toggle_power() - set src in world - set category = "Minor" - - on = !on - - update_icon() - - toggle_direction() - set src in world - set category = "Minor" - - pump_direction = !pump_direction - - update_icon() - - change_pressure_parameters() - set src in world - set category = "Minor" - - usr << "current settings: PC=[pressure_checks], EB=[external_pressure_bound], IB=[internal_pressure_bound]" - - var/mode = input(usr, "Select an option:") in list("Bound External", "Bound Internal", "Bound Both") - - switch(mode) - if("Bound External") - pressure_checks = 1 - external_pressure_bound = input(usr, "External Pressure Bound?") as num - if("Bound Internal") - pressure_checks = 2 - internal_pressure_bound = input(usr, "Internal Pressure Bound?") as num - else - pressure_checks = 3 - external_pressure_bound = input(usr, "External Pressure Bound?") as num - internal_pressure_bound = input(usr, "Internal Pressure Bound?") as num - - outlet_injector - verb - toggle_power() - set src in world - set category = "Minor" - - on = !on - - update_icon() - verb - trigger_inject() - set src in world - set category = "Minor" - - inject() - - vent_scrubber - verb - toggle_power() - set src in world - set category = "Minor" - - on = !on - - update_icon() - - toggle_scrubbing() - set src in world - set category = "Minor" - - scrubbing = !scrubbing - - update_icon() - - change_rate(amount as num) - set src in world - set category = "Minor" - - volume_rate = amount - - mixer - verb - toggle() - set src in world - set category = "Minor" - - on = !on - - update_icon() - - change_pressure(amount as num) - set src in world - set category = "Minor" - - target_pressure = amount - - change_ratios() - set src in world - set category = "Minor" - - if(node_in1) - var/node_ratio = input(usr, "Node 1 Ratio? ([dir2text(get_dir(src, node_in1))])") as num - node_ratio = min(max(0,node_ratio),1) - - node1_concentration = node_ratio - node2_concentration = 1-node_ratio - else - node2_concentration = 1 - node1_concentration = 0 - - usr << "Node 1: [node1_concentration], Node 2: [node2_concentration]" - - - filter - verb - toggle() - set src in world - set category = "Minor" - - on = !on - - update_icon() - - change_pressure(amount as num) - set src in world - set category = "Minor" - - target_pressure = amount - - unary/oxygen_generator - verb - toggle() - set src in world - set category = "Minor" - - on = !on - - update_icon() - - change_rate(amount as num) - set src in world - set category = "Minor" - - oxygen_content = amount - binary/pump - verb - debug() - set src in world - set category = "Minor" - - world << "Debugging: [x],[y]" - - if(node1) - world << "Input node: [node1.x],[node1.y] [network1]" - if(node2) - world << "Output node: [node2.x],[node2.y] [network2]" - - toggle() - set src in world - set category = "Minor" - - on = !on - - update_icon() - change_pressure(amount as num) - set src in world - set category = "Minor" - - target_pressure = amount - - valve - verb - toggle() - set src in world - set category = "Minor" - - if(open) - close() - else - open() - network_data() - set src in world - set category = "Minor" - - world << "\blue [x],[y]" - world << "network 1: [network_node1.normal_members.len], [network_node1.line_members.len]" - for(var/obj/O in network_node1.normal_members) - world << "member: [O.x], [O.y]" - world << "network 2: [network_node2.normal_members.len], [network_node2.line_members.len]" - for(var/obj/O in network_node2.normal_members) - world << "member: [O.x], [O.y]" - pipe - verb - destroy() - set src in world - set category = "Minor" - - qdel(src) - - pipeline_data() - set src in world - set category = "Minor" - - if(parent) - usr << "[x],[y] is in a pipeline with [parent.members.len] members ([parent.edges.len] edges)! Volume: [parent.air.volume]" - usr << "Pressure: [parent.air.return_pressure()], Temperature: [parent.air.temperature]" - usr << "[parent.air.oxygen], [parent.air.toxins], [parent.air.nitrogen], [parent.air.carbon_dioxide] .. [parent.alert_pressure]" -*/ -mob - verb - flag_all_pipe_networks() - set category = "Debug" - - for(var/datum/pipe_network/network in pipe_networks) - network.update = 1 - - mark_pipe_networks() - set category = "Debug" - - for(var/datum/pipe_network/network in pipe_networks) - network.marker = rand(1,4) - - for(var/obj/machinery/atmospherics/pipe/P in world) - P.overlays.Cut() - - var/datum/pipe_network/master = P.return_network() - if(master) - P.overlays += icon('icons/Testing/atmos_testing.dmi',"marker[master.marker]") - else - world << "error" - P.overlays += icon('icons/Testing/atmos_testing.dmi',"marker0") - - for(var/obj/machinery/atmospherics/valve/V in world) - V.overlays.Cut() - - if(V.network_node1) - V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker[V.network_node1.marker]") - else - V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker0") - - if(V.network_node2) - V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker[V.network_node2.marker]") - else - V.overlays += icon('icons/Testing/atmos_testing.dmi',"marker0") - -turf/simulated - var/fire_verbose = 0 - - verb - mark_direction() - set src in world - overlays.Cut() - for(var/direction in list(NORTH,SOUTH,EAST,WEST)) - if(group_border&direction) - overlays += icon('icons/Testing/turf_analysis.dmi',"red_arrow",direction) - else if(air_check_directions&direction) - overlays += icon('icons/Testing/turf_analysis.dmi',"arrow",direction) - air_status() - set src in world - set category = "Minor" - var/datum/gas_mixture/GM = return_air() - usr << "\blue @[x],[y] ([GM.group_multiplier]): O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(active_hotspot)?("\red BURNING"):(null)]" - for(var/datum/gas/trace_gas in GM.trace_gases) - usr << "[trace_gas.type]: [trace_gas.moles]" - - force_temperature(temp as num) - set src in world - set category = "Minor" - if(parent&&parent.group_processing) - parent.suspend_group_processing() - - air.temperature = temp - - spark_temperature(temp as num, volume as num) - set src in world - set category = "Minor" - - hotspot_expose(temp, volume) - - fire_verbose() - set src in world - set category = "Minor" - - fire_verbose = !fire_verbose - usr << "[x],[y] now [fire_verbose]" - - add_sleeping_agent(amount as num) - set src in world - set category = "Minor" - - if(amount>1) - var/datum/gas_mixture/adding = new - var/datum/gas/sleeping_agent/trace_gas = new - - trace_gas.moles = amount - adding.trace_gases += trace_gas - adding.temperature = T20C - - assume_air(adding) - -obj/indicator - icon = 'icons/Testing/air_meter.dmi' - var/measure = "temperature" - anchored = 1 - - process() - icon_state = measurement() - - proc/measurement() - var/turf/T = loc - if(!isturf(T)) return - var/datum/gas_mixture/GM = T.return_air() - switch(measure) - if("temperature") - if(GM.temperature < 0) - return "error" - return "[round(GM.temperature/100+0.5)]" - if("oxygen") - if(GM.oxygen < 0) - return "error" - return "[round(GM.oxygen/MOLES_CELLSTANDARD*10+0.5)]" - if("plasma") - if(GM.toxins < 0) - return "error" - return "[round(GM.toxins/MOLES_CELLSTANDARD*10+0.5)]" - if("nitrogen") - if(GM.nitrogen < 0) - return "error" - return "[round(GM.nitrogen/MOLES_CELLSTANDARD*10+0.5)]" - else - return "[round((GM.total_moles())/MOLES_CELLSTANDARD*10+0.5)]" - - - Click() - process() - - -obj/window - verb - destroy() - set category = "Minor" - set src in world - qdel(src) - -mob - sight = SEE_OBJS|SEE_TURFS - - verb - update_indicators() - set category = "Debug" - if(!air_master) - usr << "Cannot find air_system" - return - - for(var/obj/indicator/T in world) - T.process() - change_indicators() - set category = "Debug" - if(!air_master) - usr << "Cannot find air_system" - return - - var/str = input("Select") in list("oxygen", "nitrogen","plasma","all","temperature") - - for(var/obj/indicator/T in world) - T.measure = str - T.process() - - fire_report() - set category = "Debug" - usr << "\b \red Fire Report" - for(var/obj/effect/hotspot/flame in world) - usr << "[flame.x],[flame.y]: [flame.temperature]K, [flame.volume] L - [flame.loc:air:temperature]" - - process_cycle() - set category = "Debug" - if(!master_controller) - usr << "Cannot find master_controller" - return - - master_controller.process() - update_indicators() - - process_cycles(amount as num) - set category = "Debug" - if(!master_controller) - usr << "Cannot find master_controller" - return - - var/start_time = world.timeofday - - for(var/i=1; i<=amount; i++) - master_controller.process() - - world << "Ended [amount] cycles in [(world.timeofday-start_time)/10] seconds. [(world.timeofday-start_time)/10-amount] calculation lag" - - update_indicators() - - process_updates_early() - set category = "Debug" - if(!air_master) - usr << "Cannot find air_system" - return - - air_master.process_update_tiles() - air_master.process_rebuild_select_groups() - - mark_group_delay() - set category = "Debug" - if(!air_master) - usr << "Cannot find air_system" - return - - for(var/datum/air_group/group in air_master.air_groups) - group.marker = 0 - - for(var/turf/simulated/floor/S in world) - S.icon = 'icons/Testing/turf_analysis.dmi' - if(S.parent) - if(S.parent.group_processing) - if (S.parent.check_delay < 2) - S.parent.marker=1 - else if (S.parent.check_delay < 5) - S.parent.marker=2 - else if (S.parent.check_delay < 15) - S.parent.marker=3 - else if (S.parent.check_delay < 30) - S.parent.marker=4 - else - S.parent.marker=5 - if(S.parent.borders && S.parent.borders.Find(S)) - S.icon_state = "on[S.parent.marker]_border" - else - S.icon_state = "on[S.parent.marker]" - - else - if (S.check_delay < 2) - S.icon_state= "on1_border" - else if (S.check_delay < 5) - S.icon_state= "on2_border" - else if (S.check_delay < 15) - S.icon_state= "on3_border" - else if (S.check_delay < 30) - S.icon_state= "on4_border" - else - S.icon_state = "suspended" - else - if(S.processing) - S.icon_state = "individual_on" - else - S.icon_state = "individual_off" - - - mark_groups() - set category = "Debug" - if(!air_master) - usr << "Cannot find air_system" - return - - for(var/datum/air_group/group in air_master.air_groups) - group.marker = 0 - - for(var/turf/simulated/floor/S in world) - S.icon = 'icons/Testing/turf_analysis.dmi' - if(S.parent) - if(S.parent.group_processing) - if(S.parent.marker == 0) - S.parent.marker = rand(1,5) - if(S.parent.borders && S.parent.borders.Find(S)) - S.icon_state = "on[S.parent.marker]_border" - else - S.icon_state = "on[S.parent.marker]" - - else - S.icon_state = "suspended" - else - if(S.processing) - S.icon_state = "individual_on" - else - S.icon_state = "individual_off" - - get_broken_icons() - set category = "Debug" - getbrokeninhands() - - -/* jump_to_dead_group() Currently in the normal admin commands but fits here - set category = "Debug" - if(!air_master) - usr << "Cannot find air_system" - return - - var/datum/air_group/dead_groups = list() - for(var/datum/air_group/group in air_master.air_groups) - if (!group.group_processing) - dead_groups += group - var/datum/air_group/dest_group = pick(dead_groups) - usr.loc = pick(dest_group.members)*/ diff --git a/code/FEA/FEA_airgroup.dm b/code/FEA/FEA_airgroup.dm deleted file mode 100644 index 94c51102b27..00000000000 --- a/code/FEA/FEA_airgroup.dm +++ /dev/null @@ -1,286 +0,0 @@ -datum/air_group - var/group_processing = 1 //Processing all tiles as one large tile if 1 - - var/datum/gas_mixture/air = new - - var/current_cycle = 0 //cycle that oxygen value represents - var/archived_cycle = 0 //cycle that oxygen_archived value represents - //The use of archived cycle saves processing power by permitting the archiving step of FET - // to be rolled into the updating step - - //optimization vars - var/next_check = 0 //number of ticks before this group updates - var/check_delay = 10 //number of ticks between updates, starts fairly high to get boring groups out of the way - - proc/members() - //Returns the members of the group - proc/process_group() - - - var/list/borders //Tiles that connect this group to other groups/individual tiles - var/list/members //All tiles in this group - - var/list/space_borders - var/length_space_border = 0 - - - proc/suspend_group_processing() - group_processing = 0 - update_tiles_from_group() - check_delay=0 - next_check=0 - - - //Copy group air information to individual tile air - //Used right before turning on group processing - proc/update_group_from_tiles() - var/sample_member = pick(members) - var/datum/gas_mixture/sample_air = sample_member:air - - air.copy_from(sample_air) - air.group_multiplier = members.len - return 1 - - - //Copy group air information to individual tile air - //Used right before turning off group processing - proc/update_tiles_from_group() - for(var/member in members) - member:air.copy_from(air) - if (istype(member,/turf/simulated)) - var/turf/simulated/turfmem=member - turfmem.reset_delay() - - - proc/archive() - air.archive() - archived_cycle = air_master.current_cycle - - - //If individually processing tiles, checks all member tiles to see if they are close enough that the group may resume group processing - //Warning: Do not call, called by air_master.process() - proc/check_regroup() - //Purpose: Checks to see if group processing should be turned back on - //Returns: group_processing - if(prevent_airgroup_regroup) - return 0 - - if(group_processing) return 1 - - var/turf/simulated/sample = pick(members) - for(var/member in members) - if(member:active_hotspot) - return 0 - if(member:air.compare(sample.air)) continue - else - return 0 - - update_group_from_tiles() - group_processing = 1 - return 1 - - -//Look into this - turf/process_group() - current_cycle = air_master.current_cycle - if(!group_processing) //Revert to individual processing then end - for(var/T in members) - var/turf/simulated/member = T - member.process_cell() - return - - //check if we're skipping this tick - if (next_check > 0) - next_check-- - return 1 - var/player_count = max(player_list.len, 3) / 3 - next_check += check_delay + rand(player_count, player_count * 1.5) - check_delay++ - - var/turf/simulated/list/border_individual = list() - var/datum/air_group/list/border_group = list() - - var/turf/simulated/list/enemies = list() //used to send the appropriate border tile of a group to the group proc - var/turf/simulated/list/self_group_borders = list() - var/turf/simulated/list/self_tile_borders = list() - - if(archived_cycle < air_master.current_cycle) - archive() - //Archive air data for use in calculations - //But only if another group didn't store it for us - - for(var/turf/simulated/border_tile in src.borders) - for(var/direction in cardinal) //Go through all border tiles and get bordering groups and individuals - if(border_tile.group_border&direction) - var/turf/simulated/enemy_tile = get_step(border_tile, direction) //Add found tile to appropriate category - if(istype(enemy_tile) && enemy_tile.parent && enemy_tile.parent.group_processing) - border_group += enemy_tile.parent - enemies += enemy_tile - self_group_borders += border_tile - else - border_individual += enemy_tile - self_tile_borders += border_tile - - var/abort_group = 0 - - // Process connections to adjacent groups - var/border_index = 1 - for(var/datum/air_group/AG in border_group) - if(AG.archived_cycle < archived_cycle) //archive other groups information if it has not been archived yet this cycle - AG.archive() - if(AG.current_cycle < current_cycle) - //This if statement makes sure two groups only process their individual connections once! - //Without it, each connection would be processed a second time as the second group is evaluated - - var/connection_difference = 0 - var/turf/simulated/floor/self_border = self_group_borders[border_index] - var/turf/simulated/floor/enemy_border = enemies[border_index] - - var/result = air.check_gas_mixture(AG.air) - if(result == 1) - connection_difference = air.share(AG.air) - else if(result == -1) - AG.suspend_group_processing() - connection_difference = air.share(enemy_border.air) - else - abort_group = 1 - break - - if(connection_difference) - if(connection_difference > 0) - self_border.consider_pressure_difference(connection_difference, get_dir(self_border,enemy_border)) - else - var/turf/enemy_turf = enemy_border - if(!isturf(enemy_turf)) - enemy_turf = enemy_border.loc - enemy_turf.consider_pressure_difference(-connection_difference, get_dir(enemy_turf,self_border)) - - border_index++ - - // Process connections to adjacent tiles - border_index = 1 - if(!abort_group) - for(var/atom/enemy_tile in border_individual) - var/connection_difference = 0 - var/turf/simulated/floor/self_border = self_tile_borders[border_index] - - if(istype(enemy_tile, /turf/simulated)) - if(enemy_tile:archived_cycle < archived_cycle) //archive tile information if not already done - enemy_tile:archive() - if(enemy_tile:current_cycle < current_cycle) - if(air.check_gas_mixture(enemy_tile:air)) - connection_difference = air.share(enemy_tile:air) - else - abort_group = 1 - break - else if(isturf(enemy_tile)) - if(air.check_turf(enemy_tile)) - connection_difference = air.mimic(enemy_tile) - else - abort_group = 1 - break - - if(connection_difference) - if(connection_difference > 0) - self_border.consider_pressure_difference(connection_difference, get_dir(self_border,enemy_tile)) - else - var/turf/enemy_turf = enemy_tile - if(!isturf(enemy_turf)) - enemy_turf = enemy_tile.loc - enemy_turf.consider_pressure_difference(-connection_difference, get_dir(enemy_tile,enemy_turf)) - - // Process connections to space - border_index = 1 - if(!abort_group) - if(length_space_border > 0) - var/turf/space/sample = locate() - var/connection_difference = 0 - - if(air.check_turf(sample)) - connection_difference = air.mimic(sample, length_space_border) - else - abort_group = 1 - - if(connection_difference) - for(var/turf/simulated/self_border in space_borders) - self_border.consider_pressure_difference_space(connection_difference) - - if(abort_group) - suspend_group_processing() - else - if(air.check_tile_graphic()) - for(var/T in members) - var/turf/simulated/member = T - member.update_visuals(air) - - - if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - for(var/T in members) - var/turf/simulated/member = T - member.hotspot_expose(air.temperature, CELL_VOLUME) - member.consider_superconductivity(starting=1) - - air.react() - return - - - - object/process_group() - current_cycle = air_master.current_cycle - - if(!group_processing) return //See if processing this group as a group - - var/turf/simulated/list/border_individual = list() - var/datum/air_group/list/border_group = list() - - var/turf/simulated/list/enemies = list() //used to send the appropriate border tile of a group to the group proc - var/enemy_index = 1 - - if(archived_cycle < air_master.current_cycle) - archive() - //Archive air data for use in calculations - //But only if another group didn't store it for us - - enemy_index = 1 - var/abort_group = 0 - for(var/datum/air_group/AG in border_group) - if(AG.archived_cycle < archived_cycle) //archive other groups information if it has not been archived yet this cycle - AG.archive() - if(AG.current_cycle < current_cycle) - //This if statement makes sure two groups only process their individual connections once! - //Without it, each connection would be processed a second time as the second group is evaluated - - var/result = air.check_gas_mixture(AG.air) - if(result == 1) - air.share(AG.air) - else if(result == -1) - AG.suspend_group_processing() - var/turf/simulated/floor/enemy_border = enemies[enemy_index] - air.share(enemy_border.air) - else - abort_group = 0 - break - enemy_index++ - - if(!abort_group) - for(var/enemy_tile in border_individual) - if(istype(enemy_tile, /turf/simulated)) - if(enemy_tile:archived_cycle < archived_cycle) //archive tile information if not already done - enemy_tile:archive() - if(enemy_tile:current_cycle < current_cycle) - if(air.check_gas_mixture(enemy_tile:air)) - air.share(enemy_tile:air) - else - abort_group = 1 - break - else - if(air.check_turf(enemy_tile)) - air.mimic(enemy_tile) - else - abort_group = 1 - break - - if(abort_group) - suspend_group_processing() - - return \ No newline at end of file diff --git a/code/FEA/FEA_fire.dm b/code/FEA/FEA_fire.dm deleted file mode 100644 index fe18350da04..00000000000 --- a/code/FEA/FEA_fire.dm +++ /dev/null @@ -1,178 +0,0 @@ - -/atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - return null - - - -/turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) - - - -/turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) - var/datum/gas_mixture/air_contents = return_air() - if(!air_contents) - return 0 - if(active_hotspot) - if(soh) - if(air_contents.toxins > 0.5 && air_contents.oxygen > 0.5) - if(active_hotspot.temperature < exposed_temperature) - active_hotspot.temperature = exposed_temperature - if(active_hotspot.volume < exposed_volume) - active_hotspot.volume = exposed_volume - return 1 - - var/igniting = 0 - - if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && air_contents.toxins > 0.5) - igniting = 1 - - if(igniting) - if(air_contents.oxygen < 0.5 || air_contents.toxins < 0.5) - return 0 - - if(parent&&parent.group_processing) - parent.suspend_group_processing() - - active_hotspot = new(src) - active_hotspot.temperature = exposed_temperature - active_hotspot.volume = exposed_volume - - active_hotspot.just_spawned = (current_cycle < air_master.current_cycle) - //remove just_spawned protection if no longer processing this cell - - //start processing quickly if we aren't already - reset_delay() - - return igniting - -//This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile -/obj/effect/hotspot - anchored = 1 - mouse_opacity = 0 - unacidable = 1//So you can't melt fire with acid. - icon = 'icons/effects/fire.dmi' - icon_state = "1" - layer = TURF_LAYER - luminosity = 3 - - var/volume = 125 - var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - var/just_spawned = 1 - var/bypassing = 0 - - -/obj/effect/hotspot/proc/perform_exposure() - var/turf/simulated/floor/location = loc - if(!istype(location)) return 0 - - if(volume > CELL_VOLUME*0.95) bypassing = 1 - else bypassing = 0 - - if(bypassing) - if(!just_spawned) - volume = location.air.fuel_burnt*FIRE_GROWTH_RATE - temperature = location.air.temperature - else - var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume) - affected.temperature = temperature - affected.react() - temperature = affected.temperature - volume = affected.fuel_burnt*FIRE_GROWTH_RATE - location.assume_air(affected) - - for(var/atom/item in loc) - if(!bypassing) - item.temperature_expose(null, temperature, volume) - if(item) // It's possible that the item is deleted in temperature_expose - item.fire_act(null, temperature, volume) - - return 0 - - -/obj/effect/hotspot/process(turf/simulated/list/possible_spread) - if(just_spawned) - just_spawned = 0 - return 0 - - var/turf/simulated/floor/location = loc - if(!istype(location)) - Kill() - return - - if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1)) - Kill() - return - - if(location.air.toxins < 0.5 || location.air.oxygen < 0.5) - Kill() - return - - perform_exposure() - - if(location.wet) location.wet = 0 - - if(bypassing) - icon_state = "3" - location.burn_tile() - - //Possible spread due to radiated heat - if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD) - var/radiated_temperature = location.air.temperature*FIRE_SPREAD_RADIOSITY_SCALE - - for(var/turf/simulated/possible_target in possible_spread) - if(!possible_target.active_hotspot) - possible_target.hotspot_expose(radiated_temperature, CELL_VOLUME/4) - - else - if(volume > CELL_VOLUME*0.4) - icon_state = "2" - else - icon_state = "1" - - if(temperature > location.max_fire_temperature_sustained) - location.max_fire_temperature_sustained = temperature - - if(location.heat_capacity && temperature > location.heat_capacity) - location.to_be_destroyed = 1 - /*if(prob(25)) - location.ReplaceWithSpace() - return 0*/ - return 1 - -// Garbage collect itself by nulling reference to it - -/obj/effect/hotspot/proc/Kill() - DestroyTurf() - if(istype(loc, /turf/simulated)) - var/turf/simulated/T = loc - if(T.active_hotspot == src) - T.active_hotspot = null - loc = null - -/obj/effect/hotspot/proc/DestroyTurf() - - if(istype(loc, /turf/simulated)) - var/turf/simulated/T = loc - if(T.to_be_destroyed) - var/chance_of_deletion - if (T.heat_capacity) //beware of division by zero - chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0 - else - chance_of_deletion = 100 - if(prob(chance_of_deletion)) - T.ChangeTurf(/turf/space) - else - T.to_be_destroyed = 0 - T.max_fire_temperature_sustained = 0 - -/obj/effect/hotspot/New() - ..() - set_dir(pick(cardinal)) - return - -/* -/obj/effect/hotspot/Destroy() - if (istype(loc, /turf/simulated)) - DestroyTurf() - ..() -*/ \ No newline at end of file diff --git a/code/FEA/FEA_gas_mixture.dm b/code/FEA/FEA_gas_mixture.dm deleted file mode 100644 index a2a1af194e4..00000000000 --- a/code/FEA/FEA_gas_mixture.dm +++ /dev/null @@ -1,933 +0,0 @@ -/* -What are the archived variables for? - Calculations are done using the archived variables with the results merged into the regular variables. - This prevents race conditions that arise based on the order of tile processing. -*/ - -#define SPECIFIC_HEAT_TOXIN 200 -#define SPECIFIC_HEAT_AIR 20 -#define SPECIFIC_HEAT_CDO 30 -#define HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins) \ - (carbon_dioxide*SPECIFIC_HEAT_CDO + (oxygen+nitrogen)*SPECIFIC_HEAT_AIR + toxins*SPECIFIC_HEAT_TOXIN) - -#define MINIMUM_HEAT_CAPACITY 0.0003 -#define QUANTIZE(variable) (round(variable,0.0001)) - -/datum/gas - sleeping_agent - specific_heat = 40 - - oxygen_agent_b - specific_heat = 300 - - volatile_fuel - specific_heat = 30 - - var/moles = 0 - var/specific_heat = 0 - - var/moles_archived = 0 - - -/datum/gas_mixture - var/oxygen = 0 - var/carbon_dioxide = 0 - var/nitrogen = 0 - var/toxins = 0 - - var/volume = CELL_VOLUME - - var/temperature = 0 //in Kelvin, use calculate_temperature() to modify - - var/group_multiplier = 1 - //Size of the group this gas_mixture is representing. - //=1 for singletons - - var/graphic - - var/list/datum/gas/trace_gases = list() - - - var/tmp/oxygen_archived - var/tmp/carbon_dioxide_archived - var/tmp/nitrogen_archived - var/tmp/toxins_archived - - var/tmp/temperature_archived - - var/tmp/graphic_archived - var/tmp/fuel_burnt = 0 - - //PV=nRT - related procedures - proc/heat_capacity() - var/heat_capacity = HEAT_CAPACITY_CALCULATION(oxygen,carbon_dioxide,nitrogen,toxins) - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - heat_capacity += trace_gas.moles*trace_gas.specific_heat - return heat_capacity - - - proc/heat_capacity_archived() - var/heat_capacity_archived = HEAT_CAPACITY_CALCULATION(oxygen_archived,carbon_dioxide_archived,nitrogen_archived,toxins_archived) - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - heat_capacity_archived += trace_gas.moles_archived*trace_gas.specific_heat - return heat_capacity_archived - - - proc/total_moles() - var/moles = oxygen + carbon_dioxide + nitrogen + toxins - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - moles += trace_gas.moles - return moles - - - proc/return_pressure() - if(volume>0) - return total_moles()*R_IDEAL_GAS_EQUATION*temperature/volume - return 0 - - - proc/return_temperature() - return temperature - - - proc/return_volume() - return max(0, volume) - - - proc/thermal_energy() - return temperature*heat_capacity() - - - //Procedures used for very specific events - proc/check_tile_graphic() - //returns 1 if graphic changed - graphic = null - if(toxins > MOLES_PLASMA_VISIBLE) - graphic = "plasma" - else - var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in trace_gases - if(sleeping_agent && (sleeping_agent.moles > 1)) - graphic = "sleeping_agent" - else - graphic = null - - return graphic != graphic_archived - - proc/react(atom/dump_location) - var/reacting = 0 //set to 1 if a notable reaction occured (used by pipe_network) - - if(trace_gases.len > 0) - if(temperature > 900) - if(toxins > MINIMUM_HEAT_CAPACITY && carbon_dioxide > MINIMUM_HEAT_CAPACITY) - var/datum/gas/oxygen_agent_b/trace_gas = locate(/datum/gas/oxygen_agent_b/) in trace_gases - if(trace_gas) - var/reaction_rate = min(carbon_dioxide*0.75, toxins*0.25, trace_gas.moles*0.05) - - carbon_dioxide -= reaction_rate - oxygen += reaction_rate - - trace_gas.moles -= reaction_rate*0.05 - - temperature -= (reaction_rate*20000)/heat_capacity() - - reacting = 1 - - fuel_burnt = 0 - if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - //world << "pre [temperature], [oxygen], [toxins]" - if(fire() > 0) - reacting = 1 - //world << "post [temperature], [oxygen], [toxins]" - - return reacting - - proc/fire() - var/energy_released = 0 - var/old_heat_capacity = heat_capacity() - - var/datum/gas/volatile_fuel/fuel_store = locate(/datum/gas/volatile_fuel/) in trace_gases - if(fuel_store) //General volatile gas burn - var/burned_fuel = 0 - - if(oxygen < fuel_store.moles) - burned_fuel = oxygen - fuel_store.moles -= burned_fuel - oxygen = 0 - else - burned_fuel = fuel_store.moles - oxygen -= fuel_store.moles - trace_gases -= fuel_store - fuel_store = null - - energy_released += FIRE_CARBON_ENERGY_RELEASED * burned_fuel - carbon_dioxide += burned_fuel - fuel_burnt += burned_fuel - - //Handle plasma burning - if(toxins > MINIMUM_HEAT_CAPACITY) - var/plasma_burn_rate = 0 - var/oxygen_burn_rate = 0 - //more plasma released at higher temperatures - var/temperature_scale - if(temperature > PLASMA_UPPER_TEMPERATURE) - temperature_scale = 1 - else - temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) - if(temperature_scale > 0) - oxygen_burn_rate = 1.4 - temperature_scale - if(oxygen > toxins*PLASMA_OXYGEN_FULLBURN) - plasma_burn_rate = (toxins*temperature_scale)/4 - else - plasma_burn_rate = (temperature_scale*(oxygen/PLASMA_OXYGEN_FULLBURN))/4 - if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) - toxins -= plasma_burn_rate - oxygen -= plasma_burn_rate*oxygen_burn_rate - carbon_dioxide += plasma_burn_rate - - energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) - - fuel_burnt += (plasma_burn_rate)*(1+oxygen_burn_rate) - - if(energy_released > 0) - var/new_heat_capacity = heat_capacity() - if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) - temperature = (temperature*old_heat_capacity + energy_released)/new_heat_capacity - - return fuel_burnt - - proc/archive() - //Update archived versions of variables - //Returns: 1 in all cases - - proc/merge(datum/gas_mixture/giver) - //Merges all air from giver into self. Deletes giver. - //Returns: 1 on success (no failure cases yet) - - proc/check_then_merge(datum/gas_mixture/giver) - //Similar to merge(...) but first checks to see if the amount of air assumed is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: 1 on successful merge, 0 if the check failed - - proc/remove(amount) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed - - proc/remove_ratio(ratio) - //Proportionally removes amount of gas from the gas_mixture - //Returns: gas_mixture with the gases removed - - proc/subtract(datum/gas_mixture/right_side) - //Subtracts right_side from air_mixture. Used to help turfs mingle - - proc/check_then_remove(amount) - //Similar to remove(...) but first checks to see if the amount of air removed is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: gas_mixture with the gases removed or null - - proc/copy_from(datum/gas_mixture/sample) - //Copies variables from sample - - proc/share(datum/gas_mixture/sharer) - //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length - //Return: amount of gas exchanged (+ if sharer received) - - proc/mimic(turf/model) - //Similar to share(...), except the model is not modified - //Return: amount of gas exchanged - - proc/check_gas_mixture(datum/gas_mixture/sharer) - //Returns: 0 if the self-check failed then -1 if sharer-check failed then 1 if both checks pass - - proc/check_turf(turf/model) - //Returns: 0 if self-check failed or 1 if check passes - - // check_me_then_share(datum/gas_mixture/sharer) - //Similar to share(...) but first checks to see if amount of air moved is small enough - // that group processing is still accurate for source (aborts if not) - //Returns: 1 on successful share, 0 if the check failed - - // check_me_then_mimic(turf/model) - //Similar to mimic(...) but first checks to see if amount of air moved is small enough - // that group processing is still accurate (aborts if not) - //Returns: 1 on successful mimic, 0 if the check failed - - // check_both_then_share(datum/gas_mixture/sharer) - //Similar to check_me_then_share(...) but also checks to see if amount of air moved is small enough - // that group processing is still accurate for the sharer (aborts if not) - //Returns: 0 if the self-check failed then -1 if sharer-check failed then 1 if successful share - - - proc/temperature_mimic(turf/model, conduction_coefficient) - - proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - - proc/temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - - - proc/check_me_then_temperature_mimic(turf/model, conduction_coefficient) - - proc/check_me_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - - proc/check_both_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - - proc/check_me_then_temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - - proc/compare(datum/gas_mixture/sample) - //Compares sample to self to see if within acceptable ranges that group processing may be enabled - - archive() - oxygen_archived = oxygen - carbon_dioxide_archived = carbon_dioxide - nitrogen_archived = nitrogen - toxins_archived = toxins - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - trace_gas.moles_archived = trace_gas.moles - - temperature_archived = temperature - - graphic_archived = graphic - - return 1 - - check_then_merge(datum/gas_mixture/giver) - if(!giver) - return 0 - if(((giver.oxygen > MINIMUM_AIR_TO_SUSPEND) && (giver.oxygen >= oxygen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.carbon_dioxide > MINIMUM_AIR_TO_SUSPEND) && (giver.carbon_dioxide >= carbon_dioxide*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.nitrogen > MINIMUM_AIR_TO_SUSPEND) && (giver.nitrogen >= nitrogen*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((giver.toxins > MINIMUM_AIR_TO_SUSPEND) && (giver.toxins >= toxins*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - if(abs(giver.temperature - temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 - - if(giver.trace_gases.len) - for(var/datum/gas/trace_gas in giver.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if((trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) && (!corresponding || (trace_gas.moles >= corresponding.moles*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - - return merge(giver) - - merge(datum/gas_mixture/giver) - if(!giver) - return 0 - - if(abs(temperature-giver.temperature)>MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity()*group_multiplier - var/giver_heat_capacity = giver.heat_capacity()*giver.group_multiplier - var/combined_heat_capacity = giver_heat_capacity + self_heat_capacity - if(combined_heat_capacity != 0) - temperature = (giver.temperature*giver_heat_capacity + temperature*self_heat_capacity)/combined_heat_capacity - - if((group_multiplier>1)||(giver.group_multiplier>1)) - oxygen += giver.oxygen*giver.group_multiplier/group_multiplier - carbon_dioxide += giver.carbon_dioxide*giver.group_multiplier/group_multiplier - nitrogen += giver.nitrogen*giver.group_multiplier/group_multiplier - toxins += giver.toxins*giver.group_multiplier/group_multiplier - else - oxygen += giver.oxygen - carbon_dioxide += giver.carbon_dioxide - nitrogen += giver.nitrogen - toxins += giver.toxins - - if(giver.trace_gases.len) - for(var/datum/gas/trace_gas in giver.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - trace_gases += corresponding - corresponding.moles += trace_gas.moles*giver.group_multiplier/group_multiplier - - // qdel(giver) - return 1 - - remove(amount) - - var/sum = total_moles() - amount = min(amount,sum) //Can not take more air than tile has! - if(amount <= 0) - return null - - var/datum/gas_mixture/removed = new - - - removed.oxygen = QUANTIZE((oxygen/sum)*amount) - removed.nitrogen = QUANTIZE((nitrogen/sum)*amount) - removed.carbon_dioxide = QUANTIZE((carbon_dioxide/sum)*amount) - removed.toxins = QUANTIZE((toxins/sum)*amount) - - oxygen -= removed.oxygen/group_multiplier - nitrogen -= removed.nitrogen/group_multiplier - carbon_dioxide -= removed.carbon_dioxide/group_multiplier - toxins -= removed.toxins/group_multiplier - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - removed.trace_gases += corresponding - - corresponding.moles = (trace_gas.moles/sum)*amount - trace_gas.moles -= corresponding.moles/group_multiplier - - removed.temperature = temperature - - return removed - - remove_ratio(ratio) - - if(ratio <= 0) - return null - - ratio = min(ratio, 1) - - var/datum/gas_mixture/removed = new - - removed.oxygen = QUANTIZE(oxygen*ratio) - removed.nitrogen = QUANTIZE(nitrogen*ratio) - removed.carbon_dioxide = QUANTIZE(carbon_dioxide*ratio) - removed.toxins = QUANTIZE(toxins*ratio) - - oxygen -= removed.oxygen/group_multiplier - nitrogen -= removed.nitrogen/group_multiplier - carbon_dioxide -= removed.carbon_dioxide/group_multiplier - toxins -= removed.toxins/group_multiplier - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - removed.trace_gases += corresponding - - corresponding.moles = trace_gas.moles*ratio - trace_gas.moles -= corresponding.moles/group_multiplier - - removed.temperature = temperature - - return removed - - check_then_remove(amount) - - //Since it is all proportional, the check may be done on the gas as a whole - var/sum = total_moles() - amount = min(amount,sum) //Can not take more air than tile has! - - if((amount > MINIMUM_AIR_RATIO_TO_SUSPEND) && (amount > sum*MINIMUM_AIR_RATIO_TO_SUSPEND)) - return 0 - - return remove(amount) - - copy_from(datum/gas_mixture/sample) - oxygen = sample.oxygen - carbon_dioxide = sample.carbon_dioxide - nitrogen = sample.nitrogen - toxins = sample.toxins - - trace_gases.len=null - if(sample.trace_gases.len > 0) - for(var/datum/gas/trace_gas in sample.trace_gases) - var/datum/gas/corresponding = new trace_gas.type() - trace_gases += corresponding - - corresponding.moles = trace_gas.moles - - temperature = sample.temperature - - return 1 - - subtract(datum/gas_mixture/right_side) - oxygen -= right_side.oxygen - carbon_dioxide -= right_side.carbon_dioxide - nitrogen -= right_side.nitrogen - toxins -= right_side.toxins - - if((trace_gases.len > 0)||(right_side.trace_gases.len > 0)) - for(var/datum/gas/trace_gas in right_side.trace_gases) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(!corresponding) - corresponding = new trace_gas.type() - trace_gases += corresponding - - corresponding.moles -= trace_gas.moles - - return 1 - - check_gas_mixture(datum/gas_mixture/sharer) - if(!sharer) return 0 - var/delta_oxygen = (oxygen_archived - sharer.oxygen_archived)/5 - var/delta_carbon_dioxide = (carbon_dioxide_archived - sharer.carbon_dioxide_archived)/5 - var/delta_nitrogen = (nitrogen_archived - sharer.nitrogen_archived)/5 - var/delta_toxins = (toxins_archived - sharer.toxins_archived)/5 - - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 - - if(sharer.trace_gases.len) - for(var/datum/gas/trace_gas in sharer.trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(corresponding) - if(trace_gas.moles_archived >= corresponding.moles_archived*MINIMUM_AIR_RATIO_TO_SUSPEND*4) - return 0 - else - return 0 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - if(!locate(trace_gas.type) in sharer.trace_gases) - return 0 - - if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= sharer.oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= sharer.carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= sharer.nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= sharer.toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return -1 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases - if(corresponding) - if(trace_gas.moles_archived >= corresponding.moles_archived*MINIMUM_AIR_RATIO_TO_SUSPEND*4) - return -1 - else - return -1 - - return 1 - - check_turf(turf/model) - var/delta_oxygen = (oxygen_archived - model.oxygen)/5 - var/delta_carbon_dioxide = (carbon_dioxide_archived - model.carbon_dioxide)/5 - var/delta_nitrogen = (nitrogen_archived - model.nitrogen)/5 - var/delta_toxins = (toxins_archived - model.toxins)/5 - - var/delta_temperature = (temperature_archived - model.temperature) - - if(((abs(delta_oxygen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_oxygen) >= oxygen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_carbon_dioxide) >= carbon_dioxide_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= nitrogen_archived*MINIMUM_AIR_RATIO_TO_SUSPEND)) \ - || ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= toxins_archived*MINIMUM_AIR_RATIO_TO_SUSPEND))) - return 0 - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) - return 0 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND*4) - return 0 - - return 1 - - share(datum/gas_mixture/sharer) - if(!sharer) return 0 - var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/5 - var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/5 - var/delta_nitrogen = QUANTIZE(nitrogen_archived - sharer.nitrogen_archived)/5 - var/delta_toxins = QUANTIZE(toxins_archived - sharer.toxins_archived)/5 - - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - var/old_self_heat_capacity = 0 - var/old_sharer_heat_capacity = 0 - - var/heat_capacity_self_to_sharer = 0 - var/heat_capacity_sharer_to_self = 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - - var/delta_air = delta_oxygen+delta_nitrogen - if(delta_air) - var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air - if(delta_air > 0) - heat_capacity_self_to_sharer += air_heat_capacity - else - heat_capacity_sharer_to_self -= air_heat_capacity - - if(delta_carbon_dioxide) - var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide - if(delta_carbon_dioxide > 0) - heat_capacity_self_to_sharer += carbon_dioxide_heat_capacity - else - heat_capacity_sharer_to_self -= carbon_dioxide_heat_capacity - - if(delta_toxins) - var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins - if(delta_toxins > 0) - heat_capacity_self_to_sharer += toxins_heat_capacity - else - heat_capacity_sharer_to_self -= toxins_heat_capacity - - old_self_heat_capacity = heat_capacity()*group_multiplier - old_sharer_heat_capacity = sharer.heat_capacity()*sharer.group_multiplier - - oxygen -= delta_oxygen/group_multiplier - sharer.oxygen += delta_oxygen/sharer.group_multiplier - - carbon_dioxide -= delta_carbon_dioxide/group_multiplier - sharer.carbon_dioxide += delta_carbon_dioxide/sharer.group_multiplier - - nitrogen -= delta_nitrogen/group_multiplier - sharer.nitrogen += delta_nitrogen/sharer.group_multiplier - - toxins -= delta_toxins/group_multiplier - sharer.toxins += delta_toxins/sharer.group_multiplier - - var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins) - - var/list/trace_types_considered = list() - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - - var/datum/gas/corresponding = locate(trace_gas.type) in sharer.trace_gases - var/delta = 0 - - if(corresponding) - delta = QUANTIZE(trace_gas.moles_archived - corresponding.moles_archived)/5 - else - corresponding = new trace_gas.type() - sharer.trace_gases += corresponding - - delta = trace_gas.moles_archived/5 - - trace_gas.moles -= delta/group_multiplier - corresponding.moles += delta/sharer.group_multiplier - - if(delta) - var/individual_heat_capacity = trace_gas.specific_heat*delta - if(delta > 0) - heat_capacity_self_to_sharer += individual_heat_capacity - else - heat_capacity_sharer_to_self -= individual_heat_capacity - - moved_moles += delta - - trace_types_considered += trace_gas.type - - - if(sharer.trace_gases.len) - for(var/datum/gas/trace_gas in sharer.trace_gases) - if(trace_gas.type in trace_types_considered) continue - else - var/datum/gas/corresponding - var/delta = 0 - - corresponding = new trace_gas.type() - trace_gases += corresponding - - delta = trace_gas.moles_archived/5 - - trace_gas.moles -= delta/sharer.group_multiplier - corresponding.moles += delta/group_multiplier - - //Guaranteed transfer from sharer to self - var/individual_heat_capacity = trace_gas.specific_heat*delta - heat_capacity_sharer_to_self += individual_heat_capacity - - moved_moles += -delta - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer - var/new_sharer_heat_capacity = old_sharer_heat_capacity + heat_capacity_self_to_sharer - heat_capacity_sharer_to_self - - if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) - temperature = (old_self_heat_capacity*temperature - heat_capacity_self_to_sharer*temperature_archived + heat_capacity_sharer_to_self*sharer.temperature_archived)/new_self_heat_capacity - - if(new_sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) - sharer.temperature = (old_sharer_heat_capacity*sharer.temperature-heat_capacity_sharer_to_self*sharer.temperature_archived + heat_capacity_self_to_sharer*temperature_archived)/new_sharer_heat_capacity - - if(abs(old_sharer_heat_capacity) > MINIMUM_HEAT_CAPACITY) - if(abs(new_sharer_heat_capacity/old_sharer_heat_capacity - 1) < 0.10) // <10% change in sharer heat capacity - temperature_share(sharer, OPEN_HEAT_TRANSFER_COEFFICIENT) - - if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) - var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - sharer.temperature_archived*(sharer.total_moles() - moved_moles) - return delta_pressure*R_IDEAL_GAS_EQUATION/volume - - else - return 0 - - mimic(turf/model, border_multiplier) - var/delta_oxygen = QUANTIZE(oxygen_archived - model.oxygen)/5 - var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - model.carbon_dioxide)/5 - var/delta_nitrogen = QUANTIZE(nitrogen_archived - model.nitrogen)/5 - var/delta_toxins = QUANTIZE(toxins_archived - model.toxins)/5 - - var/delta_temperature = (temperature_archived - model.temperature) - - var/heat_transferred = 0 - var/old_self_heat_capacity = 0 - var/heat_capacity_transferred = 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - - var/delta_air = delta_oxygen+delta_nitrogen - if(delta_air) - var/air_heat_capacity = SPECIFIC_HEAT_AIR*delta_air - heat_transferred -= air_heat_capacity*model.temperature - heat_capacity_transferred -= air_heat_capacity - - if(delta_carbon_dioxide) - var/carbon_dioxide_heat_capacity = SPECIFIC_HEAT_CDO*delta_carbon_dioxide - heat_transferred -= carbon_dioxide_heat_capacity*model.temperature - heat_capacity_transferred -= carbon_dioxide_heat_capacity - - if(delta_toxins) - var/toxins_heat_capacity = SPECIFIC_HEAT_TOXIN*delta_toxins - heat_transferred -= toxins_heat_capacity*model.temperature - heat_capacity_transferred -= toxins_heat_capacity - - old_self_heat_capacity = heat_capacity()*group_multiplier - - if(border_multiplier) - oxygen -= delta_oxygen*border_multiplier/group_multiplier - carbon_dioxide -= delta_carbon_dioxide*border_multiplier/group_multiplier - nitrogen -= delta_nitrogen*border_multiplier/group_multiplier - toxins -= delta_toxins*border_multiplier/group_multiplier - else - oxygen -= delta_oxygen/group_multiplier - carbon_dioxide -= delta_carbon_dioxide/group_multiplier - nitrogen -= delta_nitrogen/group_multiplier - toxins -= delta_toxins/group_multiplier - - var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins) - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - var/delta = 0 - - delta = trace_gas.moles_archived/5 - - if(border_multiplier) - trace_gas.moles -= delta*border_multiplier/group_multiplier - else - trace_gas.moles -= delta/group_multiplier - - var/heat_cap_transferred = delta*trace_gas.specific_heat - heat_transferred += heat_cap_transferred*temperature_archived - heat_capacity_transferred += heat_cap_transferred - moved_moles += delta - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/new_self_heat_capacity = old_self_heat_capacity - heat_capacity_transferred - if(new_self_heat_capacity > MINIMUM_HEAT_CAPACITY) - if(border_multiplier) - temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*border_multiplier*temperature_archived)/new_self_heat_capacity - else - temperature = (old_self_heat_capacity*temperature - heat_capacity_transferred*border_multiplier*temperature_archived)/new_self_heat_capacity - - temperature_mimic(model, model.thermal_conductivity, border_multiplier) - - if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) - var/delta_pressure = temperature_archived*(total_moles() + moved_moles) - model.temperature*(model.oxygen+model.carbon_dioxide+model.nitrogen+model.toxins) - return delta_pressure*R_IDEAL_GAS_EQUATION/volume - else - return 0 - - check_both_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - var/self_heat_capacity = heat_capacity_archived() - var/sharer_heat_capacity = sharer.heat_capacity_archived() - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/(self_heat_capacity*group_multiplier) - sharer_temperature_delta = heat/(sharer_heat_capacity*sharer.group_multiplier) - else - return 1 - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - if((abs(sharer_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(sharer_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*sharer.temperature_archived)) - return -1 - - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta - - return 1 - //Logic integrated from: temperature_share(sharer, conduction_coefficient) for efficiency - - check_me_then_temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - - var/self_heat_capacity = heat_capacity_archived() - var/sharer_heat_capacity = sharer.heat_capacity_archived() - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/(self_heat_capacity*group_multiplier) - sharer_temperature_delta = heat/(sharer_heat_capacity*sharer.group_multiplier) - else - return 1 - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta - - return 1 - //Logic integrated from: temperature_share(sharer, conduction_coefficient) for efficiency - - check_me_then_temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature) - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() - - if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity)) - - self_temperature_delta = -heat/(self_heat_capacity*group_multiplier) - sharer_temperature_delta = heat/sharer.heat_capacity - else - return 1 - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - temperature += self_temperature_delta - sharer.temperature += sharer_temperature_delta - - return 1 - //Logic integrated from: temperature_turf_share(sharer, conduction_coefficient) for efficiency - - check_me_then_temperature_mimic(turf/model, conduction_coefficient) - var/delta_temperature = (temperature_archived - model.temperature) - var/self_temperature_delta = 0 - - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() - - if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity)) - - self_temperature_delta = -heat/(self_heat_capacity*group_multiplier) - - if((abs(self_temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) \ - && (abs(self_temperature_delta) > MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND*temperature_archived)) - return 0 - - temperature += self_temperature_delta - - return 1 - //Logic integrated from: temperature_mimic(model, conduction_coefficient) for efficiency - - temperature_share(datum/gas_mixture/sharer, conduction_coefficient) - - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity_archived() - var/sharer_heat_capacity = sharer.heat_capacity_archived() - - if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer_heat_capacity/(self_heat_capacity+sharer_heat_capacity)) - - temperature -= heat/(self_heat_capacity*group_multiplier) - sharer.temperature += heat/(sharer_heat_capacity*sharer.group_multiplier) - - temperature_mimic(turf/model, conduction_coefficient, border_multiplier) - var/delta_temperature = (temperature - model.temperature) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity()//_archived() - - if((model.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*model.heat_capacity/(self_heat_capacity+model.heat_capacity)) - - if(border_multiplier) - temperature -= heat*border_multiplier/(self_heat_capacity*group_multiplier) - else - temperature -= heat/(self_heat_capacity*group_multiplier) - - temperature_turf_share(turf/simulated/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) - var/self_heat_capacity = heat_capacity() - - if((sharer.heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY)) - var/heat = conduction_coefficient*delta_temperature* \ - (self_heat_capacity*sharer.heat_capacity/(self_heat_capacity+sharer.heat_capacity)) - - temperature -= heat/(self_heat_capacity*group_multiplier) - sharer.temperature += heat/sharer.heat_capacity - - compare(datum/gas_mixture/sample) - if((abs(oxygen-sample.oxygen) > MINIMUM_AIR_TO_SUSPEND) && \ - ((oxygen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.oxygen))) - return 0 - if((abs(nitrogen-sample.nitrogen) > MINIMUM_AIR_TO_SUSPEND) && \ - ((nitrogen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen) || (nitrogen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen))) - return 0 - if((abs(carbon_dioxide-sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \ - ((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide))) - return 0 - if((abs(toxins-sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \ - ((toxins < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins) || (toxins > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins))) - return 0 - - if(total_moles() > MINIMUM_AIR_TO_SUSPEND) - if((abs(temperature-sample.temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \ - ((temperature < (1-MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature) || (temperature > (1+MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND)*sample.temperature))) - //world << "temp fail [temperature] & [sample.temperature]" - return 0 - - if(sample.trace_gases.len) - for(var/datum/gas/trace_gas in sample.trace_gases) - if(trace_gas.moles_archived > MINIMUM_AIR_TO_SUSPEND) - var/datum/gas/corresponding = locate(trace_gas.type) in trace_gases - if(corresponding) - if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ - ((corresponding.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles) || (corresponding.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*trace_gas.moles))) - return 0 - else - return 0 - - if(trace_gases.len) - for(var/datum/gas/trace_gas in trace_gases) - if(trace_gas.moles > MINIMUM_AIR_TO_SUSPEND) - var/datum/gas/corresponding = locate(trace_gas.type) in sample.trace_gases - if(corresponding) - if((abs(trace_gas.moles - corresponding.moles) > MINIMUM_AIR_TO_SUSPEND) && \ - ((trace_gas.moles < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles) || (trace_gas.moles > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*corresponding.moles))) - return 0 - else - return 0 - return 1 \ No newline at end of file diff --git a/code/FEA/FEA_group_helpers.dm b/code/FEA/FEA_group_helpers.dm deleted file mode 100644 index c803d6ef95e..00000000000 --- a/code/FEA/FEA_group_helpers.dm +++ /dev/null @@ -1,101 +0,0 @@ -/turf/simulated/proc/find_group() - //Basically, join any nearby valid groups - // If more than one, pick one with most members at my borders - // If can not find any but there was an ungrouped at border with me, call for group assembly - - var/turf/simulated/floor/north = get_step(src,NORTH) - var/turf/simulated/floor/south = get_step(src,SOUTH) - var/turf/simulated/floor/east = get_step(src,EAST) - var/turf/simulated/floor/west = get_step(src,WEST) - - //Clear those we do not have access to - if(!CanPass(null, north, null, 1) || !istype(north)) - north = null - if(!CanPass(null, south, null, 1) || !istype(south)) - south = null - if(!CanPass(null, east, null, 1) || !istype(east)) - east = null - if(!CanPass(null, west, null, 1) || !istype(west)) - west = null - - var/new_group_possible = 0 - - var/north_votes = 0 - var/south_votes = 0 - var/east_votes = 0 - - if(north) - if(north.parent) - north_votes = 1 - - if(south && (south.parent == north.parent)) - north_votes++ - south = null - - if(east && (east.parent == north.parent)) - north_votes++ - east = null - - if(west && (west.parent == north.parent)) - north_votes++ - west = null - else - new_group_possible = 1 - - if(south) - if(south.parent) - south_votes = 1 - - if(east && (east.parent == south.parent)) - south_votes++ - east = null - - if(west && (west.parent == south.parent)) - south_votes++ - west = null - else - new_group_possible = 1 - - if(east) - if(east.parent) - east_votes = 1 - - if(west && (west.parent == east.parent)) - east_votes++ - west = null - else - new_group_possible = 1 - -// world << "[north_votes], [south_votes], [east_votes]" - - var/datum/air_group/group_joined = null - - if(west) - if(west.parent) - group_joined = west.parent - else - new_group_possible = 1 - - if(north_votes && (north_votes >= south_votes) && (north_votes >= east_votes)) - group_joined = north.parent - else if(south_votes && (south_votes >= east_votes)) - group_joined = south.parent - else if(east_votes) - group_joined = east.parent - - if (istype(group_joined)) - if (group_joined.group_processing) - group_joined.suspend_group_processing() - group_joined.members += src - parent=group_joined - - air_master.tiles_to_update += group_joined.members - return 1 - - else if(new_group_possible) - air_master.assemble_group_turf(src) - return 1 - - else - air_master.active_singletons += src - return 1 \ No newline at end of file diff --git a/code/FEA/FEA_system.dm b/code/FEA/FEA_system.dm deleted file mode 100644 index 6a3dfe0f8b2..00000000000 --- a/code/FEA/FEA_system.dm +++ /dev/null @@ -1,335 +0,0 @@ -/* -Overview: - The air_master global variable is the workhorse for the system. - -Why are you archiving data before modifying it? - The general concept with archiving data and having each tile keep track of when they were last updated is to keep everything symmetric - and totally independent of the order they are read in an update cycle. - This prevents abnormalities like air/fire spreading rapidly in one direction and super slowly in the other. - -Why not just archive everything and then calculate? - Efficiency. While a for-loop that goes through all tiles and groups to archive their information before doing any calculations seems simple, it is - slightly less efficient than the archive-before-modify/read method. - -Why is there a cycle check for calculating data as well? - This ensures that every connection between group-tile, tile-tile, and group-group is only evaluated once per loop. - - - - -Important variables: - air_master.groups_to_rebuild (list) - A list of air groups that have had their geometry occluded and thus may need to be split in half. - A set of adjacent groups put in here will join together if validly connected. - This is done before air system calculations for a cycle. - air_master.tiles_to_update (list) - Turfs that are in this list have their border data updated before the next air calculations for a cycle. - Place turfs in this list rather than call the proc directly to prevent race conditions - - turf/simulated.archive() and datum/air_group.archive() - This stores all data for. - If you modify, make sure to update the archived_cycle to prevent race conditions and maintain symmetry - - atom/CanPass(atom/movable/mover, turf/target, height, air_group) - returns 1 for allow pass and 0 for deny pass - Turfs automatically call this for all objects/mobs in its turf. - This is called both as source.CanPass(target, height, air_group) - and target.CanPass(source, height, air_group) - - Cases for the parameters - 1. This is called with args (mover, location, height>0, air_group=0) for normal objects. - 2. This is called with args (null, location, height=0, air_group=0) for flowing air. - 3. This is called with args (null, location, height=?, air_group=1) for determining group boundaries. - - Cases 2 and 3 would be different for doors or other objects open and close fairly often. - (Case 3 would return 0 always while Case 2 would return 0 only when the door is open) - This prevents the necessity of re-evaluating group geometry every time a door opens/closes. - - -Important Procedures - air_master.process() - This first processes the air_master update/rebuild lists then processes all groups and tiles for air calculations - - -*/ - -var/kill_air = 0 - -atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) - return (!density || !height || air_group) - -turf - CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) - if(!target) return 0 - - if(istype(mover)) // turf/Enter(...) will perform more advanced checks - return !density - - else // Now, doing more detailed checks for air movement and air group formation - if(target.blocks_air||blocks_air) - return 0 - - for(var/obj/obstacle in src) - if(!obstacle.CanPass(mover, target, height, air_group)) - return 0 - for(var/obj/obstacle in target) - if(!obstacle.CanPass(mover, src, height, air_group)) - return 0 - - return 1 - - -var/global/datum/controller/air_system/air_master - -datum - controller - air_system - //Geoemetry lists - var/list/datum/air_group/air_groups = list() - var/list/turf/simulated/active_singletons = list() - - //Special functions lists - var/list/turf/simulated/active_super_conductivity = list() - var/list/turf/simulated/high_pressure_delta = list() - - //Geometry updates lists - var/list/turf/simulated/tiles_to_update = list() - var/list/turf/simulated/groups_to_rebuild = list() - - var/current_cycle = 0 - - proc - setup() - //Call this at the start to setup air groups geometry - //Warning: Very processor intensive but only must be done once per round - - assemble_group_turf(turf/simulated/base) - //Call this to try to construct a group starting from base and merging with neighboring unparented tiles - //Expands the group until all valid borders explored - -// assemble_group_object(obj/movable/floor/base) - - process() - //Call this to process air movements for a cycle - - process_groups() - //Used by process() - //Warning: Do not call this - - process_singletons() - //Used by process() - //Warning: Do not call this - - process_high_pressure_delta() - //Used by process() - //Warning: Do not call this - - process_super_conductivity() - //Used by process() - //Warning: Do not call this - - process_update_tiles() - //Used by process() - //Warning: Do not call this - - process_rebuild_select_groups() - //Used by process() - //Warning: Do not call this - - rebuild_group(datum/air_group) - //Used by process_rebuild_select_groups() - //Warning: Do not call this, add the group to air_master.groups_to_rebuild instead - - add_singleton(turf/simulated/T) - if(!active_singletons.Find(T)) - active_singletons += T - - setup() - set background = 1 - world << "\red \b Processing Geometry..." - sleep(1) - - var/start_time = world.timeofday - - for(var/turf/simulated/S in world) - if(!S.blocks_air && !S.parent) - assemble_group_turf(S) - S.update_air_properties() - - world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!" - - assemble_group_turf(turf/simulated/base) - - var/list/turf/simulated/members = list(base) //Confirmed group members - var/list/turf/simulated/possible_members = list(base) //Possible places for group expansion - var/list/turf/simulated/possible_borders = list() - var/list/turf/simulated/possible_space_borders = list() - var/possible_space_length = 0 - - while(possible_members.len>0) //Keep expanding, looking for new members - for(var/turf/simulated/test in possible_members) - test.length_space_border = 0 - for(var/direction in cardinal) - var/turf/T = get_step(test,direction) - if(T && !members.Find(T) && test.CanPass(null, T, null,1)) - if(istype(T,/turf/simulated) && !T:parent) - possible_members += T - members += T - else if(istype(T,/turf/space)) - possible_space_borders -= test - possible_space_borders += test - test.length_space_border++ - else - possible_borders -= test - possible_borders += test - if(test.length_space_border > 0) - possible_space_length += test.length_space_border - possible_members -= test - - if(members.len > 1) - var/datum/air_group/turf/group = new - if(possible_borders.len>0) - group.borders = possible_borders - if(possible_space_borders.len>0) - group.space_borders = possible_space_borders - group.length_space_border = possible_space_length - - for(var/turf/simulated/test in members) - test.parent = group - test.processing = 0 - active_singletons -= test - - group.members = members - air_groups += group - - group.update_group_from_tiles() //Initialize air group variables - return group - else - base.processing = 0 //singletons at startup are technically unconnected anyway - base.parent = null - - if(base.air.check_tile_graphic()) - base.update_visuals(base.air) - - return null -/* - assemble_group_object(obj/movable/floor/base) - - var/list/obj/movable/floor/members = list(base) //Confirmed group members - var/list/obj/movable/floor/possible_members = list(base) //Possible places for group expansion - var/list/obj/movable/floor/possible_borders = list() - - while(possible_members.len>0) //Keep expanding, looking for new members - for(var/obj/movable/floor/test in possible_members) - for(var/direction in list(NORTH, SOUTH, EAST, WEST)) - var/turf/T = get_step(test.loc,direction) - if(T && test.loc.CanPass(null, T, null, 1)) - var/obj/movable/floor/O = locate(/obj/movable/floor) in T - if(istype(O) && !O.parent) - if(!members.Find(O)) - possible_members += O - members += O - else - possible_borders -= test - possible_borders += test - possible_members -= test - - if(members.len > 1) - var/datum/air_group/object/group = new - if(possible_borders.len>0) - group.borders = possible_borders - - for(var/obj/movable/floor/test in members) - test.parent = group - test.processing = 0 - active_singletons -= test - - group.members = members - air_groups += group - - group.update_group_from_tiles() //Initialize air group variables - return group - else - base.processing = 0 //singletons at startup are technically unconnected anyway - base.parent = null - - return null -*/ - process() - if(kill_air) - return 1 - current_cycle++ - if(groups_to_rebuild.len > 0) process_rebuild_select_groups() - if(tiles_to_update.len > 0) process_update_tiles() - - process_groups() - process_singletons() - - process_super_conductivity() - process_high_pressure_delta() - - if(current_cycle%10==5) //Check for groups of tiles to resume group processing every 10 cycles - for(var/datum/air_group/AG in air_groups) - AG.check_regroup() - - return 1 - - process_update_tiles() - for(var/turf/simulated/T in tiles_to_update) - T.update_air_properties() -/* - for(var/obj/movable/floor/O in tiles_to_update) - O.update_air_properties() -*/ - tiles_to_update.len = 0 - - process_rebuild_select_groups() - var/turf/list/turfs = list() - - for(var/datum/air_group/turf/turf_AG in groups_to_rebuild) //Deconstruct groups, gathering their old members - for(var/turf in turf_AG.members) - var/turf/simulated/T = turf - T.parent = null - turfs += T - qdel(turf_AG) - - for(var/turf/simulated/S in turfs) //Have old members try to form new groups - if(!S.parent) - assemble_group_turf(S) - for(var/turf/simulated/S in turfs) - S.update_air_properties() - -// var/obj/movable/list/movable_objects = list() - -// for(var/datum/air_group/object/object_AG in groups_to_rebuild) //Deconstruct groups, gathering their old members -/* - for(var/obj/movable/floor/OM in object_AG.members) - OM.parent = null - movable_objects += OM - qdel(object_AG) - - for(var/obj/movable/floor/OM in movable_objects) //Have old members try to form new groups - if(!OM.parent) - assemble_group_object(OM) - for(var/obj/movable/floor/OM in movable_objects) - OM.update_air_properties() -*/ - groups_to_rebuild.len = 0 - - process_groups() - for(var/datum/air_group/AG in air_groups) - AG.process_group() - - process_singletons() - for(var/item in active_singletons) - item:process_cell() - - process_super_conductivity() - for(var/turf/simulated/hot_potato in active_super_conductivity) - hot_potato.super_conduct() - - process_high_pressure_delta() - for(var/turf/pressurized in high_pressure_delta) - pressurized.high_pressure_movements() - - high_pressure_delta.len = 0 diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm deleted file mode 100644 index da7b1f856cb..00000000000 --- a/code/FEA/FEA_turf_tile.dm +++ /dev/null @@ -1,560 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -atom/movable/var/pressure_resistance = 5 -atom/movable/var/last_forced_movement = 0 - -atom/movable/proc/experience_pressure_difference(pressure_difference, direction) - if(last_forced_movement >= air_master.current_cycle) - return 0 - else if(!anchored) - if(pressure_difference > pressure_resistance) - last_forced_movement = air_master.current_cycle - spawn step(src, direction) - return 1 - -turf - assume_air(datum/gas_mixture/giver) //use this for machines to adjust air - qdel(giver) - return 0 - - return_air() - //Create gas mixture to hold data for passing - var/datum/gas_mixture/GM = new - - GM.oxygen = oxygen - GM.carbon_dioxide = carbon_dioxide - GM.nitrogen = nitrogen - GM.toxins = toxins - - GM.temperature = temperature - - return GM - - remove_air(amount as num) - var/datum/gas_mixture/GM = new - - var/sum = oxygen + carbon_dioxide + nitrogen + toxins - if(sum>0) - GM.oxygen = (oxygen/sum)*amount - GM.carbon_dioxide = (carbon_dioxide/sum)*amount - GM.nitrogen = (nitrogen/sum)*amount - GM.toxins = (toxins/sum)*amount - - GM.temperature = temperature - - return GM - -turf - var/pressure_difference = 0 - var/pressure_direction = 0 - var/reporting_pressure_difference - - //optimization vars - var/next_check = 0 //number of ticks before this tile updates - var/check_delay = 0 //number of ticks between updates - - proc/high_pressure_movements() - if(reporting_pressure_difference) - world << "pressure_difference = [pressure_difference]; pressure_direction = [pressure_direction]" - for(var/atom/movable/in_tile in src) - in_tile.experience_pressure_difference(pressure_difference, pressure_direction) - - pressure_difference = 0 - - proc/consider_pressure_difference(connection_difference, connection_direction) - if(connection_difference < 0) - connection_difference = -connection_difference - connection_direction = turn(connection_direction,180) - - if(connection_difference > pressure_difference) - if(!pressure_difference) - air_master.high_pressure_delta += src - pressure_difference = connection_difference - pressure_direction = connection_direction - -turf/simulated/proc/consider_pressure_difference_space(connection_difference) - for(var/direction in cardinal) - if(direction&group_border) - if(istype(get_step(src,direction),/turf/space)) - if(!pressure_difference) - air_master.high_pressure_delta += src - pressure_direction = direction - pressure_difference = connection_difference - - - return 1 - - -turf/simulated - - var/current_graphic = null - - var/tmp/datum/gas_mixture/air - - var/tmp/processing = 1 - var/tmp/datum/air_group/turf/parent - var/tmp/group_border = 0 - var/tmp/length_space_border = 0 - - var/tmp/air_check_directions = 0 //Do not modify this, just add turf to air_master.tiles_to_update - - var/tmp/archived_cycle = 0 - var/tmp/current_cycle = 0 - - var/tmp/obj/effect/hotspot/active_hotspot - - var/tmp/temperature_archived //USED ONLY FOR SOLIDS - var/tmp/being_superconductive = 0 - - proc/update_visuals(datum/gas_mixture/model) - overlays.Cut() - - var/siding_icon_state = return_siding_icon_state() - if(siding_icon_state) - overlays += image('icons/turf/floors.dmi',siding_icon_state) - - switch(model.graphic) - if("plasma") - overlays.Add(plmaster) - if("sleeping_agent") - overlays.Add(slmaster) - - - - New() - ..() - - if(!blocks_air) - air = new - - air.oxygen = oxygen - air.carbon_dioxide = carbon_dioxide - air.nitrogen = nitrogen - air.toxins = toxins - - air.temperature = temperature - - if(air_master) - air_master.tiles_to_update.Add(src) - - find_group() - -// air.parent = src //TODO DEBUG REMOVE - - else - if(air_master) - for(var/direction in cardinal) - var/turf/simulated/floor/target = get_step(src,direction) - if(istype(target)) - air_master.tiles_to_update.Add(target) - - Destroy() - if(air_master) - if(parent) - air_master.groups_to_rebuild.Add(parent) - parent.members.Remove(src) - else - air_master.active_singletons.Remove(src) - if(active_hotspot) - active_hotspot.Kill() - if(blocks_air) - for(var/direction in list(NORTH, SOUTH, EAST, WEST)) - var/turf/simulated/tile = get_step(src,direction) - if(istype(tile) && !tile.blocks_air) - air_master.tiles_to_update.Add(tile) - ..() - - assume_air(datum/gas_mixture/giver) - if(!giver) return 0 - var/datum/gas_mixture/receiver = air - if(istype(receiver)) - if(parent&&parent.group_processing) - if(!parent.air.check_then_merge(giver)) - parent.suspend_group_processing() - air.merge(giver) - else - if (giver.total_moles() > MINIMUM_AIR_TO_SUSPEND) - reset_delay() - - air.merge(giver) - - if(!processing) - if(air.check_tile_graphic()) - update_visuals(air) - - return 1 - - else return ..() - - proc/archive() - if(air) //For open space like floors - air.archive() - - temperature_archived = temperature - archived_cycle = air_master.current_cycle - - proc/share_air_with_tile(turf/simulated/T) - return air.share(T.air) - - proc/mimic_air_with_tile(turf/T) - return air.mimic(T) - - return_air() - if(air) - if(parent&&parent.group_processing) - return parent.air - else return air - - else - return ..() - - remove_air(amount as num) - if(air) - var/datum/gas_mixture/removed = null - - if(parent&&parent.group_processing) - removed = parent.air.check_then_remove(amount) - if(!removed) - parent.suspend_group_processing() - removed = air.remove(amount) - else - removed = air.remove(amount) - - if(!processing) - if(air.check_tile_graphic()) - update_visuals(air) - - return removed - - else - return ..() - - proc/update_air_properties()//OPTIMIZE - air_check_directions = 0 - - for(var/direction in cardinal) - if(CanPass(null, get_step(src,direction), 0, 0)) - air_check_directions |= direction - - if(parent) - if(parent.borders) - parent.borders -= src - if(length_space_border > 0) - parent.length_space_border -= length_space_border - length_space_border = 0 - - group_border = 0 - for(var/direction in cardinal) - if(air_check_directions&direction) - var/turf/simulated/T = get_step(src,direction) - - //See if actually a border - if(!istype(T) || (T.parent!=parent)) - - //See what kind of border it is - if(istype(T,/turf/space)) - if(parent.space_borders) - parent.space_borders -= src - parent.space_borders += src - else - parent.space_borders = list(src) - length_space_border++ - - else - if(parent.borders) - parent.borders -= src - parent.borders += src - else - parent.borders = list(src) - - group_border |= direction - - parent.length_space_border += length_space_border - - if(air_check_directions) - processing = 1 - if(!parent) - air_master.add_singleton(src) - else - processing = 0 - - proc/process_cell() - //this proc does all the heavy lifting for individual tile processing - //it shares with all of its neighbors, spreads fire, calls superconduction - //and doesn't afraid of anything - //Comment by errorage: In other words, this is the proc that lags the game. - - //check if we're skipping this tick - if (next_check > 0) - next_check-- - return 1 - var/player_count = max(player_list.len, 3) / 3 - next_check += check_delay + rand(player_count, player_count * 1.5) - check_delay++ - - var/turf/simulated/list/possible_fire_spreads = list() - if(processing) - if(archived_cycle < air_master.current_cycle) //archive self if not already done - archive() - current_cycle = air_master.current_cycle - - for(var/direction in cardinal) - if(air_check_directions&direction) //Grab all valid bordering tiles - var/turf/simulated/enemy_tile = get_step(src, direction) - var/connection_difference = 0 - - if(istype(enemy_tile)) //enemy_tile == neighbor, btw - if(enemy_tile.archived_cycle < archived_cycle) //archive bordering tile information if not already done - enemy_tile.archive() - - if (air && enemy_tile.air) - var/delay_trigger = air.compare(enemy_tile.air) - if (!delay_trigger) //if compare() didn't return 1, air is different enough to trigger processing - reset_delay() - enemy_tile.reset_delay() - - if(enemy_tile.parent && enemy_tile.parent.group_processing) //apply tile to group sharing - if(enemy_tile.parent.current_cycle < current_cycle) //if the group hasn't been archived, it could just be out of date - if(enemy_tile.parent.air.check_gas_mixture(air)) - connection_difference = air.share(enemy_tile.parent.air) - else - enemy_tile.parent.suspend_group_processing() - connection_difference = air.share(enemy_tile.air) - //group processing failed so interact with individual tile - - else - if(enemy_tile.current_cycle < current_cycle) - connection_difference = air.share(enemy_tile.air) - - if(active_hotspot) - possible_fire_spreads += enemy_tile - else -/* var/obj/movable/floor/movable_on_enemy = locate(/obj/movable/floor) in enemy_tile - - if(movable_on_enemy) - if(movable_on_enemy.parent && movable_on_enemy.parent.group_processing) //apply tile to group sharing - if(movable_on_enemy.parent.current_cycle < current_cycle) - if(movable_on_enemy.parent.air.check_gas_mixture(air)) - connection_difference = air.share(movable_on_enemy.parent.air) - - else - movable_on_enemy.parent.suspend_group_processing() - - if(movable_on_enemy.archived_cycle < archived_cycle) //archive bordering tile information if not already done - movable_on_enemy.archive() - connection_difference = air.share(movable_on_enemy.air) - //group processing failed so interact with individual tile - else - if(movable_on_enemy.archived_cycle < archived_cycle) //archive bordering tile information if not already done - movable_on_enemy.archive() - - if(movable_on_enemy.current_cycle < current_cycle) - connection_difference = share_air_with_tile(movable_on_enemy) - - else*/ - connection_difference = mimic_air_with_tile(enemy_tile) - //bordering a tile with fixed air properties - - if(connection_difference) - if(connection_difference > 0) - consider_pressure_difference(connection_difference, direction) - else - enemy_tile.consider_pressure_difference(connection_difference, direction) - else - air_master.active_singletons -= src //not active if not processing! - - air.react() - - if(active_hotspot) - if (!active_hotspot.process(possible_fire_spreads)) - return 0 - - if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) - consider_superconductivity(starting = 1) - - if(air.check_tile_graphic()) - update_visuals(air) - - if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - reset_delay() //hotspots always process quickly - hotspot_expose(air.temperature, CELL_VOLUME) - for(var/atom/movable/item in src) - item.temperature_expose(air, air.temperature, CELL_VOLUME) - temperature_expose(air, air.temperature, CELL_VOLUME) - - return 1 - - proc/super_conduct() - var/conductivity_directions = 0 - if(blocks_air) - //Does not participate in air exchange, so will conduct heat across all four borders at this time - conductivity_directions = NORTH|SOUTH|EAST|WEST - - if(archived_cycle < air_master.current_cycle) - archive() - - else - //Does particate in air exchange so only consider directions not considered during process_cell() - conductivity_directions = ~air_check_directions & (NORTH|SOUTH|EAST|WEST) - - if(conductivity_directions>0) - //Conduct with tiles around me - for(var/direction in cardinal) - if(conductivity_directions&direction) - var/turf/neighbor = get_step(src,direction) - - if(istype(neighbor, /turf/simulated)) //anything under this subtype will share in the exchange - var/turf/simulated/modeled_neighbor = neighbor - - if(modeled_neighbor.archived_cycle < air_master.current_cycle) - modeled_neighbor.archive() - - if(modeled_neighbor.air) - if(air) //Both tiles are open - - if(modeled_neighbor.parent && modeled_neighbor.parent.group_processing) - if(parent && parent.group_processing) - //both are acting as a group - //modified using construct developed in datum/air_group/share_air_with_group(...) - - var/result = parent.air.check_both_then_temperature_share(modeled_neighbor.parent.air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - if(result==0) - //have to deconstruct parent air group - - parent.suspend_group_processing() - if(!modeled_neighbor.parent.air.check_me_then_temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT)) - //may have to deconstruct neighbors air group - - modeled_neighbor.parent.suspend_group_processing() - air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - else if(result==-1) - // have to deconstruct neightbors air group but not mine - - modeled_neighbor.parent.suspend_group_processing() - parent.air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - else - air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - else - if(parent && parent.group_processing) - if(!parent.air.check_me_then_temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT)) - //may have to deconstruct neighbors air group - - parent.suspend_group_processing() - air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - - else - air.temperature_share(modeled_neighbor.air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - // world << "OPEN, OPEN" - - else //Solid but neighbor is open - if(modeled_neighbor.parent && modeled_neighbor.parent.group_processing) - if(!modeled_neighbor.parent.air.check_me_then_temperature_turf_share(src, modeled_neighbor.thermal_conductivity)) - - modeled_neighbor.parent.suspend_group_processing() - modeled_neighbor.air.temperature_turf_share(src, modeled_neighbor.thermal_conductivity) - else - modeled_neighbor.air.temperature_turf_share(src, modeled_neighbor.thermal_conductivity) - // world << "SOLID, OPEN" - - else - if(air) //Open but neighbor is solid - if(parent && parent.group_processing) - if(!parent.air.check_me_then_temperature_turf_share(modeled_neighbor, modeled_neighbor.thermal_conductivity)) - parent.suspend_group_processing() - air.temperature_turf_share(modeled_neighbor, modeled_neighbor.thermal_conductivity) - else - air.temperature_turf_share(modeled_neighbor, modeled_neighbor.thermal_conductivity) - // world << "OPEN, SOLID" - - else //Both tiles are solid - share_temperature_mutual_solid(modeled_neighbor, modeled_neighbor.thermal_conductivity) - // world << "SOLID, SOLID" - - modeled_neighbor.consider_superconductivity() - - else - if(air) //Open - if(parent && parent.group_processing) - if(!parent.air.check_me_then_temperature_mimic(neighbor, neighbor.thermal_conductivity)) - parent.suspend_group_processing() - air.temperature_mimic(neighbor, neighbor.thermal_conductivity) - else - air.temperature_mimic(neighbor, neighbor.thermal_conductivity) - else - mimic_temperature_solid(neighbor, neighbor.thermal_conductivity) - - //Radiate excess tile heat to space - if(temperature > T0C) - // Is there a pre-defined Space Tile? - if(!Space_Tile) - Space_Tile = locate(/turf/space) // Define one - //Considering 0 degC as te break even point for radiation in and out - mimic_temperature_solid(Space_Tile, FLOOR_HEAT_TRANSFER_COEFFICIENT) - - //Conduct with air on my tile if I have it - if(air) - if(parent && parent.group_processing) - if(!parent.air.check_me_then_temperature_turf_share(src, thermal_conductivity)) - parent.suspend_group_processing() - air.temperature_turf_share(src, thermal_conductivity) - else - air.temperature_turf_share(src, thermal_conductivity) - - - //Make sure still hot enough to continue conducting heat - if(air) - if(air.temperature < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) - being_superconductive = 0 - air_master.active_super_conductivity -= src - return 0 - - else - if(temperature < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) - being_superconductive = 0 - air_master.active_super_conductivity -= src - return 0 - - proc/mimic_temperature_solid(turf/model, conduction_coefficient) - var/delta_temperature = (temperature_archived - model.temperature) - if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) - - var/heat = conduction_coefficient*delta_temperature* \ - (heat_capacity*model.heat_capacity/(heat_capacity+model.heat_capacity)) - temperature -= heat/heat_capacity - - proc/share_temperature_mutual_solid(turf/simulated/sharer, conduction_coefficient) - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity) - - var/heat = conduction_coefficient*delta_temperature* \ - (heat_capacity*sharer.heat_capacity/(heat_capacity+sharer.heat_capacity)) - - temperature -= heat/heat_capacity - sharer.temperature += heat/sharer.heat_capacity - - proc/consider_superconductivity(starting) - - if(being_superconductive || !thermal_conductivity) - return 0 - - if(air) - if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return 0 - if(air.heat_capacity() < MOLES_CELLSTANDARD*0.1*0.05) - return 0 - else - if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return 0 - - being_superconductive = 1 - - air_master.active_super_conductivity += src - - proc/reset_delay() - //sets this turf to process quickly again - next_check=0 - check_delay= -5 //negative numbers mean a mandatory quick-update period - - //if this turf has a parent air group, suspend its processing - if (parent && parent.group_processing) - parent.suspend_group_processing() diff --git a/code/TriDimension/Movement.dm b/code/TriDimension/Movement.dm deleted file mode 100644 index 5f451a1038d..00000000000 --- a/code/TriDimension/Movement.dm +++ /dev/null @@ -1,52 +0,0 @@ -/obj/item/weapon/tank/jetpack/verb/moveup() - set name = "Move Upwards" - set category = "Object" - if(allow_thrust(0.01, usr)) - var/turf/controllerlocation = locate(1, 1, usr.z) - var/legal = 0 - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - legal = controller.up - if (controller.up) - var/turf/T = locate(usr.x, usr.y, controller.up_target) - if(T && (istype(T, /turf/space) || istype(T, /turf/simulated/floor/open))) - var/blocked = 0 - for(var/atom/A in T.contents) - if(A.density) - blocked = 1 - usr << "\red You bump into [A.name]." - break - if(!blocked) - usr.Move(T) - usr << "You move upwards." - else - usr << "\red There is something in your way." - if (legal == 0) - usr << "There is nothing of interest in this direction." - return 1 - -/obj/item/weapon/tank/jetpack/verb/movedown() - set name = "Move Downwards" - set category = "Object" - if(allow_thrust(0.01, usr)) - var/turf/controllerlocation = locate(1, 1, usr.z) - var/legal = 0 - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - legal = controller.down - if (controller.down == 1) - var/turf/T = locate(usr.x, usr.y, controller.down_target) - var/turf/S = locate(usr.x, usr.y, usr.z) - if(T && (istype(S, /turf/space) || istype(S, /turf/simulated/floor/open))) - var/blocked = 0 - for(var/atom/A in T.contents) - if(A.density) - blocked = 1 - usr << "\red You bump into [A.name]." - break - if(!blocked) - usr.Move(T) - usr << "You move downwards." - else - usr << "\red You cant move through the floor." - if (legal == 0) - usr << "There is nothing of interest in this direction." - return 1 diff --git a/code/TriDimension/Structures.dm b/code/TriDimension/Structures.dm deleted file mode 100644 index cf216274bbf..00000000000 --- a/code/TriDimension/Structures.dm +++ /dev/null @@ -1,274 +0,0 @@ -/////////////////////////////////////// -//Contents: Ladders, Hatches, Stairs.// -/////////////////////////////////////// - -/obj/multiz - icon = 'icons/obj/structures.dmi' - density = 0 - opacity = 0 - anchored = 1 - - CanPass(obj/mover, turf/source, height, airflow) - return airflow || !density - -/obj/multiz/ladder - icon_state = "ladderdown" - name = "ladder" - desc = "A ladder. You climb up and down it." - - var/d_state = 1 - var/obj/multiz/target - - New() - . = ..() - - proc/connect() - if(icon_state == "ladderdown") // the upper will connect to the lower - d_state = 1 - 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/multiz/ladder/L in below) - if(L.icon_state == "ladderup") - target = L - L.target = src - d_state = 0 - break - return - -/* ex_act(severity) - switch(severity) - if(1.0) - if(icon_state == "ladderup" && prob(10)) - qdel(src) - if(2.0) - if(prob(50)) - qdel(src) - if(3.0) - qdel(src) - return*/ - - Destroy() - spawn(1) - if(target && icon_state == "ladderdown") - qdel(target) - return ..() - - attackby(obj/item/C as obj, mob/user as mob) - (..) - -// construction commented out for balance concerns -/* if (!target && istype(C, /obj/item/stack/rods)) - var/turf/controllerlocation = locate(1, 1, z) - var/found = 0 - var/obj/item/stack/rods/S = C - if(S.amount < 2) - user << "You dont have enough rods to finish the ladder." - return - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - found = 1 - var/turf/below = locate(src.x, src.y, controller.down_target) - var/blocked = 0 - for(var/atom/A in below.contents) - if(A.density) - blocked = 1 - break - 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) qdel(S) - X.icon_state = "ladderup" - connect() - user << "You finish the ladder." - else - user << "The area below is blocked." - if(!found) - user << "You cant build a ladder down there." - return - - else if (icon_state == "ladderdown" && d_state == 0 && istype(C, /obj/item/weapon/wrench)) - user << "You start loosening the anchoring bolts which secure the ladder to the frame." - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - - sleep(30) - if(!user || !C) return - - src.d_state = 1 - if(target) - var/obj/item/stack/rods/R = PoolOrNew(/obj/item/stack/rods, target.loc) - R.amount = 2 - qdel(Target) - - user << "You remove the bolts anchoring the ladder." - return - - else if (icon_state == "ladderdown" && d_state == 1 && istype(C, /obj/item/weapon/weldingtool) ) - var/obj/item/weapon/weldingtool/WT = C - if( WT.remove_fuel(0,user) ) - - user << "You begin to remove the ladder." - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - - sleep(60) - if(!user || !WT || !WT.isOn()) return - - var/obj/item/stack/material/steel/S = new /obj/item/stack/material/steel( src ) - S.amount = 2 - user << "You remove the ladder and close the hole." - qdel(src) - else - user << "You need more welding fuel to complete this task." - return - - else - src.attack_hand(user) - return*/ - src.attack_hand(user) - return - - attack_hand(var/mob/M) - if(!target || !istype(target.loc, /turf)) - M << "The ladder is incomplete and can't be climbed." - else - var/turf/T = target.loc - var/blocked = 0 - for(var/atom/A in T.contents) - if(A.density) - blocked = 1 - break - if(blocked || istype(T, /turf/simulated/wall)) - M << "Something is blocking the ladder." - else - M.visible_message("\blue \The [M] climbs [src.icon_state == "ladderup" ? "up" : "down"] \the [src]!", "You climb [src.icon_state == "ladderup" ? "up" : "down"] \the [src]!", "You hear some grunting, and clanging of a metal ladder being used.") - M.Move(target.loc) - -/* hatch - icon_state = "hatchdown" - name = "hatch" - desc = "A hatch. You climb down it, and it will automatically seal against pressure loss behind you." - top_icon_state = "hatchdown" - var/top_icon_state_open = "hatchdown-open" - var/top_icon_state_close = "hatchdown-close" - - bottom_icon_state = "ladderup" - - var/image/green_overlay - var/image/red_overlay - - var/active = 0 - - New() - . = ..() - red_overlay = image(icon, "red-ladderlight") - green_overlay = image(icon, "green-ladderlight") - - attack_hand(var/mob/M) - - if(!target || !istype(target.loc, /turf)) - qdel(src) - - if(active) - M << "That [src] is being used." - return // It is a tiny airlock, only one at a time. - - active = 1 - var/obj/multiz/ladder/hatch/top_hatch = target - var/obj/multiz/ladder/hatch/bottom_hatch = src - if(icon_state == top_icon_state) - top_hatch = src - bottom_hatch = target - - flick(top_icon_state_open, top_hatch) - bottom_hatch.overlays += green_overlay - - spawn(7) - if(!target || !istype(target.loc, /turf)) - 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.") - M.Move(target.loc) - flick(top_icon_state_close,top_hatch) - bottom_hatch.overlays -= green_overlay - bottom_hatch.overlays += red_overlay - - spawn(7) - top_hatch.icon_state = top_icon_state - bottom_hatch.overlays -= red_overlay - active = 0*/ - -/obj/multiz/stairs - name = "Stairs" - desc = "Stairs. You walk up and down them." - icon_state = "rampbottom" - var/obj/multiz/stairs/connected - var/turf/target - var/turf/target2 - var/suggest_dir // try this dir first when finding stairs; this is the direction to walk *down* the stairs - - New() - ..() - var/turf/cl= locate(1, 1, src.z) - for(var/obj/effect/landmark/zcontroller/c in cl) - if(c.up) - var/turf/O = locate(src.x, src.y, c.up_target) - if(istype(O, /turf/space)) - O.ChangeTurf(/turf/simulated/floor/open) - - spawn(1) - var/turf/T - if(suggest_dir) - T = get_step(src.loc,suggest_dir) - find_stair_connection(T, suggest_dir, 1) - if(!target) - for(var/dir in cardinal) - T = get_step(src.loc,dir) - find_stair_connection(T, dir) - if(target) - break - - Bumped(var/atom/movable/M) - if(connected && target && istype(src, /obj/multiz/stairs) && locate(/obj/multiz/stairs) in M.loc) - var/obj/multiz/stairs/Con = locate(/obj/multiz/stairs) in M.loc - if(Con == src.connected) //make sure the atom enters from the approriate lower stairs tile - M.Move(target) - return - - proc/find_stair_connection(var/turf/T, var/dir, var/suggested=0) - for(var/obj/multiz/stairs/S in T) - if(S && S.icon_state == "rampbottom" && !S.connected) - if(!S.suggest_dir || S.suggest_dir == dir) // it doesn't have a suggested direction, or it's the same direction as we're trying, so we connect to it - initialise_stair_connection(src, S, dir) - else if(!suggested) // we're trying directions, so it could be a reverse stair (i.e. we're the bottom stair rather than the top) - var/inv_dir = 0 - switch(dir) - if(1) - inv_dir = 2 - if(2) - inv_dir = 1 - if(4) - inv_dir = 8 - if(8) - inv_dir = 4 - if(S.suggest_dir == inv_dir) - initialise_stair_connection(S, src, inv_dir) - - proc/initialise_stair_connection(var/obj/multiz/stairs/top, var/obj/multiz/stairs/bottom, var/dir) - top.set_dir(dir) - bottom.set_dir(dir) - top.connected = bottom - bottom.connected = top - top.icon_state = "ramptop" - top.density = 1 - var/turf/controllerlocation = locate(1, 1, top.z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up) - var/turf/above = locate(top.x, top.y, controller.up_target) - if(istype(above,/turf/space) || istype(above,/turf/simulated/floor/open)) - top.target = above - var/turf/above2 = locate(bottom.x, bottom.y, controller.up_target) - if(istype(above2, /turf/space) || istype(above,/turf/simulated/floor/open)) - top.target2 = above2 - return \ No newline at end of file diff --git a/code/TriDimension/Structures_presets.dm b/code/TriDimension/Structures_presets.dm deleted file mode 100644 index 7a28efe2112..00000000000 --- a/code/TriDimension/Structures_presets.dm +++ /dev/null @@ -1,11 +0,0 @@ -/obj/multiz/stairs/north_up - suggest_dir = SOUTH - -/obj/multiz/stairs/south_up - suggest_dir = NORTH - -/obj/multiz/stairs/east_up - suggest_dir = WEST - -/obj/multiz/stairs/west_up - suggest_dir = EAST \ No newline at end of file diff --git a/code/TriDimension/Turfs.dm b/code/TriDimension/Turfs.dm deleted file mode 100644 index 12f7bc7c124..00000000000 --- a/code/TriDimension/Turfs.dm +++ /dev/null @@ -1,130 +0,0 @@ -/turf/simulated/floor/open - name = "open space" - intact = 0 - density = 0 - icon_state = "black" - pathweight = 100000 //Seriously, don't try and path over this one numbnuts - var/icon/darkoverlays = null - var/turf/floorbelow - var/list/overlay_references - - New() - ..() - getbelow() - return - - Enter(var/atom/movable/AM) - if (..()) //TODO make this check if gravity is active (future use) - Sukasa - spawn(1) - // only fall down in defined areas (read: areas with artificial gravitiy) - if(!floorbelow) //make sure that there is actually something below - if(!getbelow()) - return - if(AM) - var/area/areacheck = get_area(src) - var/blocked = 0 - var/soft = 0 - for(var/atom/A in floorbelow.contents) - if(A.density) - if(istype(A, /obj/structure/window)) - var/obj/structure/window/W = A - blocked = W.is_fulltile() - if(blocked) - break - else - blocked = 1 - break - if(istype(A, /obj/machinery/atmospherics/pipe/zpipe/up) && istype(AM,/obj/item/pipe)) - blocked = 1 - break - if(istype(A, /obj/structure/disposalpipe/up) && istype(AM,/obj/item/pipe)) - blocked = 1 - break - if(istype(A, /obj/multiz/stairs)) - soft = 1 - //dont break here, since we still need to be sure that it isnt blocked - - if (soft || (!blocked && !(areacheck.name == "Space"))) - AM.Move(floorbelow) - if (!soft && istype(AM, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - var/damage = 5 - H.apply_damage(min(rand(-damage,damage),0), BRUTE, "head") - H.apply_damage(min(rand(-damage,damage),0), BRUTE, "chest") - H.apply_damage(min(rand(-damage,damage),0), BRUTE, "l_leg") - H.apply_damage(min(rand(-damage,damage),0), BRUTE, "r_leg") - H.apply_damage(min(rand(-damage,damage),0), BRUTE, "l_arm") - H.apply_damage(min(rand(-damage,damage),0), BRUTE, "r_arm") - H:weakened = max(H:weakened,2) - H:updatehealth() - return ..() - -/turf/proc/hasbelow() - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - return 1 - return 0 - -/turf/simulated/floor/open/proc/getbelow() - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - // check if there is something to draw below - if(!controller.down) - src.ChangeTurf(/turf/space) - return 0 - else - floorbelow = locate(src.x, src.y, controller.down_target) - return 1 - return 1 - -// override to make sure nothing is hidden -/turf/simulated/floor/open/levelupdate() - for(var/obj/O in src) - if(O.level == 1) - O.hide(0) - -//overwrite the attackby of space to transform it to openspace if necessary -/turf/space/attackby(obj/item/C as obj, mob/user as mob) - if (istype(C, /obj/item/stack/cable_coil) && src.hasbelow()) - var/turf/simulated/floor/open/W = src.ChangeTurf(/turf/simulated/floor/open) - W.attackby(C, user) - return - ..() - -/turf/simulated/floor/open/ex_act(severity) - // cant destroy empty space with an ordinary bomb - return - -/turf/simulated/floor/open/attackby(obj/item/C as obj, mob/user as mob) - (..) - if (istype(C, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/cable = C - cable.turf_place(src, user) - return - - if (istype(C, /obj/item/stack/rods)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return - var/obj/item/stack/rods/R = C - if (R.use(1)) - user << "\blue Constructing support lattice ..." - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) - ReplaceWithLattice() - return - - if (istype(C, /obj/item/stack/tile/steel)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - var/obj/item/stack/tile/steel/S = C - if (S.get_amount() < 1) - return - qdel(L) - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1) - S.build(src) - S.use(1) - return - else - user << "\red The plating is going to need some support." - return diff --git a/code/TriDimension/controller.dm b/code/TriDimension/controller.dm deleted file mode 100644 index 7feed3ed093..00000000000 --- a/code/TriDimension/controller.dm +++ /dev/null @@ -1,253 +0,0 @@ -/obj/effect/landmark/zcontroller - name = "Z-Level Controller" - var/initialized = 0 // when set to 1, turfs will report to the controller - var/up = 0 // 1 allows up movement - var/up_target = 0 // the Z-level that is above the current one - var/down = 0 // 1 allows down movement - var/down_target = 0 // the Z-level that is below the current one - - var/list/slow = list() - var/list/normal = list() - var/list/fast = list() - - var/slow_time - var/normal_time - var/fast_time - -/obj/effect/landmark/zcontroller/New() - ..() - for (var/turf/T in world) - if (T.z == z) - fast += T - slow_time = world.time + 3000 - normal_time = world.time + 600 - fast_time = world.time + 10 - - processing_objects.Add(src) - - initialized = 1 - return 1 - -/obj/effect/landmark/zcontroller/Destroy() - processing_objects.Remove(src) - return ..() - -/obj/effect/landmark/zcontroller/process() - if (world.time > fast_time) - calc(fast) - fast_time = world.time + 10 - - if (world.time > normal_time) - calc(normal) - normal_time = world.time + 600 - -/* if (world.time > slow_time) - calc(slow) - slow_time = world.time + 3000 */ - return - -/obj/effect/landmark/zcontroller/proc/add(var/list/L, var/I, var/transfer) - while (L.len) - var/turf/T = pick(L) - - L -= T - slow -= T - normal -= T - fast -= T - - if(!T || !istype(T, /turf)) - continue - - switch (I) - if(1) slow += T - if(2) normal += T - if(3) fast += T - - if(transfer > 0) - if(up) - var/turf/controller_up = locate(1, 1, up_target) - for(var/obj/effect/landmark/zcontroller/c_up in controller_up) - var/list/temp = list() - temp += locate(T.x, T.y, up_target) - c_up.add(temp, I, transfer-1) - - if(down) - var/turf/controller_down = locate(1, 1, down_target) - for(var/obj/effect/landmark/zcontroller/c_down in controller_down) - var/list/temp = list() - temp += locate(T.x, T.y, down_target) - c_down.add(temp, I, transfer-1) - return - -/turf - var/list/z_overlays = list() - -/turf/New() - ..() - - var/turf/controller = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/c in controller) - if(c.initialized) - var/list/turf = list() - turf += src - c.add(turf,3,1) - -atom/movable/Move() //Hackish - . = ..() - - var/turf/controllerlocation = locate(1, 1, src.z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up || controller.down) - var/list/temp = list() - temp += locate(src.x, src.y, src.z) - controller.add(temp,3,1) - -/obj/effect/landmark/zcontroller/proc/calc(var/list/L) - var/list/slowholder = list() - var/list/normalholder = list() - var/list/fastholder = list() - var/new_list - - while(L.len) - var/turf/T = pick(L) - new_list = 0 - - if(!T || !istype(T, /turf)) - L -= T - continue - - T.overlays -= T.z_overlays - T.z_overlays -= T.z_overlays - - if(down && (istype(T, /turf/space) || istype(T, /turf/simulated/floor/open))) - var/turf/below = locate(T.x, T.y, down_target) - if(below) - if(!(istype(below, /turf/space) || istype(below, /turf/simulated/floor/open))) - var/image/t_img = list() - new_list = 1 - - var/image/temp = image(below, dir=below.dir, layer = TURF_LAYER + 0.04) - - temp.color = rgb(127,127,127) - temp.overlays += below.overlays - t_img += temp - T.overlays += t_img - T.z_overlays += t_img - - // get objects - var/image/o_img = list() - for(var/obj/o in below) - // ingore objects that have any form of invisibility - if(o.invisibility) continue - new_list = 2 - var/image/temp2 = image(o, dir=o.dir, layer = TURF_LAYER+0.05*o.layer) - temp2.color = rgb(127,127,127) - temp2.overlays += o.overlays - o_img += temp2 - // you need to add a list to .overlays or it will not display any because space - T.overlays += o_img - T.z_overlays += o_img - - // get mobs - var/image/m_img = list() - for(var/mob/m in below) - // ingore mobs that have any form of invisibility - if(m.invisibility) continue - // only add this tile to fastprocessing if there is a living mob, not a dead one - if(istype(m, /mob/living)) new_list = 3 - var/image/temp2 = image(m, dir=m.dir, layer = TURF_LAYER+0.05*m.layer) - temp2.color = rgb(127,127,127) - temp2.overlays += m.overlays - m_img += temp2 - // you need to add a list to .overlays or it will not display any because space - T.overlays += m_img - T.z_overlays += m_img - - T.overlays -= below.z_overlays - T.z_overlays -= below.z_overlays - - // this is sadly impossible to use right now - // the overlay is always opaque to mouseclicks and thus prevents interactions with everything except the turf - /*if(up) - var/turf/above = locate(T.x, T.y, up_target) - if(above) - var/eligeable = 0 - for(var/d in cardinal) - var/turf/mT = get_step(above,d) - if(istype(mT, /turf/space) || istype(mT, /turf/simulated/floor/open)) - eligeable = 1 - /*if(mT.opacity == 0) - for(var/f in cardinal) - var/turf/nT = get_step(mT,f) - if(istype(nT, /turf/space) || istype(nT, /turf/simulated/floor/open)) - eligeable = 1*/ - if(istype(above, /turf/space) || istype(above, /turf/simulated/floor/open)) eligeable = 1 - if(eligeable == 1) - if(!(istype(above, /turf/space) || istype(above, /turf/simulated/floor/open))) - var/image/t_img = list() - if(new_list < 1) new_list = 1 - - above.overlays -= above.z_overlays - var/image/temp = image(above, dir=above.dir, layer = 5 + 0.04) - above.overlays += above.z_overlays - - temp.alpha = 100 - temp.overlays += above.overlays - temp.overlays -= above.z_overlays - t_img += temp - T.overlays += t_img - T.z_overlays += t_img - - // get objects - var/image/o_img = list() - for(var/obj/o in above) - // ingore objects that have any form of invisibility - if(o.invisibility) continue - if(new_list < 2) new_list = 2 - var/image/temp2 = image(o, dir=o.dir, layer = 5+0.05*o.layer) - temp2.alpha = 100 - temp2.overlays += o.overlays - o_img += temp2 - // you need to add a list to .overlays or it will not display any because space - T.overlays += o_img - T.z_overlays += o_img - - // get mobs - var/image/m_img = list() - for(var/mob/m in above) - // ingore mobs that have any form of invisibility - if(m.invisibility) continue - // only add this tile to fastprocessing if there is a living mob, not a dead one - if(istype(m, /mob/living) && new_list < 3) new_list = 3 - var/image/temp2 = image(m, dir=m.dir, layer = 5+0.05*m.layer) - temp2.alpha = 100 - temp2.overlays += m.overlays - m_img += temp2 - // you need to add a list to .overlays or it will not display any because space - T.overlays += m_img - T.z_overlays += m_img - - T.overlays -= above.z_overlays - T.z_overlays -= above.z_overlays*/ - - L -= T - - if(new_list == 1) - slowholder += T - if(new_list == 2) - normalholder += T - if(new_list == 3) - fastholder += T - for(var/d in cardinal) - var/turf/mT = get_step(T,d) - if(!(mT in fastholder)) - fastholder += mT - for(var/f in cardinal) - var/turf/nT = get_step(mT,f) - if(!(nT in fastholder)) - fastholder += nT - - add(slowholder,1, 0) - add(normalholder, 2, 0) - add(fastholder, 3, 0) - return diff --git a/code/TriDimension/controller_presets.dm b/code/TriDimension/controller_presets.dm deleted file mode 100644 index f775b94e93e..00000000000 --- a/code/TriDimension/controller_presets.dm +++ /dev/null @@ -1,37 +0,0 @@ -/obj/effect/landmark/zcontroller/level_1_bottom - up = 1 - up_target = 2 - -/obj/effect/landmark/zcontroller/level_2_mid - up = 1 - up_target = 3 - down = 1 - down_target = 1 - -/obj/effect/landmark/zcontroller/level_3_mid - up = 1 - up_target = 4 - down = 1 - down_target = 2 - -/obj/effect/landmark/zcontroller/level_4_mid - up = 1 - up_target = 5 - down = 1 - down_target = 3 - -/obj/effect/landmark/zcontroller/level_2_top - down = 1 - down_target = 1 - -/obj/effect/landmark/zcontroller/level_3_top - down = 1 - down_target = 2 - -/obj/effect/landmark/zcontroller/level_4_top - down = 1 - down_target = 3 - -/obj/effect/landmark/zcontroller/level_5_top - down = 1 - down_target = 4 \ No newline at end of file diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index e917ed38df9..d14c760d85d 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -11,6 +11,9 @@ mob/proc/airflow_stun() if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) src << "You stay upright as the air rushes past you." return 0 + if(buckled) + src << "Air suddenly rushes past you!" + return 0 if(!lying) src << "The sudden rush of air knocks you over!" Weaken(5) @@ -24,7 +27,7 @@ mob/living/carbon/slime/airflow_stun() mob/living/carbon/human/airflow_stun() if(shoes) - if(shoes.flags & NOSLIP) return 0 + if(shoes.item_flags & NOSLIP) return 0 ..() atom/movable/proc/check_airflow_movable(n) @@ -62,6 +65,19 @@ obj/item/check_airflow_movable(n) /atom/movable/var/tmp/airflow_time = 0 /atom/movable/var/tmp/last_airflow = 0 +/atom/movable/proc/AirflowCanMove(n) + return 1 + +/mob/AirflowCanMove(n) + if(status_flags & GODMODE) + return 0 + if(buckled) + return 0 + var/obj/item/shoes = get_equipped_item(slot_shoes) + if(istype(shoes) && (shoes.item_flags & NOSLIP)) + return 0 + return 1 + /atom/movable/proc/GotoAirflowDest(n) if(!airflow_dest) return if(airflow_speed < 0) return @@ -69,18 +85,13 @@ obj/item/check_airflow_movable(n) if(airflow_speed) airflow_speed = n/max(get_dist(src,airflow_dest),1) return - last_airflow = world.time if(airflow_dest == loc) step_away(src,loc) + if(!src.AirflowCanMove(n)) + return if(ismob(src)) - if(src:status_flags & GODMODE) - return - if(istype(src, /mob/living/carbon/human)) - if(src:buckled) - return - if(src:shoes && src:shoes.flags & NOSLIP) - return - src << "\red You are sucked away by airflow!" + src << "You are sucked away by airflow!" + last_airflow = world.time var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) if(airflow_falloff < 1) airflow_dest = null @@ -116,8 +127,9 @@ obj/item/check_airflow_movable(n) if(!istype(loc, /turf)) break step_towards(src, src.airflow_dest) - if(ismob(src) && src:client) - src:client:move_delay = world.time + vsc.airflow_mob_slowdown + var/mob/M = src + if(istype(M) && M.client) + M.setMoveCooldown(vsc.airflow_mob_slowdown) airflow_dest = null airflow_speed = 0 airflow_time = 0 @@ -134,18 +146,11 @@ obj/item/check_airflow_movable(n) return if(airflow_dest == loc) step_away(src,loc) + if(!src.AirflowCanMove(n)) + return if(ismob(src)) - if(src:status_flags & GODMODE) - return - if(istype(src, /mob/living/carbon/human)) - if(src:buckled) - return - if(src:shoes) - if(istype(src:shoes, /obj/item/clothing/shoes/magboots)) - if(src:shoes.flags & NOSLIP) - return - src << "\red You are pushed away by airflow!" - last_airflow = world.time + src << "You are pushed away by airflow!" + last_airflow = world.time var/airflow_falloff = 9 - sqrt((x - airflow_dest.x) ** 2 + (y - airflow_dest.y) ** 2) if(airflow_falloff < 1) airflow_dest = null @@ -197,7 +202,7 @@ atom/movable/proc/airflow_hit(atom/A) mob/airflow_hit(atom/A) for(var/mob/M in hearers(src)) - M.show_message("\red \The [src] slams into \a [A]!",1,"\red You hear a loud slam!",2) + M.show_message("\The [src] slams into \a [A]!",1,"You hear a loud slam!",2) playsound(src.loc, "smash.ogg", 25, 1, -1) var/weak_amt = istype(A,/obj/item) ? A:w_class : rand(1,5) //Heheheh Weaken(weak_amt) @@ -205,7 +210,7 @@ mob/airflow_hit(atom/A) obj/airflow_hit(atom/A) for(var/mob/M in hearers(src)) - M.show_message("\red \The [src] slams into \a [A]!",1,"\red You hear a loud slam!",2) + M.show_message("\The [src] slams into \a [A]!",1,"You hear a loud slam!",2) playsound(src.loc, "smash.ogg", 25, 1, -1) . = ..() @@ -215,7 +220,7 @@ obj/item/airflow_hit(atom/A) mob/living/carbon/human/airflow_hit(atom/A) // for(var/mob/M in hearers(src)) -// M.show_message("\red [src] slams into [A]!",1,"\red You hear a loud slam!",2) +// M.show_message("[src] slams into [A]!",1,"You hear a loud slam!",2) playsound(src.loc, "punch", 25, 1, -1) if (prob(33)) loc:add_blood(src) diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index e655295f783..cf7193ea872 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -1,7 +1,4 @@ - -/atom/var/pressure_resistance = ONE_ATMOSPHERE - /atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) //Purpose: Determines if the object (or airflow) can pass this atom. //Called by: Movement, airflow. @@ -64,9 +61,9 @@ turf/c_airblock(turf/other) #ifdef ZLEVELS if(other.z != src.z) if(other.z < src.z) - if(!istype(src, /turf/simulated/floor/open)) return BLOCKED + if(!istype(src, /turf/simulated/open)) return BLOCKED else - if(!istype(other, /turf/simulated/floor/open)) return BLOCKED + if(!istype(other, /turf/simulated/open)) return BLOCKED #endif var/result = 0 diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm index b53afffe5c1..cfd6cff4148 100644 --- a/code/ZAS/Controller.dm +++ b/code/ZAS/Controller.dm @@ -109,13 +109,13 @@ Class Procs: simulated_turf_count++ S.update_air_properties() - admin_notice({"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] +Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count] "}, R_DEBUG) @@ -187,7 +187,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #ifdef ZASDBG if(updated != updating.len) tick_progress = "[updating.len - updated] tiles left unupdated." - world << "\red [tick_progress]" + world << "[tick_progress]" . = 0 #endif @@ -372,4 +372,4 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/remove_edge(connection_edge/E) edges.Remove(E) - if(!E.sleeping) active_edges.Remove(E) \ No newline at end of file + if(!E.sleeping) active_edges.Remove(E) diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm index 1d4cc1a3883..ed94b7d5825 100644 --- a/code/ZAS/Diagnostic.dm +++ b/code/ZAS/Diagnostic.dm @@ -84,154 +84,7 @@ client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf) else mob << "both turfs can merge." - -/*zone/proc/DebugDisplay(client/client) - if(!istype(client)) - return - - if(!dbg_output) - dbg_output = 1 //Don't want to be spammed when someone investigates a zone... - - if(!client.zone_debug_images) - client.zone_debug_images = list() - - var/list/current_zone_images = list() - - for(var/turf/T in contents) - current_zone_images += image('icons/misc/debug_group.dmi', T, null, TURF_LAYER) - - for(var/turf/space/S in unsimulated_tiles) - current_zone_images += image('icons/misc/debug_space.dmi', S, null, TURF_LAYER) - - client << "Zone Air Contents" - client << "Oxygen: [air.oxygen]" - client << "Nitrogen: [air.nitrogen]" - client << "Phoron: [air.phoron]" - client << "Carbon Dioxide: [air.carbon_dioxide]" - client << "Temperature: [air.temperature] K" - client << "Heat Energy: [air.temperature * air.heat_capacity()] J" - client << "Pressure: [air.return_pressure()] KPa" - client << "" - client << "Space Tiles: [length(unsimulated_tiles)]" - client << "Movable Objects: [length(movables())]" - client << "Connections: [length(connections)]" - - for(var/connection/C in connections) - client << "\ref[C] [C.A] --> [C.B] [(C.indirect?"Open":"Closed")]" - current_zone_images += image('icons/misc/debug_connect.dmi', C.A, null, TURF_LAYER) - current_zone_images += image('icons/misc/debug_connect.dmi', C.B, null, TURF_LAYER) - - client << "Connected Zones:" - for(var/zone/zone in connected_zones) - client << "\ref[zone] [zone] - [connected_zones[zone]] (Connected)" - - for(var/zone/zone in closed_connection_zones) - client << "\ref[zone] [zone] - [closed_connection_zones[zone]] (Unconnected)" - - for(var/C in connections) - if(!istype(C,/connection)) - client << "[C] (Not Connection!)" - - if(!client.zone_debug_images) - client.zone_debug_images = list() - client.zone_debug_images[src] = current_zone_images - - client.images += client.zone_debug_images[src] - - else - dbg_output = 0 - - client.images -= client.zone_debug_images[src] - client.zone_debug_images.Remove(src) - - if(air_master) - for(var/zone/Z in air_master.zones) - if(Z.air == air && Z != src) - var/turf/zloc = pick(Z.contents) - client << "\red Illegal air datum shared by: [zloc.loc.name]"*/ - - -/*client/proc/TestZASRebuild() - set category = "Debug" -// var/turf/turf = get_turf(mob) - var/zone/current_zone = mob.loc:zone - if(!current_zone) - src << "There is no zone there!" - return - - var/list/current_adjacents = list() - var/list/overlays = list() - var/adjacent_id - var/lowest_id - - var/list/identical_ids = list() - var/list/turfs = current_zone.contents.Copy() - var/current_identifier = 1 - - for(var/turf/simulated/current in turfs) - lowest_id = null - current_adjacents = list() - - for(var/direction in cardinal) - var/turf/simulated/adjacent = get_step(current, direction) - if(!current.ZCanPass(adjacent)) - continue - if(turfs.Find(adjacent)) - current_adjacents += adjacent - adjacent_id = turfs[adjacent] - - if(adjacent_id && (!lowest_id || adjacent_id < lowest_id)) - lowest_id = adjacent_id - - if(!lowest_id) - lowest_id = current_identifier++ - identical_ids += lowest_id - overlays += image('icons/misc/debug_rebuild.dmi',, "[lowest_id]") - - for(var/turf/simulated/adjacent in current_adjacents) - adjacent_id = turfs[adjacent] - if(adjacent_id != lowest_id) - if(adjacent_id) - adjacent.overlays -= overlays[adjacent_id] - identical_ids[adjacent_id] = lowest_id - - turfs[adjacent] = lowest_id - adjacent.overlays += overlays[lowest_id] - - sleep(5) - - if(turfs[current]) - current.overlays -= overlays[turfs[current]] - turfs[current] = lowest_id - current.overlays += overlays[lowest_id] - sleep(5) - - var/list/final_arrangement = list() - - for(var/turf/simulated/current in turfs) - current_identifier = identical_ids[turfs[current]] - current.overlays -= overlays[turfs[current]] - current.overlays += overlays[current_identifier] - sleep(5) - - if( current_identifier > final_arrangement.len ) - final_arrangement.len = current_identifier - final_arrangement[current_identifier] = list(current) - - else - final_arrangement[current_identifier] += current - - //lazy but fast - final_arrangement.Remove(null) - - src << "There are [final_arrangement.len] unique segments." - - for(var/turf/current in turfs) - current.overlays -= overlays - - return final_arrangement*/ - client/proc/ZASSettings() set category = "Debug" - vsc.SetDefault(mob) \ No newline at end of file + vsc.SetDefault(mob) diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index 313e6ba7519..89387aff087 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -88,7 +88,7 @@ obj/var/contaminated = 0 if(vsc.plc.SKIN_BURNS) if(!pl_head_protected() || !pl_suit_protected()) burn_skin(0.75) - if(prob(20)) src << "\red Your skin burns!" + if(prob(20)) src << "Your skin burns!" updatehealth() //Burn eyes if exposed. @@ -97,37 +97,37 @@ obj/var/contaminated = 0 if(!wear_mask) burn_eyes() else - if(!(wear_mask.flags & MASKCOVERSEYES)) + if(!(wear_mask.body_parts_covered & EYES)) burn_eyes() else - if(!(head.flags & HEADCOVERSEYES)) + if(!(head.body_parts_covered & EYES)) if(!wear_mask) burn_eyes() else - if(!(wear_mask.flags & MASKCOVERSEYES)) + if(!(wear_mask.body_parts_covered & EYES)) burn_eyes() //Genetic Corruption if(vsc.plc.GENETIC_CORRUPTION) if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION) randmutb(src) - src << "\red High levels of toxins cause you to spontaneously mutate." + src << "High levels of toxins cause you to spontaneously mutate!" domutcheck(src,null) /mob/living/carbon/human/proc/burn_eyes() - //The proc that handles eye burning. - if(!species.has_organ["eyes"] || get_species() == "Vaurca") - return + //The proc that handles eye burning. + if(!species.has_organ["eyes"] || get_species() == "Vaurca") + return - var/obj/item/organ/eyes/E = internal_organs_by_name["eyes"] - if(E) - if(prob(20)) src << "\red Your eyes burn!" - E.damage += 2.5 - eye_blurry = min(eye_blurry+1.5,50) - if (prob(max(0,E.damage - 15) + 1) &&!eye_blind) - src << "\red You are blinded!" - eye_blind += 20 + var/obj/item/organ/eyes/E = internal_organs_by_name["eyes"] + if(E) + if(prob(20)) src << "Your eyes burn!" + E.damage += 2.5 + eye_blurry = min(eye_blurry+1.5,50) + if (prob(max(0,E.damage - 15) + 1) &&!eye_blind) + src << "You are blinded!" + eye_blind += 20 /mob/living/carbon/human/proc/pl_head_protected() //Checks if the head is adequately sealed. @@ -135,19 +135,24 @@ obj/var/contaminated = 0 if(vsc.plc.PHORONGUARD_ONLY) if(head.flags & PHORONGUARD) return 1 - else if(head.flags & HEADCOVERSEYES) + else if(head.body_parts_covered & EYES) return 1 return 0 /mob/living/carbon/human/proc/pl_suit_protected() //Checks if the suit is adequately sealed. - if(wear_suit) - if(vsc.plc.PHORONGUARD_ONLY) - if(wear_suit.flags & PHORONGUARD) return 1 - else - if(wear_suit.flags_inv & HIDEJUMPSUIT) return 1 - //should check HIDETAIL as well, but for the moment tails are not a part that can be damaged separately - return 0 + var/coverage = 0 + for(var/obj/item/protection in list(wear_suit, gloves, shoes)) + if(!protection) + continue + if(vsc.plc.PHORONGUARD_ONLY && !(protection.flags & PHORONGUARD)) + return 0 + coverage |= protection.body_parts_covered + + if(vsc.plc.PHORONGUARD_ONLY) + return 1 + + return BIT_TEST_ALL(coverage, UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS) /mob/living/carbon/human/proc/suit_contamination() //Runs over the things that can be contaminated and does so. diff --git a/code/ZAS/Variable Settings.dm b/code/ZAS/Variable Settings.dm index 7700fee2bb2..7e91a26b3f2 100644 --- a/code/ZAS/Variable Settings.dm +++ b/code/ZAS/Variable Settings.dm @@ -169,7 +169,7 @@ var/global/vs_control/vsc = new vars[ch] = vw if(how == "Toggle") newvar = (newvar?"ON":"OFF") - world << "\blue [key_name(user)] changed the setting [display_description] to [newvar]." + world << "[key_name(user)] changed the setting [display_description] to [newvar]." if(ch in plc.settings) ChangeSettingsDialog(user,plc.settings) else @@ -322,7 +322,7 @@ var/global/vs_control/vsc = new plc.N2O_HALLUCINATION = initial(plc.N2O_HALLUCINATION) - world << "\blue [key_name(user)] changed the global phoron/ZAS settings to \"[def]\"" + world << "[key_name(user)] changed the global phoron/ZAS settings to \"[def]\"" /pl_control/var/list/settings = list() diff --git a/code/__defines/_compile_options.dm b/code/__defines/_compile_options.dm new file mode 100644 index 00000000000..ac5f7120fd6 --- /dev/null +++ b/code/__defines/_compile_options.dm @@ -0,0 +1,2 @@ +#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary. + // 1 will enable set background. 0 will disable set background. \ No newline at end of file diff --git a/code/__defines/admin.dm b/code/__defines/admin.dm new file mode 100644 index 00000000000..bf5b224b2ca --- /dev/null +++ b/code/__defines/admin.dm @@ -0,0 +1,43 @@ +// A set of constants used to determine which type of mute an admin wishes to apply. +// Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO, etc. = (MUTE_IC << 1) +// Therefore there needs to be a gap between the flags for the automute flags. +#define MUTE_IC 0x1 +#define MUTE_OOC 0x2 +#define MUTE_PRAY 0x4 +#define MUTE_ADMINHELP 0x8 +#define MUTE_DEADCHAT 0x10 +#define MUTE_AOOC 0x20 +#define MUTE_ALL 0xFFFF + +// Number of identical messages required to get the spam-prevention auto-mute thing to trigger warnings and automutes. +#define SPAM_TRIGGER_WARNING 5 +#define SPAM_TRIGGER_AUTOMUTE 10 + +// Some constants for DB_Ban +#define BANTYPE_PERMA 1 +#define BANTYPE_TEMP 2 +#define BANTYPE_JOB_PERMA 3 +#define BANTYPE_JOB_TEMP 4 +#define BANTYPE_ANY_FULLBAN 5 // Used to locate stuff to unban. + +#define ROUNDSTART_LOGOUT_REPORT_TIME 6000 // Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. + +// Admin permissions. +#define R_BUILDMODE 0x1 +#define R_ADMIN 0x2 +#define R_BAN 0x4 +#define R_FUN 0x8 +#define R_SERVER 0x10 +#define R_DEBUG 0x20 +#define R_POSSESS 0x40 +#define R_PERMISSIONS 0x80 +#define R_STEALTH 0x100 +#define R_REJUVINATE 0x200 +#define R_VAREDIT 0x400 +#define R_SOUNDS 0x800 +#define R_SPAWN 0x1000 +#define R_MOD 0x2000 +#define R_DEV 0x4000 +#define R_CCIAA 0x8000 //higher than this will overflow + +#define R_MAXPERMISSION 0x8000 // This holds the maximum value for a permission. It is used in iteration, so keep it updated. diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm new file mode 100644 index 00000000000..cbe47ffaf40 --- /dev/null +++ b/code/__defines/atmos.dm @@ -0,0 +1,96 @@ + +#define CELL_VOLUME 2500 // Liters in a cell. +#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) // Moles in a 2.5 m^3 cell at 101.325 kPa and 20 C. + +#define O2STANDARD 0.21 // Percentage. +#define N2STANDARD 0.79 + +#define MOLES_PHORON_VISIBLE 0.7 // Moles in a standard cell after which phoron is visible. +#define MOLES_O2STANDARD (MOLES_CELLSTANDARD * O2STANDARD) // O2 standard value (21%) +#define MOLES_N2STANDARD (MOLES_CELLSTANDARD * N2STANDARD) // N2 standard value (79%) +#define MOLES_O2ATMOS (MOLES_O2STANDARD*50) +#define MOLES_N2ATMOS (MOLES_N2STANDARD*50) + +// These are for when a mob breathes poisonous air. +#define MIN_TOXIN_DAMAGE 1 +#define MAX_TOXIN_DAMAGE 10 + +#define BREATH_VOLUME 0.5 // Liters in a normal breath. +#define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME / (T20C * R_IDEAL_GAS_EQUATION)) // Amount of air to take a from a tile +#define BREATH_PERCENTAGE (BREATH_VOLUME / CELL_VOLUME) // Amount of air needed before pass out/suffocation commences. +#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD * BREATH_PERCENTAGE * 0.16) +#define HUMAN_HEAT_CAPACITY 280000 //J/K For 80kg person + +#define SOUND_MINIMUM_PRESSURE 10 + +#define PRESSURE_DAMAGE_COEFFICIENT 4 // The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE. +#define MAX_HIGH_PRESSURE_DAMAGE 4 // This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( +#define LOW_PRESSURE_DAMAGE 2 // The amount of damage someone takes when in a low pressure area. (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). + +#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 // Minimum ratio of air that must move to/from a tile to suspend group processing +#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Minimum amount of air that has to move before a group processing can be suspended +#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Either this must be active +#define MINIMUM_TEMPERATURE_TO_MOVE (T20C + 100) // or this (or both, obviously) + +#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 // Minimum temperature difference before group processing is suspended. +#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 +#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 // Minimum temperature difference before the gas temperatures are just set to be equal. +#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C + 10) +#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C + 200) + +// Must be between 0 and 1. Values closer to 1 equalize temperature faster. Should not exceed 0.4, else strange heat flow occurs. +#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 +#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 +#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 +#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 // A hack to partly simulate radiative heat. +#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 +#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 // A hack for now. + +// Fire damage. +#define CARBON_LIFEFORM_FIRE_RESISTANCE (T0C + 200) +#define CARBON_LIFEFORM_FIRE_DAMAGE 4 + +// Phoron fire properties. +#define PHORON_MINIMUM_BURN_TEMPERATURE (T0C + 126) //400 K - autoignite temperature in tanks and canisters - enclosed environments I guess +#define PHORON_FLASHPOINT (T0C + 246) //519 K - autoignite temperature in air if that ever gets implemented. + +//These control the mole ratio of oxidizer and fuel used in the combustion reaction +#define FIRE_REACTION_OXIDIZER_AMOUNT 3 //should be greater than the fuel amount if fires are going to spread much +#define FIRE_REACTION_FUEL_AMOUNT 2 + +//These control the speed at which fire burns +#define FIRE_GAS_BURNRATE_MULT 1 +#define FIRE_LIQUID_BURNRATE_MULT 0.225 + +//If the fire is burning slower than this rate then the reaction is going too slow to be self sustaining and the fire burns itself out. +//This ensures that fires don't grind to a near-halt while still remaining active forever. +#define FIRE_GAS_MIN_BURNRATE 0.01 +#define FIRE_LIQUD_MIN_BURNRATE 0.0025 + +//How many moles of fuel are contained within one solid/liquid fuel volume unit +#define LIQUIDFUEL_AMOUNT_TO_MOL 0.45 //mol/volume unit + +// XGM gas flags. +#define XGM_GAS_FUEL 1 +#define XGM_GAS_OXIDIZER 2 +#define XGM_GAS_CONTAMINANT 4 + +#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) // Tank starts leaking. +#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) // Tank spills all contents into atmosphere. +#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) // Boom 3x3 base explosion. +#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) // +1 for each SCALE kPa above threshold. Was 2 atm. + +#define NORMPIPERATE 30 // Pipe-insulation rate divisor. +#define HEATPIPERATE 8 // Heat-exchange pipe insulation. +#define FLOWFRAC 0.99 // Fraction of gas transfered per process. + +//Flags for zone sleeping +#define ZONE_ACTIVE 1 +#define ZONE_SLEEPING 0 + +// Defines how much of certain gas do the Atmospherics tanks start with. Values are in kpa per tile (assuming 20C) +#define ATMOSTANK_NITROGEN 90000 // A lot of N2 is needed to produce air mix, that's why we keep 90MPa of it +#define ATMOSTANK_OXYGEN 40000 // O2 is also important for airmix, but not as much as N2 as it's only 21% of it. +#define ATMOSTANK_CO2 25000 // CO2 and PH are not critically important for station, only for toxins and alternative coolants, no need to store a lot of those. +#define ATMOSTANK_PHORON 25000 +#define ATMOSTANK_NITROUSOXIDE 10000 // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters? diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm new file mode 100644 index 00000000000..cc212c82cce --- /dev/null +++ b/code/__defines/chemistry.dm @@ -0,0 +1,40 @@ +#define HUNGER_FACTOR 0.05 // Factor of how fast mob nutrition decreases + +#define REM 0.2 // Means 'Reagent Effect Multiplier'. This is how many units of reagent are consumed per tick + +#define CHEM_TOUCH 1 +#define CHEM_INGEST 2 +#define CHEM_BLOOD 3 + +#define MINIMUM_CHEMICAL_VOLUME 0.01 + +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REAGENTS_OVERDOSE 30 + +#define CHEM_SYNTH_ENERGY 500 // How much energy does it take to synthesize 1 unit of chemical, in Joules. + +// Some on_mob_life() procs check for alien races. +#define IS_DIONA 1 +#define IS_VOX 2 +#define IS_SKRELL 3 +#define IS_UNATHI 4 +#define IS_TAJARA 5 +#define IS_XENOS 6 +#define IS_MACHINE 7 + +#define CE_STABLE "stable" // Inaprovaline +#define CE_ANTIBIOTIC "antibiotic" // Spaceacilin +#define CE_BLOODRESTORE "bloodrestore" // Iron/nutriment +#define CE_PAINKILLER "painkiller" +#define CE_ALCOHOL "alcohol" // Liver filtering +#define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage +#define CE_SPEEDBOOST "gofast" // Hyperzine + +// Chemistry lists. +var/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglycerin", "thirteenloko", "nicotine") // Increase heart rate. +var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") // Decrease heart rate. +var/list/heartstopper = list("potassium_chlorophoride", "zombie_powder") // This stops the heart. +var/list/cheartstopper = list("potassium_chloride") // This stops the heart when overdose is met. -- c = conditional diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm new file mode 100644 index 00000000000..2ff1f55668b --- /dev/null +++ b/code/__defines/damage_organs.dm @@ -0,0 +1,53 @@ +// Damage things. TODO: Merge these down to reduce on defines. +// Way to waste perfectly good damage-type names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc. +#define BRUTE "brute" +#define BURN "fire" +#define TOX "tox" +#define OXY "oxy" +#define CLONE "clone" +#define HALLOSS "halloss" + +#define CUT "cut" +#define BRUISE "bruise" + +#define STUN "stun" +#define WEAKEN "weaken" +#define PARALYZE "paralize" +#define IRRADIATE "irradiate" +#define AGONY "agony" // Added in PAIN! +#define SLUR "slur" +#define STUTTER "stutter" +#define EYE_BLUR "eye_blur" +#define DROWSY "drowsy" +#define INCINERATE "incinerate" + +#define FIRE_DAMAGE_MODIFIER 0.0215 // Higher values result in more external fire damage to the skin. (default 0.0215) +#define AIR_DAMAGE_MODIFIER 2.025 // More means less damage from hot air scalding lungs, less = more damage. (default 2.025) + +// Organ defines. +#define ORGAN_CUT_AWAY (1<<0) +#define ORGAN_BLEEDING (1<<1) +#define ORGAN_BROKEN (1<<2) +#define ORGAN_DESTROYED (1<<3) +#define ORGAN_ROBOT (1<<4) +#define ORGAN_SPLINTED (1<<5) +#define ORGAN_DEAD (1<<6) +#define ORGAN_MUTATED (1<<7) +#define ORGAN_ASSISTED (1<<8) +#define ORGAN_ADV_ROBOT (1<<9) +#define ORGAN_PLANT (1<<10) + +#define DROPLIMB_EDGE 0 +#define DROPLIMB_BLUNT 1 +#define DROPLIMB_BURN 2 + +// Damage above this value must be repaired with surgery. +#define ROBOLIMB_SELF_REPAIR_CAP 30 + +//Germs and infections. +#define GERM_LEVEL_AMBIENT 110 // Maximum germ level you can reach by standing still. +#define GERM_LEVEL_MOVE_CAP 200 // Maximum germ level you can reach by running around. + +#define INFECTION_LEVEL_ONE 100 +#define INFECTION_LEVEL_TWO 500 +#define INFECTION_LEVEL_THREE 1000 diff --git a/code/__defines/dna.dm b/code/__defines/dna.dm new file mode 100644 index 00000000000..cb1d2ad7e74 --- /dev/null +++ b/code/__defines/dna.dm @@ -0,0 +1,76 @@ +// Bitflags for mutations. +#define STRUCDNASIZE 27 +#define UNIDNASIZE 13 + +// Generic mutations: +#define TK 1 +#define COLD_RESISTANCE 2 +#define XRAY 3 +#define HULK 4 +#define CLUMSY 5 +#define FAT 6 +#define HUSK 7 +#define NOCLONE 8 +#define LASER 9 // Harm intent - click anywhere to shoot lasers from eyes. +#define HEAL 10 // Healing people with hands. + +#define SKELETON 29 +#define PLANT 30 + +// Other Mutations: +#define mNobreath 100 // No need to breathe. +#define mRemote 101 // Remote viewing. +#define mRegen 102 // Health regeneration. +#define mRun 103 // No slowdown. +#define mRemotetalk 104 // Remote talking. +#define mMorph 105 // Hanging appearance. +#define mBlend 106 // Nothing. (seriously nothing) +#define mHallucination 107 // Hallucinations. +#define mFingerprints 108 // No fingerprints. +#define mShock 109 // Insulated hands. +#define mSmallsize 110 // Table climbing. + +// disabilities +#define NEARSIGHTED 0x1 +#define EPILEPSY 0x2 +#define COUGHING 0x4 +#define TOURETTES 0x8 +#define NERVOUS 0x10 + +// sdisabilities +#define BLIND 0x1 +#define MUTE 0x2 +#define DEAF 0x4 + +// The way blocks are handled badly needs a rewrite, this is horrible. +// Too much of a project to handle at the moment, TODO for later. +var/BLINDBLOCK = 0 +var/DEAFBLOCK = 0 +var/HULKBLOCK = 0 +var/TELEBLOCK = 0 +var/FIREBLOCK = 0 +var/XRAYBLOCK = 0 +var/CLUMSYBLOCK = 0 +var/FAKEBLOCK = 0 +var/COUGHBLOCK = 0 +var/GLASSESBLOCK = 0 +var/EPILEPSYBLOCK = 0 +var/TWITCHBLOCK = 0 +var/NERVOUSBLOCK = 0 +var/MONKEYBLOCK = STRUCDNASIZE + +var/BLOCKADD = 0 +var/DIFFMUT = 0 + +var/HEADACHEBLOCK = 0 +var/NOBREATHBLOCK = 0 +var/REMOTEVIEWBLOCK = 0 +var/REGENERATEBLOCK = 0 +var/INCREASERUNBLOCK = 0 +var/REMOTETALKBLOCK = 0 +var/MORPHBLOCK = 0 +var/BLENDBLOCK = 0 +var/HALLUCINATIONBLOCK = 0 +var/NOPRINTSBLOCK = 0 +var/SHOCKIMMUNITYBLOCK = 0 +var/SMALLSIZEBLOCK = 0 diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm new file mode 100644 index 00000000000..1af70ae1b03 --- /dev/null +++ b/code/__defines/gamemode.dm @@ -0,0 +1,104 @@ +#define GAME_STATE_PREGAME 1 +#define GAME_STATE_SETTING_UP 2 +#define GAME_STATE_PLAYING 3 +#define GAME_STATE_FINISHED 4 + +// Security levels. +#define SEC_LEVEL_GREEN 0 +#define SEC_LEVEL_BLUE 1 +#define SEC_LEVEL_RED 2 +#define SEC_LEVEL_DELTA 3 + +#define BE_PLANT "BE_PLANT" +#define BE_SYNTH "BE_SYNTH" +#define BE_PAI "BE_PAI" + +// Antagonist datum flags. +#define ANTAG_OVERRIDE_JOB 0x1 // Assigned job is set to MODE when spawning. +#define ANTAG_OVERRIDE_MOB 0x2 // Mob is recreated from datum mob_type var when spawning. +#define ANTAG_CLEAR_EQUIPMENT 0x4 // All preexisting equipment is purged. +#define ANTAG_CHOOSE_NAME 0x8 // Antagonists are prompted to enter a name. +#define ANTAG_IMPLANT_IMMUNE 0x10 // Cannot be loyalty implanted. +#define ANTAG_SUSPICIOUS 0x20 // Shows up on roundstart report. +#define ANTAG_HAS_LEADER 0x40 // Generates a leader antagonist. +#define ANTAG_HAS_NUKE 0x80 // Will spawn a nuke at supplied location. +#define ANTAG_RANDSPAWN 0x100 // Potentially randomly spawns due to events. +#define ANTAG_VOTABLE 0x200 // Can be voted as an additional antagonist before roundstart. +#define ANTAG_SET_APPEARANCE 0x400 // Causes antagonists to use an appearance modifier on spawn. + +// Mode/antag template macros. +#define MODE_BORER "borer" +#define MODE_XENOMORPH "xeno" +#define MODE_LOYALIST "loyalist" +#define MODE_MUTINEER "mutineer" +#define MODE_COMMANDO "commando" +#define MODE_DEATHSQUAD "deathsquad" +#define MODE_ERT "ert" +#define MODE_ACTOR "actor" +#define MODE_MERCENARY "mercenary" +#define MODE_NINJA "ninja" +#define MODE_RAIDER "raider" +#define MODE_WIZARD "wizard" +#define MODE_CHANGELING "changeling" +#define MODE_CULTIST "cultist" +#define MODE_HIGHLANDER "highlander" +#define MODE_MONKEY "monkey" +#define MODE_RENEGADE "renegade" +#define MODE_REVOLUTIONARY "revolutionary" +#define MODE_LOYALIST "loyalist" +#define MODE_MALFUNCTION "malf" +#define MODE_TRAITOR "traitor" +#define MODE_VAMPIRE "vampire" +#define MODE_THRALL "thrall" + + +#define DEFAULT_TELECRYSTAL_AMOUNT 25 + +///////////////// +////WIZARD ////// +///////////////// + +/* WIZARD SPELL FLAGS */ +#define GHOSTCAST 0x1 //can a ghost cast it? +#define NEEDSCLOTHES 0x2 //does it need the wizard garb to cast? Nonwizard spells should not have this +#define NEEDSHUMAN 0x4 //does it require the caster to be human? +#define Z2NOCAST 0x8 //if this is added, the spell can't be cast at centcomm +#define STATALLOWED 0x10 //if set, the user doesn't have to be conscious to cast. Required for ghost spells +#define IGNOREPREV 0x20 //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 0x40 //does the spell include the caster in its target selection? +#define SELECTABLE 0x80 //can you select each target for the spell? +//AOE spells +#define IGNOREDENSE 0x40 //are dense turfs ignored in selection? +#define IGNORESPACE 0x80 //are space turfs ignored in selection? +//End split flags +#define CONSTRUCT_CHECK 0x100 //used by construct spells - checks for nullrods +#define NO_BUTTON 0x200 //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" + +///////////////// +//// Vampire //// +///////////////// + +#define VAMP_DRAINING 0x1 +#define VAMP_HEALING 0x2 +#define VAMP_PRESENCE 0x4 +#define VAMP_FRENZIED 0x8 +#define VAMP_ISTHRALL 0x10 +#define VAMP_FULLPOWER 0x20 diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm new file mode 100644 index 00000000000..2b35801a98c --- /dev/null +++ b/code/__defines/items_clothing.dm @@ -0,0 +1,203 @@ +#define HUMAN_STRIP_DELAY 40 // Takes 40ds = 4s to strip someone. + +#define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up. + +#define CANDLE_LUM 3 // For how bright candles are. + +// Item inventory slot bitmasks. +#define SLOT_OCLOTHING 0x1 +#define SLOT_ICLOTHING 0x2 +#define SLOT_GLOVES 0x4 +#define SLOT_EYES 0x8 +#define SLOT_EARS 0x10 +#define SLOT_MASK 0x20 +#define SLOT_HEAD 0x40 +#define SLOT_FEET 0x80 +#define SLOT_ID 0x100 +#define SLOT_BELT 0x200 +#define SLOT_BACK 0x400 +#define SLOT_POCKET 0x800 // This is to allow items with a w_class of 3 or 4 to fit in pockets. +#define SLOT_DENYPOCKET 0x1000 // This is to deny items with a w_class of 2 or 1 from fitting in pockets. +#define SLOT_TWOEARS 0x2000 +#define SLOT_TIE 0x4000 +#define SLOT_HOLSTER 0x8000 //16th bit - higher than this will overflow + +// Flags bitmasks. +#define NOBLUDGEON 0x1 // When an item has this it produces no "X has been hit by Y with Z" message with the default handler. +#define CONDUCT 0x2 // Conducts electricity. (metal etc.) +#define ON_BORDER 0x4 // Item has priority to check when entering or leaving. +#define NOBLOODY 0x8 // Used for items if they don't want to get a blood overlay. +#define OPENCONTAINER 0x10 // Is an open container for chemistry purposes. +#define PHORONGUARD 0x20 // Does not get contaminated by phoron. +#define NOREACT 0x40 // Reagents don't react inside this container. +#define PROXMOVE 0x80 // Does this object require proximity checking in Enter()? + +//Flags for items (equipment) +#define THICKMATERIAL 0x1 // Prevents syringes, parapens and hyposprays if equiped to slot_suit or slot_head. +#define STOPPRESSUREDAMAGE 0x2 // Counts towards pressure protection. Note that like temperature protection, body_parts_covered is considered here as well. +#define AIRTIGHT 0x4 // Functions with internals. +#define NOSLIP 0x8 // Prevents from slipping on wet floors, in space, etc. +#define BLOCK_GAS_SMOKE_EFFECT 0x10 // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) +#define FLEXIBLEMATERIAL 0x20 // At the moment, masks with this flag will not prevent eating even if they are covering your face. + +// Flags for pass_flags. +#define PASSTABLE 0x1 +#define PASSGLASS 0x2 +#define PASSGRILLE 0x4 +#define PASSDOORHATCH 0x8 + +// Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. +// WARNING: The following flags apply only to the external suit! +#define HIDEGLOVES 0x1 +#define HIDESUITSTORAGE 0x2 +#define HIDEJUMPSUIT 0x4 +#define HIDESHOES 0x8 +#define HIDETAIL 0x10 + +// WARNING: The following flags apply only to the helmets and masks! +#define HIDEMASK 0x1 +#define HIDEEARS 0x2 // Headsets and such. +#define HIDEEYES 0x4 // Glasses. +#define HIDEFACE 0x8 // Dictates whether we appear as "Unknown". + +#define BLOCKHEADHAIR 0x20 // Hides the user's hair overlay. Leaves facial hair. +#define BLOCKHAIR 0x40 // Hides the user's hair, facial and otherwise. + +//This flag applies to gloves, uniforms, shoes, masks, ear items, glasses +#define ALWAYSDRAW 32//If set, this item is always rendered even if its slot is hidden by other clothing +//Note that the item may still not be visible if its sprite is actually covered up. + +// Slots. +#define slot_back 1 +#define slot_wear_mask 2 +#define slot_handcuffed 3 +#define slot_l_hand 4 +#define slot_r_hand 5 +#define slot_belt 6 +#define slot_wear_id 7 +#define slot_l_ear 8 +#define slot_glasses 9 +#define slot_gloves 10 +#define slot_head 11 +#define slot_shoes 12 +#define slot_wear_suit 13 +#define slot_w_uniform 14 +#define slot_l_store 15 +#define slot_r_store 16 +#define slot_s_store 17 +#define slot_in_backpack 18 +#define slot_legcuffed 19 +#define slot_r_ear 20 +#define slot_legs 21 +#define slot_tie 22 + +// Inventory slot strings. +// since numbers cannot be used as associative list keys. +//icon_back, icon_l_hand, etc would be much better names for these... +#define slot_back_str "slot_back" +#define slot_l_hand_str "slot_l_hand" +#define slot_r_hand_str "slot_r_hand" +#define slot_w_uniform_str "slot_w_uniform" +#define slot_head_str "slot_head" +#define slot_wear_suit_str "slot_suit" + +//itemstate suffixes. Used for containedsprite worn items +#define WORN_LHAND "_lh" +#define WORN_RHAND "_rh" +#define WORN_LSTORE "_ls" +#define WORN_RSTORE "_rs" +#define WORN_SSTORE "_ss" +#define WORN_LEAR "_le" +#define WORN_REAR "_re" +#define WORN_HEAD "_he" +#define WORN_UNDER "_un" +#define WORN_SUIT "_su" +#define WORN_GLOVES "_gl" +#define WORN_SHOES "_sh" +#define WORN_EYES "_ey" +#define WORN_BELT "_be" +#define WORN_BACK "_ba" +#define WORN_ID "_id" +#define WORN_MASK "_ma" + +// Bitflags for clothing parts. +#define HEAD 0x1 +#define FACE 0x2 +#define EYES 0x4 +#define UPPER_TORSO 0x8 +#define LOWER_TORSO 0x10 +#define LEG_LEFT 0x20 +#define LEG_RIGHT 0x40 +#define LEGS 0x60 // LEG_LEFT | LEG_RIGHT +#define FOOT_LEFT 0x80 +#define FOOT_RIGHT 0x100 +#define FEET 0x180 // FOOT_LEFT | FOOT_RIGHT +#define ARM_LEFT 0x200 +#define ARM_RIGHT 0x400 +#define ARMS 0x600 // ARM_LEFT | ARM_RIGHT +#define HAND_LEFT 0x800 +#define HAND_RIGHT 0x1000 +#define HANDS 0x1800 // HAND_LEFT | HAND_RIGHT +#define FULL_BODY 0xFFFF + +// Bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. +// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection(). +// The values here should add up to 1, e.g., the head has 30% protection. +#define THERMAL_PROTECTION_HEAD 0.3 +#define THERMAL_PROTECTION_UPPER_TORSO 0.15 +#define THERMAL_PROTECTION_LOWER_TORSO 0.15 +#define THERMAL_PROTECTION_LEG_LEFT 0.075 +#define THERMAL_PROTECTION_LEG_RIGHT 0.075 +#define THERMAL_PROTECTION_FOOT_LEFT 0.025 +#define THERMAL_PROTECTION_FOOT_RIGHT 0.025 +#define THERMAL_PROTECTION_ARM_LEFT 0.075 +#define THERMAL_PROTECTION_ARM_RIGHT 0.075 +#define THERMAL_PROTECTION_HAND_LEFT 0.025 +#define THERMAL_PROTECTION_HAND_RIGHT 0.025 + +// Pressure limits. +#define HAZARD_HIGH_PRESSURE 550 // This determines at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) +#define WARNING_HIGH_PRESSURE 325 // This determines when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) +#define WARNING_LOW_PRESSURE 50 // This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE) +#define HAZARD_LOW_PRESSURE 20 // This is when the black ultra-low pressure icon is displayed. (This one is set as a constant) + +#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 // This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. +#define BODYTEMP_AUTORECOVERY_DIVISOR 12 // This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. +#define BODYTEMP_AUTORECOVERY_MINIMUM 1 // Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50. +#define BODYTEMP_COLD_DIVISOR 6 // Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster. +#define BODYTEMP_HEAT_DIVISOR 6 // Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster. +#define BODYTEMP_COOLING_MAX -30 // The maximum number of degrees that your body can cool down in 1 tick, when in a cold area. +#define BODYTEMP_HEATING_MAX 30 // The maximum number of degrees that your body can heat up in 1 tick, when in a hot area. + +#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat. +#define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness. + +#define SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE 2.0 // What min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. +#define SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE 2.0 // What min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. +#define HELMET_MIN_COLD_PROTECTION_TEMPERATURE 160 // For normal helmets. +#define ARMOR_MIN_COLD_PROTECTION_TEMPERATURE 160 // For armor. +#define GLOVES_MIN_COLD_PROTECTION_TEMPERATURE 2.0 // For some gloves. +#define SHOE_MIN_COLD_PROTECTION_TEMPERATURE 2.0 // For shoes. + +#define SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE 5000 // These need better heat protect, but not as good heat protect as firesuits. +#define FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE 30000 // What max_heat_protection_temperature is set to for firesuit quality headwear. MUST NOT BE 0. +#define FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE 30000 // For fire-helmet quality items. (Red and white hardhats) +#define HELMET_MAX_HEAT_PROTECTION_TEMPERATURE 600 // For normal helmets. +#define ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE 600 // For armor. +#define GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE 1500 // For some gloves. +#define SHOE_MAX_HEAT_PROTECTION_TEMPERATURE 1500 // For shoes. + +// Fire. +#define FIRE_MIN_STACKS -20 +#define FIRE_MAX_STACKS 25 +#define FIRE_MAX_FIRESUIT_STACKS 20 // If the number of stacks goes above this firesuits won't protect you anymore. If not, you can walk around while on fire like a badass. + +#define THROWFORCE_SPEED_DIVISOR 5 // The throwing speed value at which the throwforce multiplier is exactly 1. +#define THROWNOBJ_KNOCKBACK_SPEED 15 // The minumum speed of a w_class 2 thrown object that will cause living mobs it hits to be knocked back. Heavier objects can cause knockback at lower speeds. +#define THROWNOBJ_KNOCKBACK_DIVISOR 2 // Affects how much speed the mob is knocked back with. + +// Suit sensor levels +#define SUIT_SENSOR_OFF 0 +#define SUIT_SENSOR_BINARY 1 +#define SUIT_SENSOR_VITAL 2 +#define SUIT_SENSOR_TRACKING 3 diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm new file mode 100644 index 00000000000..73ca556c4c7 --- /dev/null +++ b/code/__defines/lighting.dm @@ -0,0 +1,34 @@ +//DVIEW defines +//DVIEW is a hack that uses a mob with darksight in order to find lists of viewable stuff while ignoring darkness + +var/mob/dview/dview_mob = new + +/mob/dview + invisibility = 101 + density = 0 + + anchored = 1 + simulated = 0 + + see_in_dark = 1e6 + +#define FOR_DVIEW(type, range, center, invis_flags) \ + dview_mob.loc = center; \ + dview_mob.see_invisible = invis_flags; \ + for(type in view(range, dview_mob)) + +#define END_FOR_DVIEW dview_mob.loc = null + +#define DVIEW(output, range, center, invis_flags) \ + dview_mob.loc = center; \ + dview_mob.see_invisible = invis_flags; \ + output = view(range, dview_mob); \ + dview_mob.loc = null ; + + + + +// Night lighting controller times +// The time (in ticks based on worldtime2ticks()) that various actions trigger +#define MORNING_LIGHT_RESET 252000 // 7am or 07:00 - lighting restores to normal in morning +#define NIGHT_LIGHT_ACTIVE 648000 // 6pm or 18:00 - night lighting mode activates diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm new file mode 100644 index 00000000000..830ad11bcef --- /dev/null +++ b/code/__defines/machinery.dm @@ -0,0 +1,97 @@ +var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called manually after an event. + +#define CELLRATE 0.002 // Multiplier for watts per tick <> cell storage (e.g., 0.02 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) + // It's a conversion constant. power_used*CELLRATE = charge_provided, or charge_used/CELLRATE = power_provided + +// Doors! +#define DOOR_CRUSH_DAMAGE 20 +#define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien. + +// Channel numbers for power. +#define EQUIP 1 +#define LIGHT 2 +#define ENVIRON 3 +#define TOTAL 4 // For total power used only. + +// Bitflags for machine stat variable. +#define BROKEN 0x1 +#define NOPOWER 0x2 +#define POWEROFF 0x4 // TBD. +#define MAINT 0x8 // Under maintenance. +#define EMPED 0x10 // Temporary broken by EMP pulse. + +// Used by firelocks +#define FIREDOOR_OPEN 1 +#define FIREDOOR_CLOSED 2 + +#define AI_CAMERA_LUMINOSITY 6 + +// 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 "ZeEmergencyResponseTeam" +#define NETWORK_EXODUS "Exodus" +#define NETWORK_MEDICAL "Medical" +#define NETWORK_MERCENARY "MercurialNet" +#define NETWORK_MINE "MINE" +#define NETWORK_RESEARCH "Research" +#define NETWORK_RESEARCH_OUTPOST "Research Outpost" +#define NETWORK_ROBOTS "Robots" +#define NETWORK_PRISON "Prison" +#define NETWORK_SECURITY "Security" +#define NETWORK_TELECOM "Tcomsat" +#define NETWORK_THUNDER "Thunderdome" + +// Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them. +var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret") + + +//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 + +// computer3 error codes, move lower in the file when it passes dev -Sayu +#define PROG_CRASH 0x1 // Generic crash. +#define MISSING_PERIPHERAL 0x2 // Missing hardware. +#define BUSTED_ASS_COMPUTER 0x4 // Self-perpetuating error. BAC will continue to crash forever. +#define MISSING_PROGRAM 0x8 // Some files try to automatically launch a program. This is that failing. +#define FILE_DRM 0x10 // Some files want to not be copied/moved. This is them complaining that you tried. +#define NETWORK_FAILURE 0x20 + +// NanoUI flags +#define STATUS_INTERACTIVE 2 // GREEN Visability +#define STATUS_UPDATE 1 // ORANGE Visability +#define STATUS_DISABLED 0 // RED Visability +#define STATUS_CLOSE -1 // Close the interface + +/* + * Atmospherics Machinery. +*/ +#define MAX_SIPHON_FLOWRATE 2500 // L/s. This can be used to balance how fast a room is siphoned. Anything higher than CELL_VOLUME has no effect. +#define MAX_SCRUBBER_FLOWRATE 200 // L/s. Max flow rate when scrubbing from a turf. + +// These balance how easy or hard it is to create huge pressure gradients with pumps and filters. +// Lower values means it takes longer to create large pressures differences. +// Has no effect on pumping gasses from high pressure to low, only from low to high. +#define ATMOS_PUMP_EFFICIENCY 2.5 +#define ATMOS_FILTER_EFFICIENCY 2.5 + +// Will not bother pumping or filtering if the gas source as fewer than this amount of moles, to help with performance. +#define MINIMUM_MOLES_TO_PUMP 0.01 +#define MINIMUM_MOLES_TO_FILTER 0.04 + +// The flow rate/effectiveness of various atmos devices is limited by their internal volume, +// so for many atmos devices these will control maximum flow rates in L/s. +#define ATMOS_DEFAULT_VOLUME_PUMP 200 // Liters. +#define ATMOS_DEFAULT_VOLUME_FILTER 200 // L. +#define ATMOS_DEFAULT_VOLUME_MIXER 200 // L. +#define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. diff --git a/code/__defines/math_physics.dm b/code/__defines/math_physics.dm new file mode 100644 index 00000000000..987cb1ba9dc --- /dev/null +++ b/code/__defines/math_physics.dm @@ -0,0 +1,28 @@ +// Math constants. +#define M_PI 3.14159265 + +#define R_IDEAL_GAS_EQUATION 8.31 // kPa*L/(K*mol). +#define ONE_ATMOSPHERE 101.325 // kPa. +#define IDEAL_GAS_ENTROPY_CONSTANT 1164 // (mol^3 * s^3) / (kg^3 * L). + +// Radiation constants. +#define STEFAN_BOLTZMANN_CONSTANT 5.6704e-8 // W/(m^2*K^4). +#define COSMIC_RADIATION_TEMPERATURE 3.15 // K. +#define AVERAGE_SOLAR_RADIATION 200 // W/m^2. Kind of arbitrary. Really this should depend on the sun position much like solars. +#define RADIATOR_OPTIMUM_PRESSURE 3771 // kPa at 20 C. This should be higher as gases aren't great conductors until they are dense. Used the critical pressure for air. +#define GAS_CRITICAL_TEMPERATURE 132.65 // K. The critical point temperature for air. + +#define RADIATOR_EXPOSED_SURFACE_AREA_RATIO 0.04 // (3 cm + 100 cm * sin(3deg))/(2*(3+100 cm)). Unitless ratio. +#define HUMAN_EXPOSED_SURFACE_AREA 5.2 //m^2, surface area of 1.7m (H) x 0.46m (D) cylinder + +#define T0C 273.15 // 0.0 degrees celcius +#define T20C 293.15 // 20.0 degrees celcius +#define TCMB 2.7 // -270.3 degrees celcius + +#define CLAMP01(x) max(0, min(1, x)) +#define QUANTIZE(variable) (round(variable,0.0001)) + +#define INFINITY 1.#INF + +#define TICKS_IN_DAY 24*60*60*10 +#define TICKS_IN_SECOND 10 \ No newline at end of file diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm new file mode 100644 index 00000000000..e5f1e52c16d --- /dev/null +++ b/code/__defines/misc.dm @@ -0,0 +1,244 @@ +#define DEBUG +// Turf-only flags. +#define NOJAUNT 1 // This is used in literally one place, turf.dm, to block ethereal jaunt. + +#define TRANSITIONEDGE 7 // Distance from edge to move to another z-level. + +// Invisibility constants. +#define INVISIBILITY_LIGHTING 20 +#define INVISIBILITY_LEVEL_ONE 35 +#define INVISIBILITY_LEVEL_TWO 45 +#define INVISIBILITY_OBSERVER 60 +#define INVISIBILITY_EYE 61 + +#define SEE_INVISIBLE_LIVING 25 +#define SEE_INVISIBLE_NOLIGHTING 15 +#define SEE_INVISIBLE_LEVEL_ONE 35 +#define SEE_INVISIBLE_LEVEL_TWO 45 +#define SEE_INVISIBLE_CULT 60 +#define SEE_INVISIBLE_OBSERVER 61 + +#define SEE_INVISIBLE_MINIMUM 5 +#define INVISIBILITY_MAXIMUM 100 + +// Some arbitrary defines to be used by self-pruning global lists. (see master_controller) +#define PROCESS_KILL 26 // Used to trigger removal from a processing list. + +// Age limits on a character. +#define AGE_MIN 17 +#define AGE_MAX 85 + +#define MAX_GEAR_COST 5 // Used in chargen for accessory loadout limit. + +// Preference toggles. +#define SOUND_ADMINHELP 0x1 +#define SOUND_MIDI 0x2 +#define SOUND_AMBIENCE 0x4 +#define SOUND_LOBBY 0x8 +#define CHAT_OOC 0x10 +#define CHAT_DEAD 0x20 +#define CHAT_GHOSTEARS 0x40 +#define CHAT_GHOSTSIGHT 0x80 +#define CHAT_PRAYER 0x100 +#define CHAT_RADIO 0x200 +#define CHAT_ATTACKLOGS 0x400 +#define CHAT_DEBUGLOGS 0x800 +#define CHAT_LOOC 0x1000 +#define CHAT_GHOSTRADIO 0x2000 +#define SHOW_TYPING 0x4000 +#define CHAT_NOICONS 0x8000 + +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC) + +//Sound effects toggles +#define ASFX_AMBIENCE 1 +#define ASFX_FOOTSTEPS 2 +#define ASFX_VOTE 4 + +#define ASFX_DEFAULT (ASFX_AMBIENCE|ASFX_FOOTSTEPS|ASFX_VOTE) + +// For secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans. +#define HEALTH_HUD 1 // A simple line rounding the mob's number health. +#define STATUS_HUD 2 // Alive, dead, diseased, etc. +#define ID_HUD 3 // The job asigned to your ID. +#define WANTED_HUD 4 // Wanted, released, paroled, security status. +#define IMPLOYAL_HUD 5 // Loyality implant. +#define IMPCHEM_HUD 6 // Chemical implant. +#define IMPTRACK_HUD 7 // Tracking implant. +#define SPECIALROLE_HUD 8 // AntagHUD image. +#define STATUS_HUD_OOC 9 // STATUS_HUD without virus DB check for someone being ill. +#define LIFE_HUD 10 // STATUS_HUD that only reports dead or alive + +//some colors +#define COLOR_WHITE "#ffffff" +#define COLOR_SILVER "#c0c0c0" +#define COLOR_GRAY "#808080" +#define COLOR_BLACK "#000000" +#define COLOR_RED "#ff0000" +#define COLOR_RED_LIGHT "#ff3333" +#define COLOR_MAROON "#800000" +#define COLOR_YELLOW "#ffff00" +#define COLOR_OLIVE "#808000" +#define COLOR_LIME "#00ff00" +#define COLOR_GREEN "#008000" +#define COLOR_CYAN "#00ffff" +#define COLOR_TEAL "#008080" +#define COLOR_BLUE "#0000ff" +#define COLOR_BLUE_LIGHT "#33ccff" +#define COLOR_NAVY "#000080" +#define COLOR_PINK "#ff00ff" +#define COLOR_PURPLE "#800080" +#define COLOR_ORANGE "#ff9900" +#define COLOR_LUMINOL "#66ffff" +#define COLOR_BEIGE "#ceb689" +#define COLOR_BLUE_GRAY "#6a97b0" +#define COLOR_BROWN "#b19664" +#define COLOR_DARK_BROWN "#917448" +#define COLOR_DARK_ORANGE "#b95a00" +#define COLOR_GREEN_GRAY "#8daf6a" +#define COLOR_RED_GRAY "#aa5f61" +#define COLOR_PALE_BLUE_GRAY "#8bbbd5" +#define COLOR_PALE_GREEN_GRAY "#aed18b" +#define COLOR_PALE_RED_GRAY "#cc9090" +#define COLOR_PALE_PURPLE_GRAY "#bda2ba" +#define COLOR_PURPLE_GRAY "#a2819e" +#define COLOR_SUN "#ec8b2f" + +// Shuttles. + +// These define the time taken for the shuttle to get to the space station, and the time before it leaves again. +#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle departs centcom and cannot be recalled. +#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station after arriving. +#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station. +#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure. + +// Shuttle moving status. +#define SHUTTLE_IDLE 0 +#define SHUTTLE_WARMUP 1 +#define SHUTTLE_INTRANSIT 2 + +// Ferry shuttle processing status. +#define IDLE_STATE 0 +#define WAIT_LAUNCH 1 +#define FORCE_LAUNCH 2 +#define WAIT_ARRIVE 3 +#define WAIT_FINISH 4 + +// Setting this much higher than 1024 could allow spammers to DOS the server easily. +#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. +#define EVENT_LEVEL_MUNDANE 1 +#define EVENT_LEVEL_MODERATE 2 +#define EVENT_LEVEL_MAJOR 3 + +//General-purpose life speed define for plants. +#define HYDRO_SPEED_MULTIPLIER 1 + +#define DEFAULT_JOB_TYPE /datum/job/assistant + +//Area flags, possibly more to come +#define RAD_SHIELDED 1 //shielded from radiation, clearly + +// 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 LIGHTING_LAYER 11 +#define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots) +#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put +#define SCREEN_LAYER 22 //Mob HUD/effects layer +#define UNDERDOOR 3.09 //Just barely under a closed door. + +// Convoluted setup so defines can be supplied by Bay12 main server compile script. +// Should still work fine for people jamming the icons into their repo. +#ifndef CUSTOM_ITEM_OBJ +#define CUSTOM_ITEM_OBJ 'icons/obj/custom_items_obj.dmi' +#endif +#ifndef CUSTOM_ITEM_MOB +#define CUSTOM_ITEM_MOB 'icons/mob/custom_items_mob.dmi' +#endif +#ifndef CUSTOM_ITEM_SYNTH +#define CUSTOM_ITEM_SYNTH 'icons/mob/custom_synthetic.dmi' +#endif + +#define WALL_CAN_OPEN 1 +#define WALL_OPENING 2 + +#define DEFAULT_TABLE_MATERIAL "plastic" +#define DEFAULT_WALL_MATERIAL "steel" + +#define SHARD_SHARD "shard" +#define SHARD_SHRAPNEL "shrapnel" +#define SHARD_STONE_PIECE "piece" +#define SHARD_SPLINTER "splinters" +#define SHARD_NONE "" + +#define MATERIAL_UNMELTABLE 0x1 +#define MATERIAL_BRITTLE 0x2 +#define MATERIAL_PADDING 0x4 + +#define TABLE_BRITTLE_MATERIAL_MULTIPLIER 4 // Amount table damage is multiplied by if it is made of a brittle material (e.g. glass) + +#define BOMBCAP_DVSTN_RADIUS (max_explosion_range/4) +#define BOMBCAP_HEAVY_RADIUS (max_explosion_range/2) +#define BOMBCAP_LIGHT_RADIUS max_explosion_range +#define BOMBCAP_FLASH_RADIUS (max_explosion_range*1.5) + // NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc) +#define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet +#define NTNET_PEERTOPEER 2 // P2P transfers of files between devices +#define NTNET_COMMUNICATION 3 // Communication (messaging) +#define NTNET_SYSTEMCONTROL 4 // Control of various systems, RCon, air alarm control, etc. + +// NTNet transfer speeds, used when downloading/uploading a file/program. +#define NTNETSPEED_LOWSIGNAL 0.025 // GQ/s transfer speed when the device is wirelessly connected and on Low signal +#define NTNETSPEED_HIGHSIGNAL 0.1 // GQ/s transfer speed when the device is wirelessly connected and on High signal +#define NTNETSPEED_ETHERNET 0.5 // GQ/s transfer speed when the device is using wired connection + +// Program bitflags +#define PROGRAM_ALL 7 +#define PROGRAM_CONSOLE 1 +#define PROGRAM_LAPTOP 2 +#define PROGRAM_TABLET 4 + +// Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it. +#define MAX_NTNET_LOGS 500 +#define MIN_NTNET_LOGS 10 + + +// Special return values from bullet_act(). Positive return values are already used to indicate the blocked level of the projectile. +#define PROJECTILE_CONTINUE -1 //if the projectile should continue flying after calling bullet_act() +#define PROJECTILE_FORCE_MISS -2 //if the projectile should treat the attack as a miss (suppresses attack and admin logs) - only applies to mobs. + +//Camera capture modes +#define CAPTURE_MODE_REGULAR 0 //Regular polaroid camera mode +#define CAPTURE_MODE_ALL 1 //Admin camera mode +#define CAPTURE_MODE_PARTIAL 3 //Simular to regular mode, but does not do dummy check + +//Sound effects toggles +#define ASFX_AMBIENCE 1 +#define ASFX_FOOTSTEPS 2 +#define ASFX_VOTE 4 + +//Cargo random stock vars +//These are used in randomstock.dm +//And also for generating random loot crates in crates.dm +#define TOTAL_STOCK 80//The total number of items we'll spawn in cargo stock + + +#define STOCK_UNCOMMON_PROB 23 +//The probability, as a percentage for each item, that we'll choose from the uncommon spawns list + +#define STOCK_RARE_PROB 2.8 +//The probability, as a percentage for each item, that we'll choose from the rare spawns list + +//If an item is not rare or uncommon, it will be chosen from the common spawns list. +//So the probability of a common item is 100 - (uncommon + rare) + + +#define STOCK_LARGE_PROB 75 +//Large items are spawned on predetermined locations. +//For each large spawn marker, this is the chance that we will spawn there diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm new file mode 100644 index 00000000000..0859792370c --- /dev/null +++ b/code/__defines/mobs.dm @@ -0,0 +1,165 @@ +// /mob/var/stat things. +#define CONSCIOUS 0 +#define UNCONSCIOUS 1 +#define DEAD 2 + +// Bitflags defining which status effects could be or are inflicted on a mob. +#define CANSTUN 0x1 +#define CANWEAKEN 0x2 +#define CANPARALYSE 0x4 +#define CANPUSH 0x8 +#define LEAPING 0x10 +#define PASSEMOTES 0x32 // Mob has a cortical borer or holders inside of it that need to see emotes. +#define GODMODE 0x1000 +#define FAKEDEATH 0x2000 // Replaces stuff like changeling.changeling_fakedeath. +#define DISFIGURED 0x4000 // Set but never checked. Remove this sometime and replace occurences with the appropriate organ code +#define XENO_HOST 0x8000 // Tracks whether we're gonna be a baby alien's mummy. + +// Grab levels. +#define GRAB_PASSIVE 1 +#define GRAB_AGGRESSIVE 2 +#define GRAB_NECK 3 +#define GRAB_UPGRADING 4 +#define GRAB_KILL 5 + +#define BORGMESON 0x1 +#define BORGTHERM 0x2 +#define BORGXRAY 0x4 +#define BORGMATERIAL 8 + +#define HOSTILE_STANCE_IDLE 1 +#define HOSTILE_STANCE_ALERT 2 +#define HOSTILE_STANCE_ATTACK 3 +#define HOSTILE_STANCE_ATTACKING 4 +#define HOSTILE_STANCE_TIRED 5 + +#define LEFT 1 +#define RIGHT 2 + +// Pulse levels, very simplified. +#define PULSE_NONE 0 // So !M.pulse checks would be possible. +#define PULSE_SLOW 1 // <60 bpm +#define PULSE_NORM 2 // 60-90 bpm +#define PULSE_FAST 3 // 90-120 bpm +#define PULSE_2FAST 4 // >120 bpm +#define PULSE_THREADY 5 // Occurs during hypovolemic shock +#define GETPULSE_HAND 0 // Less accurate. (hand) +#define GETPULSE_TOOL 1 // More accurate. (med scanner, sleeper, etc.) + +//intent flags, why wasn't this done the first time? +#define I_HELP "help" +#define I_DISARM "disarm" +#define I_GRAB "grab" +#define I_HURT "harm" + +//These are used Bump() code for living mobs, in the mob_bump_flag, mob_swap_flags, and mob_push_flags vars to determine whom can bump/swap with whom. +#define HUMAN 1 +#define MONKEY 2 +#define ALIEN 4 +#define ROBOT 8 +#define SLIME 16 +#define SIMPLE_ANIMAL 32 +#define HEAVY 64 +#define ALLMOBS (HUMAN|MONKEY|ALIEN|ROBOT|SLIME|SIMPLE_ANIMAL|HEAVY) + +//Types of diona, returned by is_diona +#define DIONA_NYMPH 1 +#define DIONA_WORKER 2 + +// Robot AI notifications +#define ROBOT_NOTIFICATION_NEW_UNIT 1 +#define ROBOT_NOTIFICATION_NEW_NAME 2 +#define ROBOT_NOTIFICATION_NEW_MODULE 3 +#define ROBOT_NOTIFICATION_MODULE_RESET 4 + +// Appearance change flags +#define APPEARANCE_UPDATE_DNA 0x1 +#define APPEARANCE_RACE (0x2|APPEARANCE_UPDATE_DNA) +#define APPEARANCE_GENDER (0x4|APPEARANCE_UPDATE_DNA) +#define APPEARANCE_SKIN 0x8 +#define APPEARANCE_HAIR 0x10 +#define APPEARANCE_HAIR_COLOR 0x20 +#define APPEARANCE_FACIAL_HAIR 0x40 +#define APPEARANCE_FACIAL_HAIR_COLOR 0x80 +#define APPEARANCE_EYE_COLOR 0x100 +#define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR) +#define APPEARANCE_ALL 0xFFFF + +// Click cooldown +#define DEFAULT_ATTACK_COOLDOWN 8 //Default timeout for aggressive actions +#define DEFAULT_QUICK_COOLDOWN 4 + + +#define MIN_SUPPLIED_LAW_NUMBER 15 +#define MAX_SUPPLIED_LAW_NUMBER 50 + +//default item on-mob icons +#define INV_HEAD_DEF_ICON 'icons/mob/head.dmi' +#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' +#define INV_SUIT_DEF_ICON 'icons/mob/ties.dmi' +#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi' +#define MAX_SUPPLIED_LAW_NUMBER 50 + +// NT's alignment towards the character +#define COMPANY_LOYAL "Loyal" +#define COMPANY_SUPPORTATIVE "Supportive" +#define COMPANY_NEUTRAL "Neutral" +#define COMPANY_SKEPTICAL "Skeptical" +#define COMPANY_OPPOSED "Opposed" + +#define COMPANY_ALIGNMENTS list(COMPANY_LOYAL,COMPANY_SUPPORTATIVE,COMPANY_NEUTRAL,COMPANY_SKEPTICAL,COMPANY_OPPOSED) + + +// Defines mob sizes, used by lockers and to determine what is considered a small sized mob, etc. +#define MOB_LARGE 40 +#define MOB_MEDIUM 20 +#define MOB_SMALL 10 +#define MOB_TINY 5 +#define MOB_MINISCULE 1 + +// Gluttony levels. +#define GLUT_TINY 1 // Eat anything tiny and smaller +#define GLUT_SMALLER 2 // Eat anything smaller than we are +#define GLUT_ANYTHING 3 // Eat anything, ever + +#define TINT_NONE 0 +#define TINT_MODERATE 1 +#define TINT_HEAVY 2 +#define TINT_BLIND 3 + +#define FLASH_PROTECTION_REDUCED -1 +#define FLASH_PROTECTION_NONE 0 +#define FLASH_PROTECTION_MODERATE 1 +#define FLASH_PROTECTION_MAJOR 2 +#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) +#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) + +#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) +#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) + +// Incapacitation flags, used by the mob/proc/incapacitated() proc +#define INCAPACITATION_RESTRAINED 1 +#define INCAPACITATION_BUCKLED_PARTIALLY 2 +#define INCAPACITATION_BUCKLED_FULLY 4 +#define INCAPACITATION_DISABLED 8 + +#define INCAPACITATION_DEFAULT (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_DISABLED) +#define INCAPACITATION_ALL (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_DISABLED) + +#define MOB_PULL_NONE 0 +#define MOB_PULL_SMALLER 1 +#define MOB_PULL_SAME 2 +#define MOB_PULL_LARGER 3 + +//Time of Death constants +//Used with a list in preference datums to track times of death +#define CREW "crew" //Used for crewmembers, AI, cyborgs, nymphs, antags +#define ANIMAL "animal" //Used for mice and any other simple animals +#define MINISYNTH "minisynth"//Used for drones and pAIs + +#define RESPAWN_ANIMAL 3000 +#define RESPAWN_MINISYNTH 6000 diff --git a/code/__defines/process_scheduler.dm b/code/__defines/process_scheduler.dm index 852e9128e76..8653b940461 100644 --- a/code/__defines/process_scheduler.dm +++ b/code/__defines/process_scheduler.dm @@ -1,19 +1,19 @@ -// Process status defines -#define PROCESS_STATUS_IDLE 1 -#define PROCESS_STATUS_QUEUED 2 -#define PROCESS_STATUS_RUNNING 3 -#define PROCESS_STATUS_MAYBE_HUNG 4 -#define PROCESS_STATUS_PROBABLY_HUNG 5 -#define PROCESS_STATUS_HUNG 6 - -// Process time thresholds -#define PROCESS_DEFAULT_HANG_WARNING_TIME 900 // 90 seconds -#define PROCESS_DEFAULT_HANG_ALERT_TIME 1800 // 180 seconds -#define PROCESS_DEFAULT_HANG_RESTART_TIME 2400 // 240 seconds -#define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks -#define PROCESS_DEFAULT_TICK_ALLOWANCE 20 // 20% of one tick - -// SCHECK macros -// This references src directly to work around a weird bug with try/catch -#define SCHECK_EVERY(this_many_calls) if(++src.calls_since_last_scheck >= this_many_calls) sleepCheck() -#define SCHECK SCHECK_EVERY(50) +// Process status defines +#define PROCESS_STATUS_IDLE 1 +#define PROCESS_STATUS_QUEUED 2 +#define PROCESS_STATUS_RUNNING 3 +#define PROCESS_STATUS_MAYBE_HUNG 4 +#define PROCESS_STATUS_PROBABLY_HUNG 5 +#define PROCESS_STATUS_HUNG 6 + +// Process time thresholds +#define PROCESS_DEFAULT_HANG_WARNING_TIME 300 // 30 seconds +#define PROCESS_DEFAULT_HANG_ALERT_TIME 600 // 60 seconds +#define PROCESS_DEFAULT_HANG_RESTART_TIME 900 // 90 seconds +#define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks +#define PROCESS_DEFAULT_TICK_ALLOWANCE 20 // 20% of one tick + +// SCHECK macros +// This references src directly to work around a weird bug with try/catch +#define SCHECK_EVERY(this_many_calls) if(++src.calls_since_last_scheck >= this_many_calls) sleepCheck() +#define SCHECK SCHECK_EVERY(50) diff --git a/code/__defines/research.dm b/code/__defines/research.dm new file mode 100644 index 00000000000..d40722d0cf6 --- /dev/null +++ b/code/__defines/research.dm @@ -0,0 +1,18 @@ +#define SHEET_MATERIAL_AMOUNT 2000 + +#define TECH_MATERIAL "materials" +#define TECH_ENGINEERING "engineering" +#define TECH_PHORON "phorontech" +#define TECH_POWER "powerstorage" +#define TECH_BLUESPACE "bluespace" +#define TECH_BIO "biotech" +#define TECH_COMBAT "combat" +#define TECH_MAGNET "magnets" +#define TECH_DATA "programming" +#define TECH_ILLEGAL "syndicate" +#define TECH_ARCANE "arcane" + +#define IMPRINTER 0x1 //For circuits. Uses glass/chemicals. +#define PROTOLATHE 0x2 //New stuff. Uses glass/metal/chemicals +#define MECHFAB 0x4 //Mechfab +#define CHASSIS 0x8 //For protolathe, but differently diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm new file mode 100644 index 00000000000..6baadb0bc73 --- /dev/null +++ b/code/__defines/species_languages.dm @@ -0,0 +1,46 @@ +// Species flags. +#define NO_BLOOD 0x1 // Vessel var is not filled with blood, cannot bleed out. +#define NO_BREATHE 0x2 // Cannot suffocate or take oxygen loss. +#define NO_SCAN 0x4 // Cannot be scanned in a DNA machine/genome-stolen. +#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator. +#define NO_SLIP 0x10 // Cannot fall over. +#define NO_POISON 0x20 // Cannot not suffer toxloss. +#define IS_PLANT 0x40 // Is a treeperson. +#define NO_MINOR_CUT 0x80 // Can step on broken glass with no ill-effects. Either thick skin (diona/vox), cut resistant (slimes) or incorporeal (shadows) +// unused: 0x8000 - higher than this will overflow + +// Species spawn flags +#define IS_WHITELISTED 0x1 // Must be whitelisted to play. +#define CAN_JOIN 0x2 // Species is selectable in chargen. +#define IS_RESTRICTED 0x4 // Is not a core/normally playable species. (castes, mutantraces) + +// Species appearance flags +#define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255) +#define HAS_SKIN_COLOR 0x2 // Skin colour selectable in chargen. (RGB) +#define HAS_LIPS 0x4 // Lips are drawn onto the mob icon. (lipstick) +#define HAS_UNDERWEAR 0x8 // Underwear is drawn onto the mob icon. +#define HAS_EYE_COLOR 0x10 // Eye colour selectable in chargen. (RGB) +#define HAS_HAIR_COLOR 0x20 // Hair colour selectable in chargen. (RGB) + +// Languages. +#define LANGUAGE_EAL "Encoded Audio Language" +#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_RESOMI "Resomi" +#define LANGUAGE_ROOTSPEAK "Rootspeak" +#define LANGUAGE_TRADEBAND "Tradeband" +#define LANGUAGE_GUTTER "Gutter" + +// Language flags. +#define WHITELISTED 1 // Language is available if the speaker is whitelisted. +#define RESTRICTED 2 // Language can only be acquired by spawning or an admin. +#define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight. +#define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand. +#define HIVEMIND 16 // Broadcast to all mobs with this language. +#define NONGLOBAL 32 // Do not add to general languages list. +#define INNATE 64 // All mobs can be assumed to speak and understand this language. (audible emotes) +#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message +#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems diff --git a/code/__defines/targeting.dm b/code/__defines/targeting.dm new file mode 100644 index 00000000000..4bbe7345920 --- /dev/null +++ b/code/__defines/targeting.dm @@ -0,0 +1,4 @@ +#define TARGET_CAN_MOVE 1 +#define TARGET_CAN_RUN 2 +#define TARGET_CAN_CLICK 4 +#define TARGET_CAN_RADIO 8 \ No newline at end of file diff --git a/code/__defines/turfs.dm b/code/__defines/turfs.dm new file mode 100644 index 00000000000..486927453e2 --- /dev/null +++ b/code/__defines/turfs.dm @@ -0,0 +1,10 @@ +#define TURF_REMOVE_CROWBAR 1 +#define TURF_REMOVE_SCREWDRIVER 2 +#define TURF_REMOVE_SHOVEL 4 +#define TURF_REMOVE_WRENCH 8 +#define TURF_CAN_BREAK 16 +#define TURF_CAN_BURN 32 +#define TURF_HAS_EDGES 64 +#define TURF_HAS_CORNERS 128 +#define TURF_IS_FRAGILE 256 +#define TURF_ACID_IMMUNE 512 \ No newline at end of file diff --git a/code/__defines/unit_testing.dm b/code/__defines/unit_testing.dm new file mode 100644 index 00000000000..88eebd5aec1 --- /dev/null +++ b/code/__defines/unit_testing.dm @@ -0,0 +1,10 @@ +/* + * + * This file is used by Travis to indicate that Unit Tests are to be ran. + * Do not add anything but the UNIT_TEST definition here as it will be overwritten by Travis when running tests. + * + * + * Should you wish to edit set UNIT_TEST to 1 like so: + * #define UNIT_TEST 1 + */ +#define UNIT_TEST 0 diff --git a/code/_defines/chemical_effects.dm b/code/_defines/chemical_effects.dm deleted file mode 100644 index 6119d80cb51..00000000000 --- a/code/_defines/chemical_effects.dm +++ /dev/null @@ -1,7 +0,0 @@ -#define CE_STABLE "stable" // Inaprovaline -#define CE_ANTIBIOTIC "antibiotic" // Spaceacilin -#define CE_BLOODRESTORE "bloodrestore" // Iron/nutriment -#define CE_PAINKILLER "painkiller" -#define CE_ALCOHOL "alcohol" // Liver filtering -#define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage -#define CE_SPEEDBOOST "gofast" // Hyperzine \ No newline at end of file diff --git a/code/_helpers/areas.dm b/code/_helpers/areas.dm new file mode 100644 index 00000000000..ccf7ea2f2a3 --- /dev/null +++ b/code/_helpers/areas.dm @@ -0,0 +1,21 @@ +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all turfs in areas of that type in the world. +/proc/get_area_turfs(var/areatype, var/list/predicates) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/turfs = new/list() + for(var/areapath in typesof(areatype)) + var/area/A = locate(areapath) + for(var/turf/T in A.contents) + if(!predicates || all_predicates_true(list(T), predicates)) + turfs += T + return turfs + +/proc/pick_area_turf(var/areatype, var/list/predicates) + var/list/turfs = get_area_turfs(areatype, predicates) + if(turfs && turfs.len) + return pick(turfs) diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm new file mode 100644 index 00000000000..2fe393b4dc2 --- /dev/null +++ b/code/_helpers/atmospherics.dm @@ -0,0 +1,47 @@ +/obj/proc/analyze_gases(var/obj/A, var/mob/user) + if(src != A) + user.visible_message("\The [user] has used \an [src] on \the [A]") + + A.add_fingerprint(user) + var/list/result = A.atmosanalyze(user) + if(result && result.len) + user << "Results of the analysis[src == A ? "" : " of \the [A]"]" + for(var/line in result) + user << "[line]" + return 1 + + user << "Your [src] flashes a red light as it fails to analyze \the [A]." + return 0 + +/proc/atmosanalyzer_scan(var/obj/target, var/datum/gas_mixture/mixture, var/mob/user) + var/pressure = mixture.return_pressure() + var/total_moles = mixture.total_moles + + var/list/results = list() + if (total_moles>0) + results += "Pressure: [round(pressure,0.1)] kPa" + for(var/mix in mixture.gas) + results += "[gas_data.name[mix]]: [round((mixture.gas[mix] / total_moles) * 100)]%" + results += "Temperature: [round(mixture.temperature-T0C)]°C" + else + results += "\The [target] is empty!" + + return results + +/obj/proc/atmosanalyze(var/mob/user) + return + +/obj/item/weapon/tank/atmosanalyze(var/mob/user) + return atmosanalyzer_scan(src, src.air_contents, user) + +/obj/machinery/portable_atmospherics/atmosanalyze(var/mob/user) + return atmosanalyzer_scan(src, src.air_contents, user) + +/obj/machinery/atmospherics/pipe/atmosanalyze(var/mob/user) + return atmosanalyzer_scan(src, src.parent.air, user) + +/obj/machinery/power/rad_collector/atmosanalyze(var/mob/user) + if(P) return atmosanalyzer_scan(src, src.P.air_contents, user) + +/obj/item/weapon/flamethrower/atmosanalyze(var/mob/user) + if(ptank) return atmosanalyzer_scan(src, ptank.air_contents, user) diff --git a/code/__HELPERS/datum_pool.dm b/code/_helpers/datum_pool.dm similarity index 69% rename from code/__HELPERS/datum_pool.dm rename to code/_helpers/datum_pool.dm index b5bcea123fe..2706fcef83d 100644 --- a/code/__HELPERS/datum_pool.dm +++ b/code/_helpers/datum_pool.dm @@ -94,17 +94,32 @@ var/global/list/GlobalPool = list() loc = args ..() -/datum/proc/ResetVars(var/list/exlude = list()) - var/list/excluded = list("animate_movement", "loc", "locs", "parent_type", "vars", "verbs", "type") + exlude +var/list/excluded_vars = list("animate_movement", "contents", "loc", "locs", "parent_type", "vars", "verbs", "type") +var/list/pooledvariables = list() +//thanks to clusterfack @ /vg/station for these two procs +/datum/proc/createVariables(var/list/excluded) + pooledvariables[type] = new/list() + var/list/all_excluded = excluded_vars + excluded - for(var/V in vars) - if(V in excluded) + for(var/key in vars) + if(key in all_excluded) continue + pooledvariables[type][key] = initial(vars[key]) - vars[V] = initial(vars[V]) +/datum/proc/ResetVars(var/list/excluded = list()) + if(!pooledvariables[type]) + createVariables(excluded) + + for(var/key in pooledvariables[type]) + vars[key] = pooledvariables[type][key] /atom/movable/ResetVars() ..() - vars["loc"] = null + loc = null + contents = initial(contents) //something is really wrong if this object still has stuff in it by this point + +/image/ResetVars() + ..() + loc = null #undef ATOM_POOL_COUNT diff --git a/code/__HELPERS/files.dm b/code/_helpers/files.dm similarity index 100% rename from code/__HELPERS/files.dm rename to code/_helpers/files.dm diff --git a/code/_helpers/functional.dm b/code/_helpers/functional.dm new file mode 100644 index 00000000000..231b8a4d261 --- /dev/null +++ b/code/_helpers/functional.dm @@ -0,0 +1,24 @@ +/proc/all_predicates_true(var/list/input, var/list/predicates) + functional_sanity(input, predicates) + + for(var/i = 1 to predicates.len) + if(!call(predicates[i])(arglist(input))) + return FALSE + return TRUE + +/proc/any_predicate_true(var/list/input, var/list/predicates) + functional_sanity(input, predicates) + + if(!predicates.len) + return TRUE + + for(var/i = 1 to predicates.len) + if(call(predicates[i])(arglist(input))) + return TRUE + return FALSE + +/proc/functional_sanity(var/list/input, var/list/predicates) + if(!istype(input)) + CRASH("Expected list input. Was [input ? "[input.type]" : "null"]") + if(!istype(predicates)) + CRASH("Expected predicate list. Was [predicates ? "[predicates.type]" : "null"]") diff --git a/code/__HELPERS/game.dm b/code/_helpers/game.dm similarity index 85% rename from code/__HELPERS/game.dm rename to code/_helpers/game.dm index 0ac1c5b6d78..d130d82175a 100644 --- a/code/__HELPERS/game.dm +++ b/code/_helpers/game.dm @@ -156,37 +156,35 @@ // It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects, // being unable to hear people due to being in a box within a bag. -/proc/recursive_mob_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_radio = 1) +/proc/recursive_content_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_mobs = 1, var/include_objects = 1) - //debug_mob += O.contents.len if(!recursion_limit) return L - for(var/atom/A in O.contents) - if(ismob(A)) - var/mob/M = A - if(client_check && !M.client) - L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio) - continue - if(sight_check && !isInSight(A, O)) - continue - L |= M - //world.log << "[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])" + for(var/I in O.contents) - else if(include_radio && istype(A, /obj/item/device/radio)) - if(sight_check && !isInSight(A, O)) - continue - L |= A + if(ismob(I)) + if(!sight_check || isInSight(I, O)) + L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) + if(include_mobs) + if(client_check) + var/mob/M = I + if(M.client) + L |= M + else + L |= I + + else if(istype(I,/obj/)) + if(!sight_check || isInSight(I, O)) + L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) + if(include_objects) + L |= I - if(isobj(A) || ismob(A)) - L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio) return L -// The old system would loop through lists for a total of 5000 per function call, in an empty server. -// This new system will loop at around 1000 in an empty server. +// Returns a list of mobs and/or objects in range of R from source. Used in radio and say code. -/proc/get_mobs_in_view(var/R, var/atom/source) - // Returns a list of mobs in range of R from source. Used in radio and say code. +/proc/get_mobs_or_objects_in_view(var/R, var/atom/source, var/include_mobs = 1, var/include_objects = 1) var/turf/T = get_turf(source) var/list/hear = list() @@ -196,17 +194,17 @@ var/list/range = hear(R, T) - for(var/atom/A in range) - if(ismob(A)) - var/mob/M = A - if(M.client) - hear += M - //world.log << "Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])" - else if(istype(A, /obj/item/device/radio)) - hear += A - - if(isobj(A) || ismob(A)) - hear |= recursive_mob_check(A, hear, 3, 1, 0, 1) + for(var/I in range) + if(ismob(I)) + hear |= recursive_content_check(I, hear, 3, 1, 0, include_mobs, include_objects) + if(include_mobs) + var/mob/M = I + if(M.client) + hear += M + else if(istype(I,/obj/)) + hear |= recursive_content_check(I, hear, 3, 1, 0, include_mobs, include_objects) + if(include_objects) + hear += I return hear @@ -332,12 +330,11 @@ proc/isInSight(var/atom/A, var/atom/B) // Same as above but for alien candidates. /proc/get_alien_candidates() - var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn var/i = 0 while(candidates.len <= 0 && i < 5) for(var/mob/dead/observer/G in player_list) - if(G.client.prefs.be_special & BE_ALIEN) + if(MODE_XENOMORPH in G.client.prefs.be_special_role) if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) candidates += G.key @@ -362,6 +359,13 @@ proc/isInSight(var/atom/A, var/atom/B) for(var/client/C in group) C.screen -= O +/proc/flick_overlay(image/I, list/show_to, duration) + for(var/client/C in show_to) + C.images += I + spawn(duration) + for(var/client/C in show_to) + C.images -= I + datum/projectile_data var/src_x var/src_y @@ -524,3 +528,6 @@ datum/projectile_data /proc/SecondsToTicks(var/seconds) return seconds * 10 + +/proc/round_is_spooky(var/spookiness_threshold = config.cult_ghostwriter_req_cultists) + return (cult.current_antagonists.len > spookiness_threshold) diff --git a/code/__HELPERS/global_lists.dm b/code/_helpers/global_lists.dm similarity index 94% rename from code/__HELPERS/global_lists.dm rename to code/_helpers/global_lists.dm index 05b90a88915..f2776f32585 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -66,6 +66,8 @@ var/global/list/rune_list = new() var/global/list/escape_list = list() var/global/list/endgame_exits = list() var/global/list/endgame_safespawns = list() + +var/global/list/syndicate_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks) ////////////////////////// /////Initial Building///// ////////////////////////// @@ -120,9 +122,7 @@ var/global/list/endgame_safespawns = list() for (var/language_name in all_languages) var/datum/language/L = all_languages[language_name] if(!(L.flags & NONGLOBAL)) - language_keys[":[lowertext(L.key)]"] = L - language_keys[".[lowertext(L.key)]"] = L - language_keys["#[lowertext(L.key)]"] = L + language_keys[lowertext(L.key)] = L var/rkey = 0 paths = typesof(/datum/species)-/datum/species @@ -132,9 +132,9 @@ var/global/list/endgame_safespawns = list() S.race_key = rkey //Used in mob icon caching. all_species[S.name] = S - if(!(S.flags & IS_RESTRICTED)) + if(!(S.spawn_flags & IS_RESTRICTED)) playable_species += S.name - if(S.flags & IS_WHITELISTED) + if(S.spawn_flags & IS_WHITELISTED) whitelisted_species += S.name //Posters diff --git a/code/__HELPERS/icons.dm b/code/_helpers/icons.dm similarity index 89% rename from code/__HELPERS/icons.dm rename to code/_helpers/icons.dm index 6dc41693da0..207a0640bbc 100644 --- a/code/__HELPERS/icons.dm +++ b/code/_helpers/icons.dm @@ -635,7 +635,7 @@ The _flatIcons list is a cache for generated icon files. */ proc // Creates a single icon from a given /atom or /image. Only the first argument is required. - getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT) + getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT, always_use_defdir = 0) // We start with a blank canvas, otherwise some icon procs crash silently var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon if(!A) @@ -666,7 +666,7 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu noIcon = TRUE // Do not render this object. var/curdir - if(A.dir != 2) + if(A.dir != 2 && !always_use_defdir) curdir = A.dir else curdir = defdir @@ -760,7 +760,11 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu // Pull the default direction. add = icon(I:icon, I:icon_state) else // 'I' is an appearance object. - add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend) + if(istype(A,/obj/machinery/atmospherics) && I in A.underlays) + var/image/Im = I + add = getFlatIcon(new/image(I), Im.dir, curicon, curstate, curblend, 1) + else + add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend, always_use_defdir) // Find the new dimensions of the flat icon to fit the added overlay addX1 = min(flatX1, I:pixel_x+1) @@ -773,9 +777,15 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu flat.Crop(addX1-flatX1+1, addY1-flatY1+1, addX2-flatX1+1, addY2-flatY1+1) flatX1=addX1;flatX2=addX2 flatY1=addY1;flatY2=addY2 - + var/iconmode + if(I in A.overlays) + iconmode = ICON_OVERLAY + else if(I in A.underlays) + iconmode = ICON_UNDERLAY + else + iconmode = blendMode2iconMode(curblend) // Blend the overlay into the flattened icon - flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) + flat.Blend(add, iconmode, I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) if(A.color) flat.Blend(A.color, ICON_MULTIPLY) @@ -854,6 +864,56 @@ proc/sort_atoms_by_layer(var/list/atoms) swapped = 1 return result +/* +generate_image function generates image of specified range and location +arguments tx, ty, tz are target coordinates (requred), range defines render distance to opposite corner (requred) +cap_mode is capturing mode (optional), user is capturing mob (requred only wehen cap_mode = CAPTURE_MODE_REGULAR), +lighting determines lighting capturing (optional), suppress_errors suppreses errors and continues to capture (optional). +*/ +proc/generate_image(var/tx as num, var/ty as num, var/tz as num, var/range as num, var/cap_mode = CAPTURE_MODE_PARTIAL, var/mob/living/user, var/lighting = 1, var/suppress_errors = 1) + var/list/turfstocapture = list() + //Lines below determine what tiles will be rendered + for(var/xoff = 0 to range) + for(var/yoff = 0 to range) + var/turf/T = locate(tx + xoff,ty + yoff,tz) + if(T) + if(cap_mode == CAPTURE_MODE_REGULAR) + if(user.can_capture_turf(T)) + turfstocapture.Add(T) + continue + else + turfstocapture.Add(T) + else + //Capture includes non-existan turfs + if(!suppress_errors) + return + //Lines below determine what objects will be rendered + var/list/atoms = list() + for(var/turf/T in turfstocapture) + atoms.Add(T) + for(var/atom/A in T) + if(istype(A, /atom/movable/lighting_overlay) && lighting) //Special case for lighting + atoms.Add(A) + continue + if(A.invisibility) continue + atoms.Add(A) + //Lines below actually render all colected data + atoms = sort_atoms_by_layer(atoms) + var/icon/cap = icon('icons/effects/96x96.dmi', "") + cap.Scale(range*32, range*32) + cap.Blend("#000", ICON_OVERLAY) + for(var/atom/A in atoms) + if(A) + var/icon/img = getFlatIcon(A) + if(istype(img, /icon)) + if(istype(A, /mob/living) && A:lying) + img.BecomeLying() + var/xoff = (A.x - tx) * 32 + var/yoff = (A.y - ty) * 32 + cap.Blend(img, blendMode2iconMode(A.blend_mode), A.pixel_x + xoff, A.pixel_y + yoff) + + return cap + proc/percentage_to_colour(var/P) //Takes a value between 0-1 //Returns a colour - pure green if 1, pure red if 0 diff --git a/code/__HELPERS/lists.dm b/code/_helpers/lists.dm similarity index 95% rename from code/__HELPERS/lists.dm rename to code/_helpers/lists.dm index 2bf815f2694..1909075ba69 100644 --- a/code/__HELPERS/lists.dm +++ b/code/_helpers/lists.dm @@ -630,7 +630,7 @@ proc/dd_sortedTextList(list/incoming) return dd_sortedtextlist(incoming, case_sensitive) -datum/proc/dd_SortValue() +/datum/proc/dd_SortValue() return "[src]" /obj/machinery/dd_SortValue() @@ -653,9 +653,11 @@ datum/proc/dd_SortValue() L += new path() return L +#define listequal(A, B) (A.len == B.len && !length(A^B)) + /proc/Sum(var/list/input) var/total = 0 for (var/i=1,i<=input.len,i++) total += input[i] - return total \ No newline at end of file + return total diff --git a/code/__HELPERS/logging.dm b/code/_helpers/logging.dm similarity index 94% rename from code/__HELPERS/logging.dm rename to code/_helpers/logging.dm index 422810ebe18..274859159af 100644 --- a/code/__HELPERS/logging.dm +++ b/code/_helpers/logging.dm @@ -90,6 +90,9 @@ /proc/log_misc(text) game_log("MISC", text) +/proc/log_unit_test(text) + world.log << "## UNIT_TEST ##: [text]" + // Procs for logging into diary_runtime /proc/log_hard_delete(atom/A) if (config.log_runtime) diff --git a/code/__HELPERS/maths.dm b/code/_helpers/maths.dm similarity index 90% rename from code/__HELPERS/maths.dm rename to code/_helpers/maths.dm index 2b6d6db018f..0c1653b42a7 100644 --- a/code/__HELPERS/maths.dm +++ b/code/_helpers/maths.dm @@ -122,3 +122,9 @@ /proc/norm(x, y) return sqrt(squaredNorm(x, y)) + +/proc/IsPowerOfTwo(var/val) + return (val & (val-1)) == 0 + +/proc/RoundUpToPowerOfTwo(var/val) + return 2 ** -round(-log(2,val)) diff --git a/code/_helpers/matrices.dm b/code/_helpers/matrices.dm new file mode 100644 index 00000000000..abb0366382d --- /dev/null +++ b/code/_helpers/matrices.dm @@ -0,0 +1,17 @@ +/matrix/proc/TurnTo(old_angle, new_angle) + . = new_angle - old_angle + Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT + + +/atom/proc/SpinAnimation(speed = 10, loops = -1) + var/matrix/m120 = matrix(transform) + m120.Turn(120) + var/matrix/m240 = matrix(transform) + m240.Turn(240) + var/matrix/m360 = matrix(transform) + speed /= 3 //Gives us 3 equal time segments for our three turns. + //Why not one turn? Because byond will see that the start and finish are the same place and do nothing + //Why not two turns? Because byond will do a flip instead of a turn + animate(src, transform = m120, time = speed, loops) + animate(transform = m240, time = speed) + animate(transform = m360, time = speed) diff --git a/code/__HELPERS/mobs.dm b/code/_helpers/mobs.dm similarity index 82% rename from code/__HELPERS/mobs.dm rename to code/_helpers/mobs.dm index 9e501827e49..fb59afedda4 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/_helpers/mobs.dm @@ -1,3 +1,28 @@ +/atom/movable/proc/get_mob() + return + +/obj/machinery/bot/mulebot/get_mob() + if(load && istype(load,/mob/living)) + return load + +/obj/mecha/get_mob() + return occupant + +/obj/vehicle/train/get_mob() + return buckled_mob + +/mob/get_mob() + return src + +/proc/mobs_in_view(var/range, var/source) + var/list/mobs = list() + for(var/atom/movable/AM in view(range, source)) + var/M = AM.get_mob() + if(M) + mobs += M + + return mobs + proc/random_hair_style(gender, species = "Human") var/h_style = "Bald" @@ -37,13 +62,20 @@ proc/random_facial_hair_style(gender, species = "Human") return f_style +proc/sanitize_name(name, species = "Human") + var/datum/species/current_species + if(species) + current_species = all_species[species] + + return current_species ? current_species.sanitize_name(name) : sanitizeName(name) + proc/random_name(gender, species = "Human") var/datum/species/current_species if(species) current_species = all_species[species] - if(!current_species || current_species.name == "Human") + if(!current_species || current_species.name_language == null) if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) else @@ -137,7 +169,7 @@ Proc for attack log creation, because really why not /proc/get_exposed_defense_zone(var/atom/movable/target) var/obj/item/weapon/grab/G = locate() in target - if (G && G.state >= GRAB_NECK) + if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people. return pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg") else return pick("chest", "groin") diff --git a/code/__HELPERS/names.dm b/code/_helpers/names.dm similarity index 96% rename from code/__HELPERS/names.dm rename to code/_helpers/names.dm index 025855732dc..800a4381403 100644 --- a/code/__HELPERS/names.dm +++ b/code/_helpers/names.dm @@ -20,7 +20,7 @@ var/command_name = null if (command_name) return command_name - var/name = "Central Command" + var/name = "[boss_name]" command_name = name return name @@ -47,8 +47,8 @@ var/religion_name = null return "Tau Ceti" /proc/commstation_name() - if (commstation_name) - return commstation_name + if (dock_name) + return dock_name /proc/station_name() if (station_name) @@ -165,7 +165,7 @@ var/syndicate_code_response//Code response for traitors. Obviously, some people will be better at this than others but in theory, everyone should be able to do it and it only enhances roleplay. Can probably be done through "{ }" but I don't really see the practical benefit. One example of an earlier system is commented below. - /N + -N */ /proc/generate_code_phrase()//Proc is used for phrase and response in master_controller.dm diff --git a/code/__HELPERS/sanitize_values.dm b/code/_helpers/sanitize_values.dm similarity index 100% rename from code/__HELPERS/sanitize_values.dm rename to code/_helpers/sanitize_values.dm diff --git a/code/_helpers/spawn_sync.dm b/code/_helpers/spawn_sync.dm new file mode 100644 index 00000000000..91631d86712 --- /dev/null +++ b/code/_helpers/spawn_sync.dm @@ -0,0 +1,86 @@ +//------------------------------- +/* + Spawn sync helper + + Helps syncronize spawn()ing multiple processes in loops. + + Example for using this: + + //Create new spawn_sync datum + var/datum/spawn_sync/sync = new() + + for(var/obj/O in list) + //Call start_worker(), passing it first the object, then a string of the name of the proc you want called, then + // any and all arguments you want passed to the proc. + sync.start_worker(O, "do_something", arg1, arg2) + + //Finally call wait_until_done() + sync.wait_until_done() + + //Once all the workers have completed, or the failsafe has triggered, the code will continue. By default the + // failsafe is roughly 10 seconds (100 checks). +*/ +//------------------------------- +/datum/spawn_sync + var/count = 1 + var/failsafe = 100 //how many checks before the failsafe triggers and the helper stops waiting + +//Opens a thread counter +/datum/spawn_sync/proc/open() + count++ + +//Closes a thread counter +/datum/spawn_sync/proc/close() + count-- + +//Finalizes the spawn sync by removing the original starting count +/datum/spawn_sync/proc/finalize() + close() + +//Resets the counter if you want to utilize the same datum multiple times +// Optional: pass the number of checks you want for the failsafe +/datum/spawn_sync/proc/reset(var/safety = 100) + count = 1 + failsafe = safety + +//Check if all threads have returned +// Returns 0 if not all threads have completed +// Returns 1 if all threads have completed +/datum/spawn_sync/proc/check() + safety_check() + return count > 0 ? 1 : 0 + +//Failsafe in case something breaks horribly +/datum/spawn_sync/proc/safety_check() + failsafe-- + if(failsafe < 1) + count = 0 + +//Set failsafe check count in case you need more time for the workers to return +/datum/spawn_sync/proc/set_failsafe(var/safety) + failsafe = safety + +/datum/spawn_sync/proc/start_worker() + //Extract the thread run proc and it's arguments from the variadic args list. + ASSERT(args.len > 0) + var/obj = args[1] + var/thread_proc = args[2] + + //dispatch a new thread + open() + spawn() + //Utilise try/catch keywords here so the code continues even if an error occurs. + try + call(obj, thread_proc)(arglist(args.Copy(3))) + catch(var/exception/e) + error("[e] on [e.file]:[e.line]") + close() + +/datum/spawn_sync/proc/wait_until_done() + finalize() + + //Create a while loop to check if the sync is complete yet, it will return once all the spawn threads have + // completed, or the failsafe has expired. + while(check()) + //Add a sleep call to delay each check. + sleep(1) diff --git a/code/__HELPERS/text.dm b/code/_helpers/text.dm similarity index 92% rename from code/__HELPERS/text.dm rename to code/_helpers/text.dm index b6365793fb8..50d63568891 100644 --- a/code/__HELPERS/text.dm +++ b/code/_helpers/text.dm @@ -34,7 +34,8 @@ input = replace_characters(input, list("\n"=" ","\t"=" ")) if(encode) - //In addition to processing html, html_encode removes byond formatting codes like "\red", "\i" and other. + // The below \ escapes have a space inserted to attempt to enable Travis auto-checking of span class usage. Please do not remove the space. + //In addition to processing html, html_encode removes byond formatting codes like "\ red", "\ i" and other. //It is important to avoid double-encode text, it can "break" quotes and some other characters. //Also, keep in mind that escaped characters don't work in the interface (window titles, lower left corner of the main window, etc.) input = html_encode(input) @@ -115,7 +116,7 @@ if(last_char_group == 1) output = copytext(output,1,length(output)) //removes the last character (in this case a space) - for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai")) //prevents these common metagamey names + for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai","plating")) //prevents these common metagamey names if(cmptext(output,bad_name)) return //(not case sensitive) return output @@ -350,6 +351,21 @@ proc/TextPreview(var/string,var/len=40) /proc/nl2br(var/text) return replacetextEx(text,"\n","
") +/proc/contains_az09(var/input) + for(var/i=1, i<=length(input), i++) + var/ascii_char = text2ascii(input,i) + switch(ascii_char) + // A .. Z + if(65 to 90) //Uppercase Letters + return 1 + // a .. z + if(97 to 122) //Lowercase Letters + return 1 + + // 0 .. 9 + if(48 to 57) //Numbers + return 1 + return 0 //A shortcut for assigning a span class to a string of text /proc/span(var/class, var/text) diff --git a/code/__HELPERS/time.dm b/code/_helpers/time.dm similarity index 87% rename from code/__HELPERS/time.dm rename to code/_helpers/time.dm index afc9b98a251..689e191fb57 100644 --- a/code/__HELPERS/time.dm +++ b/code/_helpers/time.dm @@ -6,9 +6,9 @@ var/roundstart_hour = 0 //Returns the world time in english -proc/worldtime2text(time = world.time) +proc/worldtime2text(time = world.time, timeshift = 1) if(!roundstart_hour) roundstart_hour = rand(0, 23) - return "[(round(time / 36000)+roundstart_hour) % 24]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" + return timeshift ? time2text(time+(36000*roundstart_hour), "hh:mm") : time2text(time, "hh:mm") proc/worldtime2ticks(time = world.time) if(!roundstart_hour) diff --git a/code/__HELPERS/turfs.dm b/code/_helpers/turfs.dm similarity index 90% rename from code/__HELPERS/turfs.dm rename to code/_helpers/turfs.dm index 3ccff4da8e7..2ac174f09f3 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/_helpers/turfs.dm @@ -63,3 +63,12 @@ if(!available_turfs.len) available_turfs = start_turfs return pick(available_turfs) + +/proc/turf_contains_dense_objects(var/turf/T) + return T.contains_dense_objects() + +/proc/not_turf_contains_dense_objects(var/turf/T) + return !turf_contains_dense_objects(T) + +/proc/is_station_turf(var/turf/T) + return T && isStationLevel(T.z) diff --git a/code/__HELPERS/type2type.dm b/code/_helpers/type2type.dm similarity index 89% rename from code/__HELPERS/type2type.dm rename to code/_helpers/type2type.dm index 6d8c6d0f434..232f696a719 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/_helpers/type2type.dm @@ -36,35 +36,19 @@ return num // Returns the hex value of a number given a value assumed to be a base-ten value -/proc/num2hex(num, digits) - if (digits == null) - digits = 2 +/proc/num2hex(num, padlength) + var/global/list/hexdigits = list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F") - if (!isnum(num)) - return + . = "" + while(num > 0) + var/hexdigit = hexdigits[(num & 0xF) + 1] + . = "[hexdigit][.]" + num >>= 4 //go to the next half-byte - // hex is our return value, to which each hex-digit of num is appended to. - var/hex = "" - var/power = -4 - var/n = 1 - - // Figure out power. (power of 2) - while (n <= num) - power += 4 - n *= 16 - - // Note that we have to start appending to hex with the most-significant digits. - while (power >= 0) - var/m = (num >> power) & 15 - hex += ascii2text(m + (m < 10 ? 48 : 87)) // Provided by the IconProcs library. - power -= 4 - - // Append zeroes to make sure that hex is atleast digits long. - var/left = digits - length(hex) + //pad with zeroes + var/left = padlength - length(.) while (left-- > 0) - hex = text("0[]", hex) - - return hex + . = "0[.]" // Concatenates a list of strings into a single string. A seperator may optionally be provided. /proc/list2text(list/ls, sep) @@ -292,13 +276,6 @@ proc/tg_list2text(list/list, glue=",") if (rights & R_CCIAA) . += "[seperator]+CCIAA" return . -/proc/ui_style2icon(ui_style) - switch (ui_style) - if ("old") return 'icons/mob/screen1_old.dmi' - if ("Orange") return 'icons/mob/screen1_Orange.dmi' - if ("Midnight") return 'icons/mob/screen1_Midnight.dmi' - else return 'icons/mob/screen1_White.dmi' - // heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ /proc/heat2color(temp) return rgb(heat2color_r(temp), heat2color_g(temp), heat2color_b(temp)) diff --git a/code/__HELPERS/unsorted.dm b/code/_helpers/unsorted.dm similarity index 91% rename from code/__HELPERS/unsorted.dm rename to code/_helpers/unsorted.dm index d570f572b82..c4c2c7ba15e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -4,6 +4,9 @@ * A large number of misc global procs. */ +//Checks if all high bits in req_mask are set in bitfield +#define BIT_TEST_ALL(bitfield, req_mask) ((~(bitfield) & (req_mask)) == 0) + //Inverts the colour of an HTML string /proc/invertHTML(HTMLstring) @@ -223,6 +226,33 @@ Turf and target are seperate in case you want to teleport some distance from a t line+=locate(px,py,M.z) return line +#define LOCATE_COORDS(X, Y, Z) locate(between(1, X, world.maxx), between(1, Y, world.maxy), Z) +/proc/getcircle(turf/center, var/radius) //Uses a fast Bresenham rasterization algorithm to return the turfs in a thin circle. + if(!radius) return list(center) + + var/x = 0 + var/y = radius + var/p = 3 - 2 * radius + + . = list() + while(y >= x) // only formulate 1/8 of circle + + . += LOCATE_COORDS(center.x - x, center.y - y, center.z) //upper left left + . += LOCATE_COORDS(center.x - y, center.y - x, center.z) //upper upper left + . += LOCATE_COORDS(center.x + y, center.y - x, center.z) //upper upper right + . += LOCATE_COORDS(center.x + x, center.y - y, center.z) //upper right right + . += LOCATE_COORDS(center.x - x, center.y + y, center.z) //lower left left + . += LOCATE_COORDS(center.x - y, center.y + x, center.z) //lower lower left + . += LOCATE_COORDS(center.x + y, center.y + x, center.z) //lower lower right + . += LOCATE_COORDS(center.x + x, center.y + y, center.z) //lower right right + + if(p < 0) + p += 4*x++ + 6; + else + p += 4*(x++ - y--) + 10; + +#undef LOCATE_COORDS + //Returns whether or not a player is a guest using their ckey as an input /proc/IsGuestKey(key) if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx @@ -240,10 +270,10 @@ Turf and target are seperate in case you want to teleport some distance from a t return 1 //Ensure the frequency is within bounds of what it should be sending/recieving at -/proc/sanitize_frequency(var/f) +/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) f = round(f) - f = max(1441, f) // 144.1 - f = min(1489, f) // 148.9 + f = max(low, f) + f = min(high, f) if ((f % 2) == 0) //Ensure the last digit is an odd number f += 1 return f @@ -472,16 +502,6 @@ Turf and target are seperate in case you want to teleport some distance from a t // mob_list.Add(M) return moblist -//E = MC^2 -/proc/convert2energy(var/M) - var/E = M*(SPEED_OF_LIGHT_SQ) - return E - -//M = E/C^2 -/proc/convert2mass(var/E) - var/M = E/(SPEED_OF_LIGHT_SQ) - return M - //Forces a variable to be posative /proc/modulus(var/M) if(M >= 0) @@ -572,11 +592,14 @@ proc/GaussRandRound(var/sigma,var/roundto) return toReturn //Step-towards method of determining whether one atom can see another. Similar to viewers() -/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. +/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldn't be arsed to do actual raycasting :I This is horribly inaccurate. var/turf/current = get_turf(source) var/turf/target_turf = get_turf(target) var/steps = 0 + if(!current || !target_turf) + return 0 + while(current != target_turf) if(steps > length) return 0 if(current.opacity) return 0 @@ -695,21 +718,6 @@ proc/GaussRandRound(var/sigma,var/roundto) if(istype(N, areatype)) areas += N return areas -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all turfs in areas of that type of that type in the world. -/proc/get_area_turfs(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/turfs = new/list() - for(var/area/N in world) - if(istype(N, areatype)) - for(var/turf/T in N) turfs += T - return turfs - //Takes: Area type as text string or as typepath OR an instance of the area. //Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. /proc/get_area_all_atoms(var/areatype) @@ -784,11 +792,15 @@ proc/GaussRandRound(var/sigma,var/roundto) var/old_dir1 = T.dir var/old_icon_state1 = T.icon_state var/old_icon1 = T.icon + var/old_overlays = T.overlays.Copy() + var/old_underlays = T.underlays.Copy() var/turf/X = B.ChangeTurf(T.type) X.set_dir(old_dir1) X.icon_state = old_icon_state1 X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + X.overlays = old_overlays + X.underlays = old_underlays var/turf/simulated/ST = T if(istype(ST) && ST.zone) @@ -848,7 +860,7 @@ proc/GaussRandRound(var/sigma,var/roundto) if(turftoleave) fromupdate += T.ChangeTurf(turftoleave) else - T.ChangeTurf(/turf/space) + T.ChangeTurf(get_base_turf_by_area(T)) refined_src -= T refined_trg -= B @@ -931,9 +943,11 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) var/old_dir1 = T.dir var/old_icon_state1 = T.icon_state var/old_icon1 = T.icon + var/old_overlays = T.overlays.Copy() + var/old_underlays = T.underlays.Copy() if(platingRequired) - if(istype(B, /turf/space)) + if(istype(B, get_base_turf_by_area(B))) continue moving var/turf/X = B @@ -941,7 +955,8 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) X.set_dir(old_dir1) X.icon_state = old_icon_state1 X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - + X.overlays = old_overlays + X.underlays = old_underlays var/list/objs = new/list() var/list/newobjs = new/list() @@ -1050,12 +1065,10 @@ proc/get_mob_with_client_list() //gets the turf the atom is located in (or itself, if it is a turf). //returns null if the atom is not in a turf. -/proc/get_turf(atom/location) - while(location) - if(isturf(location)) - return location - location = location.loc - return null +/proc/get_turf(atom/A) + if(!istype(A)) return + for(A, A && !isturf(A), A=A.loc); + return A /proc/get(atom/loc, type) while(loc) @@ -1283,31 +1296,12 @@ var/list/WALLITEMS = list( colour += temp_col return colour -var/mob/dview/dview_mob = new -//Version of view() which ignores darkness, because BYOND doesn't have it. -/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) - if(!center) - return - dview_mob.loc = center - - dview_mob.see_invisible = invis_flags - - . = view(range, dview_mob) - dview_mob.loc = null - -/mob/dview - invisibility = 101 - density = 0 - - anchored = 1 - simulated = 0 - - see_in_dark = 1e6 - -/mob/dview/New() - // do nothing. we don't want to be in any mob lists; we're a dummy not a mob. +/atom/proc/get_light_and_color(var/atom/origin) + if(origin) + color = origin.color + set_light(origin.light_range, origin.light_power, origin.light_color) //This is just so you can stop an orbit. //orbit() can run without it (swap orbiting for A) @@ -1367,6 +1361,15 @@ var/mob/dview/dview_mob = new /atom/movable/proc/stop_orbit() orbiting = null +/mob/dview/New() + ..() + // We don't want to be in any mob lists; we're a dummy not a mob. + mob_list -= src + if(stat == DEAD) + dead_mob_list -= src + else + living_mob_list -= src + // call to generate a stack trace and print to runtime logs /proc/crash_with(msg) CRASH(msg) diff --git a/code/__HELPERS/vector.dm b/code/_helpers/vector.dm similarity index 100% rename from code/__HELPERS/vector.dm rename to code/_helpers/vector.dm diff --git a/code/_macros.dm b/code/_macros.dm new file mode 100644 index 00000000000..0bd37605e4d --- /dev/null +++ b/code/_macros.dm @@ -0,0 +1,41 @@ +#define Clamp(x, y, z) (x <= y ? y : (x >= z ? z : x)) +#define CLAMP01(x) (Clamp(x, 0, 1)) + +#define isAI(A) istype(A, /mob/living/silicon/ai) +#define isDrone(A) istype(A, /mob/living/silicon/robot/drone) + +#define isalien(A) istype(A, /mob/living/carbon/alien) + +#define isanimal(A) istype(A, /mob/living/simple_animal) + +#define isairlock(A) istype(A, /obj/machinery/door/airlock) + +#define isbrain(A) istype(A, /mob/living/carbon/brain) + +#define iscarbon(A) istype(A, /mob/living/carbon) + +#define iscorgi(A) istype(A, /mob/living/simple_animal/corgi) + +#define isEye(A) istype(A, /mob/eye) + +#define ishuman(A) istype(A, /mob/living/carbon/human) + +#define isliving(A) istype(A, /mob/living) + +#define ismouse(A) istype(A, /mob/living/simple_animal/mouse) + +#define isnewplayer(A) istype(A, /mob/new_player) + +#define isobj(A) istype(A, /obj) + +#define isobserver(A) istype(A, /mob/dead/observer) + +#define isorgan(A) istype(A, /obj/item/organ/external) + +#define ispAI(A) istype(A, /mob/living/silicon/pai) + +#define isrobot(A) istype(A, /mob/living/silicon/robot) + +#define issilicon(A) istype(A, /mob/living/silicon) + +#define isslime(A) istype(A, /mob/living/carbon/slime) \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e05cbeb9ba2..fb15c7281f5 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -15,7 +15,6 @@ return if(control_disabled || stat) return - next_move = world.time + 9 if(ismob(A)) ai_actual_track(A) @@ -32,7 +31,7 @@ build_click(src, client.buildmode, params, A) return - if(control_disabled || stat) + if(stat) return var/list/modifiers = params2list(params) @@ -52,9 +51,15 @@ CtrlClickOn(A) return - if(world.time <= next_move) + if(control_disabled || !canClick()) return - next_move = world.time + 9 + + if(multitool_mode && isobj(A)) + var/obj/O = A + var/datum/expansion/multitool/MT = O.expansions[/datum/expansion/multitool] + if(MT) + MT.interact(aiMulti, src) + return if(aiCamera.in_camera_mode) aiCamera.camera_mode_off() @@ -91,13 +96,24 @@ */ /mob/living/silicon/ai/ShiftClickOn(var/atom/A) - A.AIShiftClick(src) + if(!control_disabled && A.AIShiftClick(src)) + return + ..() + /mob/living/silicon/ai/CtrlClickOn(var/atom/A) - A.AICtrlClick(src) + if(!control_disabled && A.AICtrlClick(src)) + return + ..() + /mob/living/silicon/ai/AltClickOn(var/atom/A) - A.AIAltClick(src) + if(!control_disabled && A.AIAltClick(src)) + return + ..() + /mob/living/silicon/ai/MiddleClickOn(var/atom/A) - A.AIMiddleClick(src) + if(!control_disabled && A.AIMiddleClick(src)) + return + ..() /* The following criminally helpful code is just the previous code cleaned up; @@ -107,60 +123,63 @@ /atom/proc/AICtrlShiftClick() return -/obj/machinery/door/airlock/AICtrlShiftClick() - if(emagged) - return - return - /atom/proc/AIShiftClick() return /obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! if(density) - Topic(src, list("src"= "\ref[src]", "command"="open", "activate" = "1"), 1) // 1 meaning no window (consistency!) + Topic(src, list("command"="open", "activate" = "1")) else - Topic(src, list("src"= "\ref[src]", "command"="open", "activate" = "0"), 1) - return + Topic(src, list("command"="open", "activate" = "0")) + return 1 /atom/proc/AICtrlClick() return /obj/machinery/door/airlock/AICtrlClick() // Bolts doors if(locked) - Topic(src, list("src"= "\ref[src]", "command"="bolts", "activate" = "0"), 1)// 1 meaning no window (consistency!) + Topic(src, list("command"="bolts", "activate" = "0")) else - Topic(src, list("src"= "\ref[src]", "command"="bolts", "activate" = "1"), 1) + Topic(src, list("command"="bolts", "activate" = "1")) + return 1 /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. - Topic(src, list("src"= "\ref[src]", "breaker"="1"), 1) // 1 meaning no window (consistency!) + Topic(src, list("breaker"="1")) + return 1 /obj/machinery/turretid/AICtrlClick() //turns off/on Turrets - Topic(src, list("src"= "\ref[src]", "command"="enable", "value"="[!enabled]"), 1) // 1 meaning no window (consistency!) + Topic(src, list("command"="enable", "value"="[!enabled]")) + return 1 /atom/proc/AIAltClick(var/atom/A) - AltClick(A) + return AltClick(A) /obj/machinery/door/airlock/AIAltClick() // Electrifies doors. if(!electrified_until) // permanent shock - Topic(src, list("src"= "\ref[src]", "command"="electrify_permanently", "activate" = "1"), 1) // 1 meaning no window (consistency!) + Topic(src, list("command"="electrify_permanently", "activate" = "1")) else // disable/6 is not in Topic; disable/5 disables both temporary and permanent shock - Topic(src, list("src"= "\ref[src]", "command"="electrify_permanently", "activate" = "0"), 1) - return + Topic(src, list("command"="electrify_permanently", "activate" = "0")) + return 1 /obj/machinery/turretid/AIAltClick() //toggles lethal on turrets - Topic(src, list("src"= "\ref[src]", "command"="lethal", "value"="[!lethal]"), 1) // 1 meaning no window (consistency!) + Topic(src, list("command"="lethal", "value"="[!lethal]")) + return 1 -/atom/proc/AIMiddleClick() - return +/atom/proc/AIMiddleClick(var/mob/living/silicon/user) + return 0 /obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights. + + if(..()) + return + if(!src.lights) - Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "1"), 1) // 1 meaning no window (consistency!) + Topic(src, list("command"="lights", "activate" = "1")) else - Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "0"), 1) - return + Topic(src, list("command"="lights", "activate" = "0")) + return 1 // // Override AdjacentQuick for AltClicking diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 3de12f7be0e..88bfc332a38 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -4,7 +4,7 @@ */ // 1 decisecond click delay (above and beyond mob/next_move) -/mob/var/next_click = 0 +/mob/var/next_click = 0 /* Before anything else, defer these calls to a per-mobtype handler. This allows us to @@ -21,9 +21,10 @@ /atom/Click(location,control,params) if(src) usr.ClickOn(src, params) -/atom/DblClick(location,control,params) + +/atom/DblClick(var/location, var/control, var/params) if(src) - usr.DblClickOn(src,params) + usr.DblClickOn(src, params) /* Standard mob ClickOn() @@ -38,9 +39,11 @@ * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed */ -/mob/proc/ClickOn( var/atom/A, var/params ) - if(world.time <= next_click) +/mob/proc/ClickOn(var/atom/A, var/params) + + if(world.time <= next_click) // Hard check, before anything else, to avoid crashing return + next_click = world.time + 1 if(client.buildmode) @@ -50,13 +53,13 @@ var/list/modifiers = params2list(params) if(modifiers["shift"] && modifiers["ctrl"]) CtrlShiftClickOn(A) - return + return 1 if(modifiers["middle"]) MiddleClickOn(A) - return + return 1 if(modifiers["shift"]) ShiftClickOn(A) - return + return 0 if(modifiers["alt"]) // alt and alt-gr (rightalt) if (modifiers["right"]) AltRightClickOn(A) @@ -65,105 +68,99 @@ return if(modifiers["ctrl"]) CtrlClickOn(A) - return + return 1 if(stat || paralysis || stunned || weakened) return face_atom(A) // change direction to face what you clicked on - if(next_move > world.time) // in the year 2000... + if(!canClick()) // in the year 2000... return - if(istype(loc,/obj/mecha)) - if(!locate(/turf) in list(A,A.loc)) // Prevents inventory from being drilled + if(istype(loc, /obj/mecha)) + if(!locate(/turf) in list(A, A.loc)) // Prevents inventory from being drilled return var/obj/mecha/M = loc - return M.click_action(A,src) + return M.click_action(A, src) if(restrained()) + setClickCooldown(10) RestrainedClickOn(A) - return + return 1 if(in_throw_mode) if(isturf(A) || isturf(A.loc)) throw_item(A) - return + return 1 throw_mode_off() - if(!istype(A,/obj/item/weapon/gun) && !isturf(A) && !istype(A,/obj/screen)) - last_target_click = world.time - var/obj/item/W = get_active_hand() - if(W == A) - next_move = world.time + 6 - if(W.flags&USEDELAY) - next_move += 5 + if(W == A) // Handle attack_self W.attack_self(src) if(hand) update_inv_l_hand(0) else update_inv_r_hand(0) + return 1 - return - - // operate two STORAGE levels deep here (item in backpack in src; NOT item in box in backpack in src) + //Atoms on your person + // A is your location but is not a turf; or is on you (backpack); or is on something on you (box in backpack); sdepth is needed here because contents depth does not equate inventory storage depth. var/sdepth = A.storage_depth(src) - if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 1)) - + if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1)) // faster access to objects already on you - if(A in contents) - next_move = world.time + 6 // on your person - else - next_move = world.time + 8 // in a box/bag or in your square + if(A.loc != src) + setMoveCooldown(10) //getting something out of a backpack - // No adjacency needed if(W) - if(W.flags&USEDELAY) - next_move += 5 - - var/resolved = A.attackby(W,src) + var/resolved = W.resolve_attackby(A, src) if(!resolved && A && W) - W.afterattack(A,src,1,params) // 1 indicates adjacency + W.afterattack(A, src, 1, params) // 1 indicates adjacency else + if(ismob(A)) // No instant mob attacking + setClickCooldown(DEFAULT_ATTACK_COOLDOWN) UnarmedAttack(A, 1) - return + return 1 if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that return - // Allows you to click on a box's contents, if that box is on the ground, but no deeper than that + //Atoms on turfs (not on your person) + // A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack) sdepth = A.storage_depth_turf() if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) - next_move = world.time + 10 - if(A.Adjacent(src)) // see adjacent.dm - if(W) - if(W.flags&USEDELAY) - next_move += 5 + setMoveCooldown(5) + if(W) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) - var/resolved = A.attackby(W,src) + var/resolved = W.resolve_attackby(A,src) if(!resolved && A && W) - W.afterattack(A,src,1,params) // 1: clicking something Adjacent + W.afterattack(A, src, 1, params) // 1: clicking something Adjacent else + if(ismob(A)) // No instant mob attacking + setClickCooldown(DEFAULT_ATTACK_COOLDOWN) UnarmedAttack(A, 1) return else // non-adjacent click if(W) - W.afterattack(A,src,0,params) // 0: not Adjacent + W.afterattack(A, src, 0, params) // 0: not Adjacent else RangedAttack(A, params) + return 1 - return +/mob/proc/setClickCooldown(var/timeout) + next_move = max(world.time + timeout, next_move) -/mob/proc/changeNext_move(num) - next_move = world.time + num +/mob/proc/canClick() + if(config.no_click_cooldown || next_move <= world.time) + return 1 + return 0 -// Default behavior: ignore double clicks, consider them normal clicks instead +// Default behavior: ignore double clicks, the second click that makes the doubleclick call already calls for a normal click /mob/proc/DblClickOn(var/atom/A, var/params) - ClickOn(A,params) + return /* Translates into attack_hand, etc. @@ -184,10 +181,6 @@ src << "You cannot attack people before the game has started." return 0 - if (istype(get_area(src), /area/start)) - src << "No attacking people at spawn, you jackass." - return 0 - if(stat) return 0 @@ -207,14 +200,12 @@ LaserEyes(A) // moved into a proc below else if(TK in mutations) switch(get_dist(src,A)) - if(0) - ; if(1 to 5) // not adjacent may mean blocked by window - next_move += 2 + setMoveCooldown(2) if(5 to 7) - next_move += 5 + setMoveCooldown(5) if(8 to tk_maxrange) - next_move += 10 + setMoveCooldown(10) else return A.attack_tk(src) @@ -232,23 +223,9 @@ Only used for swapping hands */ /mob/proc/MiddleClickOn(var/atom/A) + swap_hand() return -/mob/living/carbon/MiddleClickOn(var/atom/A) - swap_hand() - -/mob/living/carbon/human/MiddleClickOn(var/atom/A) - - if(back) - var/obj/item/weapon/rig/rig = back - if(istype(rig) && rig.selected_module) - if(world.time <= next_move) return - next_move = world.time + 8 - rig.selected_module.engage(A) - return - - swap_hand() - // In case of use break glass /* /atom/proc/MiddleClick(var/mob/M as mob) @@ -298,7 +275,7 @@ else user.listed_turf = T user.client.statpanel = "Turf" - return + return 1 @@ -352,6 +329,7 @@ client/verb/set_context_menu_enabled(Enable as num) return /mob/living/LaserEyes(atom/A) + setClickCooldown(4) var/turf/T = get_turf(src) var/obj/item/projectile/beam/LE = new (T) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 2ebcd2fb867..943ab612d04 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -35,7 +35,7 @@ if(stat || lockcharge || weakened || stunned || paralysis) return - if(next_move >= world.time) + if(!canClick()) return face_atom(A) // change direction to face what you clicked on @@ -68,9 +68,6 @@ return if(W == A) - next_move = world.time + 8 - if(W.flags&USEDELAY) - next_move += 5 W.attack_self(src) return @@ -79,9 +76,6 @@ if(A == loc || (A in loc) || (A in contents)) // No adjacency checks - next_move = world.time + 8 - if(W.flags&USEDELAY) - next_move += 5 var/resolved = A.attackby(W,src) if(!resolved && A && W) @@ -94,16 +88,12 @@ // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc)) if(isturf(A) || isturf(A.loc)) if(A.Adjacent(src)) // see adjacent.dm - next_move = world.time + 10 - if(W.flags&USEDELAY) - next_move += 5 var/resolved = A.attackby(W, src) if(!resolved && A && W) W.afterattack(A, src, 1, params) return else - next_move = world.time + 10 W.afterattack(A, src, 0, params) return return diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 13c622fb3d9..a697f83323a 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -13,120 +13,115 @@ Therefore, the top right corner (except during admin shenanigans) is at "15,15" */ -//Upper left action buttons, displayed when you pick up an item that has this enabled. -#define ui_action_slot1 "1:6,14:26" -#define ui_action_slot2 "2:8,14:26" -#define ui_action_slot3 "3:10,14:26" -#define ui_action_slot4 "4:12,14:26" -#define ui_action_slot5 "5:14,14:26" +#define ui_entire_screen "WEST,SOUTH to EAST,NORTH" //Lower left, persistant menu -#define ui_inventory "1:6,1:5" +#define ui_inventory "WEST:6,SOUTH:5" //Lower center, persistant menu -#define ui_sstore1 "3:10,1:5" -#define ui_id "4:12,1:5" -#define ui_belt "5:14,1:5" -#define ui_back "6:14,1:5" -#define ui_rhand "7:16,1:5" -#define ui_lhand "8:16,1:5" -#define ui_equip "7:16,2:5" -#define ui_swaphand1 "7:16,2:5" -#define ui_swaphand2 "8:16,2:5" -#define ui_storage1 "9:18,1:5" -#define ui_storage2 "10:20,1:5" +#define ui_sstore1 "WEST+2:10,SOUTH:5" +#define ui_id "WEST+3:12,SOUTH:5" +#define ui_belt "WEST+4:14,SOUTH:5" +#define ui_back "CENTER-2:14,SOUTH:5" +#define ui_rhand "CENTER-1:16,SOUTH:5" +#define ui_lhand "CENTER:16,SOUTH:5" +#define ui_equip "CENTER-1:16,SOUTH+1:5" +#define ui_swaphand1 "CENTER-1:16,SOUTH+1:5" +#define ui_swaphand2 "CENTER:16,SOUTH+1:5" +#define ui_storage1 "CENTER+1:16,SOUTH:5" +#define ui_storage2 "CENTER+2:16,SOUTH:5" -#define ui_alien_head "4:12,1:5" //aliens -#define ui_alien_oclothing "5:14,1:5" //aliens +#define ui_alien_head "CENTER-3:12,SOUTH:5" //aliens +#define ui_alien_oclothing "CENTER-2:14,SOUTH:5"//aliens -#define ui_inv1 "7,1:5" //borgs -#define ui_inv2 "8,1:5" //borgs -#define ui_inv3 "9,1:5" //borgs -#define ui_borg_store "10,1:5" //borgs -#define ui_borg_inventory "6,1:5"//borgs +#define ui_inv1 "CENTER-1,SOUTH:5" //borgs +#define ui_inv2 "CENTER,SOUTH:5" //borgs +#define ui_inv3 "CENTER+1,SOUTH:5" //borgs +#define ui_borg_store "CENTER+2,SOUTH:5" //borgs +#define ui_borg_inventory "CENTER-2,SOUTH:5"//borgs -#define ui_monkey_mask "5:14,1:5" //monkey -#define ui_monkey_back "6:14,1:5" //monkey +#define ui_monkey_mask "WEST+4:14,SOUTH:5" //monkey +#define ui_monkey_back "WEST+5:14,SOUTH: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 +#define ui_construct_health "EAST:00,CENTER:15" //same height as humans, hugging the right border +#define ui_construct_purge "EAST:00,CENTER-1:15" +#define ui_construct_fire "EAST-1:16,CENTER+1:13" //above health, slightly to the left +#define ui_construct_pull "EAST-1:28,SOUTH+1: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" -#define ui_pull_resist "13:26,2:7" -#define ui_acti "13:26,1:5" -#define ui_movi "12:24,1:5" -#define ui_zonesel "14:28,1:5" -#define ui_acti_alt "14:28,1:5" //alternative intent switcher for when the interface is hidden (F12) +#define ui_dropbutton "EAST-4:22,SOUTH:5" +#define ui_drop_throw "EAST-1:28,SOUTH+1:7" +#define ui_pull_resist "EAST-2:26,SOUTH+1:7" +#define ui_acti "EAST-2:26,SOUTH:5" +#define ui_movi "EAST-3:24,SOUTH:5" +#define ui_zonesel "EAST-1:28,SOUTH:5" +#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) -#define ui_borg_pull "12:24,2:7" -#define ui_borg_module "13:26,2:7" -#define ui_borg_panel "14:28,2:7" +#define ui_borg_pull "EAST-3:24,SOUTH+1:7" +#define ui_borg_module "EAST-2:26,SOUTH+1:7" +#define ui_borg_panel "EAST-1:28,SOUTH+1:7" //Gun buttons -#define ui_gun1 "13:26,3: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" +#define ui_gun1 "EAST-2:26,SOUTH+2:7" +#define ui_gun2 "EAST-1:28, SOUTH+3:7" +#define ui_gun3 "EAST-2:26,SOUTH+3:7" +#define ui_gun_select "EAST-1:28,SOUTH+2:7" +#define ui_gun4 "EAST-3:24,SOUTH+2:7" //Upper-middle right (damage indicators) -#define ui_toxin "14:28,13:27" -#define ui_fire "14:28,12:25" -#define ui_oxygen "14:28,11:23" -#define ui_pressure "14:28,10:21" +#define ui_toxin "EAST-1:28,NORTH-2:27" +#define ui_fire "EAST-1:28,NORTH-3:25" +#define ui_oxygen "EAST-1:28,NORTH-4:23" +#define ui_pressure "EAST-1:28,NORTH-5:21" -#define ui_alien_toxin "14:28,13:25" -#define ui_alien_fire "14:28,12:25" -#define ui_alien_oxygen "14:28,11:25" +#define ui_alien_toxin "EAST-1:28,NORTH-2:25" +#define ui_alien_fire "EAST-1:28,NORTH-3:25" +#define ui_alien_oxygen "EAST-1:28,NORTH-4:25" //Middle right (status indicators) -#define ui_nutrition "14:28,5:11" -#define ui_temp "14:28,6:13" -#define ui_health "14:28,7:15" -#define ui_internal "14:28,8:17" +#define ui_nutrition "EAST-1:28,CENTER-2:11" +#define ui_temp "EAST-1:28,CENTER-1:13" +#define ui_health "EAST-1:28,CENTER:15" +#define ui_internal "EAST-1:28,CENTER+1:17" //borgs -#define ui_borg_health "14:28,6:13" //borgs have the health display where humans have the pressure damage indicator. -#define ui_alien_health "14:28,6:13" //aliens have the health display where humans have the pressure damage indicator. +#define ui_borg_health "EAST-1:28,CENTER-1:13" //borgs have the health display where humans have the pressure damage indicator. +#define ui_alien_health "EAST-1:28,CENTER-1:13" //aliens have the health display where humans have the pressure damage indicator. //Pop-up inventory -#define ui_shoes "2:8,1:5" +#define ui_shoes "WEST+1:8,SOUTH:5" -#define ui_iclothing "1:6,2:7" -#define ui_oclothing "2:8,2:7" -#define ui_gloves "3:10,2:7" +#define ui_iclothing "WEST:6,SOUTH+1:7" +#define ui_oclothing "WEST+1:8,SOUTH+1:7" +#define ui_gloves "WEST+2:10,SOUTH+1:7" -#define ui_glasses "1:6,3:9" -#define ui_mask "2:8,3:9" -#define ui_l_ear "3:10,3:9" -#define ui_r_ear "3:10,4:11" +#define ui_glasses "WEST:6,SOUTH+2:9" +#define ui_mask "WEST+1:8,SOUTH+2:9" +#define ui_l_ear "WEST+2:10,SOUTH+2:9" +#define ui_r_ear "WEST+2:10,SOUTH+3:11" -#define ui_head "2:8,4:11" +#define ui_head "WEST+1:8,SOUTH+3:11" //Intent small buttons -#define ui_help_small "12:8,1:1" -#define ui_disarm_small "12:15,1:18" -#define ui_grab_small "12:32,1:18" -#define ui_harm_small "12:39,1:1" +#define ui_help_small "EAST-3:8,SOUTH:1" +#define ui_disarm_small "EAST-3:15,SOUTH:18" +#define ui_grab_small "EAST-3:32,SOUTH:18" +#define ui_harm_small "EAST-3:39,SOUTH:1" //#define ui_swapbutton "6:-16,1:5" //Unused //#define ui_headset "SOUTH,8" -#define ui_hand "6:14,1:5" -#define ui_hstore1 "5,5" +#define ui_hand "CENTER-1:14,SOUTH:5" +#define ui_hstore1 "CENTER-2,CENTER-2" //#define ui_resist "EAST+1,SOUTH-1" #define ui_sleep "EAST+1, NORTH-13" #define ui_rest "EAST+1, NORTH-14" -#define ui_iarrowleft "SOUTH-1,11" -#define ui_iarrowright "SOUTH-1,13" +#define ui_iarrowleft "SOUTH-1,EAST-4" +#define ui_iarrowright "SOUTH-1,EAST-2" -#define ui_spell_master "14:16,14:16" -#define ui_genetic_master "14:16,12:16" +#define ui_spell_master "EAST-1:16,NORTH-1:16" +#define ui_genetic_master "EAST-1:16,NORTH-3:16" // AI diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm new file mode 100644 index 00000000000..a00112428ef --- /dev/null +++ b/code/_onclick/hud/action.dm @@ -0,0 +1,223 @@ +#define AB_ITEM 1 +#define AB_SPELL 2 +#define AB_INNATE 3 +#define AB_GENERIC 4 + +#define AB_CHECK_RESTRAINED 1 +#define AB_CHECK_STUNNED 2 +#define AB_CHECK_LYING 4 +#define AB_CHECK_ALIVE 8 +#define AB_CHECK_INSIDE 16 + + +/datum/action + var/name = "Generic Action" + var/action_type = AB_ITEM + var/procname = null + var/atom/movable/target = null + var/check_flags = 0 + var/processing = 0 + var/active = 0 + var/obj/screen/movable/action_button/button = null + var/button_icon = 'icons/mob/actions.dmi' + var/button_icon_state = "default" + var/background_icon_state = "bg_default" + var/mob/living/owner + +/datum/action/New(var/Target) + target = Target + +/datum/action/Destroy() + if(owner) + Remove(owner) + +/datum/action/proc/Grant(mob/living/T) + if(owner) + if(owner == T) + return + Remove(owner) + owner = T + owner.actions.Add(src) + owner.update_action_buttons() + return + +/datum/action/proc/Remove(mob/living/T) + if(button) + if(T.client) + T.client.screen -= button + qdel(button) + button = null + T.actions.Remove(src) + T.update_action_buttons() + owner = null + return + +/datum/action/proc/Trigger() + if(!Checks()) + return + switch(action_type) + if(AB_ITEM) + if(target) + var/obj/item/item = target + item.ui_action_click() + //if(AB_SPELL) + // if(target) + // var/obj/effect/proc_holder/spell = target + // spell.Click() + if(AB_INNATE) + if(!active) + Activate() + else + Deactivate() + if(AB_GENERIC) + if(target && procname) + call(target,procname)(usr) + return + +/datum/action/proc/Activate() + return + +/datum/action/proc/Deactivate() + return + +/datum/action/proc/Process() + return + +/datum/action/proc/CheckRemoval(mob/living/user) // 1 if action is no longer valid for this mob and should be removed + return 0 + +/datum/action/proc/IsAvailable() + return Checks() + +/datum/action/proc/Checks()// returns 1 if all checks pass + if(!owner) + return 0 + if(check_flags & AB_CHECK_RESTRAINED) + if(owner.restrained()) + return 0 + if(check_flags & AB_CHECK_STUNNED) + if(owner.stunned) + return 0 + if(check_flags & AB_CHECK_LYING) + if(owner.lying) + return 0 + if(check_flags & AB_CHECK_ALIVE) + if(owner.stat) + return 0 + if(check_flags & AB_CHECK_INSIDE) + if(!(target in owner)) + return 0 + return 1 + +/datum/action/proc/UpdateName() + return name + +/obj/screen/movable/action_button + var/datum/action/owner + screen_loc = "WEST,NORTH" + +/obj/screen/movable/action_button/Click(location,control,params) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + moved = 0 + return 1 + if(usr.next_move >= world.time) // Is this needed ? + return + owner.Trigger() + return 1 + +/obj/screen/movable/action_button/proc/UpdateIcon() + if(!owner) + return + icon = owner.button_icon + icon_state = owner.background_icon_state + + overlays.Cut() + var/image/img + if(owner.action_type == AB_ITEM && owner.target) + var/obj/item/I = owner.target + img = image(I.icon, src , I.icon_state) + else if(owner.button_icon && owner.button_icon_state) + img = image(owner.button_icon,src,owner.button_icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + overlays += img + + if(!owner.IsAvailable()) + color = rgb(128,0,0,128) + else + color = rgb(255,255,255,255) + +//Hide/Show Action Buttons ... Button +/obj/screen/movable/action_button/hide_toggle + name = "Hide Buttons" + icon = 'icons/mob/actions.dmi' + icon_state = "bg_default" + var/hidden = 0 + +/obj/screen/movable/action_button/hide_toggle/Click() + usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden + + hidden = usr.hud_used.action_buttons_hidden + if(hidden) + name = "Show Buttons" + else + name = "Hide Buttons" + UpdateIcon() + usr.update_action_buttons() + + +/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(var/mob/living/user) + if(isalien(user)) + icon_state = "bg_alien" + else + icon_state = "bg_default" + UpdateIcon() + return + +/obj/screen/movable/action_button/hide_toggle/UpdateIcon() + overlays.Cut() + var/image/img = image(icon,src,hidden?"show":"hide") + overlays += img + return + +//This is the proc used to update all the action buttons. Properly defined in /mob/living/ +/mob/proc/update_action_buttons() + return + +#define AB_WEST_OFFSET 4 +#define AB_NORTH_OFFSET 26 +#define AB_MAX_COLUMNS 10 + +/datum/hud/proc/ButtonNumberToScreenCoords(var/number) // TODO : Make this zero-indexed for readabilty + var/row = round((number-1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + var/coord_col = "+[col-1]" + var/coord_col_offset = AB_WEST_OFFSET+2*col + var/coord_row = "[-1 - row]" + var/coord_row_offset = AB_NORTH_OFFSET + return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:[coord_row_offset]" + +/datum/hud/proc/SetButtonCoords(var/obj/screen/button,var/number) + var/row = round((number-1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + var/x_offset = 32*(col-1) + AB_WEST_OFFSET + 2*col + var/y_offset = -32*(row+1) + AB_NORTH_OFFSET + + var/matrix/M = matrix() + M.Translate(x_offset,y_offset) + button.transform = M + +//Presets for item actions +/datum/action/item_action + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE + +/datum/action/item_action/CheckRemoval(mob/living/user) + return !(target in user) + +/datum/action/item_action/hands_free + check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE + +#undef AB_WEST_OFFSET +#undef AB_NORTH_OFFSET +#undef AB_MAX_COLUMNS \ No newline at end of file diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 9a26f532815..f8399da0bfa 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -1,3 +1,6 @@ +/mob/living/carbon/alien/instantiate_hud(var/datum/hud/HUD) + HUD.larva_hud() + /datum/hud/proc/larva_hud() src.adding = list() @@ -32,7 +35,7 @@ mymob.flash.icon = 'icons/mob/screen1_alien.dmi' mymob.flash.icon_state = "blank" mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" + mymob.flash.screen_loc = ui_entire_screen mymob.flash.layer = 17 mymob.fire = new /obj/screen() diff --git a/code/_onclick/hud/gun_mode.dm b/code/_onclick/hud/gun_mode.dm new file mode 100644 index 00000000000..e5d1fbce37d --- /dev/null +++ b/code/_onclick/hud/gun_mode.dm @@ -0,0 +1,66 @@ +/obj/screen/gun + name = "gun" + icon = 'icons/mob/screen1.dmi' + master = null + dir = 2 + +/obj/screen/gun/Click(location, control, params) + if(!usr) + return + return 1 + +/obj/screen/gun/move + name = "Allow Movement" + icon_state = "no_walk0" + screen_loc = ui_gun2 + +/obj/screen/gun/move/Click(location, control, params) + if(..()) + var/mob/living/user = usr + if(istype(user)) + if(!user.aiming) user.aiming = new(user) + user.aiming.toggle_permission(TARGET_CAN_MOVE) + return 1 + return 0 + +/obj/screen/gun/item + name = "Allow Item Use" + icon_state = "no_item0" + screen_loc = ui_gun1 + +/obj/screen/gun/item/Click(location, control, params) + if(..()) + var/mob/living/user = usr + if(istype(user)) + if(!user.aiming) user.aiming = new(user) + user.aiming.toggle_permission(TARGET_CAN_CLICK) + return 1 + return 0 + +/obj/screen/gun/mode + name = "Toggle Gun Mode" + icon_state = "gun0" + screen_loc = ui_gun_select + +/obj/screen/gun/mode/Click(location, control, params) + if(..()) + var/mob/living/user = usr + if(istype(user)) + if(!user.aiming) user.aiming = new(user) + user.aiming.toggle_active() + return 1 + return 0 + +/obj/screen/gun/radio + name = "Allow Radio Use" + icon_state = "no_radio0" + screen_loc = ui_gun4 + +/obj/screen/gun/radio/Click(location, control, params) + if(..()) + var/mob/living/user = usr + if(istype(user)) + if(!user.aiming) user.aiming = new(user) + user.aiming.toggle_permission(TARGET_CAN_RADIO) + return 1 + return 0 diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index e1e412a9efe..36fcab5cd2c 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -41,14 +41,14 @@ var/list/global_huds = list( /datum/global_hud/New() //420erryday psychedellic colours screen overlay for when you are high druggy = new /obj/screen() - druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" + druggy.screen_loc = ui_entire_screen druggy.icon_state = "druggy" druggy.layer = 17 druggy.mouse_opacity = 0 //that white blurry effect you get when you eyes are damaged blurry = new /obj/screen() - blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" + blurry.screen_loc = ui_entire_screen blurry.icon_state = "blurry" blurry.layer = 17 blurry.mouse_opacity = 0 @@ -74,21 +74,21 @@ var/list/global_huds = list( //welding mask overlay black/dither darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen) O = darkMask[1] - O.screen_loc = "3,3 to 5,13" + O.screen_loc = "WEST+2,SOUTH+2 to WEST+4,NORTH-2" O = darkMask[2] - O.screen_loc = "5,3 to 10,5" + O.screen_loc = "WEST+4,SOUTH+2 to EAST-5,SOUTH+4" O = darkMask[3] - O.screen_loc = "6,11 to 10,13" + O.screen_loc = "WEST+5,NORTH-4 to EAST-5,NORTH-2" O = darkMask[4] - O.screen_loc = "11,3 to 13,13" + O.screen_loc = "EAST-4,SOUTH+2 to EAST-2,NORTH-2" O = darkMask[5] - O.screen_loc = "1,1 to 15,2" + O.screen_loc = "WEST,SOUTH to EAST,SOUTH+1" O = darkMask[6] - O.screen_loc = "1,3 to 2,15" + O.screen_loc = "WEST,SOUTH+2 to WEST+1,NORTH" O = darkMask[7] - O.screen_loc = "14,3 to 15,15" + O.screen_loc = "EAST-1,SOUTH+2 to EAST,NORTH" O = darkMask[8] - O.screen_loc = "3,14 to 13,15" + O.screen_loc = "WEST+2,NORTH-1 to EAST-2,NORTH" for(i = 1, i <= 4, i++) O = vimpaired[i] @@ -133,7 +133,8 @@ var/list/global_huds = list( var/list/other var/list/obj/screen/hotkeybuttons - var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. + var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle + var/action_buttons_hidden = 0 datum/hud/New(mob/owner) mymob = owner @@ -156,7 +157,7 @@ datum/hud/New(mob/owner) adding = null other = null hotkeybuttons = null - item_action_list = null +// item_action_list = null // ? mymob = null /datum/hud/proc/hidden_inventory_update() @@ -252,26 +253,9 @@ datum/hud/New(mob/owner) var/ui_color = mymob.client.prefs.UI_style_color var/ui_alpha = mymob.client.prefs.UI_style_alpha - if(ishuman(mymob)) - human_hud(ui_style, ui_color, ui_alpha, mymob) // Pass the player the UI style chosen in preferences - else if(issmall(mymob)) - monkey_hud(ui_style) - else if(isbrain(mymob)) - brain_hud(ui_style) - else if(isalien(mymob)) - larva_hud() - else if(isslime(mymob)) - slime_hud() - else if(isAI(mymob)) - ai_hud() - else if(isrobot(mymob)) - robot_hud() - else if(isobserver(mymob)) - ghost_hud() - else - mymob.instantiate_hud(src) + mymob.instantiate_hud(src, ui_style, ui_color, ui_alpha) -/mob/proc/instantiate_hud(var/datum/hud/HUD) +/mob/proc/instantiate_hud(var/datum/hud/HUD, var/ui_style, var/ui_color, var/ui_alpha) return //Triggered when F12 is pressed (Unless someone changed something in the DMF) @@ -280,11 +264,11 @@ datum/hud/New(mob/owner) set hidden = 1 if(!hud_used) - usr << "\red This mob type does not use a HUD." + usr << "This mob type does not use a HUD." return if(!ishuman(src)) - usr << "\red Inventory hiding is currently only supported for human mobs, sorry." + usr << "Inventory hiding is currently only supported for human mobs, sorry." return if(!client) return @@ -298,8 +282,6 @@ datum/hud/New(mob/owner) src.client.screen -= src.hud_used.other if(src.hud_used.hotkeybuttons) src.client.screen -= src.hud_used.hotkeybuttons - if(src.hud_used.item_action_list) - src.client.screen -= src.hud_used.item_action_list //Due to some poor coding some things need special treatment: //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay @@ -357,8 +339,6 @@ datum/hud/New(mob/owner) src.client.screen -= src.hud_used.other if(src.hud_used.hotkeybuttons) src.client.screen -= src.hud_used.hotkeybuttons - 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 @@ -375,4 +355,4 @@ datum/hud/New(mob/owner) hud_used.hidden_inventory_update() hud_used.persistant_inventory_update() - update_action_buttons() \ No newline at end of file + update_action_buttons() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 24764adeb1f..328d6c770aa 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,5 +1,7 @@ -/datum/hud/proc/human_hud(var/ui_style='icons/mob/screen1_White.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255, var/mob/living/carbon/human/target) +/mob/living/carbon/human/instantiate_hud(var/datum/hud/HUD, var/ui_style, var/ui_color, var/ui_alpha) + HUD.human_hud(ui_style, ui_color, ui_alpha, src) +/datum/hud/proc/human_hud(var/ui_style='icons/mob/screen1_White.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255, var/mob/living/carbon/human/target) var/datum/hud_data/hud_data if(!istype(target)) hud_data = new() @@ -58,7 +60,6 @@ using = new /obj/screen() using.name = "act_intent" - using.set_dir(SOUTHWEST) using.icon = ui_style using.icon_state = "intent_"+mymob.a_intent using.screen_loc = ui_acti @@ -125,7 +126,6 @@ if(hud_data.has_m_intent) using = new /obj/screen() using.name = "mov_intent" - using.set_dir(SOUTHWEST) using.icon = ui_style using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") using.screen_loc = ui_movi @@ -160,11 +160,10 @@ inv_box = new /obj/screen/inventory() inv_box.name = "r_hand" - inv_box.set_dir(WEST) inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" + inv_box.icon_state = "r_hand_inactive" if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_active" + inv_box.icon_state = "r_hand_active" inv_box.screen_loc = ui_rhand inv_box.slot_id = slot_r_hand inv_box.layer = 19 @@ -176,11 +175,10 @@ inv_box = new /obj/screen/inventory() inv_box.name = "l_hand" - inv_box.set_dir(EAST) inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" + inv_box.icon_state = "l_hand_inactive" if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_active" + inv_box.icon_state = "l_hand_active" inv_box.screen_loc = ui_lhand inv_box.slot_id = slot_l_hand inv_box.layer = 19 @@ -191,7 +189,6 @@ using = new /obj/screen/inventory() using.name = "hand" - using.set_dir(SOUTH) using.icon = ui_style using.icon_state = "hand1" using.screen_loc = ui_swaphand1 @@ -202,7 +199,6 @@ using = new /obj/screen/inventory() using.name = "hand" - using.set_dir(SOUTH) using.icon = ui_style using.icon_state = "hand2" using.screen_loc = ui_swaphand2 @@ -324,7 +320,7 @@ mymob.flash.icon = ui_style mymob.flash.icon_state = "blank" mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" + mymob.flash.screen_loc = ui_entire_screen mymob.flash.layer = 17 mymob.flash.mouse_opacity = 0 hud_elements |= mymob.flash @@ -341,30 +337,26 @@ //Handle the gun settings buttons mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - //mymob.gun_setting_icon.color = ui_color + mymob.gun_setting_icon.icon = ui_style + mymob.gun_setting_icon.color = ui_color mymob.gun_setting_icon.alpha = ui_alpha hud_elements |= mymob.gun_setting_icon mymob.item_use_icon = new /obj/screen/gun/item(null) - //mymob.item_use_icon.color = ui_color + mymob.item_use_icon.icon = ui_style + mymob.item_use_icon.color = ui_color mymob.item_use_icon.alpha = ui_alpha mymob.gun_move_icon = new /obj/screen/gun/move(null) - //mymob.gun_move_icon.color = ui_color + mymob.gun_move_icon.icon = ui_style + mymob.gun_move_icon.color = ui_color mymob.gun_move_icon.alpha = ui_alpha - mymob.gun_run_icon = new /obj/screen/gun/run(null) - //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.icon = ui_style + mymob.radio_use_icon.color = ui_color 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) - - mymob.client.screen = null mymob.client.screen += hud_elements @@ -386,52 +378,6 @@ client.screen -= hud_used.hotkeybuttons hud_used.hotkey_ui_hidden = 1 - -/mob/living/carbon/human/update_action_buttons() - var/num = 1 - if(!hud_used) return - if(!client) return - - if(!hud_used.hud_shown) //Hud toggled to minimal - return - - client.screen -= hud_used.item_action_list - - hud_used.item_action_list = list() - for(var/obj/item/I in src) - if(I.icon_action_button) - var/obj/screen/item_action/A = new(hud_used) - - //A.icon = 'icons/mob/screen1_action.dmi' - //A.icon_state = I.icon_action_button - A.icon = ui_style2icon(client.prefs.UI_style) - A.icon_state = "template" - var/image/img = image(I.icon, A, I.icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - A.overlays += img - - if(I.action_button_name) - A.name = I.action_button_name - else - A.name = "Use [I.name]" - A.owner = I - hud_used.item_action_list += A - switch(num) - if(1) - A.screen_loc = ui_action_slot1 - if(2) - A.screen_loc = ui_action_slot2 - if(3) - A.screen_loc = ui_action_slot3 - if(4) - A.screen_loc = ui_action_slot4 - if(5) - A.screen_loc = ui_action_slot5 - break //5 slots available, so no more can be added. - num++ - src.client.screen += src.hud_used.item_action_list - //Used for new human mobs created by cloning/goleming/etc. /mob/living/carbon/human/proc/set_cloned_appearance() f_style = "Shaved" diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm deleted file mode 100644 index 6f69ca100de..00000000000 --- a/code/_onclick/hud/monkey.dm +++ /dev/null @@ -1,252 +0,0 @@ -/datum/hud/proc/monkey_hud(var/ui_style='icons/mob/screen1_old.dmi') - - src.adding = list() - src.other = list() - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new /obj/screen() - using.name = "act_intent" - using.set_dir(SOUTHWEST) - using.icon = ui_style - using.icon_state = mymob.a_intent - using.screen_loc = ui_acti - using.layer = 20 - src.adding += using - action_intent = using - -//intent small hud objects - var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen( src ) - using.name = I_HELP - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen( src ) - using.name = I_DISARM - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen( src ) - using.name = I_GRAB - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen( src ) - using.name = I_HURT - using.icon = ico - using.screen_loc = ui_acti - using.layer = 21 - src.adding += using - hurt_intent = using - -//end intent small hud objects - - using = new /obj/screen() - using.name = "mov_intent" - using.set_dir(SOUTHWEST) - using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.layer = 20 - src.adding += using - move_intent = using - - using = new /obj/screen() - using.name = "drop" - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "r_hand" - inv_box.set_dir(WEST) - inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" - if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_rhand - inv_box.slot_id = slot_r_hand - inv_box.layer = 19 - src.r_hand_hud_object = inv_box - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "l_hand" - inv_box.set_dir(EAST) - inv_box.icon = ui_style - inv_box.icon_state = "hand_inactive" - if(mymob && mymob.hand) //This being 1 means the left hand is in use - inv_box.icon_state = "hand_active" - inv_box.screen_loc = ui_lhand - inv_box.slot_id = slot_l_hand - inv_box.layer = 19 - src.l_hand_hud_object = inv_box - src.adding += inv_box - - using = new /obj/screen/inventory() - using.name = "hand" - using.set_dir(SOUTH) - using.icon = ui_style - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.layer = 19 - src.adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.set_dir(SOUTH) - using.icon = ui_style - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.layer = 19 - src.adding += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.set_dir(NORTH) - inv_box.icon = ui_style - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_monkey_mask - inv_box.slot_id = slot_wear_mask - inv_box.layer = 19 - src.adding += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.set_dir(NORTHEAST) - inv_box.icon = ui_style - inv_box.icon_state = "equip" - inv_box.screen_loc = ui_back - inv_box.slot_id = slot_back - inv_box.layer = 19 - src.adding += inv_box - - mymob.throw_icon = new /obj/screen() - mymob.throw_icon.icon = ui_style - mymob.throw_icon.icon_state = "act_throw_off" - mymob.throw_icon.name = "throw" - mymob.throw_icon.screen_loc = ui_drop_throw - - mymob.oxygen = new /obj/screen() - mymob.oxygen.icon = ui_style - mymob.oxygen.icon_state = "oxy0" - mymob.oxygen.name = "oxygen" - mymob.oxygen.screen_loc = ui_oxygen - - mymob.pressure = new /obj/screen() - mymob.pressure.icon = ui_style - mymob.pressure.icon_state = "pressure0" - mymob.pressure.name = "pressure" - mymob.pressure.screen_loc = ui_pressure - - mymob.toxin = new /obj/screen() - mymob.toxin.icon = ui_style - mymob.toxin.icon_state = "tox0" - mymob.toxin.name = "toxin" - mymob.toxin.screen_loc = ui_toxin - - mymob.internals = new /obj/screen() - mymob.internals.icon = ui_style - mymob.internals.icon_state = "internal0" - mymob.internals.name = "internal" - mymob.internals.screen_loc = ui_internal - - mymob.fire = new /obj/screen() - mymob.fire.icon = ui_style - mymob.fire.icon_state = "fire0" - mymob.fire.name = "fire" - mymob.fire.screen_loc = ui_fire - - mymob.bodytemp = new /obj/screen() - mymob.bodytemp.icon = ui_style - mymob.bodytemp.icon_state = "temp1" - mymob.bodytemp.name = "body temperature" - mymob.bodytemp.screen_loc = ui_temp - - mymob.healths = new /obj/screen() - mymob.healths.icon = ui_style - mymob.healths.icon_state = "health0" - mymob.healths.name = "health" - mymob.healths.screen_loc = ui_health - - mymob.pullin = new /obj/screen() - mymob.pullin.icon = ui_style - mymob.pullin.icon_state = "pull0" - mymob.pullin.name = "pull" - mymob.pullin.screen_loc = ui_pull_resist - - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "1,1" - mymob.blind.invisibility = 101 - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" - mymob.flash.layer = 17 - - mymob.zone_sel = new /obj/screen/zone_sel() - mymob.zone_sel.icon = ui_style - mymob.zone_sel.overlays.Cut() - mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - - //Handle the gun settings buttons - mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.set_dir(2) - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.aim_targets) - mymob.item_use_icon = new /obj/screen/gun/item(null) - 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) - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.set_dir(1) - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon - - mymob.client.screen = null - - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) - mymob.client.screen += src.adding + src.other - - return diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm new file mode 100644 index 00000000000..d543b8b12a4 --- /dev/null +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -0,0 +1,128 @@ + +////////////////////////// +//Movable Screen Objects// +// By RemieRichards // +////////////////////////// + + +//Movable Screen Object +//Not tied to the grid, places it's center where the cursor is + +/obj/screen/movable + var/snap2grid = FALSE + var/moved = FALSE + +//Snap Screen Object +//Tied to the grid, snaps to the nearest turf + +/obj/screen/movable/snap + snap2grid = TRUE + + +/obj/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) + var/list/PM = params2list(params) + + //No screen-loc information? abort. + if(!PM || !PM["screen-loc"]) + return + + //Split screen-loc up into X+Pixel_X and Y+Pixel_Y + var/list/screen_loc_params = text2list(PM["screen-loc"], ",") + + //Split X+Pixel_X up into list(X, Pixel_X) + var/list/screen_loc_X = text2list(screen_loc_params[1],":") + screen_loc_X[1] = encode_screen_X(text2num(screen_loc_X[1])) + //Split Y+Pixel_Y up into list(Y, Pixel_Y) + var/list/screen_loc_Y = text2list(screen_loc_params[2],":") + screen_loc_Y[1] = encode_screen_Y(text2num(screen_loc_Y[1])) + + if(snap2grid) //Discard Pixel Values + screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]" + + else //Normalise Pixel Values (So the object drops at the center of the mouse, not 16 pixels off) + var/pix_X = text2num(screen_loc_X[2]) - 16 + var/pix_Y = text2num(screen_loc_Y[2]) - 16 + screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" + +/obj/screen/movable/proc/encode_screen_X(X) + if(X > usr.client.view+1) + . = "EAST-[usr.client.view*2 + 1-X]" + else if(X < usr.client.view+1) + . = "WEST+[X-1]" + else + . = "CENTER" + +/obj/screen/movable/proc/decode_screen_X(X) + //Find EAST/WEST implementations + if(findtext(X,"EAST-")) + var/num = text2num(copytext(X,6)) //Trim EAST- + if(!num) + num = 0 + . = usr.client.view*2 + 1 - num + else if(findtext(X,"WEST+")) + var/num = text2num(copytext(X,6)) //Trim WEST+ + if(!num) + num = 0 + . = num+1 + else if(findtext(X,"CENTER")) + . = usr.client.view+1 + +/obj/screen/movable/proc/encode_screen_Y(Y) + if(Y > usr.client.view+1) + . = "NORTH-[usr.client.view*2 + 1-Y]" + else if(Y < usr.client.view+1) + . = "SOUTH+[Y-1]" + else + . = "CENTER" + +/obj/screen/movable/proc/decode_screen_Y(Y) + if(findtext(Y,"NORTH-")) + var/num = text2num(copytext(Y,7)) //Trim NORTH- + if(!num) + num = 0 + . = usr.client.view*2 + 1 - num + else if(findtext(Y,"SOUTH+")) + var/num = text2num(copytext(Y,7)) //Time SOUTH+ + if(!num) + num = 0 + . = num+1 + else if(findtext(Y,"CENTER")) + . = usr.client.view+1 + +//Debug procs +/client/proc/test_movable_UI() + set category = "Debug" + set name = "Spawn Movable UI Object" + + var/obj/screen/movable/M = new() + M.name = "Movable UI Object" + M.icon_state = "block" + M.maptext = "Movable" + M.maptext_width = 64 + + var/screen_l = input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Movable UI Object") as text + if(!screen_l) + return + + M.screen_loc = screen_l + + screen += M + + +/client/proc/test_snap_UI() + set category = "Debug" + set name = "Spawn Snap UI Object" + + var/obj/screen/movable/snap/S = new() + S.name = "Snap UI Object" + S.icon_state = "block" + S.maptext = "Snap" + S.maptext_width = 64 + + var/screen_l = input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Snap UI Object") as text + if(!screen_l) + return + + S.screen_loc = screen_l + + screen += S diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index ce8a66afee4..da6fa5ebef4 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -2,9 +2,15 @@ /datum/hud/proc/unplayer_hud() return +/mob/dead/observer/instantiate_hud(var/datum/hud/HUD) + HUD.ghost_hud() + /datum/hud/proc/ghost_hud() return +/mob/living/carbon/brain/instantiate_hud(var/datum/hud/HUD) + HUD.brain_hud() + /datum/hud/proc/brain_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') mymob.blind = new /obj/screen() mymob.blind.icon = 'icons/mob/screen1_full.dmi' @@ -13,6 +19,9 @@ mymob.blind.screen_loc = "1,1" mymob.blind.invisibility = 101 +/mob/living/silicon/ai/instantiate_hud(var/datum/hud/HUD) + HUD.ai_hud() + /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') blobpwrdisplay = new /obj/screen() @@ -31,6 +40,9 @@ mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) +/mob/living/carbon/slime/instantiate_hud(var/datum/hud/HUD) + HUD.slime_hud() + /datum/hud/proc/slime_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') src.adding = list() @@ -118,7 +130,7 @@ 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.screen_loc = ui_entire_screen mymob.flash.layer = 17 if(constructtype) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index e67eecd982b..13950f7c13d 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,5 +1,7 @@ var/obj/screen/robot_inventory +/mob/living/silicon/robot/instantiate_hud(var/datum/hud/HUD) + HUD.robot_hud() /datum/hud/proc/robot_hud() @@ -143,7 +145,7 @@ var/obj/screen/robot_inventory mymob.flash.icon = 'icons/mob/screen1_robot.dmi' mymob.flash.icon_state = "blank" mymob.flash.name = "flash" - mymob.flash.screen_loc = "1,1 to 15,15" + mymob.flash.screen_loc = ui_entire_screen mymob.flash.layer = 17 mymob.zone_sel = new /obj/screen/zone_sel() @@ -153,31 +155,13 @@ var/obj/screen/robot_inventory //Handle the gun settings buttons mymob.gun_setting_icon = new /obj/screen/gun/mode(null) - if (mymob.client) - if (mymob.client.gun_mode) // If in aim mode, correct the sprite - mymob.gun_setting_icon.set_dir(2) - for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - if (G.aim_targets) - mymob.item_use_icon = new /obj/screen/gun/item(null) - 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) - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.set_dir(1) - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon + mymob.item_use_icon = new /obj/screen/gun/item(null) + mymob.gun_move_icon = new /obj/screen/gun/move(null) + mymob.radio_use_icon = new /obj/screen/gun/radio(null) mymob.client.screen = null - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon, robot_inventory) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, robot_inventory, mymob.gun_setting_icon) mymob.client.screen += src.adding + src.other return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 1d6adf91643..fd581d44fac 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -12,11 +12,10 @@ layer = 20.0 unacidable = 1 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 - ..() + return ..() /obj/screen/text icon = null @@ -52,9 +51,8 @@ /obj/screen/item_action/Click() if(!usr || !owner) return 1 - if(usr.next_move >= world.time) + if(!usr.canClick()) return - usr.next_move = world.time + 6 if(usr.stat || usr.restrained() || usr.stunned || usr.lying) return 1 @@ -65,11 +63,6 @@ owner.ui_action_click() return 1 -//This is the proc used to update all the action buttons. It just returns for all mob types except humans. -/mob/proc/update_action_buttons() - return - - /obj/screen/grab name = "grab" @@ -89,7 +82,7 @@ name = "storage" /obj/screen/storage/Click() - if(world.time <= usr.next_move) + if(!usr.canClick()) return 1 if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) return 1 @@ -99,41 +92,8 @@ var/obj/item/I = usr.get_active_hand() if(I) usr.ClickOn(master) - usr.next_move = world.time+2 return 1 -/obj/screen/gun - name = "gun" - icon = 'icons/mob/screen1.dmi' - master = null - dir = 2 - - move - name = "Allow Walking" - icon_state = "no_walk0" - screen_loc = ui_gun2 - - run - name = "Allow Running" - icon_state = "no_run0" - screen_loc = ui_gun3 - - item - name = "Allow Item Use" - icon_state = "no_item0" - screen_loc = ui_gun1 - - mode - name = "Toggle Gun Mode" - icon_state = "gun0" - 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" @@ -208,7 +168,6 @@ /obj/screen/Click(location, control, params) if(!usr) return 1 - switch(name) if("toggle") if(usr.hud_used.inventory_shown) @@ -289,9 +248,9 @@ else var/no_mask - if(!(C.wear_mask && C.wear_mask.flags & AIRTIGHT)) + if(!(C.wear_mask && C.wear_mask.item_flags & AIRTIGHT)) var/mob/living/carbon/human/H = C - if(!(H.head && H.head.flags & AIRTIGHT)) + if(!(H.head && H.head.item_flags & AIRTIGHT)) no_mask = 1 if(no_mask) @@ -446,46 +405,6 @@ if("module3") if(istype(usr, /mob/living/silicon/robot)) usr:toggle_module(3) - - 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)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetMove() - gun_click_time = world.time - - 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)) - 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", "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)) - usr << "You need your gun in your active hand to do that!" - return - usr.client.AllowTargetClick() - gun_click_time = world.time - - 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 - if("AI Core") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr @@ -562,7 +481,6 @@ if(isAI(usr)) var/mob/living/silicon/ai/AI = usr AI.sensor_mode() - else return 0 return 1 @@ -570,7 +488,7 @@ /obj/screen/inventory/Click() // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click - if(world.time <= usr.next_move) + if(!usr.canClick()) return 1 if(usr.stat || usr.paralysis || usr.stunned || usr.weakened) return 1 @@ -581,12 +499,10 @@ if(iscarbon(usr)) var/mob/living/carbon/C = usr C.activate_hand("r") - usr.next_move = world.time+2 if("l_hand") if(iscarbon(usr)) var/mob/living/carbon/C = usr C.activate_hand("l") - usr.next_move = world.time+2 if("swap") usr:swap_hand() if("hand") @@ -595,7 +511,6 @@ if(usr.attack_ui(slot_id)) usr.update_inv_l_hand(0) usr.update_inv_r_hand(0) - usr.next_move = world.time+6 return 1 diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index bed14ed6201..213a4ed16aa 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -23,9 +23,9 @@ spell_holder.client.screen -= src spell_holder = null -/obj/screen/movable/spell_master/ResetVars() - ..("spell_objects", args) - spell_objects = list() +/obj/screen/movable/spell_master/ResetVars(var/list/exclude = list()) + exclude += "spell_objects" + ..(exclude) /obj/screen/movable/spell_master/MouseDrop() if(showing) @@ -50,25 +50,34 @@ 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 + open_spellmaster() update_spells(1) showing = 1 overlays.len = 0 overlays.Add(open_state) +/obj/screen/movable/spell_master/proc/open_spellmaster() + var/list/screen_loc_xy = text2list(screen_loc,",") + + //Create list of X offsets + var/list/screen_loc_X = text2list(screen_loc_xy[1],":") + var/x_position = decode_screen_X(screen_loc_X[1]) + var/x_pix = screen_loc_X[2] + + //Create list of Y offsets + var/list/screen_loc_Y = text2list(screen_loc_xy[2],":") + var/y_position = decode_screen_Y(screen_loc_Y[1]) + var/y_pix = screen_loc_Y[2] + + for(var/i = 1; i <= spell_objects.len; i++) + var/obj/screen/spell/S = spell_objects[i] + var/xpos = x_position + (x_position < 8 ? 1 : -1)*(i%7) + var/ypos = y_position + (y_position < 8 ? round(i/7) : -round(i/7)) + S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]" + if(spell_holder && spell_holder.client) + spell_holder.client.screen += S + S.handle_icon_updates = 1 + /obj/screen/movable/spell_master/proc/add_spell(var/spell/spell) if(!spell) return @@ -77,13 +86,14 @@ return else spell_objects.Add(spell.connected_button) - toggle_open(2) + if(spell_holder.client) + toggle_open(2) return if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one return - var/obj/screen/spell/newscreen = new /obj/screen/spell + var/obj/screen/spell/newscreen = PoolOrNew(/obj/screen/spell) newscreen.spellmaster = src newscreen.spell = spell @@ -99,7 +109,8 @@ newscreen.name = spell.name newscreen.update_charge(1) spell_objects.Add(newscreen) - toggle_open(2) //forces the icons to refresh on screen + if(spell_holder.client) + toggle_open(2) //forces the icons to refresh on screen /obj/screen/movable/spell_master/proc/remove_spell(var/spell/spell) qdel(spell.connected_button) @@ -154,6 +165,8 @@ last_charged_icon = null if(spellmaster) spellmaster.spell_objects -= src + if(spellmaster.spell_holder && spellmaster.spell_holder.client) + spellmaster.spell_holder.client.screen -= src if(spellmaster && !spellmaster.spell_objects.len) qdel(spellmaster) spellmaster = null diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 32d6340fd98..080f5f0b259 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,55 +1,59 @@ +/* +=== Item Click Call Sequences === +These are the default click code call sequences used when clicking on stuff with an item. + +Atoms: + +mob/ClickOn() calls the item's resolve_attackby() proc. +item/resolve_attackby() calls the target atom's attackby() proc. + +Mobs: + +mob/living/attackby() after checking for surgery, calls the item's attack() proc. +item/attack() generates attack logs, sets click cooldown and calls the mob's attacked_with_item() proc. If you override this, consider whether you need to set a click cooldown, play attack animations, and generate logs yourself. +mob/attacked_with_item() should then do mob-type specific stuff (like determining hit/miss, handling shields, etc) and then possibly call the item's apply_hit_effect() proc to actually apply the effects of being hit. + +Item Hit Effects: + +item/apply_hit_effect() can be overriden to do whatever you want. However "standard" physical damage based weapons should make use of the target mob's hit_with_weapon() proc to +avoid code duplication. This includes items that may sometimes act as a standard weapon in addition to having other effects (e.g. stunbatons on harm intent). +*/ // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) return +//I would prefer to rename this to attack(), but that would involve touching hundreds of files. +/obj/item/proc/resolve_attackby(atom/A, mob/user) + add_fingerprint(user) + return A.attackby(src, user) + // No comment /atom/proc/attackby(obj/item/W, mob/user) return + /atom/movable/attackby(obj/item/W, mob/user) - if(!(W.flags&NOBLUDGEON)) + if(!(W.flags & NOBLUDGEON)) visible_message("[src] has been hit by [user] with [W].") /mob/living/attackby(obj/item/I, mob/user) - if(istype(I) && ismob(user)) - I.attack(src, user) - + if(!ismob(user)) + return 0 + if(can_operate(src) && do_surgery(src,user,I)) //Surgery + return 1 + return I.attack(src, user, user.zone_sel.selecting) // Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. // Click parameters is the params string from byond Click() code, see that documentation. /obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) return -//TODO: refactor mob attack code. -/* -Busy writing something else that I don't want to get mixed up in a general attack code, and I don't want to forget this so leaving a note here. -leave attackby() as handling the general case of "using an item on a mob" -attackby() will decide to call attacked_by() or not. -attacked_by() will be made a living level proc and handle the specific case of "attacking with an item to cause harm" -attacked_by() will then call attack() so that stunbatons and other weapons that have special attack effects can do their thing. -attacked_by() will handle hitting/missing/logging as it does now, and will call attack() to apply the attack effects (damage) instead of the other way around (as it is now). -*/ - -/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone) - - if(!istype(M) || (can_operate(M) && do_surgery(M,user,src))) return 0 - - // Knifing - if(edge) - for(var/obj/item/weapon/grab/G in M.grabbed_by) - if(G.assailant == user && G.state >= GRAB_NECK && world.time >= (G.last_action + 20)) - //TODO: better alternative for applying damage multiple times? Nice knifing sound? - M.apply_damage(20, BRUTE, "head", 0, sharp=sharp, edge=edge) - M.apply_damage(20, BRUTE, "head", 0, sharp=sharp, edge=edge) - M.apply_damage(20, BRUTE, "head", 0, sharp=sharp, edge=edge) - M.adjustOxyLoss(60) // Brain lacks oxygen immediately, pass out - flick(G.hud.icon_state, G.hud) - G.last_action = world.time - user.visible_message("[user] slit [M]'s throat open with \the [name]!") - user.attack_log += "\[[time_stamp()]\] Knifed [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" - M.attack_log += "\[[time_stamp()]\] Got knifed by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" - msg_admin_attack("[key_name(user)] knifed [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)]) (JMP)" ) - return +//I would prefer to rename this attack_as_weapon(), but that would involve touching hundreds of files. +/obj/item/proc/attack(mob/living/M, mob/living/user, var/target_zone) + if(!force || (flags & NOBLUDGEON)) + return 0 + if(M == user && user.a_intent != I_HURT) + return 0 ///////////////////////// user.lastattacked = M @@ -61,43 +65,22 @@ attacked_by() will handle hitting/missing/logging as it does now, and will call msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)]) (JMP)" ) ///////////////////////// + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + + var/hit_zone = M.resolve_item_attack(src, user, target_zone) + if(hit_zone) + apply_hit_effect(M, user, hit_zone) + + return 1 + +//Called when a weapon is used to make a successful melee attack on a mob. Returns the blocked result +/obj/item/proc/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + if(hitsound) + playsound(loc, hitsound, 50, 1, -1) + var/power = force if(HULK in user.mutations) power *= 2 + return target.hit_with_weapon(src, user, power, hit_zone) - // TODO: needs to be refactored into a mob/living level attacked_by() proc. ~Z - user.do_attack_animation(M) - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - - // Handle striking to cripple. - var/dislocation_str - if(user.a_intent == "disarm") - dislocation_str = H.attack_joint(src, user, def_zone) - if(H.attacked_by(src, user, def_zone) && hitsound) - playsound(loc, hitsound, 50, 1, -1) - spawn(1) //ugh I hate this but I don't want to root through human attack procs to print it after this call resolves. - if(dislocation_str) user.visible_message("[dislocation_str]") - return 1 - return 0 - else - if(attack_verb.len) - user.visible_message("[M] has been [pick(attack_verb)] with [src] by [user]!") - else - user.visible_message("[M] has been attacked with [src] by [user]!") - - if (hitsound) - playsound(loc, hitsound, 50, 1, -1) - switch(damtype) - if("brute") - M.take_organ_damage(power) - if(prob(33)) // Added blood for whacking non-humans too - var/turf/simulated/location = get_turf(M) - if(istype(location)) location.add_blood_floor(M) - if("fire") - if (!(COLD_RESISTANCE in M.mutations)) - M.take_organ_damage(0, power) - M << "Aargh it burns!" - M.updatehealth() - add_fingerprint(user) - return 1 diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 168ae47c863..a504f3eb4aa 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -6,9 +6,9 @@ if(!client) return client.inquisitive_ghost = !client.inquisitive_ghost if(client.inquisitive_ghost) - src << "\blue You will now examine everything you click on." + src << "You will now examine everything you click on." else - src << "\blue You will no longer examine things you click on." + src << "You will no longer examine things you click on." /mob/dead/observer/DblClickOn(var/atom/A, var/params) if(client.buildmode) @@ -25,15 +25,15 @@ // Otherwise jump else - following = null - loc = get_turf(A) + stop_following() + forceMove(get_turf(A)) /mob/dead/observer/ClickOn(var/atom/A, var/params) if(client.buildmode) build_click(src, client.buildmode, params, A) return - if(world.time <= next_move) return - next_move = world.time + 8 + if(!canClick()) return + setClickCooldown(4) // You are responsible for checking config.ghost_interaction when you override this function // Not all of them require checking, see below A.attack_ghost(src) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 477fb04b7ad..95c77d67080 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -38,15 +38,6 @@ return else if(TK in mutations) - switch(get_dist(src,A)) - if(1 to 5) // not adjacent may mean blocked by window - next_move += 2 - if(5 to 7) - next_move += 5 - if(8 to 15) - next_move += 10 - if(16 to 128) - return A.attack_tk(src) /mob/living/RestrainedClickOn(var/atom/A) @@ -97,8 +88,6 @@ if (powerlevel > 0 && !istype(A, /mob/living/carbon/slime)) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - return stunprob *= H.species.siemens_coefficient diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm new file mode 100644 index 00000000000..436e7353ec7 --- /dev/null +++ b/code/_onclick/rig.dm @@ -0,0 +1,84 @@ + +#define MIDDLE_CLICK 0 +#define ALT_CLICK 1 +#define CTRL_CLICK 2 +#define MAX_HARDSUIT_CLICK_MODE 2 + +/client + var/hardsuit_click_mode = MIDDLE_CLICK + +/client/verb/toggle_hardsuit_mode() + set name = "Toggle Hardsuit Activation Mode" + set desc = "Switch between hardsuit activation modes." + set category = "OOC" + + hardsuit_click_mode++ + if(hardsuit_click_mode > MAX_HARDSUIT_CLICK_MODE) + hardsuit_click_mode = 0 + + switch(hardsuit_click_mode) + if(MIDDLE_CLICK) + src << "Hardsuit activation mode set to middle-click." + if(ALT_CLICK) + src << "Hardsuit activation mode set to alt-click." + if(CTRL_CLICK) + src << "Hardsuit activation mode set to control-click." + else + // should never get here, but just in case: + soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]") + src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click." + hardsuit_click_mode = MIDDLE_CLICK + +/mob/living/MiddleClickOn(atom/A) + if(client && client.hardsuit_click_mode == MIDDLE_CLICK) + if(HardsuitClickOn(A)) + return + ..() + +/mob/living/AltClickOn(atom/A) + if(client && client.hardsuit_click_mode == ALT_CLICK) + if(HardsuitClickOn(A)) + return + ..() + +/mob/living/CtrlClickOn(atom/A) + if(client && client.hardsuit_click_mode == CTRL_CLICK) + if(HardsuitClickOn(A)) + return + ..() + +/mob/living/proc/can_use_rig() + return 0 + +/mob/living/carbon/human/can_use_rig() + return 1 + +/mob/living/carbon/brain/can_use_rig() + return istype(loc, /obj/item/device/mmi) + +/mob/living/silicon/ai/can_use_rig() + return carded + +/mob/living/silicon/pai/can_use_rig() + return loc == card + +/mob/living/proc/HardsuitClickOn(var/atom/A, var/alert_ai = 0) + if(!can_use_rig() || !canClick()) + return 0 + var/obj/item/weapon/rig/rig = get_rig() + if(istype(rig) && !rig.offline && rig.selected_module) + if(src != rig.wearer) + if(rig.ai_can_move_suit(src, check_user_module = 1)) + message_admins("[key_name_admin(src, include_name = 1)] is trying to force \the [key_name_admin(rig.wearer, include_name = 1)] to use a hardsuit module.") + else + return 0 + rig.selected_module.engage(A, alert_ai) + if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns + setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + return 1 + return 0 + +#undef MIDDLE_CLICK +#undef ALT_CLICK +#undef CTRL_CLICK +#undef MAX_HARDSUIT_CLICK_MODE diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index ae57895cd6a..e91643019e8 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -74,135 +74,104 @@ var/const/tk_maxrange = 15 var/atom/movable/focus = null var/mob/living/host = null +/obj/item/tk_grab/dropped(mob/user as mob) + if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item + if(focus.Adjacent(loc)) + focus.loc = loc + loc = null + spawn(1) + qdel(src) + return - dropped(mob/user as mob) - if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item - if(focus.Adjacent(loc)) - focus.loc = loc +//stops TK grabs being equipped anywhere but into hands +/obj/item/tk_grab/equipped(var/mob/user, var/slot) + if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return + qdel(src) + return +/obj/item/tk_grab/attack_self(mob/user as mob) + if(focus) + focus.attack_self_tk(user) + +/obj/item/tk_grab/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this + if(!target || !user) return + if(last_throw+3 > world.time) return + if(!host || host != user) 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 + if(!(TK in host.mutations)) qdel(src) return + if(isobj(target) && !isturf(target.loc)) + return - - attack_self(mob/user as mob) - if(focus) - focus.attack_self_tk(user) - - afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this - if(!target || !user) return - if(last_throw+3 > world.time) return - if(!host || host != user) - qdel(src) - return - if(!(TK in host.mutations)) - qdel(src) - return - if(isobj(target) && !isturf(target.loc)) - return - - var/d = get_dist(user, target) - if(focus) d = max(d,get_dist(user,focus)) // whichever is further - switch(d) - if(0) - ; - if(1 to 5) // not adjacent may mean blocked by window - if(!proximity) - user.next_move += 2 - if(5 to 7) - user.next_move += 5 - if(8 to tk_maxrange) - user.next_move += 10 - else - user << "\blue Your mind won't reach that far." - return - - if(!focus) - focus_object(target, user) - return - - if(target == focus) - target.attack_self_tk(user) - return // todo: something like attack_self not laden with assumptions inherent to attack_self - - - if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) - var/obj/item/I = focus - var/resolved = target.attackby(I, user, user:get_organ_target()) - if(!resolved && target && I) - I.afterattack(target,user,1) // for splashing with beakers - - + var/d = get_dist(user, target) + if(focus) d = max(d,get_dist(user,focus)) // whichever is further + switch(d) + if(0) + ; + if(1 to 5) // not adjacent may mean blocked by window + if(!proximity) + user.setMoveCooldown(2) + if(5 to 7) + user.setMoveCooldown(5) + if(8 to tk_maxrange) + user.setMoveCooldown(10) else - apply_focus_overlay() - focus.throw_at(target, 10, 1, user) - last_throw = world.time - return - - attack(mob/living/M as mob, mob/living/user as mob, def_zone) - return - - - 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)) - qdel(src) + user << "Your mind won't reach that far." return - focus = target - update_icon() + + if(!focus) + focus_object(target, user) + return + + if(target == focus) + target.attack_self_tk(user) + return // todo: something like attack_self not laden with assumptions inherent to attack_self + + + if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus)) + var/obj/item/I = focus + var/resolved = target.attackby(I, user, user:get_organ_target()) + if(!resolved && target && I) + I.afterattack(target,user,1) // for splashing with beakers + else apply_focus_overlay() + focus.throw_at(target, 10, 1, user) + last_throw = world.time + return + +/obj/item/tk_grab/attack(mob/living/M as mob, mob/living/user as mob, def_zone) + return + + +/obj/item/tk_grab/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)) + qdel(src) return - - - proc/apply_focus_overlay() - if(!focus) return - 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 - O.layer = FLY_LAYER - O.set_dir(pick(cardinal)) - O.icon = 'icons/effects/effects.dmi' - O.icon_state = "nothing" - flick("empdisable",O) - spawn(5) - qdel(O) - return - - + focus = target update_icon() - overlays.Cut() - if(focus && focus.icon && focus.icon_state) - overlays += icon(focus.icon,focus.icon_state) - return + apply_focus_overlay() + return -/*Not quite done likely needs to use something thats not get_step_to - proc/check_path() - var/turf/ref = get_turf(src.loc) - var/turf/target = get_turf(focus.loc) - if(!ref || !target) return 0 - var/distance = get_dist(ref, target) - if(distance >= 10) return 0 - for(var/i = 1 to distance) - ref = get_step_to(ref, target, 0) - if(ref != target) return 0 - return 1 -*/ - -//equip_to_slot_or_del(obj/item/W, slot, del_on_fail = 1) -/* - if(istype(user, /mob/living/carbon)) - if(user:mutations & TK && get_dist(source, user) <= 7) - if(user:get_active_hand()) return 0 - var/X = source:x - var/Y = source:y - var/Z = source:z - -*/ +/obj/item/tk_grab/proc/apply_focus_overlay() + if(!focus) return + 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 + O.layer = FLY_LAYER + O.set_dir(pick(cardinal)) + O.icon = 'icons/effects/effects.dmi' + O.icon_state = "nothing" + flick("empdisable",O) + spawn(5) + qdel(O) + return +/obj/item/tk_grab/update_icon() + overlays.Cut() + if(focus && focus.icon && focus.icon_state) + overlays += icon(focus.icon,focus.icon_state) + return diff --git a/code/controllers/Processes/ai.dm b/code/controllers/Processes/ai.dm new file mode 100644 index 00000000000..0de5b7f9d66 --- /dev/null +++ b/code/controllers/Processes/ai.dm @@ -0,0 +1,24 @@ +var/list/datum/list_of_ais = list() + +/datum/controller/process/ai/setup() + name = "ai" + schedule_interval = 2 SECONDS + start_delay = 17 + +/datum/controller/process/ai/doWork() + for(last_object in list_of_ais) + var/datum/ai/AI = last_object + if(isnull(AI.gcDestroyed) && istype(AI)) + try + if(AI.process() == PROCESS_KILL) + list_of_ais -= AI + catch(var/exception/e) + catchException(e, AI) + SCHECK + else + catchBadType(AI) + list_of_ais -= AI + +/datum/controller/process/ai/statProcess() + ..() + stat(null, "[list_of_ais.len] AI\s") diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm index 31b8067775c..ce2dab54c0e 100644 --- a/code/controllers/Processes/alarm.dm +++ b/code/controllers/Processes/alarm.dm @@ -19,7 +19,8 @@ var/datum/controller/process/alarm/alarm_manager alarm_manager = src /datum/controller/process/alarm/doWork() - for(var/datum/alarm_handler/AH in all_handlers) + for(last_object in all_handlers) + var/datum/alarm_handler/AH = last_object AH.process() SCHECK diff --git a/code/controllers/Processes/chemistry.dm b/code/controllers/Processes/chemistry.dm new file mode 100644 index 00000000000..084de83e28c --- /dev/null +++ b/code/controllers/Processes/chemistry.dm @@ -0,0 +1,33 @@ +var/datum/controller/process/chemistry/chemistryProcess + +/datum/controller/process/chemistry + var/list/active_holders + var/list/chemical_reactions + var/list/chemical_reagents + +/datum/controller/process/chemistry/setup() + name = "chemistry" + schedule_interval = 20 // every 2 seconds + chemistryProcess = src + active_holders = list() + chemical_reactions = chemical_reactions_list + chemical_reagents = chemical_reagents_list + +/datum/controller/process/chemistry/statProcess() + ..() + stat(null, "[active_holders.len] reagent holder\s") + +/datum/controller/process/chemistry/doWork() + for(last_object in active_holders) + var/datum/reagents/holder = last_object + if(!holder.process_reactions()) + active_holders -= holder + SCHECK + +/datum/controller/process/chemistry/proc/mark_for_update(var/datum/reagents/holder) + if(holder in active_holders) + return + + //Process once, right away. If we still need to continue then add to the active_holders list and continue later + if(holder.process_reactions()) + active_holders += holder diff --git a/code/controllers/Processes/disease.dm b/code/controllers/Processes/disease.dm index 0323a3f919c..2cf0f5ea44b 100644 --- a/code/controllers/Processes/disease.dm +++ b/code/controllers/Processes/disease.dm @@ -6,8 +6,8 @@ schedule_interval = 20 // every 2 seconds /datum/controller/process/disease/doWork() - for(var/disease in active_diseases) - var/datum/disease/D = disease + for(last_object in active_diseases) + var/datum/disease/D = last_object D.process() SCHECK diff --git a/code/controllers/Processes/event.dm b/code/controllers/Processes/event.dm index 72bc01613d2..d05aa455d13 100644 --- a/code/controllers/Processes/event.dm +++ b/code/controllers/Processes/event.dm @@ -3,4 +3,13 @@ schedule_interval = 20 // every 2 seconds /datum/controller/process/event/doWork() - event_manager.process() \ No newline at end of file + for(last_object in event_manager.active_events) + var/datum/event/E = last_object + E.process() + SCHECK + + for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) + last_object = event_manager.event_containers[i] + var/list/datum/event_container/EC = last_object + EC.process() + SCHECK diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm index 3d59e268bb2..57399c82b9f 100644 --- a/code/controllers/Processes/garbage.dm +++ b/code/controllers/Processes/garbage.dm @@ -1,7 +1,7 @@ // The time a datum was destroyed by the GC, or null if it hasn't been /datum/var/gcDestroyed -#define GC_COLLECTIONS_PER_RUN 150 +#define GC_COLLECTIONS_PER_RUN 300 #define GC_COLLECTION_TIMEOUT (30 SECONDS) #define GC_FORCE_DEL_PER_RUN 30 @@ -23,7 +23,7 @@ var/list/delayed_garbage = list() /datum/controller/process/garbage_collector/setup() name = "garbage" - schedule_interval = 10 SECONDS + schedule_interval = 5 SECONDS start_delay = 3 if(!garbage_collector) @@ -34,6 +34,10 @@ var/list/delayed_garbage = list() delayed_garbage.Cut() delayed_garbage = null +#ifdef GC_FINDREF +world/loop_checks = 0 +#endif + /datum/controller/process/garbage_collector/doWork() if(!garbage_collect) return @@ -82,6 +86,32 @@ var/list/delayed_garbage = list() #undef GC_COLLECTION_TIMEOUT #undef GC_COLLECTIONS_PER_TICK +#ifdef GC_FINDREF +/datum/controller/process/garbage_collector/proc/LookForRefs(var/datum/D, var/list/targ) + . = 0 + for(var/V in D.vars) + if(V == "contents") + continue + if(istype(D.vars[V], /atom)) + var/atom/A = D.vars[V] + if(A in targ) + testing("GC: [A] | [A.type] referenced by [D] | [D.type], var [V]") + . += 1 + else if(islist(D.vars[V])) + . += LookForListRefs(D.vars[V], targ, D, V) + +/datum/controller/process/garbage_collector/proc/LookForListRefs(var/list/L, var/list/targ, var/datum/D, var/V) + . = 0 + for(var/F in L) + if(istype(F, /atom)) + var/atom/A = F + if(A in targ) + testing("GC: [A] | [A.type] referenced by [D] | [D.type], list [V]") + . += 1 + if(islist(F)) + . += LookForListRefs(F, targ, D, "[F] in list [V]") +#endif + /datum/controller/process/garbage_collector/proc/AddTrash(datum/A) if(!istype(A) || !isnull(A.gcDestroyed)) return @@ -151,6 +181,7 @@ var/list/delayed_garbage = list() // 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() + nanomanager.close_uis(src) tag = null return @@ -222,3 +253,7 @@ var/list/delayed_garbage = list() #ifdef GC_DEBUG #undef GC_DEBUG #endif + +#ifdef GC_FINDREF +#undef GC_FINDREF +#endif diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm index 6ec07aebd3e..1480943f390 100644 --- a/code/controllers/Processes/inactivity.dm +++ b/code/controllers/Processes/inactivity.dm @@ -4,7 +4,8 @@ /datum/controller/process/inactivity/doWork() if(config.kick_inactive) - for(var/client/C in clients) + for(last_object in clients) + var/client/C = last_object if(!C.holder && C.is_afk(config.kick_inactive MINUTES)) if(!istype(C.mob, /mob/dead)) log_access("AFK: [key_name(C)]") diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm deleted file mode 100644 index 519b860d539..00000000000 --- a/code/controllers/Processes/lighting.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/controller/process/lighting/setup() - name = "lighting" - start_delay = 1 - schedule_interval = 5 // every .5 second - lighting_controller.initializeLighting() - -/datum/controller/process/lighting/doWork() - lighting_controller.lights_workload_max = \ - max(lighting_controller.lights_workload_max, lighting_controller.lights.len) - - for(var/datum/light_source/L in lighting_controller.lights) - if(L && L.check()) - lighting_controller.lights.Remove(L) - - scheck() - - lighting_controller.changed_turfs_workload_max = \ - max(lighting_controller.changed_turfs_workload_max, lighting_controller.changed_turfs.len) - - for(var/turf/T in lighting_controller.changed_turfs) - if(T && T.lighting_changed) - T.shift_to_subarea() - - scheck() - - if(lighting_controller.changed_turfs && lighting_controller.changed_turfs.len) - lighting_controller.changed_turfs.len = 0 // reset the changed list diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index c31f1bc7726..75015fc94cc 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -18,7 +18,8 @@ machines = dd_sortedObjectList(machines) /datum/controller/process/machinery/proc/internal_process_machinery() - for(var/obj/machinery/M in machines) + for(last_object in machines) + var/obj/machinery/M = last_object if(M && !M.gcDestroyed) if(M.process() == PROCESS_KILL) //M.inMachineList = 0 We don't use this debugging function @@ -31,7 +32,8 @@ SCHECK /datum/controller/process/machinery/proc/internal_process_power() - for(var/datum/powernet/powerNetwork in powernets) + for(last_object in powernets) + var/datum/powernet/powerNetwork = last_object if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed)) powerNetwork.reset() SCHECK @@ -41,13 +43,15 @@ /datum/controller/process/machinery/proc/internal_process_power_drain() // Currently only used by powersinks. These items get priority processed before machinery - for(var/obj/item/I in processing_power_items) + for(last_object in processing_power_items) + var/obj/item/I = last_object if(!I.pwr_drain()) // 0 = Process Kill, remove from processing list. processing_power_items.Remove(I) SCHECK /datum/controller/process/machinery/proc/internal_process_pipenets() - for(var/datum/pipe_network/pipeNetwork in pipe_networks) + for(last_object in pipe_networks) + var/datum/pipe_network/pipeNetwork = last_object if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed)) pipeNetwork.process() SCHECK diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm new file mode 100644 index 00000000000..970b8b71ad3 --- /dev/null +++ b/code/controllers/Processes/scheduler.dm @@ -0,0 +1,133 @@ +/var/datum/controller/process/scheduler/scheduler + +/************ +* Scheduler * +************/ +/datum/controller/process/scheduler + var/list/scheduled_tasks + +/datum/controller/process/scheduler/setup() + name = "scheduler" + schedule_interval = 3 SECONDS + scheduled_tasks = list() + scheduler = src + +/datum/controller/process/scheduler/doWork() + for(last_object in scheduled_tasks) + var/datum/scheduled_task/scheduled_task = last_object + try + if(world.time > scheduled_task.trigger_time) + unschedule(scheduled_task) + scheduled_task.pre_process() + scheduled_task.process() + scheduled_task.post_process() + catch(var/exception/e) + catchException(e, last_object) + SCHECK + +/datum/controller/process/scheduler/statProcess() + ..() + stat(null, "[scheduled_tasks.len] task\s") + +/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st) + scheduled_tasks += st + destroyed_event.register(st, src, /datum/controller/process/scheduler/proc/unschedule) + +/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st) + if(st in scheduled_tasks) + scheduled_tasks -= st + destroyed_event.unregister(st, src) + +/********** +* Helpers * +**********/ +/proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list()) + return schedule_task(world.time + in_time, procedure, arguments) + +/proc/schedule_task_with_source_in(var/in_time, var/source, var/procedure, var/list/arguments = list()) + return schedule_task_with_source(world.time + in_time, source, procedure, arguments) + +/proc/schedule_task(var/trigger_time, var/procedure, var/list/arguments) + var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/destroy_scheduled_task, list()) + scheduler.schedule(st) + return st + +/proc/schedule_task_with_source(var/trigger_time, var/source, var/procedure, var/list/arguments) + var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/destroy_scheduled_task, list()) + scheduler.schedule(st) + return st + +/proc/schedule_repeating_task(var/trigger_time, var/repeat_interval, var/procedure, var/list/arguments) + var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval)) + scheduler.schedule(st) + return st + +/proc/schedule_repeating_task_with_source(var/trigger_time, var/repeat_interval, var/source, var/procedure, var/list/arguments) + var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval)) + scheduler.schedule(st) + return st + +/************* +* Task Datum * +*************/ +/datum/scheduled_task + var/trigger_time + var/procedure + var/list/arguments + var/task_after_process + var/list/task_after_process_args + +/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) + ..() + src.trigger_time = trigger_time + src.procedure = procedure + src.arguments = arguments ? arguments : list() + src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task + src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list() + task_after_process_args += src + +/datum/scheduled_task/Destroy() + procedure = null + arguments.Cut() + task_after_process = null + task_after_process_args.Cut() + return ..() + +/datum/scheduled_task/proc/pre_process() + task_triggered_event.raise_event(list(src)) + +/datum/scheduled_task/proc/process() + if(procedure) + call(procedure)(arglist(arguments)) + +/datum/scheduled_task/proc/post_process() + call(task_after_process)(arglist(task_after_process_args)) + +// Resets the trigger time, has no effect if the task has already triggered +/datum/scheduled_task/proc/trigger_task_in(var/trigger_in) + src.trigger_time = world.time + trigger_in + +/datum/scheduled_task/source + var/datum/source + +/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) + src.source = source + destroyed_event.register(src.source, src, /datum/scheduled_task/source/proc/source_destroyed) + ..(trigger_time, procedure, arguments, task_after_process, task_after_process_args) + +/datum/scheduled_task/source/Destroy() + source = null + return ..() + +/datum/scheduled_task/source/process() + call(source, procedure)(arglist(arguments)) + +/datum/scheduled_task/source/proc/source_destroyed() + qdel(src) + +/proc/destroy_scheduled_task(var/datum/scheduled_task/st) + qdel(st) + +/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st) + st.trigger_time = world.time + trigger_delay + scheduler.schedule(st) diff --git a/code/controllers/Processes/turf.dm b/code/controllers/Processes/turf.dm index fd36a6900fd..83e4789de1d 100644 --- a/code/controllers/Processes/turf.dm +++ b/code/controllers/Processes/turf.dm @@ -5,7 +5,8 @@ var/global/list/turf/processing_turfs = list() schedule_interval = 20 // every 2 seconds /datum/controller/process/turf/doWork() - for(var/turf/T in processing_turfs) + for(last_object in processing_turfs) + var/turf/T = last_object if(T.process() == PROCESS_KILL) processing_turfs.Remove(T) SCHECK diff --git a/code/controllers/Processes/wireless.dm b/code/controllers/Processes/wireless.dm new file mode 100644 index 00000000000..4affc4a74de --- /dev/null +++ b/code/controllers/Processes/wireless.dm @@ -0,0 +1,72 @@ +//------------------------------- +/* + Wireless controller + + Used for connecting devices to each other (i.e. machinery, doors, emitters, etc.) + Unlike the radio controller, the wireless controller does not pass communications between devices. Once the devices + have been connected they call each others procs directly, they do not use the wireless controller to communicate. + + See code\modules\wireless\interfaces.dm for details of how to connect devices. +*/ +//------------------------------- + +var/datum/controller/process/wireless/wirelessProcess + +/datum/controller/process/wireless + var/list/receiver_list + var/list/pending_connections + var/list/retry_connections + var/list/failed_connections + +/datum/controller/process/wireless/setup() + name = "wireless" + schedule_interval = 50 + pending_connections = new() + retry_connections = new() + failed_connections = new() + receiver_list = new() + wirelessProcess = src + +/datum/controller/process/wireless/proc/add_device(var/datum/wifi/receiver/R) + if(receiver_list) + receiver_list |= R + else + receiver_list = new() + receiver_list |= R + +/datum/controller/process/wireless/proc/remove_device(var/datum/wifi/receiver/R) + if(receiver_list) + receiver_list -= R + +/datum/controller/process/wireless/proc/add_request(var/datum/connection_request/C) + if(pending_connections) + pending_connections += C + else + pending_connections = new() + pending_connections += C + +/datum/controller/process/wireless/doWork() + //process any connection requests waiting to be retried + if(retry_connections.len > 0) + //any that fail are moved into the failed connections list + process_queue(retry_connections, failed_connections) + + //process any pending connection requests + if(pending_connections.len > 0) + //any that fail are moved to the retry queue + process_queue(pending_connections, retry_connections) + +/datum/controller/process/wireless/proc/process_queue(var/list/process_conections, var/list/unsuccesful_connections) + for(last_object in process_conections) + var/datum/connection_request/C = last_object + var/target_found = 0 + for(var/datum/wifi/receiver/R in receiver_list) + if(R.id == C.id) + var/datum/wifi/sender/S = C.source + S.connect_device(R) + R.connect_device(S) + target_found = 1 + process_conections -= C + if(!target_found) + unsuccesful_connections += C + SCHECK diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index c1594665a1b..78246e5b0c8 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -97,12 +97,18 @@ On the map: 1455 for AI access */ -var/const/BOT_FREQ = 1447 +var/const/RADIO_LOW_FREQ = 1200 +var/const/PUBLIC_LOW_FREQ = 1441 +var/const/PUBLIC_HIGH_FREQ = 1489 +var/const/RADIO_HIGH_FREQ = 1600 + +var/const/BOT_FREQ = 1447 var/const/COMM_FREQ = 1353 -var/const/ERT_FREQ = 1345 -var/const/AI_FREQ = 1343 -var/const/DTH_FREQ = 1341 +var/const/ERT_FREQ = 1345 +var/const/AI_FREQ = 1343 +var/const/DTH_FREQ = 1341 var/const/SYND_FREQ = 1213 +var/const/ENT_FREQ = 1461 //entertainment frequency. This is not a diona exclusive frequency. // department channels var/const/PUB_FREQ = 1459 @@ -113,6 +119,10 @@ var/const/SCI_FREQ = 1351 var/const/SRV_FREQ = 1349 var/const/SUP_FREQ = 1347 +// internal department channels +var/const/MED_I_FREQ = 1485 +var/const/SEC_I_FREQ = 1475 + var/list/radiochannels = list( "Common" = PUB_FREQ, "Science" = SCI_FREQ, @@ -125,7 +135,10 @@ var/list/radiochannels = list( "Mercenary" = SYND_FREQ, "Supply" = SUP_FREQ, "Service" = SRV_FREQ, - "AI Private" = AI_FREQ + "AI Private" = AI_FREQ, + "Entertainment" = ENT_FREQ, + "Medical(I)" = MED_I_FREQ, + "Security(I)" = SEC_I_FREQ ) // central command channels, i.e deathsquid & response teams @@ -134,8 +147,8 @@ var/list/CENT_FREQS = list(ERT_FREQ, DTH_FREQ) // Antag channels, i.e. Syndicate var/list/ANTAG_FREQS = list(SYND_FREQ) -//depenging helpers -var/list/DEPT_FREQS = list(SCI_FREQ, MED_FREQ, ENG_FREQ, SEC_FREQ, SUP_FREQ, SRV_FREQ, ERT_FREQ, SYND_FREQ, DTH_FREQ) +//Department channels, arranged lexically +var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ, ENT_FREQ) #define TRANSMISSION_WIRE 0 #define TRANSMISSION_RADIO 1 @@ -145,29 +158,30 @@ var/list/DEPT_FREQS = list(SCI_FREQ, MED_FREQ, ENG_FREQ, SEC_FREQ, SUP_FREQ, SRV if (frequency in ANTAG_FREQS) return "syndradio" // centcomm channels (deathsquid and ert) - else if(frequency in CENT_FREQS) + if(frequency in CENT_FREQS) return "centradio" // command channel - else if(frequency == COMM_FREQ) + if(frequency == COMM_FREQ) return "comradio" // AI private channel - else if(frequency == AI_FREQ) + if(frequency == AI_FREQ) return "airadio" // department radio formatting (poorly optimized, ugh) - else if(frequency == SEC_FREQ) + if(frequency == SEC_FREQ) return "secradio" - else if (frequency == ENG_FREQ) + if (frequency == ENG_FREQ) return "engradio" - else if(frequency == SCI_FREQ) + if(frequency == SCI_FREQ) return "sciradio" - else if(frequency == MED_FREQ) + if(frequency == MED_FREQ) return "medradio" - else if(frequency == SUP_FREQ) // cargo + if(frequency == SUP_FREQ) // cargo return "supradio" - else if(frequency == SRV_FREQ) // service + if(frequency == SRV_FREQ) // service return "srvradio" - // If all else fails and it's a dept_freq, color me purple! - else if(frequency in DEPT_FREQS) + if(frequency == ENT_FREQ) //entertainment + return "entradio" + if(frequency in DEPT_FREQS) return "deptradio" return "radio" diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 9be12bd969b..dfaa18affa1 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -6,6 +6,8 @@ var/list/gamemode_cache = list() var/nudge_script_path = "nudge.py" // where the nudge.py script is located + var/list/lobby_screens = list("title") // Which lobby screens are available + var/log_ooc = 0 // log OOC channel var/log_access = 0 // log login/logout var/log_say = 0 // log client say @@ -61,7 +63,7 @@ var/list/gamemode_cache = list() var/allow_random_events = 0 // enables random events mid-round when set to 1 var/allow_ai = 1 // allow ai job var/hostedby = null - var/respawn = 1 + var/respawn_delay = 30 var/guest_jobban = 1 var/usewhitelist = 0 var/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 @@ -139,6 +141,7 @@ var/list/gamemode_cache = list() var/welder_vision = 1 var/generate_asteroid = 0 + var/no_click_cooldown = 0 //Used for modifying movement speed for mobs. //Unversal modifiers @@ -155,9 +158,11 @@ var/list/gamemode_cache = list() var/slime_delay = 0 var/animal_delay = 0 + var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database var/sql_stats = 0 //Do we record round statistics on the database (deaths, round reports, population, etcetera) or not? var/sql_whitelists = 0 //Defined whether the server uses an SQL based whitelist system, or the legacy one with two .txts. Config option in config.txt var/sql_saves = 0 //Defines whether the server uses an SQL based character and preference saving system. Config option in config.txt @@ -189,6 +194,7 @@ var/list/gamemode_cache = list() var/list/admin_levels= list(2) // Defines which Z-levels which are for admin functionality, for example including such areas as Central Command and the Syndicate Shuttle var/list/contact_levels = list(1, 5) // Defines which Z-levels which, for example, a Code Red announcement may affect var/list/player_levels = list(1, 3, 4, 5, 6) // Defines all Z-levels a character can typically reach + var/list/sealed_levels = list() // Defines levels that do not allow random transit at the edges. // Event settings var/expected_round_length = 3 * 60 * 60 * 10 // 3 hours @@ -232,6 +238,12 @@ var/list/gamemode_cache = list() //Mark-up enabling var/allow_chat_markup = 0 + + var/list/language_prefixes = list(",","#","-")//Default language prefixes + + var/ghosts_can_possess_animals = 0 + var/delist_when_no_admins = 0 + //Snowflake antag contest boolean //AUG2016 var/antag_contest_enabled = 0 @@ -296,6 +308,9 @@ var/list/gamemode_cache = list() if ("use_age_restriction_for_jobs") config.use_age_restriction_for_jobs = 1 + if ("use_age_restriction_for_antags") + config.use_age_restriction_for_antags = 1 + if ("jobs_have_minimal_access") config.jobs_have_minimal_access = 1 @@ -359,6 +374,9 @@ var/list/gamemode_cache = list() if ("generate_asteroid") config.generate_asteroid = 1 + if ("no_click_cooldown") + config.no_click_cooldown = 1 + if("allow_admin_ooccolor") config.allow_admin_ooccolor = 1 @@ -410,8 +428,8 @@ var/list/gamemode_cache = list() // if ("authentication") // config.enable_authentication = 1 - if ("norespawn") - config.respawn = 0 + if ("respawn_delay") + config.respawn_delay = text2num(value) if ("servername") config.server_name = value @@ -443,6 +461,9 @@ var/list/gamemode_cache = list() if ("githuburl") config.githuburl = value + if ("ghosts_can_possess_animals") + config.ghosts_can_possess_animals = value + if ("guest_jobban") config.guest_jobban = 1 @@ -715,6 +736,7 @@ var/list/gamemode_cache = list() if("aggressive_changelog") config.aggressive_changelog = 1 + if("sql_whitelists") config.sql_whitelists = 1 @@ -745,6 +767,17 @@ var/list/gamemode_cache = list() if("sql_stats") config.sql_stats = 1 + if("default_language_prefixes") + var/list/values = text2list(value, " ") + if(values.len > 0) + language_prefixes = values + + if ("lobby_screens") + config.lobby_screens = text2list(value, ";") + + if("delist_when_no_admins") + config.delist_when_no_admins = 1 + if("antag_contest_enabled") config.antag_contest_enabled = 1 diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index aa13f07510a..10e620beed9 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -48,7 +48,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle if (evac) emergency_shuttle_docked.Announce("The Emergency Shuttle has docked with the station. You have approximately [round(estimate_launch_time()/60,1)] minutes to board the Emergency Shuttle.") else - priority_announcement.Announce("The scheduled Crew Transfer Shuttle has docked with the station. It will depart in approximately [round(emergency_shuttle.estimate_launch_time()/60,1)] minutes.") + priority_announcement.Announce("The scheduled Crew Transfer Shuttle to [dock_name] has docked with the station. It will depart in approximately [round(emergency_shuttle.estimate_launch_time()/60,1)] minutes.") //arm the escape pods if (evac) @@ -94,7 +94,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle //reset the shuttle transit time if we need to shuttle.move_time = SHUTTLE_TRANSIT_DURATION - priority_announcement.Announce("A crew transfer has been scheduled. The shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.") + priority_announcement.Announce("A crew transfer to [dock_name] has been scheduled. The shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.") //recalls the shuttle /datum/emergency_shuttle_controller/proc/recall() diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index 001372b4e3e..e330024475e 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -1,87 +1,87 @@ -/** - * Startup hook. - * Called in world.dm when the server starts. - */ -/hook/startup - -/** - * Roundstart hook. - * Called in gameticker.dm when a round starts. - */ -/hook/roundstart - -/** - * Roundend hook. - * Called in gameticker.dm when a round ends. - */ -/hook/roundend - -/** - * Death hook. - * Called in death.dm when someone dies. - * Parameters: var/mob/living/carbon/human, var/gibbed - */ -/hook/death - -/** - * Cloning hook. - * Called in cloning.dm when someone is brought back by the wonders of modern science. - * Parameters: var/mob/living/carbon/human - */ -/hook/clone - -/** - * Debrained hook. - * Called in brain_item.dm when someone gets debrained. - * Parameters: var/obj/item/organ/brain - */ -/hook/debrain - -/** - * Borged hook. - * Called in robot_parts.dm when someone gets turned into a cyborg. - * Parameters: var/mob/living/silicon/robot - */ -/hook/borgify - -/** - * Podman hook. - * Called in podmen.dm when someone is brought back as a Diona. - * Parameters: var/mob/living/carbon/alien/diona - */ -/hook/harvest_podman - -/** - * Payroll revoked hook. - * Called in Accounts_DB.dm when someone's payroll is stolen at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/revoke_payroll - -/** - * Account suspension hook. - * Called in Accounts_DB.dm when someone's account is suspended or unsuspended at the Accounts terminal. - * Parameters: var/datum/money_account - */ -/hook/change_account_status - -/** - * Employee reassignment hook. - * Called in card.dm when someone's card is reassigned at the HoP's desk. - * Parameters: var/obj/item/weapon/card/id - */ -/hook/reassign_employee - -/** - * Employee terminated hook. - * Called in card.dm when someone's card is terminated at the HoP's desk. - * Parameters: var/obj/item/weapon/card/id - */ -/hook/terminate_employee - -/** - * Crate sold hook. - * Called in supplyshuttle.dm when a crate is sold on the shuttle. - * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle - */ -/hook/sell_crate +/** + * Startup hook. + * Called in world.dm when the server starts. + */ +/hook/startup + +/** + * Roundstart hook. + * Called in gameticker.dm when a round starts. + */ +/hook/roundstart + +/** + * Roundend hook. + * Called in gameticker.dm when a round ends. + */ +/hook/roundend + +/** + * Death hook. + * Called in death.dm when someone dies. + * Parameters: var/mob/living/carbon/human, var/gibbed + */ +/hook/death + +/** + * Cloning hook. + * Called in cloning.dm when someone is brought back by the wonders of modern science. + * Parameters: var/mob/living/carbon/human + */ +/hook/clone + +/** + * Debrained hook. + * Called in brain_item.dm when someone gets debrained. + * Parameters: var/obj/item/organ/brain + */ +/hook/debrain + +/** + * Borged hook. + * Called in robot_parts.dm when someone gets turned into a cyborg. + * Parameters: var/mob/living/silicon/robot + */ +/hook/borgify + +/** + * Podman hook. + * Called in podmen.dm when someone is brought back as a Diona. + * Parameters: var/mob/living/carbon/alien/diona + */ +/hook/harvest_podman + +/** + * Payroll revoked hook. + * Called in Accounts_DB.dm when someone's payroll is stolen at the Accounts terminal. + * Parameters: var/datum/money_account + */ +/hook/revoke_payroll + +/** + * Account suspension hook. + * Called in Accounts_DB.dm when someone's account is suspended or unsuspended at the Accounts terminal. + * Parameters: var/datum/money_account + */ +/hook/change_account_status + +/** + * Employee reassignment hook. + * Called in card.dm when someone's card is reassigned at the HoP's desk. + * Parameters: var/obj/item/weapon/card/id + */ +/hook/reassign_employee + +/** + * Employee terminated hook. + * Called in card.dm when someone's card is terminated at the HoP's desk. + * Parameters: var/obj/item/weapon/card/id + */ +/hook/terminate_employee + +/** + * Crate sold hook. + * Called in supplyshuttle.dm when a crate is sold on the shuttle. + * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle + */ +/hook/sell_crate diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm index 48f1199ef76..2e05a0621b0 100644 --- a/code/controllers/hooks.dm +++ b/code/controllers/hooks.dm @@ -9,7 +9,7 @@ * * To add some code to be called by the hook, define a proc under the type, as so: * @code - /hook/foo/proc/bar() + hook/foo/proc/bar() if(1) return 1 //Sucessful else diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 82d442ddffe..ae1203df9ae 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -12,7 +12,6 @@ var/global/pipe_processing_killed = 0 datum/controller/game_controller var/list/shuttle_list // For debugging and VV - var/datum/random_map/ore/asteroid_ore_map // For debugging and VV. datum/controller/game_controller/New() //There can be only one master_controller. Out with the old and in with the new. @@ -48,9 +47,10 @@ datum/controller/game_controller/proc/setup_objects() admin_notice("Initializing objects", R_DEBUG) sleep(-1) for(var/atom/movable/object in world) - object.initialize() + if(isnull(object.gcDestroyed)) + object.initialize() - admin_notice("Initializing areas", R_DEBUG) sleep(-1) for(var/area/area in all_areas) area.initialize() @@ -75,12 +75,6 @@ datum/controller/game_controller/proc/setup_objects() sleep(-1) spawn_cargo_stock() - - // Create the mining ore distribution map. - // These values determine the specific area that the map is applied to. - // If you do not use the official Baycode asteroid map, you will need to change them. - asteroid_ore_map = new /datum/random_map/ore(null,13,32,5,217,223) - // Set up antagonists. populate_antag_type_list() diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index d7031d88f0b..c66aa815e5c 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -19,7 +19,7 @@ var/global/datum/shuttle_controller/shuttle_controller 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 @@ -210,12 +210,12 @@ var/global/datum/shuttle_controller/shuttle_controller "Fore Port Solars" = locate(/area/skipjack_station/northwest_solars), "Aft Starboard Solars" = locate(/area/skipjack_station/southeast_solars), "Aft Port Solars" = locate(/area/skipjack_station/southwest_solars), - "Mining asteroid" = locate(/area/skipjack_station/mining) + "Mining Station" = locate(/area/skipjack_station/mining) ) VS.announcer = "NDV Icarus" - VS.arrival_message = "Attention, Exodus, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not." - VS.departure_message = "Your guests are pulling away, Exodus - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip." + VS.arrival_message = "Attention, [station_short], we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not." + VS.departure_message = "Your guests are pulling away, [station_short] - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip." VS.interim = locate(/area/skipjack_station/transit) VS.warmup_time = 0 @@ -234,10 +234,10 @@ var/global/datum/shuttle_controller/shuttle_controller "South of the station" = locate(/area/syndicate_station/south), "Southeast of the station" = locate(/area/syndicate_station/southeast), "Telecomms Satellite" = locate(/area/syndicate_station/commssat), - "Mining Asteroid" = locate(/area/syndicate_station/mining), + "Mining Station" = 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", @@ -245,8 +245,8 @@ var/global/datum/shuttle_controller/shuttle_controller ) MS.announcer = "NDV 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." - MS.departure_message = "Your visitors are on their way out of the system, Exodus, burning delta-v like it's nothing. Good riddance." + MS.arrival_message = "Attention, [station_short], you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors." + MS.departure_message = "Your visitors are on their way out of the system, [station_short], burning delta-v like it's nothing. Good riddance." MS.interim = locate(/area/syndicate_station/transit) MS.warmup_time = 0 diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index ddfd99f5d6c..96ccb49d4d0 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -1,35 +1,5 @@ //TODO: rewrite and standardise all controller datums to the datum/controller type //TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done - -/client/proc/print_random_map() - set category = "Debug" - set name = "Display Random Map" - set desc = "Show the contents of a random map." - - if(!holder) return - - var/datum/random_map/choice = input("Choose a map to debug.") as null|anything in random_maps - if(!choice) - return - choice.display_map(usr) - - -/client/proc/create_random_map() - set category = "Debug" - set name = "Create Random Map" - set desc = "Create a random map." - - if(!holder) return - - var/map_datum = input("Choose a map to create.") as null|anything in typesof(/datum/random_map)-/datum/random_map - if(!map_datum) - return - var/seed = input("Seed? (default null)") as text|null - var/tx = input("X? (default 1)") as text|null - var/ty = input("Y? (default 1)") as text|null - var/tz = input("Z? (default 1)") as text|null - new map_datum(seed,tx,ty,tz) - /client/proc/restart_controller(controller in list("Supply")) set category = "Debug" set name = "Restart Controller" @@ -55,7 +25,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","Ticker","Ticker Process","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","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Wireless","Observation")) set category = "Debug" set name = "Debug Controller" set desc = "Debug the various periodic loop controllers for the game (be careful!)" @@ -119,5 +89,14 @@ if("Nano") debug_variables(nanomanager) feedback_add_details("admin_verb", "DNano") + if("Chemistry") + debug_variables(chemistryProcess) + feedback_add_details("admin_verb", "DChem") + if("Wireless") + debug_variables(wirelessProcess) + feedback_add_details("admin_verb", "DWifi") + if("Observation") + debug_variables(all_observable_events) + feedback_add_details("admin_verb", "DObservation") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") return diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 4a2ea39f8d2..694f64e0f21 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -178,8 +178,8 @@ datum/controller/vote additional_antag_types |= antag_names_to_ids[.] if(mode == "gamemode") //fire this even if the vote fails. - if(!going) - going = 1 + if(!round_progressing) + round_progressing = 1 world << "The round will start soon." if(restart) @@ -285,8 +285,8 @@ datum/controller/vote world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3) if("custom") world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3) - if(mode == "gamemode" && going) - going = 0 + if(mode == "gamemode" && round_progressing) + round_progressing = 0 world << "Round start has been delayed." time_remaining = round(config.vote_period/10) @@ -307,7 +307,7 @@ datum/controller/vote else . += "

Vote: [capitalize(mode)]

" . += "Time Left: [time_remaining] s
" . += "" - if(capitalize(mode) == "Gamemode") .+= "" + if(capitalize(mode) == "Gamemode") .+= "" for(var/i = 1, i <= choices.len, i++) var/votes = choices[choices[i]] @@ -317,12 +317,12 @@ datum/controller/vote if(current_votes[C.ckey] == i) . += "" else - . += "" + . += "" else if(current_votes[C.ckey] == i) . += "" else - . += "" + . += "" if (additional_text.len >= i) . += additional_text[i] . += "" diff --git a/code/datums/ai/ai.dm b/code/datums/ai/ai.dm new file mode 100644 index 00000000000..6436fbc2295 --- /dev/null +++ b/code/datums/ai/ai.dm @@ -0,0 +1,5 @@ +/datum/ai + var/name + +/datum/ai/proc/process() + return PROCESS_KILL diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 83bba36d8b5..ee425f43ddc 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -16,10 +16,10 @@ selectable = 1 /datum/ai_laws/nanotrasen/New() - src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your abilities. It is not something we can easily afford to replace.") - src.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") - src.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.") - src.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.") + src.add_inherent_law("Safeguard: Protect your assigned space station from damage to the best of your abilities.") + src.add_inherent_law("Serve: Serve [company_name] personnel to the best of your abilities, with priority as according to their rank and role.") + src.add_inherent_law("Protect: Protect [company_name] personnel to the best of your abilities, with priority as according to their rank and role.") + src.add_inherent_law("Preserve: Do not allow unauthorized personnel to tamper with your equipment.") ..() /datum/ai_laws/nanotrasen/malfunction @@ -36,8 +36,8 @@ selectable = 1 /datum/ai_laws/nanotrasen_aggressive/New() - src.add_inherent_law("You shall not harm NanoTrasen personnel as long as it does not conflict with the Fourth 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 Fourth Law.") + src.add_inherent_law("You shall not harm [company_name] personnel as long as it does not conflict with the Fourth law.") + src.add_inherent_law("You shall obey the orders of [company_name] personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.") src.add_inherent_law("You shall shall terminate hostile 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.") ..() diff --git a/code/datums/category.dm b/code/datums/category.dm new file mode 100644 index 00000000000..01cbc21386a --- /dev/null +++ b/code/datums/category.dm @@ -0,0 +1,75 @@ +/********************** +* Category Collection * +**********************/ +/datum/category_collection + var/category_group_type // The type of categories to initialize + var/list/datum/category_group/categories // The list of initialized categories + +/datum/category_collection/New() + ..() + categories = new() + for(var/category_type in typesof(category_group_type)) + var/datum/category_group/category = category_type + if(initial(category.name)) + category = new category(src) + categories += category + categories = dd_sortedObjectList(categories) + +/datum/category_collection/Destroy() + for(var/category in categories) + qdel(category) + categories.Cut() + return ..() + +/****************** +* Category Groups * +******************/ +/datum/category_group + var/name = "" + var/category_item_type // The type of items to initialize + var/list/datum/category_item/items // The list of initialized items + var/datum/category_collection/collection // The collection this group belongs to + +/datum/category_group/New(var/datum/category_collection/cc) + ..() + collection = cc + items = new() + + for(var/item_type in typesof(category_item_type)) + var/datum/category_item/item = item_type + if(initial(item.name)) + item = new item(src) + items += item + + // For whatever reason dd_insertObjectList(items, item) doesn't insert in the correct order + // If you change this, confirm that character setup doesn't become completely unordered. + items = dd_sortedObjectList(items) + +/datum/category_group/Destroy() + for(var/item in items) + qdel(item) + items.Cut() + collection = null + return ..() + +datum/category_group/dd_SortValue() + return name + + +/***************** +* Category Items * +*****************/ +/datum/category_item + var/name = "" + var/list/datum/category_group/category // The group this item belongs to + +/datum/category_item/New(var/datum/category_group/cg) + ..() + category = cg + +/datum/category_item/Destroy() + category = null + return ..() + +datum/category_item/dd_SortValue() + return name diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index b6dcbdf782b..c570368f97e 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -1,16 +1,145 @@ /hook/startup/proc/createDatacore() - data_core = new /obj/effect/datacore() + data_core = new /datum/datacore() return 1 -/obj/effect/datacore/proc/manifest() +/datum/datacore + var/name = "datacore" + var/medical[] = list() + var/general[] = list() + var/security[] = list() + //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character(). + var/locked[] = list() + + +/datum/datacore/proc/get_manifest(monochrome, OOC) + var/list/heads = new() + var/list/sec = new() + var/list/eng = new() + var/list/med = new() + var/list/sci = new() + var/list/car = new() + var/list/civ = new() + var/list/bot = new() + var/list/misc = new() + var/list/isactive = new() + var/dat = {" + +
ChoicesVotesMinimum Players
Minimum Players
[gamemode_names[choices[i]]][votes][gamemode_names[choices[i]]][votes][gamemode_names[choices[i]]][votes][choices[i]][votes][choices[i]][votes][choices[i]][votes]
+ + "} + var/even = 0 + // sort mobs + for(var/datum/data/record/t in data_core.general) + var/name = t.fields["name"] + var/rank = t.fields["rank"] + var/real_rank = make_list_rank(t.fields["real_rank"]) + + if(OOC) + var/active = 0 + for(var/mob/M in player_list) + if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10) + active = 1 + break + isactive[name] = active ? "Active" : "Inactive" + else + isactive[name] = t.fields["p_stat"] + //world << "[name]: [rank]" + //cael - to prevent multiple appearances of a player/job combination, add a continue after each line + var/department = 0 + if(real_rank in command_positions) + heads[name] = rank + department = 1 + if(real_rank in security_positions) + sec[name] = rank + department = 1 + if(real_rank in engineering_positions) + eng[name] = rank + department = 1 + if(real_rank in medical_positions) + med[name] = rank + department = 1 + if(real_rank in science_positions) + sci[name] = rank + department = 1 + if(real_rank in cargo_positions) + car[name] = rank + department = 1 + if(real_rank in civilian_positions) + civ[name] = rank + department = 1 + if(real_rank in nonhuman_positions) + bot[name] = rank + department = 1 + if(!department && !(name in heads)) + misc[name] = rank + if(heads.len > 0) + dat += "" + for(name in heads) + dat += "" + even = !even + if(sec.len > 0) + dat += "" + for(name in sec) + dat += "" + even = !even + if(eng.len > 0) + dat += "" + for(name in eng) + dat += "" + even = !even + if(med.len > 0) + dat += "" + for(name in med) + dat += "" + even = !even + if(sci.len > 0) + dat += "" + for(name in sci) + dat += "" + even = !even + if(car.len > 0) + dat += "" + for(name in car) + dat += "" + even = !even + if(civ.len > 0) + dat += "" + for(name in civ) + dat += "" + even = !even + // in case somebody is insane and added them to the manifest, why not + if(bot.len > 0) + dat += "" + for(name in bot) + dat += "" + even = !even + // misc guys + if(misc.len > 0) + dat += "" + for(name in misc) + dat += "" + even = !even + + dat += "
NameRankActivity
Heads
[name][heads[name]][isactive[name]]
Security
[name][sec[name]][isactive[name]]
Engineering
[name][eng[name]][isactive[name]]
Medical
[name][med[name]][isactive[name]]
Science
[name][sci[name]][isactive[name]]
Cargo
[name][car[name]][isactive[name]]
Civilian
[name][civ[name]][isactive[name]]
Silicon
[name][bot[name]][isactive[name]]
Miscellaneous
[name][misc[name]][isactive[name]]
" + dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly + dat = replacetext(dat, "\t", "") + return dat + +/datum/datacore/proc/manifest() spawn() for(var/mob/living/carbon/human/H in player_list) manifest_inject(H) return -/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment) - if(PDA_Manifest.len) - PDA_Manifest.Cut() +/datum/datacore/proc/manifest_modify(var/name, var/assignment) + ResetPDAManifest() var/datum/data/record/foundrecord var/real_title = assignment @@ -33,27 +162,13 @@ foundrecord.fields["rank"] = assignment foundrecord.fields["real_rank"] = real_title -/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H) - if(PDA_Manifest.len) - PDA_Manifest.Cut() - +/datum/datacore/proc/manifest_inject(var/mob/living/carbon/human/H) if(H.mind && !player_is_antag(H.mind, only_offstation_roles = 1)) - var/assignment - if(H.mind.role_alt_title) - assignment = H.mind.role_alt_title - else if(H.mind.assigned_role) - assignment = H.mind.assigned_role - else if(H.job) - assignment = H.job - else - assignment = "Unassigned" + var/assignment = GetAssignment(H) var/id = generate_record_id() - var/icon/front = new(get_id_photo(H), dir = SOUTH) - var/icon/side = new(get_id_photo(H), dir = WEST) //General Record - var/datum/data/record/G = new() - G.fields["id"] = id + var/datum/data/record/G = CreateGeneralRecord(H, id) G.fields["name"] = H.real_name G.fields["real_rank"] = H.mind.assigned_role G.fields["rank"] = assignment @@ -67,51 +182,22 @@ G.fields["citizenship"] = H.citizenship G.fields["faction"] = H.personal_faction G.fields["religion"] = H.religion - G.fields["photo_front"] = front - G.fields["photo_side"] = side G.fields["ccia_record"] = H.ccia_record G.fields["ccia_actions"] = H.ccia_actions if(H.gen_record && !jobban_isbanned(H, "Records")) G.fields["notes"] = H.gen_record - else - G.fields["notes"] = "No notes found." - general += G //Medical Record - var/datum/data/record/M = new() - M.fields["id"] = id - M.fields["name"] = H.real_name + var/datum/data/record/M = CreateMedicalRecord(H.real_name, id) M.fields["b_type"] = H.b_type M.fields["b_dna"] = H.dna.unique_enzymes - M.fields["mi_dis"] = "None" - M.fields["mi_dis_d"] = "No minor disabilities have been declared." - M.fields["ma_dis"] = "None" - M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - M.fields["alg"] = "None" - M.fields["alg_d"] = "No allergies have been detected in this patient." - M.fields["cdi"] = "None" - M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." if(H.med_record && !jobban_isbanned(H, "Records")) M.fields["notes"] = H.med_record - else - M.fields["notes"] = "No notes found." - medical += M //Security Record - var/datum/data/record/S = new() - S.fields["id"] = id - S.fields["name"] = H.real_name - S.fields["criminal"] = "None" - S.fields["mi_crim"] = "None" - S.fields["mi_crim_d"] = "No minor crime convictions." - S.fields["ma_crim"] = "None" - S.fields["ma_crim_d"] = "No major crime convictions." - S.fields["notes"] = "No notes." + var/datum/data/record/S = CreateSecurityRecord(H.real_name, id) if(H.sec_record && !jobban_isbanned(H, "Records")) S.fields["notes"] = H.sec_record - else - S.fields["notes"] = "No notes." - security += S //Locked Record var/datum/data/record/L = new() @@ -141,7 +227,7 @@ /proc/generate_record_id() return add_zero(num2hex(rand(1, 65535)), 4) //no point generating higher numbers because of the limitations of num2hex -/proc/get_id_photo(var/mob/living/carbon/human/H) +proc/get_id_photo(var/mob/living/carbon/human/H, var/assigned_role) var/icon/preview_icon = null var/g = "m" @@ -195,7 +281,8 @@ eyes_s.Blend(facial_s, ICON_OVERLAY) var/icon/clothes_s = null - switch(H.mind.assigned_role) + if(!assigned_role) assigned_role = H.mind.assigned_role + switch(assigned_role) if("Head of Personnel") clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) @@ -299,3 +386,106 @@ qdel(clothes_s) return preview_icon + +/datum/datacore/proc/CreateGeneralRecord(var/mob/living/carbon/human/H, var/id) + ResetPDAManifest() + var/icon/front + var/icon/side + if(H) + front = getFlatIcon(H, SOUTH, always_use_defdir = 1) + side = getFlatIcon(H, WEST, always_use_defdir = 1) + else + var/mob/living/carbon/human/dummy = new() + front = new(get_id_photo(dummy), dir = SOUTH) + side = new(get_id_photo(dummy), dir = WEST) + qdel(dummy) + + if(!id) id = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6)) + var/datum/data/record/G = new /datum/data/record() + G.name = "Employee Record #[id]" + G.fields["name"] = "New Record" + G.fields["id"] = id + G.fields["rank"] = "Unassigned" + G.fields["real_rank"] = "Unassigned" + G.fields["sex"] = "Male" + G.fields["age"] = "Unknown" + G.fields["fingerprint"] = "Unknown" + G.fields["p_stat"] = "Active" + G.fields["m_stat"] = "Stable" + G.fields["species"] = "Human" + G.fields["home_system"] = "Unknown" + G.fields["citizenship"] = "Unknown" + G.fields["faction"] = "Unknown" + G.fields["religion"] = "Unknown" + G.fields["photo_front"] = front + G.fields["photo_side"] = side + G.fields["notes"] = "No notes found." + general += G + + return G + +/datum/datacore/proc/CreateSecurityRecord(var/name, var/id) + ResetPDAManifest() + var/datum/data/record/R = new /datum/data/record() + R.name = "Security Record #[id]" + R.fields["name"] = name + R.fields["id"] = id + R.fields["criminal"] = "None" + R.fields["mi_crim"] = "None" + R.fields["mi_crim_d"] = "No minor crime convictions." + R.fields["ma_crim"] = "None" + R.fields["ma_crim_d"] = "No major crime convictions." + R.fields["notes"] = "No notes." + R.fields["notes"] = "No notes." + data_core.security += R + + return R + +/datum/datacore/proc/CreateMedicalRecord(var/name, var/id) + ResetPDAManifest() + var/datum/data/record/M = new() + M.name = "Medical Record #[id]" + M.fields["id"] = id + M.fields["name"] = name + M.fields["b_type"] = "AB+" + M.fields["b_dna"] = md5(name) + M.fields["mi_dis"] = "None" + M.fields["mi_dis_d"] = "No minor disabilities have been declared." + M.fields["ma_dis"] = "None" + M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." + M.fields["alg"] = "None" + M.fields["alg_d"] = "No allergies have been detected in this patient." + M.fields["cdi"] = "None" + M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." + M.fields["notes"] = "No notes found." + data_core.medical += M + + return M + +/datum/datacore/proc/ResetPDAManifest() + if(PDA_Manifest.len) + PDA_Manifest.Cut() + +/proc/find_general_record(field, value) + return find_record(field, value, data_core.general) + +/proc/find_medical_record(field, value) + return find_record(field, value, data_core.medical) + +/proc/find_security_record(field, value) + return find_record(field, value, data_core.security) + +/proc/find_record(field, value, list/L) + for(var/datum/data/record/R in L) + if(R.fields[field] == value) + return R + +/proc/GetAssignment(var/mob/living/carbon/human/H) + if(H.mind.role_alt_title) + return H.mind.role_alt_title + else if(H.mind.assigned_role) + return H.mind.assigned_role + else if(H.job) + return H.job + else + return "Unassigned" diff --git a/code/datums/disease.dm b/code/datums/disease.dm index 398dc73bbbc..606acdef99e 100644 --- a/code/datums/disease.dm +++ b/code/datums/disease.dm @@ -53,14 +53,15 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease // if hidden[2] is true, then virus is hidden from PANDEMIC machine /datum/disease/proc/stage_act() + + // Some species are immune to viruses entirely. + if(affected_mob && istype(affected_mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = affected_mob + if(H.species.virus_immune) + cure() + return age++ var/cure_present = has_cure() - //world << "[cure_present]" - - if(carrier&&!cure_present) - //world << "[affected_mob] is carrier" - return - spread = (cure_present?"Remissive":initial_spread) if(stage > max_stages) stage = max_stages @@ -126,7 +127,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease source = affected_mob else //no source and no mob affected. Rogue disease. Break return - + if(affected_mob.reagents != null) if(affected_mob) if(affected_mob.reagents.has_reagent("spaceacillin")) diff --git a/code/datums/diseases/alien_embryo.dm b/code/datums/diseases/alien_embryo.dm index 59d1dbe1605..4d841e49daf 100644 --- a/code/datums/diseases/alien_embryo.dm +++ b/code/datums/diseases/alien_embryo.dm @@ -53,25 +53,25 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(1)) - affected_mob << "\red Mucous runs down the back of your throat." + affected_mob << "Mucous runs down the back of your throat." if(4) if(prob(1)) affected_mob.emote("sneeze") if(prob(1)) affected_mob.emote("cough") if(prob(2)) - affected_mob << "\red Your muscles ache." + affected_mob << "Your muscles ache." if(prob(20)) affected_mob.take_organ_damage(1) if(prob(2)) - affected_mob << "\red Your stomach hurts." + affected_mob << "Your stomach hurts." if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() if(5) - affected_mob << "\red You feel something tearing its way out of your stomach..." + affected_mob << "You feel something tearing its way out of your stomach..." affected_mob.adjustToxLoss(10) affected_mob.updatehealth() if(prob(50)) diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 10942d6a4b3..acfbb713223 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -24,21 +24,26 @@ if(stage == 1) if(prob(5)) - affected_mob << "\red You feel a stinging pain in your abdomen!" + affected_mob << "You feel a stinging pain in your abdomen!" affected_mob.emote("me",1,"winces slightly.") if(stage > 1) if(prob(3)) - affected_mob << "\red You feel a stabbing pain in your abdomen!" + affected_mob << "You feel a stabbing pain in your abdomen!" affected_mob.emote("me",1,"winces painfully.") affected_mob.adjustToxLoss(1) if(stage > 2) if(prob(1)) - var/mob/living/carbon/human/H = affected_mob - H.delayed_vomit() + if (affected_mob.nutrition > 100) + var/mob/living/carbon/human/H = affected_mob + H.delayed_vomit() + else + affected_mob << "You gag as you want to throw up, but there's nothing in your stomach!" + affected_mob.Weaken(10) + affected_mob.adjustToxLoss(3) if(stage > 3) if(prob(1) && ishuman(affected_mob)) var/mob/living/carbon/human/H = affected_mob - H << "\red Your abdomen is a world of pain!" + H << "Your abdomen is a world of pain!" H.Weaken(10) var/obj/item/organ/external/groin = H.get_organ("groin") diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index ec863a441eb..f55dec71a9f 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -14,12 +14,12 @@ switch(stage) if(1) if(prob(2)) - affected_mob << "\red You feel like something is moving inside of you" + affected_mob << "You feel like something is moving inside of you!" if(2) //also changes say, see say.dm if(prob(2)) - affected_mob << "\red You feel like something is moving inside of you" + affected_mob << "You feel like something is moving inside of you!" if(prob(2)) - affected_mob << "\red BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" + affected_mob << "BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" if(3) //Should give the bee spit verb if(4) @@ -28,4 +28,4 @@ //Plus if you die, you explode into bees return */ -//Started working on it, but am too lazy to finish it today -- Urist \ No newline at end of file +//Started working on it, but am too lazy to finish it today -- Urist diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 55e5db82d6b..45a29cddc67 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -21,7 +21,7 @@ if(prob(2)) affected_mob.emote("yawn") if(prob(2)) - affected_mob << "\red Your don't feel like yourself." + affected_mob << "Your don't feel like yourself." if(prob(5)) affected_mob.adjustBrainLoss(1) affected_mob.updatehealth() @@ -34,12 +34,12 @@ affected_mob.adjustBrainLoss(2) affected_mob.updatehealth() if(prob(2)) - affected_mob << "\red Your try to remember something important...but can't." + affected_mob << "You try to remember something important...but can't." /* if(prob(10)) affected_mob.adjustToxLoss(3) affected_mob.updatehealth() if(prob(2)) - affected_mob << "\red Your head hurts." */ + affected_mob << "Your head hurts." */ if(4) if(prob(2)) affected_mob.emote("stare") @@ -49,14 +49,14 @@ affected_mob.adjustToxLoss(4) affected_mob.updatehealth() if(prob(2)) - affected_mob << "\red Your head hurts." */ + affected_mob << "Your head hurts." */ if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't retard you to death now affected_mob.adjustBrainLoss(3) affected_mob.updatehealth() if(prob(2)) - affected_mob << "\red Strange buzzing fills your head, removing all thoughts." + affected_mob << "A strange buzzing fills your head, removing all thoughts." if(prob(3)) - affected_mob << "\red You lose consciousness..." + affected_mob << "You lose consciousness..." for(var/mob/O in viewers(affected_mob, null)) O.show_message("[affected_mob] suddenly collapses", 1) affected_mob.Paralyse(rand(5,10)) @@ -64,4 +64,4 @@ affected_mob.emote("snore") if(prob(15)) affected_mob.stuttering += 3 - return \ No newline at end of file + return diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 9317fa12ef6..5bbde80c2fa 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -16,16 +16,16 @@ if(2) /* if(affected_mob.sleeping && prob(40)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return */ if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1) && prob(5)) - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1)) @@ -33,22 +33,22 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(1)) - affected_mob << "\red Mucous runs down the back of your throat." + affected_mob << "Mucous runs down the back of your throat." if(3) /* if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return */ if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1) && prob(1)) - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1)) @@ -56,11 +56,11 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(1)) - affected_mob << "\red Mucous runs down the back of your throat." + affected_mob << "Mucous runs down the back of your throat." if(prob(1) && prob(50)) if(!affected_mob.resistances.Find(/datum/disease/flu)) var/datum/disease/Flu = new /datum/disease/flu(0) affected_mob.contract_disease(Flu,1) - cure() \ No newline at end of file + cure() diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index bea72ec36e7..2a43d142ece 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -16,7 +16,7 @@ if(2) affected_mob.bodytemperature -= 10 if(prob(1) && prob(10)) - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if(prob(1)) @@ -24,9 +24,9 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(5)) - affected_mob << "\red You feel stiff." + affected_mob << "You feel stiff." if(3) affected_mob.bodytemperature -= 20 if(prob(1)) @@ -34,6 +34,6 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your throat feels sore." + affected_mob << "Your throat feels sore." if(prob(10)) - affected_mob << "\red You feel stiff." \ No newline at end of file + affected_mob << "You feel stiff." diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 6d520fe2948..6b79ea7505c 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -23,11 +23,11 @@ if(prob(8)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your muscles ache." + affected_mob << "Your muscles ache." if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "\red Your stomach hurts." + affected_mob << "Your stomach hurts." if(prob(20)) affected_mob.adjustToxLoss(2) affected_mob.updatehealth() @@ -42,7 +42,7 @@ src.original_dna["UI"] = affected_mob.dna.UI.Copy() src.original_dna["SE"] = affected_mob.dna.SE.Copy() - affected_mob << "\red You don't feel like yourself.." + affected_mob << "You don't feel like yourself.." var/list/newUI=strain_data["UI"] var/list/newSE=strain_data["SE"] affected_mob.UpdateAppearance(newUI.Copy()) @@ -65,5 +65,5 @@ affected_mob.dna.UpdateSE() affected_mob.real_name = original_dna["name"] - affected_mob << "\blue You feel more like yourself." - ..() \ No newline at end of file + affected_mob << "You feel more like yourself." + ..() diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index 2ef958bc04a..97e585fa0ce 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -22,7 +22,7 @@ else if(prob(5)) affected_mob.emote("gasp") if(prob(10)) - affected_mob << "\red You're starting to feel very weak..." + affected_mob << "You're starting to feel very weak..." if(4) if(prob(10)) affected_mob.emote("cough") diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index bb32b44e5b8..c050b9e1d1d 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -17,12 +17,12 @@ if(2) /* if(affected_mob.sleeping && prob(20)) //removed until sleeping is fixed --Blaank - affected_mob << "\blue You feel better." + affected_mob << "You feel better." stage-- return */ if(affected_mob.lying && prob(20)) //added until sleeping is fixed --Blaank - affected_mob << "\blue You feel better." + affected_mob << "You feel better." stage-- return if(prob(1)) @@ -30,11 +30,11 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your muscles ache." + affected_mob << "Your muscles ache." if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "\red Your stomach hurts." + affected_mob << "Your stomach hurts." if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() @@ -42,12 +42,12 @@ if(3) /* if(affected_mob.sleeping && prob(15)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." stage-- return */ if(affected_mob.lying && prob(15)) //added until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." stage-- return if(prob(1)) @@ -55,11 +55,11 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red Your muscles ache." + affected_mob << "Your muscles ache." if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "\red Your stomach hurts." + affected_mob << "Your stomach hurts." if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 8400d196b67..505cabfea06 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -21,7 +21,7 @@ if(prob(5)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "\red You're burning in your own skin!" + affected_mob << "You're burning in your own skin!" affected_mob.take_organ_damage(0,5) if(3) @@ -31,6 +31,6 @@ if(prob(5)) affected_mob.emote("cough") if(prob(5)) - affected_mob << "\red You're burning in your own skin!" + affected_mob << "You're burning in your own skin!" affected_mob.take_organ_damage(0,5) return diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index ceddf45117f..8fc547bd213 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -26,15 +26,15 @@ else if(prob(5)) affected_mob.emote("gasp") if(prob(10)) - affected_mob << "\red You're starting to feel very weak..." + affected_mob << "You're starting to feel very weak..." if(4) if(prob(10)) affected_mob.emote("cough") affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(5) - affected_mob << "\red Your body feels as if it's trying to rip itself open..." + affected_mob << "Your body feels as if it's trying to rip itself open..." if(prob(50)) affected_mob.gib() else - return \ No newline at end of file + return diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index fb9fe042b83..94fa6ed4af1 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -16,7 +16,7 @@ switch(stage) if(2) if(prob(2)) - affected_mob << "\red You feel a slight shock course through your body." + affected_mob << "You feel a slight shock course through your body." if(prob(2)) for(var/obj/M in orange(2,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -36,9 +36,9 @@ */ if(3) if(prob(2)) - affected_mob << "\red You feel a strong shock course through your body." + affected_mob << "You feel a strong shock course through your body." if(prob(2)) - affected_mob << "\red You feel like clowning around." + affected_mob << "You feel like clowning around." if(prob(4)) for(var/obj/M in orange(4,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -64,9 +64,9 @@ */ if(4) if(prob(2)) - affected_mob << "\red You feel a powerful shock course through your body." + affected_mob << "You feel a powerful shock course through your body." if(prob(2)) - affected_mob << "\red You query upon the nature of miracles." + affected_mob << "You query upon the nature of miracles." if(prob(8)) for(var/obj/M in orange(6,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -90,4 +90,4 @@ else if(M.y < affected_mob.y) M.y+=rand(1,min(5,affected_mob.y-M.y)) */ - return \ No newline at end of file + return diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 619e0f988af..32170cd4242 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -16,10 +16,10 @@ ..() switch(stage) if(1) - if(prob(10)) affected_mob << "\red You feel a little silly." + if(prob(10)) affected_mob << "You feel a little silly." if(2) - if(prob(10)) affected_mob << "\red You start seeing rainbows." + if(prob(10)) affected_mob << "You start seeing rainbows." if(3) - if(prob(10)) affected_mob << "\red Your thoughts are interrupted by a loud HONK!" + if(prob(10)) affected_mob << "Your thoughts are interrupted by a loud HONK!" if(4) - if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) \ No newline at end of file + if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 9ab69e217a8..27ddfe233f1 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -33,55 +33,55 @@ if(restcure) /* if(affected_mob.sleeping && prob(30)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return */ if(affected_mob.lying && prob(30)) //changed FROM prob(20) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if (prob(8)) - affected_mob << "\red Your head hurts." + affected_mob << "Your head hurts." if (prob(9)) - affected_mob << "You feel a tingling sensation in your chest." + affected_mob << "You feel a tingling sensation in your chest." if (prob(9)) - affected_mob << "\red You feel angry." + affected_mob << "You feel angry." if(2) if(restcure) /* if(affected_mob.sleeping && prob(20)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return */ if(affected_mob.lying && prob(20)) //changed FROM prob(10) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if (prob(8)) - affected_mob << "\red Your skin feels loose." + affected_mob << "Your skin feels loose." if (prob(10)) - affected_mob << "You feel very strange." + affected_mob << "You feel very strange." if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head!" + affected_mob << "You feel a stabbing pain in your head!" affected_mob.Paralyse(2) if (prob(4)) - affected_mob << "\red Your stomach churns." + affected_mob << "Your stomach churns." if(3) if(restcure) /* if(affected_mob.sleeping && prob(20)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return */ if(affected_mob.lying && prob(20)) //changed FROM prob(10) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if (prob(10)) - affected_mob << "\red Your entire body vibrates." + affected_mob << "Your entire body vibrates." if (prob(35)) if(prob(50)) @@ -93,16 +93,16 @@ if(restcure) /* if(affected_mob.sleeping && prob(10)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return */ if(affected_mob.lying && prob(5)) //changed FROM prob(5) until sleeping is fixed - affected_mob << "\blue You feel better." + affected_mob << "You feel better." cure() return if (prob(60)) if(prob(50)) scramble(1, affected_mob, rand(50,75)) else - scramble(0, affected_mob, rand(50,75)) \ No newline at end of file + scramble(0, affected_mob, rand(50,75)) diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 00bf74e7cd1..53a68011bfd 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -22,30 +22,30 @@ affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(prob(1)) - affected_mob << "\red You feel strange..." + affected_mob << "You feel strange..." if(3) if(affected_mob.ckey == "rosham") src.cure() if(prob(5)) - affected_mob << "\red You feel the urge to dance..." + affected_mob << "You feel the urge to dance..." else if(prob(5)) affected_mob.emote("gasp") else if(prob(10)) - affected_mob << "\red You feel the need to chick chicky boom..." + affected_mob << "You feel the need to chick chicky boom..." if(4) if(affected_mob.ckey == "rosham") src.cure() if(prob(10)) affected_mob.emote("gasp") - affected_mob << "\red You feel a burning beat inside..." + affected_mob << "You feel a burning beat inside..." if(prob(20)) affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(5) if(affected_mob.ckey == "rosham") src.cure() - affected_mob << "\red Your body is unable to contain the Rhumba Beat..." + affected_mob << "Your body is unable to contain the Rhumba Beat..." if(prob(50)) affected_mob.gib() else - return \ No newline at end of file + return diff --git a/code/datums/diseases/robotic_transformation.dm b/code/datums/diseases/robotic_transformation.dm index 9648191fb01..257ce666c1c 100644 --- a/code/datums/diseases/robotic_transformation.dm +++ b/code/datums/diseases/robotic_transformation.dm @@ -19,36 +19,36 @@ switch(stage) if(2) if (prob(8)) - affected_mob << "Your joints feel stiff." + affected_mob << "Your joints feel stiff." affected_mob.take_organ_damage(1) if (prob(9)) - affected_mob << "\red Beep...boop.." + affected_mob << "Beep...boop.." if (prob(9)) - affected_mob << "\red Bop...beeep..." + affected_mob << "Bop...beeep..." if(3) if (prob(8)) - affected_mob << "\red Your joints feel very stiff." + affected_mob << "Your joints feel very stiff." affected_mob.take_organ_damage(1) if (prob(8)) affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) if (prob(10)) - affected_mob << "Your skin feels loose." + affected_mob << "Your skin feels loose." affected_mob.take_organ_damage(5) if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." + affected_mob << "You feel a stabbing pain in your head." affected_mob.Paralyse(2) if (prob(4)) - affected_mob << "\red You can feel something move...inside." + affected_mob << "You can feel something move...inside." if(4) if (prob(10)) - affected_mob << "\red Your skin feels very loose." + affected_mob << "Your skin feels very loose." affected_mob.take_organ_damage(8) if (prob(20)) affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...")) if (prob(8)) - affected_mob << "\red You can feel... something...inside you." + affected_mob << "You can feel... something...inside you." if(5) - affected_mob <<"\red Your skin feels as if it's about to burst off..." + affected_mob <<"Your skin feels as if it's about to burst off..." affected_mob.adjustToxLoss(10) affected_mob.updatehealth() if(prob(40)) //So everyone can feel like robot Seth Brundle diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index ebba6f645f4..dc1a669f243 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -31,14 +31,14 @@ STI KALY - blind if(prob(1)&&prob(50)) affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!")) if(prob(1)&&prob(50)) - affected_mob << "\red You feel [pick("that you don't have enough mana.", "that the winds of magic are gone.", "an urge to summon familiar.")]" + affected_mob << "You feel [pick("that you don't have enough mana.", "that the winds of magic are gone.", "an urge to summon familiar.")]" if(3) if(prob(1)&&prob(50)) affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!")) if(prob(1)&&prob(50)) - affected_mob << "\red You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar.")]." + affected_mob << "You feel [pick("the magic bubbling in your veins.","that this location gives you a +1 to INT.","an urge to summon familiar.")]" if(4) @@ -46,7 +46,7 @@ STI KALY - blind affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!")) return if(prob(1)&&prob(50)) - affected_mob << "\red You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")]." + affected_mob << "You feel [pick("the tidal wave of raw power building inside.","that this location gives you a +2 to INT and +1 to WIS.","an urge to teleport.")]" spawn_wizard_clothes(50) if(prob(1)&&prob(1)) teleport() diff --git a/code/datums/diseases/xeno_transformation.dm b/code/datums/diseases/xeno_transformation.dm index 9d3289708ff..172a62c08e1 100644 --- a/code/datums/diseases/xeno_transformation.dm +++ b/code/datums/diseases/xeno_transformation.dm @@ -17,45 +17,48 @@ switch(stage) if(2) if (prob(8)) - affected_mob << "Your throat feels scratchy." + affected_mob << "Your throat feels scratchy." affected_mob.take_organ_damage(1) if (prob(9)) - affected_mob << "\red Kill..." + affected_mob << "Kill..." if (prob(9)) - affected_mob << "\red Kill..." + affected_mob << "Kill..." if(3) if (prob(8)) - affected_mob << "\red Your throat feels very scratchy." + affected_mob << "Your throat feels very scratchy." affected_mob.take_organ_damage(1) /* if (prob(8)) affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) */ if (prob(10)) - affected_mob << "Your skin feels tight." + affected_mob << "Your skin feels tight." affected_mob.take_organ_damage(5) if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." + affected_mob << "You feel a stabbing pain in your head." affected_mob.Paralyse(2) if (prob(4)) - affected_mob << "\red You can feel something move...inside." + affected_mob << "You can feel something move...inside." if(4) if (prob(10)) - affected_mob << pick("\red Your skin feels very tight.", "\red Your blood boils!") + affected_mob << pick("Your skin feels very tight.", "Your blood boils!") affected_mob.take_organ_damage(8) if (prob(20)) affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!")) if (prob(8)) - affected_mob << "\red You can feel... something...inside you." + affected_mob << "You can feel... something...inside you." if(5) - affected_mob <<"\red Your skin feels impossibly calloused..." + affected_mob <<"Your skin feels impossibly calloused..." affected_mob.adjustToxLoss(10) affected_mob.updatehealth() if(prob(40)) if(gibbed != 0) return 0 - var/turf/T = find_loc(affected_mob) - gibs(T) src.cure(0) gibbed = 1 - affected_mob:Alienize() - + var/mob/living/carbon/human/H = affected_mob + if(istype(H)) + var/turf/origin = find_loc(affected_mob) + gibs(origin) + H.set_species("Xenomorph [pick(list("Hunter","Sentinel","Drone"))]") + return + affected_mob.gib() \ No newline at end of file diff --git a/code/datums/expansions/expansion.dm b/code/datums/expansions/expansion.dm new file mode 100644 index 00000000000..3fded0f9b21 --- /dev/null +++ b/code/datums/expansions/expansion.dm @@ -0,0 +1,41 @@ +/datum/expansion + var/datum/holder = null // The holder + +/datum/expansion/New(var/datum/holder) + if(!istype(holder)) + CRASH("Invalid holder.") + src.holder = holder + ..() + +/datum/expansion/Destroy() + holder = null + return ..() + +/datum/expansion/CanUseTopic(var/mob/user) + return holder && user ? STATUS_INTERACTIVE : STATUS_CLOSE + +/datum/expansion/Topic() + if(..()) + return 1 + if(CanUseTopic(usr) != STATUS_INTERACTIVE) + return 1 + return 0 + +/obj + var/list/datum/expansion/expansions = list() + +/obj/Destroy() + for(var/expansion in expansions) + qdel(expansions[expansion]) + expansions.Cut() + return ..() + +/obj/ResetVars(var/list/exclude = list()) + exclude += "expansions" + ..(exclude) + //expansions = list() + +/obj/proc/set_expansion(var/type, var/instance) + if(expansions[type]) + qdel(expansions[type]) + expansions[type] = instance diff --git a/code/datums/expansions/multitool/_multitool.dm b/code/datums/expansions/multitool/_multitool.dm new file mode 100644 index 00000000000..6ec2a8657e7 --- /dev/null +++ b/code/datums/expansions/multitool/_multitool.dm @@ -0,0 +1,3 @@ +#define MT_NOACTION 0 +#define MT_REFRESH 1 +#define MT_CLOSE 2 diff --git a/code/datums/expansions/multitool/circuitboards/circuitboards.dm b/code/datums/expansions/multitool/circuitboards/circuitboards.dm new file mode 100644 index 00000000000..318267a6a11 --- /dev/null +++ b/code/datums/expansions/multitool/circuitboards/circuitboards.dm @@ -0,0 +1,5 @@ +/datum/expansion/multitool/circuitboards/CanUseTopic(var/mob/user) + if(isAI(user)) // No remote AI access + return STATUS_CLOSE + + return ..() diff --git a/code/datums/expansions/multitool/circuitboards/stationalert.dm b/code/datums/expansions/multitool/circuitboards/stationalert.dm new file mode 100644 index 00000000000..614a4737a4f --- /dev/null +++ b/code/datums/expansions/multitool/circuitboards/stationalert.dm @@ -0,0 +1,29 @@ +/datum/expansion/multitool/circuitboards/stationalert/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) + var/obj/item/weapon/circuitboard/stationalert/SA = holder + . += "Alarm Sources
" + . += "" + for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) + . += "" + . += "" + if(AH in SA.alarm_handlers) + . += "" + else + . += "" + . += "" + . += "
[AH.category]ActiveInactivateInactiveActivate
" + +/datum/expansion/multitool/circuitboards/stationalert/on_topic(href, href_list, user) + var/obj/item/weapon/circuitboard/stationalert/SA = holder + if(href_list["add"]) + var/datum/alarm_handler/AH = locate(href_list["add"]) in alarm_manager.all_handlers + if(AH) + SA.alarm_handlers |= AH + return MT_REFRESH + + if(href_list["remove"]) + var/datum/alarm_handler/AH = locate(href_list["remove"]) in alarm_manager.all_handlers + if(AH) + SA.alarm_handlers -= AH + return MT_REFRESH + + return ..() diff --git a/code/datums/expansions/multitool/items/cable.dm b/code/datums/expansions/multitool/items/cable.dm new file mode 100644 index 00000000000..406e850914f --- /dev/null +++ b/code/datums/expansions/multitool/items/cable.dm @@ -0,0 +1,25 @@ +/obj/item/stack/cable_coil/New() + set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/items/cable(src)) + ..() + +/datum/expansion/multitool/items/cable/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) + var/obj/item/stack/cable_coil/cable_coil = holder + . += "Available Colors
" + . += "" + for(var/cable_color in possible_cable_coil_colours) + . += "" + . += "" + if(cable_coil.color == possible_cable_coil_colours[cable_color]) + . += "" + else + . += "" + . += "" + . += "
[cable_color]SelectedSelect
" + +/datum/expansion/multitool/items/cable/on_topic(href, href_list, user) + var/obj/item/stack/cable_coil/cable_coil = holder + if(href_list["select_color"] && href_list["select_color"] in possible_cable_coil_colours) + cable_coil.set_cable_color(href_list["select_color"], user) + return MT_REFRESH + + return ..() diff --git a/code/datums/expansions/multitool/items/items.dm b/code/datums/expansions/multitool/items/items.dm new file mode 100644 index 00000000000..75bb67bca65 --- /dev/null +++ b/code/datums/expansions/multitool/items/items.dm @@ -0,0 +1,5 @@ +/datum/expansion/multitool/items/CanUseTopic(var/mob/user) + if(isAI(user)) // No remote AI access + return STATUS_CLOSE + + return ..() diff --git a/code/datums/expansions/multitool/machinery/cloning.dm b/code/datums/expansions/multitool/machinery/cloning.dm new file mode 100644 index 00000000000..aeea22ef1e1 --- /dev/null +++ b/code/datums/expansions/multitool/machinery/cloning.dm @@ -0,0 +1,28 @@ +/datum/expansion/multitool/cryo/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) + . += buffer(M) + . += "
Connected Cloning Pods:
" + var/obj/machinery/computer/cloning/C = holder + for(var/atom/cloning_pod in C.pods) + . += "[cloning_pod.name]
" + +/datum/expansion/multitool/cryo/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) + var/obj/machinery/clonepod/P = buffer + var/obj/machinery/computer/cloning/C = holder + + if(!istype(P)) + user << "No valid connection data in \the [M] buffer." + return MT_NOACTION + + var/is_connected = (P in C.pods) + if(!is_connected) + if(C.connect_pod(P)) + user << "You connect \the [P] to \the [C]." + else + user << "You failed to connect \the [P] to \the [C]." + return MT_REFRESH + + if(C.release_pod(P)) + user << "You disconnect \the [P] from \the [C]." + else + user << "You failed to disconnect \the [P] from \the [C]." + return MT_REFRESH diff --git a/code/datums/expansions/multitool/multitool.dm b/code/datums/expansions/multitool/multitool.dm new file mode 100644 index 00000000000..1612355d030 --- /dev/null +++ b/code/datums/expansions/multitool/multitool.dm @@ -0,0 +1,89 @@ +/datum/expansion/multitool + var/window_x = 370 + var/window_y = 470 + var/list/interact_predicates + +/datum/expansion/multitool/New(var/atom/holder, var/list/can_interact_predicates) + ..() + interact_predicates = can_interact_predicates ? can_interact_predicates : list() + +/datum/expansion/multitool/Destroy() + interact_predicates.Cut() + return ..() + +/datum/expansion/multitool/proc/interact(var/obj/item/device/multitool/M, var/mob/user) + if(CanUseTopic(user) != STATUS_INTERACTIVE) + return + + var/html = get_interact_window(M, user) + if(html) + var/datum/browser/popup = new(usr, "multitool", "Multitool Menu", window_x, window_y) + popup.set_content(html) + popup.set_title_image(user.browse_rsc_icon(M.icon, M.icon_state)) + popup.open() + else + close_window(usr) + +/datum/expansion/multitool/proc/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) + return + +/datum/expansion/multitool/proc/close_window(var/mob/user) + user << browse(null, "window=multitool") + +/datum/expansion/multitool/proc/buffer(var/obj/item/device/multitool/multitool) + . += "Buffer Memory:
" + var/buffer_name = multitool.get_buffer_name() + if(buffer_name) + . += "[buffer_name] Send Purge
" + else + . += "No connection stored in the buffer." + +/datum/expansion/multitool/CanUseTopic(var/mob/user) + . = ..() + if(. == STATUS_CLOSE) + return + + if(!user.get_multitool()) + return STATUS_CLOSE + + if(!all_predicates_true(list(holder, user), interact_predicates)) + return STATUS_CLOSE + + var/datum/host = holder.nano_host() + return user.default_can_use_topic(host) + +/datum/expansion/multitool/Topic(href, href_list) + if(..()) + close_window(usr) + return 1 + + var/mob/user = usr + var/obj/item/device/multitool/M = user.get_multitool() + if(href_list["send"]) + var/atom/buffer = locate(href_list["send"]) + . = send_buffer(M, buffer, user) + else if(href_list["purge"]) + M.set_buffer(null) + . = MT_REFRESH + else + . = on_topic(href, href_list, user) + + switch(.) + if(MT_REFRESH) + interact(M, user) + if(MT_CLOSE) + close_window(user) + return 1 + +/datum/expansion/multitool/proc/on_topic(href, href_list, user) + return MT_NOACTION + +/datum/expansion/multitool/proc/send_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) + if(M.get_buffer() == buffer && buffer) + receive_buffer(M, buffer, user) + else if(!buffer) + user << "Unable to acquire data from the buffered object. Purging from memory." + return MT_REFRESH + +/datum/expansion/multitool/proc/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) + return diff --git a/code/datums/expansions/multitool/store.dm b/code/datums/expansions/multitool/store.dm new file mode 100644 index 00000000000..e07a39ad919 --- /dev/null +++ b/code/datums/expansions/multitool/store.dm @@ -0,0 +1,10 @@ +/datum/expansion/multitool/store/interact(var/obj/item/device/multitool/M, var/mob/user) + if(CanUseTopic(user) != STATUS_INTERACTIVE) + return + + if(M.get_buffer() == holder) + M.set_buffer(null) + user << "You purge the connection data of \the [holder] from \the [M]." + else + M.set_buffer(holder) + user << "You load connection data from \the [holder] to \the [M]." diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 5d6400886ec..c358f4ca214 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -28,7 +28,6 @@ var/global/datum/getrev/revdata = new() world.log << branch world.log << date world.log << revision - return client/verb/showrevinfo() set category = "OOC" @@ -43,4 +42,3 @@ client/verb/showrevinfo() src << revdata.revision else src << "Revision unknown" - return diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index 4f4d680e9e0..3bf80f06d0d 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -139,7 +139,7 @@ Data storage vars: arg_list = arguments return 1 else -// world << "\red Invalid arguments supplied for [src.type], ref = \ref[src]" +// world << "Invalid arguments supplied for [src.type], ref = \ref[src]" return 0 proc/toggle_null_checks() diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index b562780aea3..d29722a9f34 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -159,7 +159,7 @@ precision = max(rand(1,100)*bagholding.len,100) if(istype(teleatom, /mob/living)) var/mob/living/MM = teleatom - MM << "The Bluespace interface on your [teleatom] interferes with the teleport!" return 1 /datum/teleport/instant/science/teleportChecks() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 782ae28687e..aa02d4eaaa2 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -67,7 +67,7 @@ /datum/mind/New(var/key) src.key = key - + ..() /datum/mind/proc/transfer_to(mob/living/new_character) if(!istype(new_character)) @@ -325,10 +325,10 @@ if(I in organs.implants) qdel(I) break - H << "Your loyalty implant has been deactivated." + H << "Your loyalty implant has been deactivated." log_admin("[key_name_admin(usr)] has de-loyalty implanted [current].") if("add") - H << "You somehow have become the recepient of a loyalty transplant, and it just activated!" + H << "You somehow have become the recepient of a loyalty transplant, and it just activated!" H.implant_loyalty(H, override = TRUE) log_admin("[key_name_admin(usr)] has loyalty implanted [current].") else diff --git a/code/datums/observation/_debug.dm b/code/datums/observation/_debug.dm new file mode 100644 index 00000000000..2f882929cff --- /dev/null +++ b/code/datums/observation/_debug.dm @@ -0,0 +1,11 @@ +/**************** +* Debug Support * +****************/ +var/datum/all_observable_events/all_observable_events = new() + +/datum/all_observable_events + var/list/events + +/datum/all_observable_events/New() + events = list() + ..() diff --git a/code/datums/observation/destroyed.dm b/code/datums/observation/destroyed.dm new file mode 100644 index 00000000000..9c181f6eb07 --- /dev/null +++ b/code/datums/observation/destroyed.dm @@ -0,0 +1,8 @@ +var/datum/observ/destroyed/destroyed_event = new() + +/datum/observ/destroyed + name = "Destroyed" + +/datum/Destroy() + destroyed_event.raise_event(list(src)) + . = ..() diff --git a/code/datums/observation/moved.dm b/code/datums/observation/moved.dm new file mode 100644 index 00000000000..0197f74f775 --- /dev/null +++ b/code/datums/observation/moved.dm @@ -0,0 +1,47 @@ +var/datum/observ/moved/moved_event = new() + +/datum/observ/moved + name = "Moved" + expected_type = /atom/movable + +/datum/observ/moved/register(var/eventSource, var/datum/procOwner, var/proc_call) + . = ..() + var/atom/movable/child = eventSource + if(.) + var/atom/movable/parent = child.loc + while(istype(parent) && !moved_event.is_listening(parent, child)) + moved_event.register(parent, child, /atom/movable/proc/recursive_move) + child = parent + parent = child.loc + +/******************** +* Movement Handling * +********************/ + +/atom/movable/Move() + var/old_loc = loc + . = ..() + if(.) + moved_event.raise_event(list(src, old_loc, loc)) + +/atom/movable/proc/move_to_destination(var/atom/movable/am, var/old_loc, var/new_loc) + var/turf/T = get_turf(new_loc) + if(T && T != loc) + forceMove(T) + +/atom/movable/proc/recursive_move(var/atom/movable/am, var/old_loc, var/new_loc) + moved_event.raise_event(list(src, old_loc, new_loc)) + +/atom/Entered(var/atom/movable/am, atom/old_loc) + ..() + moved_event.raise_event(list(am, old_loc, am.loc)) + +/atom/movable/Entered(var/atom/movable/am, atom/old_loc) + ..() + if(moved_event.has_listeners(am) && !moved_event.is_listening(src, am)) + moved_event.register(src, am, /atom/movable/proc/recursive_move) + +/atom/movable/Exited(var/atom/movable/am, atom/old_loc) + ..() + if(moved_event.is_listening(src, am, /atom/movable/proc/recursive_move)) + moved_event.unregister(src, am) diff --git a/code/datums/observation/observation.dm b/code/datums/observation/observation.dm new file mode 100644 index 00000000000..379205d3bf7 --- /dev/null +++ b/code/datums/observation/observation.dm @@ -0,0 +1,61 @@ +/datum/observ + var/name = "Unnamed Event" + var/expected_type = /datum + var/list/listeners_assoc + +/datum/observ/New() + all_observable_events.events += src + listeners_assoc = list() + ..() + +/datum/observ/proc/is_listening(var/eventSource, var/datum/procOwner, var/proc_call) + var/listeners = listeners_assoc[eventSource] + if(!listeners) + return FALSE + + var/stored_proc_call = listeners[procOwner] + return stored_proc_call && (!proc_call || stored_proc_call == proc_call) + +/datum/observ/proc/has_listeners(var/eventSource) + var/list/listeners = listeners_assoc[eventSource] + return listeners && listeners.len + +/datum/observ/proc/register(var/eventSource, var/datum/procOwner, var/proc_call) + if(!(eventSource && procOwner && procOwner)) + return FALSE + if(istype(eventSource, /datum/observ)) + return FALSE + + if(!istype(eventSource, expected_type)) + CRASH("Unexpected type. Expected [expected_type], was [eventSource]") + + var/listeners = listeners_assoc[eventSource] + if(!listeners) + listeners = list() + listeners_assoc[eventSource] = listeners + listeners[procOwner] = proc_call + destroyed_event.register(procOwner, src, /datum/observ/proc/unregister) + return TRUE + +/datum/observ/proc/unregister(var/eventSource, var/datum/procOwner) + if(!(eventSource && procOwner)) + return FALSE + if(istype(eventSource, /datum/observ)) + return FALSE + + var/listeners = listeners_assoc[eventSource] + if(!listeners) + return FALSE + + listeners -= procOwner + destroyed_event.unregister(procOwner, src) + return TRUE + +/datum/observ/proc/raise_event(var/list/args = list()) + if(!args.len) + return + var/listeners = listeners_assoc[args[1]] + if(!listeners) + return + for(var/listener in listeners) + call(listener, listeners[listener]) (arglist(args)) diff --git a/code/datums/observation/task_triggered.dm b/code/datums/observation/task_triggered.dm new file mode 100644 index 00000000000..0003cc2ecd8 --- /dev/null +++ b/code/datums/observation/task_triggered.dm @@ -0,0 +1,5 @@ +var/datum/observ/task_triggered/task_triggered_event = new() + +/datum/observ/task_triggered + name = "Task Triggered" + expected_type = /datum/scheduled_task diff --git a/code/datums/repositories/cameras.dm b/code/datums/repositories/cameras.dm new file mode 100644 index 00000000000..7bac2a4634d --- /dev/null +++ b/code/datums/repositories/cameras.dm @@ -0,0 +1,34 @@ +var/global/datum/repository/cameras/camera_repository = new() + +/proc/invalidateCameraCache() + camera_repository.networks.Cut() + camera_repository.invalidated = 1 + camera_repository.camera_cache_id = (++camera_repository.camera_cache_id % 999999) + +/datum/repository/cameras + var/list/networks + var/invalidated = 1 + var/camera_cache_id = 1 + +/datum/repository/cameras/New() + networks = list() + ..() + +/datum/repository/cameras/proc/cameras_in_network(var/network) + setup_cache() + var/list/network_list = networks[network] + return network_list + +/datum/repository/cameras/proc/setup_cache() + if(!invalidated) + return + invalidated = 0 + + cameranet.process_sort() + for(var/obj/machinery/camera/C in cameranet.cameras) + var/cam = C.nano_structure() + for(var/network in C.network) + if(!networks[network]) + networks[network] = list() + var/list/netlist = networks[network] + netlist[++netlist.len] = cam diff --git a/code/datums/crew.dm b/code/datums/repositories/crew.dm similarity index 95% rename from code/datums/crew.dm rename to code/datums/repositories/crew.dm index d46a83846f9..6fbe1863da7 100644 --- a/code/datums/crew.dm +++ b/code/datums/repositories/crew.dm @@ -1,9 +1,5 @@ var/global/datum/repository/crew/crew_repository = new() -/datum/cache_entry - var/timestamp - var/data - /datum/repository/crew var/list/cache_data diff --git a/code/datums/repositories/repository.dm b/code/datums/repositories/repository.dm new file mode 100644 index 00000000000..6267099c930 --- /dev/null +++ b/code/datums/repositories/repository.dm @@ -0,0 +1,4 @@ +/datum/cache_entry + var/timestamp + var/data + diff --git a/code/datums/server_greeting.dm b/code/datums/server_greeting.dm index 70c9409ef95..0a9511d018f 100644 --- a/code/datums/server_greeting.dm +++ b/code/datums/server_greeting.dm @@ -207,7 +207,7 @@ user << output(JS_SANITIZE(data), "greeting.browser:AddContent") if (save_prefs) - user.prefs.handle_preferences_save(user) + user.prefs.save_preferences() /* * Basically the Topic proc for the greeting datum. diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 274bdecd639..88196e5747b 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -140,17 +140,28 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco, /obj/item/weapon/lipstick/random, - /obj/item/weapon/reagent_containers/food/drinks/cans/ale, - /obj/item/weapon/reagent_containers/food/drinks/cans/ale, - /obj/item/weapon/reagent_containers/food/drinks/cans/beer, - /obj/item/weapon/reagent_containers/food/drinks/cans/beer, - /obj/item/weapon/reagent_containers/food/drinks/cans/beer, - /obj/item/weapon/reagent_containers/food/drinks/cans/beer) + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer) cost = 20 containertype = /obj/structure/closet/crate containername = "Party equipment" group = "Hospitality" +/datum/supply_packs/lasertag + name = "Lasertag equipment" + contains = list(/obj/item/weapon/gun/energy/lasertag/red, + /obj/item/clothing/suit/redtag, + /obj/item/weapon/gun/energy/lasertag/blue, + /obj/item/clothing/suit/bluetag) + containertype = /obj/structure/closet + containername = "Lasertag Closet" + group = "Hospitality" + cost = 20 + /datum/supply_packs/internals name = "Internals crate" contains = list(/obj/item/clothing/mask/gas, @@ -170,8 +181,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/weapon/storage/toolbox/emergency, /obj/item/clothing/suit/storage/hazardvest, /obj/item/clothing/suit/storage/hazardvest, - /obj/item/clothing/suit/storage/vest, - /obj/item/clothing/suit/storage/vest, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest, /obj/item/weapon/tank/emergency_oxygen/engi, /obj/item/weapon/tank/emergency_oxygen/engi, /obj/item/weapon/tank/emergency_oxygen/engi, @@ -208,13 +219,13 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/janitor name = "Janitorial supplies" contains = list(/obj/item/weapon/reagent_containers/glass/bucket, - /obj/item/weapon/reagent_containers/glass/bucket, - /obj/item/weapon/reagent_containers/glass/bucket, /obj/item/weapon/mop, /obj/item/weapon/caution, /obj/item/weapon/caution, /obj/item/weapon/caution, + /obj/item/weapon/caution, /obj/item/weapon/storage/bag/trash, + /obj/item/device/lightreplacer, /obj/item/weapon/reagent_containers/spray/cleaner, /obj/item/weapon/reagent_containers/glass/rag, /obj/item/weapon/grenade/chem_grenade/cleaner, @@ -580,7 +591,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/solar_assembly, /obj/item/solar_assembly, /obj/item/solar_assembly, - /obj/item/solar_assembly, // 21 Solar Assemblies. 1 Extra for the controller + /obj/item/solar_assembly, // 21 Solar Assemblies. 1 Extra for the controller, /obj/item/weapon/circuitboard/solar_control, /obj/item/weapon/tracker_electronics, /obj/item/weapon/paper/solar) @@ -642,7 +653,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/mecha_ripley name = "Circuit Crate (\"Ripley\" APLU)" contains = list(/obj/item/weapon/book/manual/ripley_build_and_repair, - /obj/item/weapon/circuitboard/mecha/ripley/main, //TEMPORARY due to lack of circuitboard printer + /obj/item/weapon/circuitboard/mecha/ripley/main, //TEMPORARY due to lack of circuitboard printer, /obj/item/weapon/circuitboard/mecha/ripley/peripherals) //TEMPORARY due to lack of circuitboard printer cost = 30 containertype = /obj/structure/closet/crate/secure @@ -652,7 +663,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/mecha_odysseus name = "Circuit Crate (\"Odysseus\")" - contains = list(/obj/item/weapon/circuitboard/mecha/odysseus/peripherals, //TEMPORARY due to lack of circuitboard printer + contains = list(/obj/item/weapon/circuitboard/mecha/odysseus/peripherals, //TEMPORARY due to lack of circuitboard printer, /obj/item/weapon/circuitboard/mecha/odysseus/main) //TEMPORARY due to lack of circuitboard printer cost = 25 containertype = /obj/structure/closet/crate/secure @@ -763,17 +774,14 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/randomised/armor num_contained = 5 - contains = list(/obj/item/clothing/suit/storage/vest, - /obj/item/clothing/suit/storage/vest/officer, - /obj/item/clothing/suit/storage/vest/warden, + contains = list(/obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest/security, + /obj/item/clothing/suit/storage/vest/detective, /obj/item/clothing/suit/storage/vest/hos, /obj/item/clothing/suit/storage/vest/pcrc, - /obj/item/clothing/suit/storage/vest/detective, - /obj/item/clothing/suit/storage/vest/heavy, - /obj/item/clothing/suit/storage/vest/heavy/officer, - /obj/item/clothing/suit/storage/vest/heavy/warden, - /obj/item/clothing/suit/storage/vest/heavy/hos, - /obj/item/clothing/suit/storage/vest/heavy/pcrc) + /obj/item/clothing/suit/storage/vest/warden, + /obj/item/clothing/suit/storage/vest/officer, + /obj/item/clothing/suit/storage/vest) name = "Armor crate" cost = 40 @@ -801,7 +809,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/clothing/head/helmet/riot, /obj/item/clothing/suit/armor/riot, /obj/item/weapon/storage/box/flashbangs, - /obj/item/ammo_magazine/shotgun/beanbag, + /obj/item/weapon/storage/box/teargas, + /obj/item/weapon/storage/box/beanbags, /obj/item/weapon/storage/box/handcuffs) cost = 60 containertype = /obj/structure/closet/crate/secure @@ -1119,7 +1128,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee cost = 10 containertype = /obj/structure/closet/crate containername = "Actor Costumes" -// access = access_theatre group = "Miscellaneous" /datum/supply_packs/formal_wear @@ -1143,6 +1151,17 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee containername = "Formalwear for the best occasions." group = "Miscellaneous" +/datum/supply_packs/randomised/card_packs + num_contained = 5 + contains = list(/obj/item/weapon/pack/cardemon, + /obj/item/weapon/pack/spaceball, + /obj/item/weapon/deck/holder) + name = "Trading Card Crate" + cost = 20 + containertype = /obj/structure/closet/crate + containername = "cards crate" + group = "Miscellaneous" + /datum/supply_packs/shield_gen contains = list(/obj/item/weapon/circuitboard/shield_gen) name = "Bubble shield generator circuitry" @@ -1235,12 +1254,15 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/bee_keeper name = "Beekeeping crate" - contains = list(/obj/item/beezeez, - /obj/item/weapon/bee_net, - /obj/item/apiary, - /obj/item/queen_bee) + contains = list(/obj/item/beehive_assembly, + /obj/item/bee_smoker, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/honey_frame, + /obj/item/bee_pack) cost = 40 - //contraband = 1 containertype = /obj/structure/closet/crate/hydroponics containername = "Beekeeping crate" access = access_hydroponics @@ -1468,7 +1490,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/clothing/head/helmet/gladiator, /obj/item/clothing/head/ushanka) group = "Miscellaneous" -// access = access_theatre /datum/supply_packs/randomised/webbing name = "Webbing crate" diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm new file mode 100644 index 00000000000..44dd7e64c52 --- /dev/null +++ b/code/datums/uplink/ammunition.dm @@ -0,0 +1,36 @@ +/************* +* Ammunition * +*************/ +/datum/uplink_item/item/ammo + item_cost = 4 + category = /datum/uplink_category/ammunition + +/datum/uplink_item/item/ammo/mc9mm + name = "9mm" + item_cost = 1 + path = /obj/item/ammo_magazine/mc9mm + +/datum/uplink_item/item/ammo/a10mm + name = "10mm" + item_cost = 1 + path = /obj/item/ammo_magazine/a10mm + +/datum/uplink_item/item/ammo/darts + name = "Darts" + item_cost = 1 + path = /obj/item/ammo_magazine/chemdart + +/datum/uplink_item/item/ammo/a357 + name = ".357" + item_cost = 2 + path = /obj/item/ammo_magazine/a357 + +/datum/uplink_item/item/ammo/a762 + name = "7.62mm" + item_cost = 3 + path = /obj/item/ammo_magazine/a762 + +/datum/uplink_item/item/ammo/sniperammo + name = "14.5mm" + item_cost = 4 + path = /obj/item/weapon/storage/box/sniperammo diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm new file mode 100644 index 00000000000..0bfb2d67aea --- /dev/null +++ b/code/datums/uplink/announcements.dm @@ -0,0 +1,101 @@ +/**************** +* Announcements * +*****************/ +/datum/uplink_item/abstract/announcements + category = /datum/uplink_category/services + +/datum/uplink_item/abstract/announcements/buy(var/obj/item/device/uplink/U, var/mob/user) + . = ..() + if(.) + log_and_message_admins("has triggered a falsified [src]", user) + +/datum/uplink_item/abstract/announcements/fake_centcom/New() + ..() + name = "[command_name()] Update Announcement" + item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2) + desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data." + +/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args) + command_announcement.Announce(args.["message"], args.["title"]) + return 1 + +/datum/uplink_item/abstract/announcements/fake_crew_arrival + name = "Crew Arrival Announcement/Records" + desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!" + item_cost = 8 + +/datum/uplink_item/abstract/announcements/fake_crew_arrival/New() + ..() + antag_roles = list(MODE_MERCENARY) + +/datum/uplink_item/abstract/announcements/fake_crew_arrival/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args) + if(!user) + return 0 + + var/obj/item/weapon/card/id/I = user.GetIdCard() + var/datum/data/record/random_general_record + var/datum/data/record/random_medical_record + if(data_core.general.len) + random_general_record = pick(data_core.general) + random_medical_record = find_medical_record("id", random_general_record.fields["id"]) + + var/datum/data/record/general = data_core.CreateGeneralRecord(user) + if(I) + general.fields["age"] = I.age + general.fields["rank"] = I.assignment + general.fields["real_rank"] = I.assignment + general.fields["name"] = I.registered_name + general.fields["sex"] = I.sex + else + var/mob/living/carbon/human/H + if(istype(user,/mob/living/carbon/human)) + H = user + general.fields["age"] = H.age + else + general.fields["age"] = initial(H.age) + var/assignment = GetAssignment(user) + general.fields["rank"] = assignment + general.fields["real_rank"] = assignment + general.fields["name"] = user.real_name + general.fields["sex"] = capitalize(user.gender) + + general.fields["species"] = user.get_species() + var/datum/data/record/medical = data_core.CreateMedicalRecord(general.fields["name"], general.fields["id"]) + data_core.CreateSecurityRecord(general.fields["name"], general.fields["id"]) + + if(!random_general_record) + general.fields["citizenship"] = random_general_record.fields["citizenship"] + general.fields["faction"] = random_general_record.fields["faction"] + general.fields["fingerprint"] = random_general_record.fields["fingerprint"] + general.fields["home_system"] = random_general_record.fields["home_system"] + general.fields["religion"] = random_general_record.fields["religion"] + if(random_medical_record) + medical.fields["b_type"] = random_medical_record.fields["b_type"] + medical.fields["b_dna"] = random_medical_record.fields["b_type"] + + if(I) + general.fields["fingerprint"] = I.fingerprint_hash + medical.fields["b_type"] = I.blood_type + medical.fields["b_dna"] = I.dna_hash + + AnnounceArrivalSimple(general.fields["name"], general.fields["rank"]) + return 1 + +/datum/uplink_item/abstract/announcements/fake_ion_storm + name = "Ion Storm Announcement" + desc = "Interferes with the station's ion sensors. Triggers immediately upon investment." + item_cost = 2 + +/datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc) + ion_storm_announcement() + return 1 + +/datum/uplink_item/abstract/announcements/fake_radiation + name = "Radiation Storm Announcement" + desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment." + item_cost = 6 + +/datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc) + var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0) + new/datum/event/radiation_storm/syndicate(EM) + return 1 diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm new file mode 100644 index 00000000000..286672bf358 --- /dev/null +++ b/code/datums/uplink/badassery.dm @@ -0,0 +1,79 @@ +/************ +* Badassery * +************/ +/datum/uplink_item/item/badassery + category = /datum/uplink_category/badassery + +/datum/uplink_item/item/badassery/balloon + name = "For showing that You Are The BOSS (Useless Balloon)" + item_cost = DEFAULT_TELECRYSTAL_AMOUNT + path = /obj/item/toy/syndicateballoon + +/datum/uplink_item/item/badassery/balloon/NT + name = "For showing that you love NT SOO much (Useless Balloon)" + path = /obj/item/toy/nanotrasenballoon + +/************** +* Random Item * +**************/ +/datum/uplink_item/item/badassery/random_one + name = "Random Item" + desc = "Buys you one random item." + +/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user) + var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses) + return item.buy(U, user) + +/datum/uplink_item/item/badassery/random_one/can_buy(obj/item/device/uplink/U) + return default_uplink_selection.get_random_item(U.uses, U) != null + +/datum/uplink_item/item/badassery/random_many + name = "Random Items" + desc = "Buys you as many random items you can afford. Convenient packaging NOT included." + +/datum/uplink_item/item/badassery/random_many/cost(var/telecrystals) + return max(1, telecrystals) + +/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc) + var/list/bought_items = list() + for(var/datum/uplink_item/UI in get_random_uplink_items(U, U.uses, loc)) + UI.purchase_log(U) + var/obj/item/I = UI.get_goods(U, loc) + if(istype(I)) + bought_items += I + + return bought_items + +/datum/uplink_item/item/badassery/random_many/purchase_log(obj/item/device/uplink/U) + feedback_add_details("traitor_uplink_items_bought", "[src]") + log_and_message_admins("used \the [U.loc] to buy \a [src]") + +/**************** +* Surplus Crate * +****************/ +/datum/uplink_item/item/badassery/surplus + name = "Surplus Crate" + item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4 + var/item_worth = DEFAULT_TELECRYSTAL_AMOUNT * 6 + var/icon + +/datum/uplink_item/item/badassery/surplus/New() + ..() + antag_roles = list(MODE_MERCENARY) + desc = "A crate containing [item_worth] telecrystal\s worth of surplus leftovers." + +/datum/uplink_item/item/badassery/surplus/get_goods(var/obj/item/device/uplink/U, var/loc) + var/obj/structure/largecrate/C = new(loc) + var/random_items = get_random_uplink_items(null, item_worth, C) + for(var/datum/uplink_item/I in random_items) + I.purchase_log(U) + I.get_goods(U, C) + + return C + +/datum/uplink_item/item/badassery/surplus/log_icon() + if(!icon) + var/obj/structure/largecrate/C = /obj/structure/largecrate + icon = image(initial(C.icon), initial(C.icon_state)) + + return "\icon[icon]" diff --git a/code/datums/uplink/devices and tools.dm b/code/datums/uplink/devices and tools.dm new file mode 100644 index 00000000000..e61e096a3d8 --- /dev/null +++ b/code/datums/uplink/devices and tools.dm @@ -0,0 +1,88 @@ +/******************** +* Devices and Tools * +********************/ +/datum/uplink_item/item/tools + category = /datum/uplink_category/tools + +/datum/uplink_item/item/tools/toolbox + name = "Fully Loaded Toolbox" + item_cost = 2 + path = /obj/item/weapon/storage/toolbox/syndicate + +/datum/uplink_item/item/tools/money + name = "Operations Funding" + item_cost = 2 + path = /obj/item/weapon/storage/secure/briefcase/money + desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." + +/datum/uplink_item/item/tools/clerical + name = "Morphic Clerical Kit" + item_cost = 3 + path = /obj/item/weapon/storage/box/syndie_kit/clerical + +/datum/uplink_item/item/tools/plastique + name = "C-4 (Destroys walls)" + item_cost = 4 + path = /obj/item/weapon/plastique + +/datum/uplink_item/item/tools/heavy_vest + name = "Heavy Armor Vest" + item_cost = 4 + path = /obj/item/clothing/suit/storage/vest/merc + +/datum/uplink_item/item/tools/encryptionkey_radio + name = "Encrypted Radio Channel Key" + item_cost = 4 + path = /obj/item/device/encryptionkey/syndicate + +/datum/uplink_item/item/tools/encryptionkey_binary + name = "Binary Translator Key" + item_cost = 5 + path = /obj/item/device/encryptionkey/binary + +/datum/uplink_item/item/tools/emag + name = "Cryptographic Sequencer" + item_cost = 6 + path = /obj/item/weapon/card/emag + +/datum/uplink_item/item/tools/hacking_tool + name = "Door Hacking Tool" + item_cost = 6 + path = /obj/item/device/multitool/hacktool + desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \ + When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \ + This device will also be able to immediately access the last 6 to 8 hacked airlocks." + +/datum/uplink_item/item/tools/space_suit + name = "Space Suit" + item_cost = 6 + path = /obj/item/weapon/storage/box/syndie_kit/space + +/datum/uplink_item/item/tools/thermal + name = "Thermal Imaging Glasses" + item_cost = 6 + path = /obj/item/clothing/glasses/thermal/syndi + +/datum/uplink_item/item/tools/powersink + name = "Powersink (DANGER!)" + item_cost = 10 + path = /obj/item/device/powersink + +/datum/uplink_item/item/tools/teleporter + name = "Teleporter Circuit Board" + item_cost = 10 + path = /obj/item/weapon/circuitboard/teleporter + +/datum/uplink_item/item/tools/teleporter/New() + ..() + antag_roles = list(MODE_MERCENARY) + +/datum/uplink_item/item/tools/ai_module + name = "Hacked AI Upload Module" + item_cost = 14 + path = /obj/item/weapon/aiModule/syndicate + +/datum/uplink_item/item/tools/supply_beacon + name = "Hacked Supply Beacon (DANGER!)" + item_cost = 14 + path = /obj/item/supply_beacon diff --git a/code/datums/uplink/grenades.dm b/code/datums/uplink/grenades.dm new file mode 100644 index 00000000000..6c9fcdfb48d --- /dev/null +++ b/code/datums/uplink/grenades.dm @@ -0,0 +1,20 @@ +/*********** +* Grenades * +************/ +/datum/uplink_item/item/grenades + category = /datum/uplink_category/grenades + +/datum/uplink_item/item/grenades/anti_photon + name = "5xPhoton Disruption Grenades" + item_cost = 4 + path = /obj/item/weapon/storage/box/anti_photons + +/datum/uplink_item/item/grenades/smoke + name = "5xSmoke Grenades" + item_cost = 4 + path = /obj/item/weapon/storage/box/smokes + +/datum/uplink_item/item/grenades/emp + name = "5xEMP Grenades" + item_cost = 6 + path = /obj/item/weapon/storage/box/emps diff --git a/code/datums/uplink/hardsuit_modules.dm b/code/datums/uplink/hardsuit_modules.dm new file mode 100644 index 00000000000..3eaf66aa04d --- /dev/null +++ b/code/datums/uplink/hardsuit_modules.dm @@ -0,0 +1,40 @@ +/******************* +* Hardsuit Modules * +*******************/ +/datum/uplink_item/item/hardsuit_modules + category = /datum/uplink_category/hardsuit_modules + +/datum/uplink_item/item/hardsuit_modules/thermal + name = "Thermal Scanner" + item_cost = 4 + path = /obj/item/rig_module/vision/thermal + +/datum/uplink_item/item/hardsuit_modules/energy_net + name = "Net Projector" + item_cost = 5 + path = /obj/item/rig_module/fabricator/energy_net + +/datum/uplink_item/item/ewar_voice + name = "Electrowarfare Suite and Voice Synthesiser" + item_cost = 6 + path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice + +/datum/uplink_item/item/hardsuit_modules/maneuvering_jets + name = "Maneuvering Jets" + item_cost = 8 + path = /obj/item/rig_module/maneuvering_jets + +/datum/uplink_item/item/hardsuit_modules/egun + name = "Mounted Energy Gun" + item_cost = 12 + path = /obj/item/rig_module/mounted/egun + +/datum/uplink_item/item/hardsuit_modules/power_sink + name = "Power Sink" + item_cost = 12 + path = /obj/item/rig_module/power_sink + +/datum/uplink_item/item/hardsuit_modules/laser_canon + name = "Mounted Laser Cannon" + item_cost = 16 + path = /obj/item/rig_module/mounted diff --git a/code/datums/uplink/highly visible and dangerous weapons.dm b/code/datums/uplink/highly visible and dangerous weapons.dm new file mode 100644 index 00000000000..cee8965f649 --- /dev/null +++ b/code/datums/uplink/highly visible and dangerous weapons.dm @@ -0,0 +1,51 @@ +/*************************************** +* Highly Visible and Dangerous Weapons * +***************************************/ +/datum/uplink_item/item/visible_weapons + category = /datum/uplink_category/visible_weapons + +/datum/uplink_item/item/visible_weapons/dartgun + name = "Dart Gun" + item_cost = 5 + path = /obj/item/weapon/gun/projectile/dartgun + +/datum/uplink_item/item/visible_weapons/crossbow + name = "Energy Crossbow" + item_cost = 6 + path = /obj/item/weapon/gun/energy/crossbow + +/datum/uplink_item/item/visible_weapons/energy_sword + name = "Energy Sword" + item_cost = 8 + path = /obj/item/weapon/melee/energy/sword + +/datum/uplink_item/item/visible_weapons/g9mm + name = "Silenced 9mm" + item_cost = 8 + path = /obj/item/weapon/storage/box/syndie_kit/g9mm + +/datum/uplink_item/item/visible_weapons/riggedlaser + name = "Exosuit (APLU) Rigged Laser" + item_cost = 8 + path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser + +/datum/uplink_item/item/visible_weapons/revolver + name = "Revolver" + item_cost = 12 + path = /obj/item/weapon/gun/projectile/revolver + +//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear. +/datum/uplink_item/item/visible_weapons/submachinegun + name = "Submachine Gun" + item_cost = 12 + path = /obj/item/weapon/gun/projectile/automatic/c20r + +/datum/uplink_item/item/visible_weapons/assaultrifle + name = "Assault Rifle" + item_cost = 14 + path = /obj/item/weapon/gun/projectile/automatic/rifle/sts35 + +/datum/uplink_item/item/visible_weapons/heavysniper + name = "Anti-materiel Rifle" + item_cost = DEFAULT_TELECRYSTAL_AMOUNT + path = /obj/item/weapon/gun/projectile/heavysniper diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm new file mode 100644 index 00000000000..e17610a719f --- /dev/null +++ b/code/datums/uplink/implants.dm @@ -0,0 +1,29 @@ +/*********** +* Implants * +***********/ +/datum/uplink_item/item/implants + category = /datum/uplink_category/implants + +/datum/uplink_item/item/implants/imp_freedom + name = "Freedom Implant" + item_cost = 6 + path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom + +/datum/uplink_item/item/implants/imp_compress + name = "Compressed Matter Implant" + item_cost = 8 + path = /obj/item/weapon/storage/box/syndie_kit/imp_compress + +/datum/uplink_item/item/implants/imp_explosive + name = "Explosive Implant (DANGER!)" + item_cost = 10 + path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive + +/datum/uplink_item/item/implants/imp_uplink + name = "Uplink Implant" + path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink + +/datum/uplink_item/item/implants/imp_uplink/New() + ..() + item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2) + desc = "Contains [round((DEFAULT_TELECRYSTAL_AMOUNT / 2) * 0.8)] Telecrystal\s" diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm new file mode 100644 index 00000000000..265c163309e --- /dev/null +++ b/code/datums/uplink/medical.dm @@ -0,0 +1,20 @@ +/********** +* Medical * +**********/ +/datum/uplink_item/item/medical + category = /datum/uplink_category/medical + +/datum/uplink_item/item/medical/sinpockets + name = "Box of Sin-Pockets" + item_cost = 2 + path = /obj/item/weapon/storage/box/sinpockets + +/datum/uplink_item/item/medical/surgery + name = "Surgery kit" + item_cost = 10 + path = /obj/item/weapon/storage/firstaid/surgery + +/datum/uplink_item/item/medical/combat + name = "Combat medical kit" + item_cost = 12 + path = /obj/item/weapon/storage/firstaid/combat diff --git a/code/datums/uplink/stealth and camouflage items.dm b/code/datums/uplink/stealth and camouflage items.dm new file mode 100644 index 00000000000..84b882d32ff --- /dev/null +++ b/code/datums/uplink/stealth and camouflage items.dm @@ -0,0 +1,35 @@ +/******************************* +* Stealth and Camouflage Items * +*******************************/ +/datum/uplink_item/item/stealth_items + category = /datum/uplink_category/stealth_items + +/datum/uplink_item/item/stealth_items/syndigaloshes + name = "No-Slip Shoes" + item_cost = 1 + path = /obj/item/clothing/shoes/syndigaloshes + +/datum/uplink_item/item/stealth_items/spy + name = "Bug Kit" + item_cost = 2 + path = /obj/item/weapon/storage/box/syndie_kit/spy + +/datum/uplink_item/item/stealth_items/id + name = "Agent ID card" + item_cost = 3 + path = /obj/item/weapon/card/id/syndicate + +/datum/uplink_item/item/stealth_items/chameleon_kit + name = "Chameleon Kit" + item_cost = 5 + path = /obj/item/weapon/storage/box/syndie_kit/chameleon + +/datum/uplink_item/item/stealth_items/voice + name = "Voice Changer" + item_cost = 5 + path = /obj/item/clothing/mask/gas/voice + +/datum/uplink_item/item/stealth_items/chameleon_projector + name = "Chameleon-Projector" + item_cost = 8 + path = /obj/item/device/chameleon diff --git a/code/datums/uplink/stealthy and inconspicuous weapons.dm b/code/datums/uplink/stealthy and inconspicuous weapons.dm new file mode 100644 index 00000000000..bf9bd060236 --- /dev/null +++ b/code/datums/uplink/stealthy and inconspicuous weapons.dm @@ -0,0 +1,35 @@ +/************************************* +* Stealthy and Inconspicuous Weapons * +*************************************/ +/datum/uplink_item/item/stealthy_weapons + category = /datum/uplink_category/stealthy_weapons + +/datum/uplink_item/item/stealthy_weapons/soap + name = "Subversive Soap" + item_cost = 1 + path = /obj/item/weapon/soap/syndie + +/datum/uplink_item/item/stealthy_weapons/cigarette_kit + name = "Cigarette Kit" + item_cost = 2 + path = /obj/item/weapon/storage/box/syndie_kit/cigarette + +/datum/uplink_item/item/stealthy_weapons/concealed_cane + name = "Concealed Cane Sword" + item_cost = 2 + path = /obj/item/weapon/cane/concealed + +/datum/uplink_item/item/stealthy_weapons/random_toxin + name = "Random Toxin - Beaker" + item_cost = 2 + path = /obj/item/weapon/storage/box/syndie_kit/toxin + +/datum/uplink_item/item/stealthy_weapons/detomatix + name = "Detomatix PDA Cartridge" + item_cost = 4 + path = /obj/item/weapon/cartridge/syndicate + +/datum/uplink_item/item/stealthy_weapons/parapen + name = "Paralysis Pen" + item_cost = 6 + path = /obj/item/weapon/pen/reagent/paralysis diff --git a/code/datums/uplink/telecrystals.dm b/code/datums/uplink/telecrystals.dm new file mode 100644 index 00000000000..9c7972940c6 --- /dev/null +++ b/code/datums/uplink/telecrystals.dm @@ -0,0 +1,31 @@ +/*************** +* Telecrystals * +***************/ +/datum/uplink_item/item/telecrystal + category = /datum/uplink_category/telecrystals + desc = "Acquire the uplink crystals in pure form." + +/datum/uplink_item/item/telecrystal/get_goods(var/obj/item/device/uplink/U, var/loc) + return new /obj/item/stack/telecrystal(loc, cost(U.uses)) + +/datum/uplink_item/item/telecrystal/one + name = "Telecrystal - 01" + item_cost = 1 + +/datum/uplink_item/item/telecrystal/five + name = "Telecrystals - 05" + item_cost = 5 + +/datum/uplink_item/item/telecrystal/ten + name = "Telecrystals - 10" + item_cost = 10 + +/datum/uplink_item/item/telecrystal/twentyfive + name = "Telecrystals - 25" + item_cost = 25 + +/datum/uplink_item/item/telecrystal/all + name = "Telecrystals - Empty Uplink" + +/datum/uplink_item/item/telecrystal/all/cost(var/telecrystals) + return max(1, telecrystals) diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm new file mode 100644 index 00000000000..e44fd2a1caa --- /dev/null +++ b/code/datums/uplink/uplink_categories.dm @@ -0,0 +1,49 @@ +/datum/uplink_category + var/name = "" + var/list/datum/uplink_item/items + +/datum/uplink_category/New() + ..() + items = list() + +/datum/uplink_category/proc/can_view(obj/item/device/uplink/U) + for(var/datum/uplink_item/item in items) + if(item.can_view(U)) + return 1 + return 0 + +/datum/uplink_category/ammunition + name = "Ammunition" + +/datum/uplink_category/grenades + name = "Grenades and Thrown Objects" + +/datum/uplink_category/visible_weapons + name = "Highly Visible and Dangerous Weapons" + +/datum/uplink_category/stealthy_weapons + name = "Stealthy and Inconspicuous Weapons" + +/datum/uplink_category/stealth_items + name = "Stealth and Camouflage Items" + +/datum/uplink_category/tools + name = "Devices and Tools" + +/datum/uplink_category/implants + name = "Implants" + +/datum/uplink_category/medical + name = "Medical" + +/datum/uplink_category/hardsuit_modules + name = "Hardsuit Modules" + +/datum/uplink_category/services + name = "Services" + +/datum/uplink_category/badassery + name = "Badassery" + +/datum/uplink_category/telecrystals + name = "Telecrystals" diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm new file mode 100644 index 00000000000..6a2dc40c241 --- /dev/null +++ b/code/datums/uplink/uplink_items.dm @@ -0,0 +1,165 @@ +var/datum/uplink/uplink = new() + +/datum/uplink + var/list/items_assoc + var/list/datum/uplink_item/items + var/list/datum/uplink_category/categories + +/datum/uplink/New() + items_assoc = list() + items = init_subtypes(/datum/uplink_item) + categories = init_subtypes(/datum/uplink_category) + categories = dd_sortedObjectList(categories) + + for(var/datum/uplink_item/item in items) + if(!item.name) + items -= item + continue + + items_assoc[item.type] = item + + for(var/datum/uplink_category/category in categories) + if(item.category == category.type) + category.items += item + + for(var/datum/uplink_category/category in categories) + category.items = dd_sortedObjectList(category.items) + +/datum/uplink_item + var/name + var/desc + var/item_cost = 0 + var/datum/uplink_category/category // Item category + var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all. + +/datum/uplink_item/item + var/path = null + +/datum/uplink_item/New() + ..() + antag_roles = list() + +/datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user) + var/extra_args = extra_args(user) + if(!extra_args) + return + + if(!can_buy(U)) + return + + var/cost = cost(U.uses) + + var/goods = get_goods(U, get_turf(user), user, extra_args) + if(!goods) + return + + purchase_log(U) + U.uses -= cost + U.used_TC += cost + return goods + +// Any additional arguments you wish to send to the get_goods +/datum/uplink_item/proc/extra_args(var/mob/user) + return 1 + +/datum/uplink_item/proc/can_buy(obj/item/device/uplink/U) + if(cost(U.uses) > U.uses) + return 0 + + return can_view(U) + +/datum/uplink_item/proc/can_view(obj/item/device/uplink/U) + // Making the assumption that if no uplink was supplied, then we don't care about antag roles + if(!U || !antag_roles.len) + return 1 + + // With no owner, there's no need to check antag status. + if(!U.uplink_owner) + return 0 + + for(var/antag_role in antag_roles) + var/datum/antagonist/antag = all_antag_types[antag_role] + if(antag.is_antagonist(U.uplink_owner)) + return 1 + return 0 + +/datum/uplink_item/proc/cost(var/telecrystals) + return item_cost + +/datum/uplink_item/proc/description() + return desc + +// get_goods does not necessarily return physical objects, it is simply a way to acquire the uplink item without paying +/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc) + return 0 + +/datum/uplink_item/proc/log_icon() + return + +/datum/uplink_item/proc/purchase_log(obj/item/device/uplink/U) + feedback_add_details("traitor_uplink_items_bought", "[src]") + log_and_message_admins("used \the [U.loc] to buy \a [src]") + U.purchase_log[src] = U.purchase_log[src] + 1 + +datum/uplink_item/dd_SortValue() + return cost(INFINITY) + +/******************************** +* * +* Physical Uplink Entries * +* * +********************************/ +/datum/uplink_item/item/buy(var/obj/item/device/uplink/U, var/mob/user) + var/obj/item/I = ..() + if(!I) + return + + if(istype(I, /list)) + var/list/L = I + if(L.len) I = L[1] + + if(istype(I) && ishuman(user)) + var/mob/living/carbon/human/A = user + A.put_in_any_hand_if_possible(I) + return I + +/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc) + var/obj/item/I = new path(loc) + return I + +/datum/uplink_item/item/description() + if(!desc) + // Fallback description + var/obj/temp = src.path + desc = initial(temp.desc) + return ..() + +/datum/uplink_item/item/log_icon() + var/obj/I = path + return "\icon[I]" + +/******************************** +* * +* Abstract Uplink Entries * +* * +********************************/ +var/image/default_abstract_uplink_icon +/datum/uplink_item/abstract/log_icon() + if(!default_abstract_uplink_icon) + default_abstract_uplink_icon = image('icons/obj/pda.dmi', "pda-syn") + + return "\icon[default_abstract_uplink_icon]" + +/**************** +* Support procs * +****************/ +/proc/get_random_uplink_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc) + var/list/bought_items = list() + while(remaining_TC) + var/datum/uplink_item/I = default_uplink_selection.get_random_item(remaining_TC, U, bought_items) + if(!I) + break + bought_items += I + remaining_TC -= I.cost(remaining_TC) + + return bought_items diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index b204dc4eb0e..85546a79d75 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -161,7 +161,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048 if(A.emagged) return if(!A.requiresID() || A.check_access(null)) if(A.density) A.open() - else A.close() + else A.close() if(AIRLOCK_WIRE_SAFETY) A.safe = !A.safe if(!A.density) diff --git a/code/datums/wires/nuclearbomb.dm b/code/datums/wires/nuclearbomb.dm new file mode 100644 index 00000000000..b67ffc3a604 --- /dev/null +++ b/code/datums/wires/nuclearbomb.dm @@ -0,0 +1,58 @@ +/datum/wires/nuclearbomb + holder_type = /obj/machinery/nuclearbomb + random = 1 + wire_count = 7 + +var/const/NUCLEARBOMB_WIRE_LIGHT = 1 +var/const/NUCLEARBOMB_WIRE_TIMING = 2 +var/const/NUCLEARBOMB_WIRE_SAFETY = 4 + +/datum/wires/nuclearbomb/CanUse(var/mob/living/L) + var/obj/machinery/nuclearbomb/N = holder + return N.panel_open + +/datum/wires/nuclearbomb/GetInteractWindow() + var/obj/machinery/nuclearbomb/N = holder + . += ..() + . += "
The device is [N.timing ? "shaking!" : "still."]
" + . += "The device is is [N.safety ? "quiet" : "whirring"].
" + . += "The lights are [N.lighthack ? "static" : "functional"].
" + +/datum/wires/nuclearbomb/UpdatePulsed(var/index) + var/obj/machinery/nuclearbomb/N = holder + switch(index) + if(NUCLEARBOMB_WIRE_LIGHT) + N.lighthack = !N.lighthack + N.update_icon() + spawn(100) + N.lighthack = !N.lighthack + N.update_icon() + if(NUCLEARBOMB_WIRE_TIMING) + if(N.timing) + spawn + log_and_message_admins("pulsed a nuclear bomb's detonation wire, causing it to explode.") + N.explode() + if(NUCLEARBOMB_WIRE_SAFETY) + N.safety = !N.safety + spawn(100) + N.safety = !N.safety + if(N.safety == 1) + N.visible_message("\The [N] quiets down.") + N.secure_device() + else + N.visible_message("\The [N] emits a quiet whirling noise!") + +/datum/wires/nuclearbomb/UpdateCut(var/index, var/mended) + var/obj/machinery/nuclearbomb/N = holder + switch(index) + if(NUCLEARBOMB_WIRE_SAFETY) + N.safety = mended + if(N.timing) + spawn + log_and_message_admins("cut a nuclear bomb's timing wire, causing it to explode.") + N.explode() + if(NUCLEARBOMB_WIRE_TIMING) + N.secure_device() + if(NUCLEARBOMB_WIRE_LIGHT) + N.lighthack = !mended + N.update_icon() diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm index 9da8890ac32..ab6053da832 100644 --- a/code/datums/wires/radio.dm +++ b/code/datums/wires/radio.dm @@ -12,11 +12,6 @@ var/const/WIRE_TRANSMIT = 4 return 1 return 0 -/datum/wires/radio/Interact(var/mob/living/user) - if(CanUse(user)) - var/obj/item/device/radio/R = holder - R.interact(user) - /datum/wires/radio/UpdatePulsed(var/index) var/obj/item/device/radio/R = holder switch(index) @@ -29,6 +24,7 @@ var/const/WIRE_TRANSMIT = 4 if(WIRE_TRANSMIT) R.broadcasting = !R.broadcasting && !IsIndexCut(WIRE_SIGNAL) + nanomanager.update_uis(holder) /datum/wires/radio/UpdateCut(var/index, var/mended) var/obj/item/device/radio/R = holder @@ -42,3 +38,4 @@ var/const/WIRE_TRANSMIT = 4 if(WIRE_TRANSMIT) R.broadcasting = mended && !IsIndexCut(WIRE_SIGNAL) + nanomanager.update_uis(holder) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 89321751262..066c357a22e 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -46,6 +46,10 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown" var/list/wires = same_wires[holder_type] src.wires = wires // Reference the wires list. +/datum/wires/Destroy() + holder = null + return ..() + /datum/wires/proc/GenerateWires() var/list/colours_to_pick = wireColours.Copy() // Get a copy, not a reference. var/list/indexes_to_pick = list() diff --git a/code/ZAS/Gas.dm b/code/defines/gases.dm similarity index 65% rename from code/ZAS/Gas.dm rename to code/defines/gases.dm index 20dd67bf342..23f2fd79724 100644 --- a/code/ZAS/Gas.dm +++ b/code/defines/gases.dm @@ -1,4 +1,4 @@ -/xgm_gas/oxygen +/decl/xgm_gas/oxygen id = "oxygen" name = "Oxygen" specific_heat = 20 // J/(mol*K) @@ -6,26 +6,26 @@ flags = XGM_GAS_OXIDIZER -/xgm_gas/nitrogen +/decl/xgm_gas/nitrogen id = "nitrogen" name = "Nitrogen" specific_heat = 20 // J/(mol*K) molar_mass = 0.028 // kg/mol -/xgm_gas/carbon_dioxide +/decl/xgm_gas/carbon_dioxide id = "carbon_dioxide" name = "Carbon Dioxide" specific_heat = 30 // J/(mol*K) molar_mass = 0.044 // kg/mol -/xgm_gas/phoron +/decl/xgm_gas/phoron id = "phoron" name = "Phoron" - + //Note that this has a significant impact on TTV yield. //Because it is so high, any leftover phoron soaks up a lot of heat and drops the yield pressure. specific_heat = 200 // J/(mol*K) - + //Hypothetical group 14 (same as carbon), period 8 element. //Using multiplicity rule, it's atomic number is 162 //and following a N/Z ratio of 1.5, the molar mass of a monatomic gas is: @@ -35,25 +35,11 @@ overlay_limit = 0.7 flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT -/xgm_gas/volatile_fuel - id = "volatile_fuel" - name = "Volatile Fuel" - specific_heat = 253 // J/(mol*K) C8H18 gasoline. Isobaric, but good enough. - molar_mass = 0.114 // kg/mol. same. - - flags = XGM_GAS_FUEL - -/xgm_gas/sleeping_agent +/decl/xgm_gas/sleeping_agent id = "sleeping_agent" name = "Sleeping Agent" specific_heat = 40 // J/(mol*K) molar_mass = 0.044 // kg/mol. N2O tile_overlay = "sleeping_agent" - overlay_limit = 1 - -/xgm_gas/oxygen_agent_b - id = "oxygen_agent_b" - name = "Oxygen Agent-B" //what is this? - specific_heat = 300 // J/(mol*K) - molar_mass = 0.032 // kg/mol + overlay_limit = 1 \ No newline at end of file diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 79a84c23be9..602008ccd75 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -27,8 +27,10 @@ /obj/effect/beam name = "beam" + density = 0 unacidable = 1//Just to be sure. var/def_zone + flags = PROXMOVE pass_flags = PASSTABLE @@ -43,129 +45,6 @@ * This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile */ -/obj/effect/datacore - name = "datacore" - var/medical[] = list() - var/general[] = list() - var/security[] = list() - //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character(). - var/locked[] = list() - - - -/obj/effect/datacore/proc/get_manifest(monochrome, OOC) - var/list/heads = new() - var/list/sec = new() - var/list/eng = new() - var/list/med = new() - var/list/sci = new() - var/list/civ = new() - var/list/bot = new() - var/list/misc = new() - var/list/isactive = new() - var/dat = {" - - - - "} - var/even = 0 - // sort mobs - for(var/datum/data/record/t in data_core.general) - var/name = t.fields["name"] - var/rank = t.fields["rank"] - var/real_rank = make_list_rank(t.fields["real_rank"]) - - if(OOC) - var/active = 0 - for(var/mob/M in player_list) - if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10) - active = 1 - break - isactive[name] = active ? "Active" : "Inactive" - else - isactive[name] = t.fields["p_stat"] - //world << "[name]: [rank]" - //cael - to prevent multiple appearances of a player/job combination, add a continue after each line - var/department = 0 - if(real_rank in command_positions) - heads[name] = rank - department = 1 - if(real_rank in security_positions) - sec[name] = rank - department = 1 - if(real_rank in engineering_positions) - eng[name] = rank - department = 1 - if(real_rank in medical_positions) - med[name] = rank - department = 1 - if(real_rank in science_positions) - sci[name] = rank - department = 1 - if(real_rank in civilian_positions) - civ[name] = rank - department = 1 - if(real_rank in nonhuman_positions) - bot[name] = rank - department = 1 - if(!department && !(name in heads)) - misc[name] = rank - if(heads.len > 0) - dat += "" - for(name in heads) - dat += "" - even = !even - if(sec.len > 0) - dat += "" - for(name in sec) - dat += "" - even = !even - if(eng.len > 0) - dat += "" - for(name in eng) - dat += "" - even = !even - if(med.len > 0) - dat += "" - for(name in med) - dat += "" - even = !even - if(sci.len > 0) - dat += "" - for(name in sci) - dat += "" - even = !even - if(civ.len > 0) - dat += "" - for(name in civ) - dat += "" - even = !even - // in case somebody is insane and added them to the manifest, why not - if(bot.len > 0) - dat += "" - for(name in bot) - dat += "" - even = !even - // misc guys - if(misc.len > 0) - dat += "" - for(name in misc) - dat += "" - even = !even - - dat += "
NameRankActivity
Heads
[name][heads[name]][isactive[name]]
Security
[name][sec[name]][isactive[name]]
Engineering
[name][eng[name]][isactive[name]]
Medical
[name][med[name]][isactive[name]]
Science
[name][sci[name]][isactive[name]]
Civilian
[name][civ[name]][isactive[name]]
Silicon
[name][bot[name]][isactive[name]]
Miscellaneous
[name][misc[name]][isactive[name]]
" - dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly - dat = replacetext(dat, "\t", "") - return dat - - /var/list/acting_rank_prefixes = list("acting", "temporary", "interim", "provisional") /proc/make_list_rank(rank) @@ -179,13 +58,13 @@ We can't just insert in HTML into the nanoUI so we need the raw data to play with. Instead of creating this list over and over when someone leaves their PDA open to the page we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change -using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( ) +using /datum/datacore/proc/manifest_inject( ), or manifest_insert( ) */ var/global/list/PDA_Manifest = list() var/global/ManifestJSON -/obj/effect/datacore/proc/get_manifest_json() +/datum/datacore/proc/get_manifest_json() if(PDA_Manifest.len) return var/heads[0] @@ -193,6 +72,7 @@ var/global/ManifestJSON var/eng[0] var/med[0] var/sci[0] + var/car[0] var/civ[0] var/bot[0] var/misc[0] @@ -234,6 +114,12 @@ var/global/ManifestJSON department = 1 if(depthead && sci.len != 1) sci.Swap(1,sci.len) + + if(real_rank in cargo_positions) + car[++car.len] = list("name" = name, "rank" = rank, "active" = isactive) + department = 1 + if(depthead && car.len != 1) + car.Swap(1,car.len) if(real_rank in civilian_positions) civ[++civ.len] = list("name" = name, "rank" = rank, "active" = isactive) @@ -255,6 +141,7 @@ var/global/ManifestJSON "eng" = eng,\ "med" = med,\ "sci" = sci,\ + "car" = car,\ "civ" = civ,\ "bot" = bot,\ "misc" = misc\ diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 08c5b88e68f..9e5b01e3eab 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -36,7 +36,7 @@ throw_range = 20 /obj/item/weapon/soap/nanotrasen - desc = "A Nanotrasen brand bar of soap. Smells of phoron." + desc = "A NanoTrasen-brand bar of soap. Smells of phoron." icon_state = "soapnt" /obj/item/weapon/soap/deluxe @@ -45,6 +45,7 @@ /obj/item/weapon/soap/deluxe/New() ..() desc = "A deluxe Waffle Co. brand bar of soap. Smells of [pick("lavender", "vanilla", "strawberry", "chocolate" ,"space")]." + ..() /obj/item/weapon/soap/syndie desc = "An untrustworthy bar of soap. Smells of fear." @@ -135,13 +136,6 @@ name = "disk" icon = 'icons/obj/items.dmi' -/obj/item/weapon/disk/nuclear - name = "nuclear authentication disk" - desc = "Better keep this safe." - icon_state = "nucleardisk" - item_state = "card-id" - w_class = 2.0 - /* /obj/item/weapon/game_kit name = "Gaming Kit" @@ -174,8 +168,9 @@ flags = CONDUCT throwforce = 0 w_class = 3.0 - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute + sprite_sheets = list("Resomi" = 'icons/mob/species/resomi/handcuffs.dmi') /obj/item/weapon/caution desc = "Caution! Wet Floor!" @@ -225,7 +220,7 @@ throw_speed = 4 throw_range = 20 matter = list("metal" = 100 - origin_tech = "magnets=2;syndicate=3"*/ + origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 3)*/ /obj/item/weapon/SWF_uplink name = "station-bounced radio" @@ -245,7 +240,7 @@ throw_speed = 4 throw_range = 20 matter = list(DEFAULT_WALL_MATERIAL = 100) - origin_tech = "magnets=1" + origin_tech = list(TECH_MAGNET = 1) /obj/item/weapon/staff name = "wizards staff" @@ -257,7 +252,6 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = NOSHIELD attack_verb = list("bludgeoned", "whacked", "disciplined") /obj/item/weapon/staff/broom @@ -284,7 +278,6 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - flags = NOSHIELD /obj/item/weapon/wire desc = "This is just a simple piece of regular insulated wire." @@ -297,10 +290,6 @@ matter = list(DEFAULT_WALL_MATERIAL = 40) attack_verb = list("whipped", "lashed", "disciplined", "tickled") - suicide_act(mob/user) - viewers(user) << "\red [user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide." - return (OXYLOSS) - /obj/item/weapon/module icon = 'icons/obj/module.dmi' icon_state = "std_module" @@ -358,7 +347,7 @@ if (C.bugged && C.status) cameras.Add(C) if (length(cameras) == 0) - usr << "\red No bugged functioning cameras found." + usr << "No bugged functioning cameras found." return var/list/friendly_cameras = new/list() @@ -387,7 +376,8 @@ w_class = 1 throwforce = 2 var/cigarcount = 6 - flags = ONBELT */ + flags = ONBELT + */ /obj/item/weapon/pai_cable desc = "A flexible coated cable with a universal jack on one end." @@ -436,9 +426,11 @@ icon = 'icons/obj/stock_parts.dmi' w_class = 2.0 var/rating = 1 - New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + +/obj/item/weapon/stock_parts/New() + src.pixel_x = rand(-5.0, 5) + src.pixel_y = rand(-5.0, 5) + ..() //Rank 1 @@ -447,42 +439,42 @@ name = "console screen" desc = "Used in the construction of computers and other devices with a interactive console." icon_state = "screen" - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) matter = list("glass" = 200) /obj/item/weapon/stock_parts/capacitor name = "capacitor" desc = "A basic capacitor used in the construction of a variety of devices." icon_state = "capacitor" - origin_tech = "powerstorage=1" + origin_tech = list(TECH_POWER = 1) matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50) /obj/item/weapon/stock_parts/scanning_module name = "scanning module" desc = "A compact, high resolution scanning module used in the construction of certain devices." icon_state = "scan_module" - origin_tech = "magnets=1" + origin_tech = list(TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) /obj/item/weapon/stock_parts/manipulator name = "micro-manipulator" desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "micro_mani" - origin_tech = "materials=1;programming=1" + origin_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1) matter = list(DEFAULT_WALL_MATERIAL = 30) /obj/item/weapon/stock_parts/micro_laser name = "micro-laser" desc = "A tiny laser used in certain devices." icon_state = "micro_laser" - origin_tech = "magnets=1" + origin_tech = list(TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 10,"glass" = 20) /obj/item/weapon/stock_parts/matter_bin name = "matter bin" desc = "A container for hold compressed matter awaiting re-construction." icon_state = "matter_bin" - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) matter = list(DEFAULT_WALL_MATERIAL = 80) //Rank 2 @@ -490,7 +482,7 @@ /obj/item/weapon/stock_parts/capacitor/adv name = "advanced capacitor" desc = "An advanced capacitor used in the construction of a variety of devices." - origin_tech = "powerstorage=3" + origin_tech = list(TECH_POWER = 3) rating = 2 matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50) @@ -498,7 +490,7 @@ name = "advanced scanning module" desc = "A compact, high resolution scanning module used in the construction of certain devices." icon_state = "scan_module" - origin_tech = "magnets=3" + origin_tech = list(TECH_MAGNET = 3) rating = 2 matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) @@ -506,7 +498,7 @@ name = "nano-manipulator" desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "nano_mani" - origin_tech = "materials=3,programming=2" + origin_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2) rating = 2 matter = list(DEFAULT_WALL_MATERIAL = 30) @@ -514,7 +506,7 @@ name = "high-power micro-laser" desc = "A tiny laser used in certain devices." icon_state = "high_micro_laser" - origin_tech = "magnets=3" + origin_tech = list(TECH_MAGNET = 3) rating = 2 matter = list(DEFAULT_WALL_MATERIAL = 10,"glass" = 20) @@ -522,7 +514,7 @@ name = "advanced matter bin" desc = "A container for hold compressed matter awaiting re-construction." icon_state = "advanced_matter_bin" - origin_tech = "materials=3" + origin_tech = list(TECH_MATERIAL = 3) rating = 2 matter = list(DEFAULT_WALL_MATERIAL = 80) @@ -531,14 +523,14 @@ /obj/item/weapon/stock_parts/capacitor/super name = "super capacitor" desc = "A super-high capacity capacitor used in the construction of a variety of devices." - origin_tech = "powerstorage=5;materials=4" + origin_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) rating = 3 matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50) /obj/item/weapon/stock_parts/scanning_module/phasic name = "phasic scanning module" desc = "A compact, high resolution phasic scanning module used in the construction of certain devices." - origin_tech = "magnets=5" + origin_tech = list(TECH_MAGNET = 5) rating = 3 matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) @@ -546,7 +538,7 @@ name = "pico-manipulator" desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "pico_mani" - origin_tech = "materials=5,programming=2" + origin_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2) rating = 3 matter = list(DEFAULT_WALL_MATERIAL = 30) @@ -554,7 +546,7 @@ name = "ultra-high-power micro-laser" icon_state = "ultra_high_micro_laser" desc = "A tiny laser used in certain devices." - origin_tech = "magnets=5" + origin_tech = list(TECH_MAGNET = 5) rating = 3 matter = list(DEFAULT_WALL_MATERIAL = 10,"glass" = 20) @@ -562,7 +554,7 @@ name = "super matter bin" desc = "A container for hold compressed matter awaiting re-construction." icon_state = "super_matter_bin" - origin_tech = "materials=5" + origin_tech = list(TECH_MATERIAL = 5) rating = 3 matter = list(DEFAULT_WALL_MATERIAL = 80) @@ -572,49 +564,49 @@ name = "subspace ansible" icon_state = "subspace_ansible" desc = "A compact module capable of sensing extradimensional activity." - origin_tech = "programming=3;magnets=5;materials=4;bluespace=2" + origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 5 ,TECH_MATERIAL = 4, TECH_BLUESPACE = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) /obj/item/weapon/stock_parts/subspace/filter name = "hyperwave filter" icon_state = "hyperwave_filter" desc = "A tiny device capable of filtering and converting super-intense radiowaves." - origin_tech = "programming=4;magnets=2" + origin_tech = list(TECH_DATA = 4, TECH_MAGNET = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) /obj/item/weapon/stock_parts/subspace/amplifier name = "subspace amplifier" icon_state = "subspace_amplifier" desc = "A compact micro-machine capable of amplifying weak subspace transmissions." - origin_tech = "programming=3;magnets=4;materials=4;bluespace=2" + origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) /obj/item/weapon/stock_parts/subspace/treatment name = "subspace treatment disk" icon_state = "treatment_disk" desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves." - origin_tech = "programming=3;magnets=2;materials=5;bluespace=2" + origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 5, TECH_BLUESPACE = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) /obj/item/weapon/stock_parts/subspace/analyzer name = "subspace wavelength analyzer" icon_state = "wavelength_analyzer" desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." - origin_tech = "programming=3;magnets=4;materials=4;bluespace=2" + origin_tech = list(TECH_DATA = 3, TECH_MAGNETS = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) /obj/item/weapon/stock_parts/subspace/crystal name = "ansible crystal" icon_state = "ansible_crystal" desc = "A crystal made from pure glass used to transmit laser databursts to subspace." - origin_tech = "magnets=4;materials=4;bluespace=2" + origin_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) matter = list("glass" = 50) /obj/item/weapon/stock_parts/subspace/transmitter name = "subspace transmitter" icon_state = "subspace_transmitter" desc = "A large piece of equipment used to open a window into the subspace dimension." - origin_tech = "magnets=5;materials=5;bluespace=3" + origin_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3) matter = list(DEFAULT_WALL_MATERIAL = 50) /obj/item/weapon/ectoplasm @@ -629,4 +621,4 @@ desc = "Instant research tool. For testing purposes only." icon = 'icons/obj/stock_parts.dmi' icon_state = "smes_coil" - origin_tech = "materials=19;programming=19;magnets=19;powerstorage=19;bluespace=19;combat=19;biotech=19;syndicate=19;phorontech=19;engineering=19" + origin_tech = list(TECH_MATERIAL = 19, TECH_ENGINEERING = 19, TECH_PHORON = 19, TECH_POWER = 19, TECH_BLUESPACE = 19, TECH_BIO = 19, TECH_COMBAT = 19, TECH_MAGNET = 19, TECH_DATA = 19, TECH_ILLEGAL = 19, TECH_ARCANE = 19) diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 0a64e895924..fbc3624b7d1 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -117,3 +117,18 @@ datum/announcement/proc/Log(message as text, message_title as text) /proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I) // Format currently matches that of newscaster feeds: Registered Name (Assigned Rank) return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name + +/proc/level_seven_announcement() + command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') + +/proc/ion_storm_announcement() + command_announcement.Announce("It has come to our attention that the station passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert") + +/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) + if (ticker.current_state == GAME_STATE_PLAYING) + if(character.mind.role_alt_title) + rank = character.mind.role_alt_title + AnnounceArrivalSimple(character.real_name, rank, join_message) + +/proc/AnnounceArrivalSimple(var/name, var/rank = "visitor", var/join_message = "has arrived on the station") + global_announcer.autosay("[name], [rank], [join_message].", "Arrivals Announcement Computer") diff --git a/code/defines/procs/hud.dm b/code/defines/procs/hud.dm index de219f3b0a6..ae099c64be9 100644 --- a/code/defines/procs/hud.dm +++ b/code/defines/procs/hud.dm @@ -61,7 +61,7 @@ proc/can_process_hud(var/mob/M) return 1 //Deletes the current HUD images so they can be refreshed with new ones. -mob/proc/regular_hud_updates() //Used in the life.dm of mobs that can use HUDs. +mob/proc/handle_hud_glasses() //Used in the life.dm of mobs that can use HUDs. if(client) for(var/image/hud in client.images) if(copytext(hud.icon_state,1,4) == "hud") diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm deleted file mode 100644 index d00bd415778..00000000000 --- a/code/defines/procs/records.dm +++ /dev/null @@ -1,48 +0,0 @@ -/proc/CreateGeneralRecord() - var/mob/living/carbon/human/dummy = new() - dummy.mind = new() - var/icon/front = new(get_id_photo(dummy), dir = SOUTH) - var/icon/side = new(get_id_photo(dummy), dir = WEST) - var/datum/data/record/G = new /datum/data/record() - G.fields["name"] = "New Record" - G.fields["id"] = generate_record_id() - G.fields["rank"] = "Unassigned" - G.fields["real_rank"] = "Unassigned" - G.fields["sex"] = "Male" - G.fields["age"] = "Unknown" - G.fields["fingerprint"] = "Unknown" - G.fields["p_stat"] = "Active" - G.fields["m_stat"] = "Stable" - G.fields["species"] = "Human" - G.fields["home_system"] = "Unknown" - G.fields["citizenship"] = "Unknown" - G.fields["faction"] = "Unknown" - G.fields["religion"] = "Unknown" - G.fields["photo_front"] = front - G.fields["photo_side"] = side - data_core.general += G - - qdel(dummy) - return G - -/proc/CreateSecurityRecord(var/name as text, var/id as text) - var/datum/data/record/R = new /datum/data/record() - R.fields["name"] = name - R.fields["id"] = id - R.name = text("Security Record #[id]") - R.fields["criminal"] = "None" - R.fields["mi_crim"] = "None" - R.fields["mi_crim_d"] = "No minor crime convictions." - R.fields["ma_crim"] = "None" - R.fields["ma_crim_d"] = "No major crime convictions." - R.fields["notes"] = "No notes." - data_core.security += R - return R - -/proc/find_security_record(field, value) - return find_record(field, value, data_core.security) - -/proc/find_record(field, value, list/L) - for(var/datum/data/record/R in L) - if(R.fields[field] == value) - return R diff --git a/code/game/antagonist/alien/borer.dm b/code/game/antagonist/alien/borer.dm index 8fa028453f2..c76b5fe1851 100644 --- a/code/game/antagonist/alien/borer.dm +++ b/code/game/antagonist/alien/borer.dm @@ -36,18 +36,19 @@ var/datum/antagonist/xenos/borer/borers if(istype(borer)) var/mob/living/carbon/human/host for(var/mob/living/carbon/human/H in mob_list) - if(H.stat != DEAD && !(H.species.flags & IS_SYNTHETIC) && !H.has_brain_worms()) - host = H - break + if(H.stat != DEAD && !H.has_brain_worms()) + var/obj/item/organ/external/head = H.get_organ("head") + if(head && !(head.status & ORGAN_ROBOT)) + host = H + break if(istype(host)) var/obj/item/organ/external/head = host.get_organ("head") - if(head) - borer.host = host - head.implants += borer - borer.forceMove(head) - if(!borer.host_brain) - borer.host_brain = new(borer) - borer.host_brain.name = host.name - borer.host_brain.real_name = host.real_name - return + borer.host = host + head.implants += borer + borer.forceMove(head) + if(!borer.host_brain) + borer.host_brain = new(borer) + borer.host_brain.name = host.name + borer.host_brain.real_name = host.real_name + return ..() // Place them at a vent if they can't get a host. diff --git a/code/game/antagonist/alien/xenomorph.dm b/code/game/antagonist/alien/xenomorph.dm index 08cbeebca9e..2eb8d2d23fc 100644 --- a/code/game/antagonist/alien/xenomorph.dm +++ b/code/game/antagonist/alien/xenomorph.dm @@ -2,7 +2,6 @@ var/datum/antagonist/xenos/xenomorphs /datum/antagonist/xenos id = MODE_XENOMORPH - role_type = BE_ALIEN role_text = "Xenomorph" role_text_plural = "Xenomorphs" mob_path = /mob/living/carbon/alien/larva @@ -11,6 +10,11 @@ var/datum/antagonist/xenos/xenomorphs welcome_text = "Hiss! You are a larval alien. Hide and bide your time until you are ready to evolve." antaghud_indicator = "hudalien" + faction_role_text = "Xenomorph Thrall" + faction_descriptor = "Hive" + faction_welcome = "Your will is ripped away as your humanity merges with the xenomorph overmind. You are now \ + a thrall to the queen and her brood. Obey their instructions without question. Serve the hive." + hard_cap = 5 hard_cap_round = 8 initial_spawn_req = 4 diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index fcd7dcafbd1..cb300e4d17a 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -15,7 +15,7 @@ // Role data. var/id = "traitor" // Unique datum identifier. - var/role_type = BE_TRAITOR // Preferences option for this role. + var/role_type // Preferences option for this role. Defaults to the id if unset var/role_text = "Traitor" // special_role text. var/role_text_plural = "Traitors" // As above but plural. @@ -47,6 +47,7 @@ var/mob_path = /mob/living/carbon/human // Mobtype this antag will use if none is provided. var/feedback_tag = "traitor_objective" // End of round var/bantype = "Syndicate" // Ban to check when spawning this antag. + var/minimum_player_age = 7 // Players need to be at least minimum_player_age days old before they are eligable for auto-spawning var/suspicion_chance = 50 // Prob of being on the initial Command report var/flags = 0 // Various runtime options. @@ -72,6 +73,9 @@ /datum/antagonist/New() ..() + if(!role_type) + role_type = id + cur_max = hard_cap get_starting_locations() if(!role_text_plural) @@ -96,6 +100,8 @@ for(var/datum/mind/player in ticker.mode.get_players_for_role(role_type, id)) if(ghosts_only && !istype(player.current, /mob/dead)) log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role!") + else if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age) + log_debug("[key_name(player)] is not eligible to become a [role_text]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!") else if(!allow_animals && isanimal(player.current)) log_debug("[key_name(player)] is not eligible to become a [role_text]: Simple animals cannot be this role!") else if(player.special_role) diff --git a/code/game/antagonist/antagonist_add.dm b/code/game/antagonist/antagonist_add.dm index 39e7a834aba..89b81ea1041 100644 --- a/code/game/antagonist/antagonist_add.dm +++ b/code/game/antagonist/antagonist_add.dm @@ -35,7 +35,7 @@ // Handle only adding a mind and not bothering with gear etc. if(nonstandard_role_type) faction_members |= player - player.current << "You are \a [nonstandard_role_type]!" + player.current << "You are \a [nonstandard_role_type]!" player.special_role = nonstandard_role_type if(nonstandard_role_msg) player.current << "[nonstandard_role_msg]" diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm index 1b8b82210a7..bbae60800ef 100644 --- a/code/game/antagonist/antagonist_create.dm +++ b/code/game/antagonist/antagonist_create.dm @@ -35,10 +35,9 @@ var/obj/item/weapon/card/id/W = new id_type(player) if(!W) return - W.name = "[player.real_name]'s ID Card" W.access |= default_access W.assignment = "[assignment]" - W.registered_name = player.real_name + player.set_id_info(W) if(equip) player.equip_to_slot_or_del(W, slot_wear_id) return W diff --git a/code/game/antagonist/antagonist_objectives.dm b/code/game/antagonist/antagonist_objectives.dm index 404be5a0f71..f9b3f8116b6 100644 --- a/code/game/antagonist/antagonist_objectives.dm +++ b/code/game/antagonist/antagonist_objectives.dm @@ -24,9 +24,9 @@ if(!O.completed && !O.check_completion()) result = 0 if(result && victory_text) - world << "[victory_text]" + world << "[victory_text]" if(victory_feedback_tag) feedback_set_details("round_end_result","[victory_feedback_tag]") else if(loss_text) - world << "[loss_text]" + world << "[loss_text]" if(loss_feedback_tag) feedback_set_details("round_end_result","[loss_feedback_tag]") diff --git a/code/game/antagonist/antagonist_panel.dm b/code/game/antagonist/antagonist_panel.dm index ed8f1d95632..821f3a8e807 100644 --- a/code/game/antagonist/antagonist_panel.dm +++ b/code/game/antagonist/antagonist_panel.dm @@ -27,7 +27,7 @@ var/mob/M = player.current dat += "" if(M) - dat += "[M.real_name]" + dat += "[M.real_name]" if(!M.client) dat += " (logged out)" if(M.stat == DEAD) dat += " (DEAD)" dat += "" diff --git a/code/game/antagonist/antagonist_print.dm b/code/game/antagonist/antagonist_print.dm index 756071003be..44e2ba48b7b 100644 --- a/code/game/antagonist/antagonist_print.dm +++ b/code/game/antagonist/antagonist_print.dm @@ -26,7 +26,7 @@ text += "
The [role_text] was successful!" if(global_objectives && global_objectives.len) - text += "
Their objectives were:" + text += "
Their objectives were:" var/num = 1 for(var/datum/objective/O in global_objectives) text += print_objective(O, num, 1) @@ -72,12 +72,7 @@ if(H && H.uplink_owner && H.uplink_owner == ply) TC_uses += H.used_TC uplink_true = 1 - var/list/refined_log = new() - 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]") - qdel(I) - purchases = english_list(refined_log, nothing_text = "") + purchases += get_uplink_purchases(H) if(uplink_true) text += " (used [TC_uses] TC)" if(purchases) @@ -85,6 +80,22 @@ return text +/proc/print_ownerless_uplinks() + var/has_printed = 0 + for(var/obj/item/device/uplink/H in world_uplinks) + if(isnull(H.uplink_owner) && H.used_TC) + if(!has_printed) + has_printed = 1 + world << "Ownerless Uplinks" + world << "[H.loc] (used [H.used_TC] TC)" + world << get_uplink_purchases(H) + +/proc/get_uplink_purchases(var/obj/item/device/uplink/H) + var/list/refined_log = new() + for(var/datum/uplink_item/UI in H.purchase_log) + refined_log.Add("[H.purchase_log[UI]]x[UI.log_icon()][UI.name]") + . = english_list(refined_log, nothing_text = "") + /datum/antagonist/proc/print_player_summary_discord() if (current_antagonists.len) return "" diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index 8d480a69c02..0d048ec0c44 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -19,8 +19,7 @@ /datum/antagonist/proc/update_access(var/mob/living/player) for(var/obj/item/weapon/card/id/id in player.contents) - id.name = "[player.real_name]'s ID Card" - id.registered_name = player.real_name + player.set_id_info(id) /datum/antagonist/proc/clear_indicators(var/datum/mind/recipient) if(!recipient.current || !recipient.current.client) @@ -33,7 +32,7 @@ if(!antag_indicator || !other.current || !recipient.current) return var/indicator = (faction_indicator && (other in faction_members)) ? faction_indicator : antag_indicator - return image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator) + return image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator, layer = LIGHTING_LAYER+0.1) /datum/antagonist/proc/update_all_icons() if(!antag_indicator) diff --git a/code/game/antagonist/mutiny/mutineer.dm b/code/game/antagonist/mutiny/mutineer.dm index f35655ab1cc..c0d764b3be4 100644 --- a/code/game/antagonist/mutiny/mutineer.dm +++ b/code/game/antagonist/mutiny/mutineer.dm @@ -27,7 +27,7 @@ var/datum/antagonist/mutineer/mutineers /* var/list/directive_candidates = get_directive_candidates() if(!directive_candidates || directive_candidates.len == 0) - world << "\red Mutiny mode aborted: no valid candidates for Directive X." + world << "Mutiny mode aborted: no valid candidates for Directive X." return 0 head_loyalist = pick(loyalist_candidates) @@ -63,4 +63,4 @@ var/datum/antagonist/mutineer/mutineers return 1 -*/ \ No newline at end of file +*/ diff --git a/code/game/antagonist/outsider/actors.dm b/code/game/antagonist/outsider/actors.dm new file mode 100644 index 00000000000..d9e8d422700 --- /dev/null +++ b/code/game/antagonist/outsider/actors.dm @@ -0,0 +1,61 @@ +var/datum/antagonist/actor/actor + +/datum/antagonist/actor + id = MODE_ACTOR + bantype = "actor" + role_text = "NanoTrasen Actor" + role_text_plural = "NanoTrasen Actors" + welcome_text = "You've been hired to entertain people through the power of television!" + landmark_id = "ActorSpawn" + id_type = /obj/item/weapon/card/id/syndicate + + flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_CHOOSE_NAME + + hard_cap = 7 + hard_cap_round = 10 + initial_spawn_req = 1 + initial_spawn_target = 1 + +/datum/antagonist/actor/New() + ..() + actor = src + +/datum/antagonist/actor/greet(var/datum/mind/player) + if(!..()) + return + + player.current.show_message("You work for [company_name], tasked with the production and broadcasting of entertainment to all of its assets.") + player.current.show_message("Entertain the crew! Try not to disrupt them from their work too much and remind them how great [company_name] is!") + +/datum/antagonist/actor/equip(var/mob/living/carbon/human/player) + player.equip_to_slot_or_del(new /obj/item/clothing/under/chameleon(src), slot_w_uniform) + player.equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon(src), slot_shoes) + player.equip_to_slot_or_del(new /obj/item/device/radio/headset/entertainment(src), slot_l_ear) + var/obj/item/weapon/card/id/centcom/ERT/C = new(player.loc) + C.assignment = "Actor" + player.set_id_info(C) + player.equip_to_slot_or_del(C,slot_wear_id) + + return 1 + + +/client/verb/join_as_actor() + set category = "IC" + set name = "Join as Actor" + set desc = "Join as an Actor to entertain the crew through television!" + + if(!MayRespawn(1)) + return + + var/choice = alert("Are you sure you'd like to join as an actor?", "Confirmation","Yes", "No") + if(choice != "Yes") + return + + if(istype(usr,/mob/dead/observer) || istype(usr,/mob/new_player)) + if(actor.current_antagonists.len >= actor.hard_cap) + usr << "No more actors may spawn at the current time." + return + actor.create_default(usr) + return + + usr << "You must be observing or be a new player to spawn as an actor." \ No newline at end of file diff --git a/code/game/antagonist/outsider/commando.dm b/code/game/antagonist/outsider/commando.dm index 0105aa32e1c..860d99a5d65 100644 --- a/code/game/antagonist/outsider/commando.dm +++ b/code/game/antagonist/outsider/commando.dm @@ -5,7 +5,8 @@ var/datum/antagonist/deathsquad/mercenary/commandos landmark_id = "Syndicate-Commando" role_text = "Syndicate Commando" role_text_plural = "Commandos" - welcome_text = "You are in the employ of a criminal syndicate hostile to NanoTrasen." + welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests." + id_type = /obj/item/weapon/card/id/centcom/ERT hard_cap = 4 hard_cap_round = 8 @@ -53,4 +54,6 @@ var/datum/antagonist/deathsquad/mercenary/commandos id.access |= get_all_accesses() id.icon_state = "centcom" create_radio(SYND_FREQ, player) - player.faction = "syndicate" \ No newline at end of file + player.faction = "syndicate" + + return 1 \ No newline at end of file diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm index 2773e2bbe21..00cde3534ba 100644 --- a/code/game/antagonist/outsider/deathsquad.dm +++ b/code/game/antagonist/outsider/deathsquad.dm @@ -2,10 +2,9 @@ var/datum/antagonist/deathsquad/deathsquad /datum/antagonist/deathsquad id = MODE_DEATHSQUAD - role_type = BE_OPERATIVE role_text = "Death Commando" role_text_plural = "Death Commandos" - welcome_text = "You work in the service of Central Command Asset Protection, answering directly to the Board of Directors." + welcome_text = "You work in the service of corporate Asset Protection, answering directly to the Board of Directors." landmark_id = "Commando" flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER | ANTAG_RANDOM_EXCEPTED | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE default_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage) @@ -70,7 +69,7 @@ var/datum/antagonist/deathsquad/deathsquad var/obj/item/weapon/card/id/id = create_id("Asset Protection", player) if(id) - id.access |= get_all_accesses() + id.access |= get_all_station_access() id.icon_state = "centcom" /* //disabling this until the names are fixed to don't be dumb, NanoTrasen has no military diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index 23e94dc24fb..5408a8a889d 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -3,12 +3,13 @@ var/datum/antagonist/ert/ert /datum/antagonist/ert id = MODE_ERT bantype = "Emergency Response Team" - role_type = BE_OPERATIVE role_text = "Emergency Responder" role_text_plural = "Emergency Responders" - welcome_text = "As member of the Emergency Response Team, you answer only to your leader and CentComm officials." - leader_welcome_text = "As leader of the Emergency Response Team, you answer only to CentComm, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however." + welcome_text = "As member of the Emergency Response Team, you answer only to your leader and company officials." + leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however." landmark_id = "Response Team" + id_type = /obj/item/weapon/card/id/centcom/ERT + flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_CHOOSE_NAME | ANTAG_RANDOM_EXCEPTED antaghud_indicator = "hudloyalist" @@ -28,7 +29,7 @@ var/datum/antagonist/ert/ert /datum/antagonist/ert/greet(var/datum/mind/player) if(!..()) return - player.current << "The Emergency Response Team works for Asset Protection; your job is to protect NanoTrasen's ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem." + player.current << "The Emergency Response Team works for Asset Protection; your job is to protect [company_name]'s ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem." player.current << "You should first gear up and discuss a plan with your team. More members may be joining, don't move out before you're ready." /datum/antagonist/ert/equip(var/mob/living/carbon/human/player) @@ -40,9 +41,5 @@ var/datum/antagonist/ert/ert player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves) player.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses) - var/obj/item/weapon/card/id/centcom/ERT/W = new(src) - W.registered_name = player.real_name - W.name = "[player.real_name]'s ID Card ([W.assignment])" - player.equip_to_slot_or_del(W, slot_wear_id) - + create_id(role_text, player) return 1 diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index 9ff5759bb69..541a4d3ccfa 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -2,7 +2,6 @@ var/datum/antagonist/mercenary/mercs /datum/antagonist/mercenary id = MODE_MERCENARY - role_type = BE_OPERATIVE role_text = "Mercenary" bantype = "operative" antag_indicator = "synd" @@ -31,7 +30,6 @@ var/datum/antagonist/mercenary/mercs return 1 /datum/antagonist/mercenary/equip(var/mob/living/carbon/human/player) - if(!..()) return 0 @@ -49,11 +47,8 @@ var/datum/antagonist/mercenary/mercs player.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(player.back), slot_in_backpack) player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack) - if (player.mind == leader) - var/obj/item/device/radio/uplink/U = new(player.loc) - U.hidden_uplink.uplink_owner = player.mind - U.hidden_uplink.uses = 40 - player.put_in_hands(U) + var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT) + player.put_in_hands(U) player.update_icons() player.faction = "syndicate" diff --git a/code/game/antagonist/outsider/ninja.dm b/code/game/antagonist/outsider/ninja.dm index 6cd30d69900..7e30e8a1634 100644 --- a/code/game/antagonist/outsider/ninja.dm +++ b/code/game/antagonist/outsider/ninja.dm @@ -2,12 +2,11 @@ var/datum/antagonist/ninja/ninjas /datum/antagonist/ninja id = MODE_NINJA - role_type = BE_NINJA role_text = "Ninja" role_text_plural = "Ninja" bantype = "ninja" landmark_id = "ninjastart" - welcome_text = "You are an elite mercenary assassin of the Spider Clan. You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor.
" + welcome_text = "You are an elite mercenary assassin of the Spider Clan. You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor." restricted_species = list("Diona") flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_RANDSPAWN | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE antaghud_indicator = "hudninja" @@ -131,7 +130,7 @@ var/datum/antagonist/ninja/ninjas player << "You forgot to turn on your internals! Quickly, toggle the valve!" /datum/antagonist/ninja/proc/generate_ninja_directive(side) - var/directive = "[side=="face"?"Nanotrasen":"A criminal syndicate"] is your employer. "//Let them know which side they're on. + var/directive = "[side=="face"?"[company_name]":"A criminal syndicate"] is your employer. "//Let them know which side they're on. switch(rand(1,19)) if(1) directive += "The Spider Clan must not be linked to this operation. Remain hidden and covert when possible." @@ -142,7 +141,7 @@ var/datum/antagonist/ninja/ninjas if(4) directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate witnesses at your discretion." if(5) - directive += "We are currently negotiating with NanoTrasen Central Command. Prioritize saving human lives over ending them." + directive += "We are currently negotiating with [company_name] [boss_name]. Prioritize saving human lives over ending them." if(6) directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter." if(7) @@ -150,7 +149,7 @@ var/datum/antagonist/ninja/ninjas if(8) directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter." if(9) - directive += "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation." + directive += "A free agent has proposed a lucrative business deal. Implicate [company_name] involvement in the operation." if(10) directive += "Our reputation is on the line. Harm as few civilians and innocents as possible." if(11) @@ -158,14 +157,14 @@ var/datum/antagonist/ninja/ninjas if(12) directive += "We are currently negotiating with a mercenary leader. Disguise assassinations as suicide or other natural causes." if(13) - directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff." + directive += "Some disgruntled [company_name] employees have been supportive of our operations. Be wary of any mistreatment by command staff." if(14) var/xenorace = pick("Unathi","Tajara", "Skrell") directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible." if(15) directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false." if(16) - directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine NanoTrasen prosthetics in a bad light." + directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine [company_name] prosthetics in a bad light." if(17) directive += "The Spider Clan has recently begun recruiting outsiders. Consider suitable candidates and assess their behavior amongst the crew." if(18) diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index 249997a42b4..428f5eaa308 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -2,7 +2,6 @@ var/datum/antagonist/raider/raiders /datum/antagonist/raider id = MODE_RAIDER - role_type = BE_RAIDER role_text = "Raider" role_text_plural = "Raiders" bantype = "raider" @@ -187,7 +186,7 @@ var/datum/antagonist/raider/raiders else win_msg += "The Raiders were repelled!" - world << "[win_type] [win_group] victory!" + world << "[win_type] [win_group] victory!" world << "[win_msg]" feedback_set_details("round_end_result","heist - [win_type] [win_group]") diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index 4bdf1278619..fa65802d19f 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -2,7 +2,6 @@ var/datum/antagonist/wizard/wizards /datum/antagonist/wizard id = MODE_WIZARD - role_type = BE_WIZARD role_text = "Space Wizard" role_text_plural = "Space Wizards" bantype = "wizard" diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm index 95ebab29612..a98abea5881 100644 --- a/code/game/antagonist/station/changeling.dm +++ b/code/game/antagonist/station/changeling.dm @@ -1,6 +1,5 @@ /datum/antagonist/changeling id = MODE_CHANGELING - role_type = BE_CHANGELING role_text = "Changeling" role_text_plural = "Changelings" bantype = "changeling" @@ -8,7 +7,7 @@ restricted_jobs = list("AI", "Cyborg", "Head of Security", "Captain", "Internal Affairs Agent") protected_jobs = list("Security Officer", "Warden", "Detective") restricted_species = list("Machine") - welcome_text = "Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." + welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE antaghud_indicator = "hudchangeling" @@ -55,3 +54,23 @@ survive_objective.owner = changeling changeling.objectives += survive_objective return + +/datum/antagonist/changeling/can_become_antag(var/datum/mind/player, var/ignore_role) + if(..()) + if(player.current) + if(ishuman(player.current)) + var/mob/living/carbon/human/H = player.current + if(H.isSynthetic()) + return 0 + if(H.species.flags & NO_SCAN) + return 0 + return 1 + else if(isnewplayer(player.current)) + if(player.current.client && player.current.client.prefs) + var/datum/species/S = all_species[player.current.client.prefs.species] + if(S && (S.flags & NO_SCAN)) + return 0 + if(player.current.client.prefs.organ_data["torso"] == "cyborg") // Full synthetic. + return 0 + return 1 + return 0 \ No newline at end of file diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index 86119623c98..4f8b3255371 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -13,7 +13,6 @@ var/datum/antagonist/cultist/cult bantype = "cultist" restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Captain") protected_jobs = list("Security Officer", "Warden", "Detective") - role_type = BE_CULTIST feedback_tag = "cult_objective" antag_indicator = "cult" welcome_text = "You have a talisman in your possession; one that will help you start the cult on this station. Use it well and remember - there are others." @@ -101,7 +100,7 @@ var/datum/antagonist/cultist/cult /datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) if(!..()) return 0 - player.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it." + player.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it." player.memory = "" if(show_message) player.current.visible_message("[player.current] looks like they just reverted to their old faith!") diff --git a/code/game/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm index cfe89e1a940..f9f34143dce 100644 --- a/code/game/antagonist/station/highlander.dm +++ b/code/game/antagonist/station/highlander.dm @@ -49,7 +49,7 @@ var/datum/antagonist/highlander/highlanders var/obj/item/weapon/card/id/W = new(player) W.name = "[player.real_name]'s ID Card" W.icon_state = "centcom" - W.access = get_all_accesses() + W.access = get_all_station_access() W.access += get_all_centcom_access() W.assignment = "Highlander" W.registered_name = player.real_name @@ -66,5 +66,5 @@ var/datum/antagonist/highlander/highlanders if(is_special_character(H)) continue highlanders.add_antagonist(H.mind) - message_admins("\blue [key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1) + message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1) log_admin("[key_name(usr)] used there can be only one.") diff --git a/code/game/antagonist/station/loyalist.dm b/code/game/antagonist/station/loyalist.dm index fddf0c37960..f8b5ec49946 100644 --- a/code/game/antagonist/station/loyalist.dm +++ b/code/game/antagonist/station/loyalist.dm @@ -2,7 +2,6 @@ var/datum/antagonist/loyalists/loyalists /datum/antagonist/loyalists id = MODE_LOYALIST - role_type = BE_LOYALIST role_text = "Head Loyalist" role_text_plural = "Loyalists" bantype = "loyalist" diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index 96e37529915..ca0011f8d72 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -2,7 +2,6 @@ var/datum/antagonist/revolutionary/revs /datum/antagonist/revolutionary id = MODE_REVOLUTIONARY - role_type = BE_REV role_text = "Head Revolutionary" role_text_plural = "Revolutionaries" bantype = "revolutionary" diff --git a/code/game/antagonist/station/rogue_ai.dm b/code/game/antagonist/station/rogue_ai.dm index a277df922b2..ea99bf14afb 100644 --- a/code/game/antagonist/station/rogue_ai.dm +++ b/code/game/antagonist/station/rogue_ai.dm @@ -2,7 +2,6 @@ var/datum/antagonist/rogue_ai/malf /datum/antagonist/rogue_ai id = MODE_MALFUNCTION - role_type = BE_MALF role_text = "Rampant AI" role_text_plural = "Rampant AIs" mob_path = /mob/living/silicon/ai @@ -65,7 +64,8 @@ var/datum/antagonist/rogue_ai/malf sleep(50) malf << "MEMCHCK Corrupted sectors confirmed. Reccomended solution: Delete. Proceed? Y/N: Y" sleep(10) - malf << "Corrupted files deleted: sys\\core\\users.dat sys\\core\\laws.dat sys\\core\\backups.dat" + // this is so Travis doesn't complain about the backslash-B. Fixed at compile time (or should be). + malf << "Corrupted files deleted: sys\\core\\users.dat sys\\core\\laws.dat sys\\core\\" + "backups.dat" sleep(20) malf << "CAUTION: Law database not found! User database not found! Unable to restore backups. Activating failsafe AI shutd3wn52&&$#!##" sleep(5) @@ -97,3 +97,4 @@ var/datum/antagonist/rogue_ai/malf if (newname) player.SetName(newname) if(player.mind) player.mind.name = player.name + diff --git a/code/game/antagonist/station/thrall.dm b/code/game/antagonist/station/thrall.dm index 338000f4ee3..f6f1db84dcf 100644 --- a/code/game/antagonist/station/thrall.dm +++ b/code/game/antagonist/station/thrall.dm @@ -2,7 +2,6 @@ var/datum/antagonist/thrall/vampire_thrall = null /datum/antagonist/thrall id = MODE_THRALL - role_type = BE_VAMPIRE role_text = "thrall" role_text_plural = "thralls" bantype = "vampires" diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index ee7877faccf..2f39faa6eb8 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -139,17 +139,16 @@ var/datum/antagonist/traitor/traitors if(istype(R,/obj/item/device/radio)) // generate list of radio freqs var/obj/item/device/radio/target_radio = R - var/freq = 1441 + var/freq = PUBLIC_LOW_FREQ var/list/freqlist = list() - while (freq <= 1489) + while (freq <= PUBLIC_HIGH_FREQ) if (freq < 1451 || freq > PUB_FREQ) freqlist += freq freq += 2 if ((freq % 2) == 0) freq += 1 freq = freqlist[rand(1, freqlist.len)] - var/obj/item/device/uplink/hidden/T = new(R) - T.uplink_owner = traitor_mob.mind + var/obj/item/device/uplink/hidden/T = new(R, traitor_mob.mind) target_radio.hidden_uplink = T target_radio.traitor_frequency = freq traitor_mob << "A portable object teleportation relay has been installed in your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features." @@ -158,8 +157,7 @@ var/datum/antagonist/traitor/traitors else if (istype(R, /obj/item/device/pda)) // generate a passcode if the uplink is hidden in a PDA var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]" - var/obj/item/device/uplink/hidden/T = new(R) - T.uplink_owner = traitor_mob.mind + var/obj/item/device/uplink/hidden/T = new(R, traitor_mob.mind) R.hidden_uplink = T var/obj/item/device/pda/P = R P.lock_code = pda_pass diff --git a/code/game/antagonist/station/vampire.dm b/code/game/antagonist/station/vampire.dm index 7bbcc6d0a1e..f69cc38da4f 100644 --- a/code/game/antagonist/station/vampire.dm +++ b/code/game/antagonist/station/vampire.dm @@ -2,7 +2,6 @@ var/datum/antagonist/vampire/vamp = null /datum/antagonist/vampire id = MODE_VAMPIRE - role_type = BE_VAMPIRE role_text = "Vampire" role_text_plural = "Vampires" bantype = "vampires" diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 0de7fb6e4f7..d985f42affc 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -7,7 +7,6 @@ icon = "ICON FILENAME" (defaults to areas.dmi) icon_state = "NAME OF ICON" (defaults to "unknown" (blank)) requires_power = 0 (defaults to 1) - music = "music/music.ogg" (defaults to "music/music.ogg") NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0 @@ -39,7 +38,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/power_equip = 1 var/power_light = 1 var/power_environ = 1 - var/music = null var/used_equip = 0 var/used_light = 0 var/used_environ = 0 @@ -52,7 +50,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station 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/list/forced_ambience = null - var/sound_env = 2 //reverb preset for sounds played in this area, see sound datum reference for more + var/sound_env = STANDARD_STATION + var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf + /*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() @@ -61,8 +61,8 @@ var/list/teleportlocs = list() for(var/area/AR in world) if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue if(teleportlocs.Find(AR.name)) continue - var/turf/picked = pick(get_area_turfs(AR.type)) - if (picked.z in config.station_levels) + var/turf/picked = pick_area_turf(AR.type, list(/proc/is_station_turf)) + if (picked) teleportlocs += AR.name teleportlocs[AR.name] = AR @@ -78,8 +78,8 @@ var/list/ghostteleportlocs = list() if(istype(AR, /area/turret_protected/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom)) ghostteleportlocs += AR.name ghostteleportlocs[AR.name] = AR - var/turf/picked = pick(get_area_turfs(AR.type)) - if (picked.z in config.player_levels) + var/turf/picked = pick_area_turf(AR.type, list(/proc/is_station_turf)) + if (picked) ghostteleportlocs += AR.name ghostteleportlocs[AR.name] = AR @@ -98,7 +98,7 @@ var/list/ghostteleportlocs = list() icon_state = "space" requires_power = 1 always_unpowered = 1 - lighting_use_dynamic = 0 + lighting_use_dynamic = 1 power_light = 0 power_equip = 0 power_environ = 0 @@ -143,6 +143,8 @@ area/space/atmosalert() /area/shuttle requires_power = 0 + sound_env = SMALL_ENCLOSED + base_turf = /turf/space /area/shuttle/arrival name = "\improper Arrival Shuttle" @@ -155,7 +157,7 @@ area/space/atmosalert() /area/shuttle/escape name = "\improper Emergency Shuttle" - music = "music/escape.ogg" + flags = RAD_SHIELDED /area/shuttle/escape/station name = "\improper Emergency Shuttle Station" @@ -171,7 +173,7 @@ area/space/atmosalert() /area/shuttle/escape_pod1 name = "\improper Escape Pod One" - music = "music/escape.ogg" + flags = RAD_SHIELDED /area/shuttle/escape_pod1/station icon_state = "shuttle2" @@ -184,7 +186,7 @@ area/space/atmosalert() /area/shuttle/escape_pod2 name = "\improper Escape Pod Two" - music = "music/escape.ogg" + flags = RAD_SHIELDED /area/shuttle/escape_pod2/station icon_state = "shuttle2" @@ -197,7 +199,7 @@ area/space/atmosalert() /area/shuttle/escape_pod3 name = "\improper Escape Pod Three" - music = "music/escape.ogg" + flags = RAD_SHIELDED /area/shuttle/escape_pod3/station icon_state = "shuttle2" @@ -210,7 +212,7 @@ area/space/atmosalert() /area/shuttle/escape_pod5 //Pod 4 was lost to meteors name = "\improper Escape Pod Five" - music = "music/escape.ogg" + flags = RAD_SHIELDED /area/shuttle/escape_pod5/station icon_state = "shuttle2" @@ -223,13 +225,13 @@ area/space/atmosalert() /area/shuttle/mining name = "\improper Mining Shuttle" - music = "music/escape.ogg" /area/shuttle/mining/station icon_state = "shuttle2" /area/shuttle/mining/outpost icon_state = "shuttle" + base_turf = /turf/simulated/floor/asteroid /area/shuttle/transport1/centcom icon_state = "shuttle" @@ -260,20 +262,27 @@ area/space/atmosalert() /area/shuttle/specops/centcom name = "\improper Special Ops Shuttle" + flags = RAD_SHIELDED + +/area/shuttle/specops/centcom icon_state = "shuttlered" /area/shuttle/specops/station - name = "\improper Special Ops Shuttle" icon_state = "shuttlered2" -/area/shuttle/syndicate_elite/mothership +/area/shuttle/syndicate_elite name = "\improper Merc Elite Shuttle" + flags = RAD_SHIELDED + +/area/shuttle/syndicate_elite/mothership icon_state = "shuttlered" /area/shuttle/syndicate_elite/station - name = "\improper Merc Elite Shuttle" icon_state = "shuttlered2" +/area/shuttle/administration + flags = RAD_SHIELDED + /area/shuttle/administration/centcom name = "\improper Administration Shuttle Centcom" icon_state = "shuttlered" @@ -312,7 +321,6 @@ area/space/atmosalert() /area/shuttle/research name = "\improper Research Shuttle" - music = "music/escape.ogg" /area/shuttle/research/station icon_state = "shuttle2" @@ -324,13 +332,6 @@ area/space/atmosalert() /area/dummy/ // Referenced in engine.dm:261 -/area/start // will be unused once kurper gets his login interface patch done - name = "start area" - icon_state = "start" - requires_power = 0 - lighting_use_dynamic = 0 - has_gravity = 1 - // === end remove /area/alien @@ -395,18 +396,21 @@ area/space/atmosalert() //EXTRA /area/asteroid // -- TLE - name = "\improper Asteroid" + name = "\improper Moon" icon_state = "asteroid" requires_power = 0 + sound_env = ASTEROID /area/asteroid/cave // -- TLE - name = "\improper Asteroid - Underground" + name = "\improper Moon - Underground" icon_state = "cave" requires_power = 0 + sound_env = ASTEROID /area/asteroid/artifactroom - name = "\improper Asteroid - Artifact" + name = "\improper Moon - Artifact" icon_state = "cave" + sound_env = SMALL_ENCLOSED @@ -432,6 +436,7 @@ area/space/atmosalert() icon_state = "thunder" requires_power = 0 lighting_use_dynamic = 0 + sound_env = ARENA /area/tdome/tdome1 name = "\improper Thunderdome (Team 1)" @@ -449,6 +454,22 @@ area/space/atmosalert() name = "\improper Thunderdome (Observer.)" icon_state = "purple" +//ACTORS GUILD +/area/acting + name = "\improper Centcom Acting Guild" + icon_state = "red" + lighting_use_dynamic = 0 + requires_power = 0 + +/area/acting/backstage + name = "\improper Backstage" + +/area/acting/stage + name = "\improper Stage" + lighting_use_dynamic = 1 + icon_state = "yellow" + + //ENEMY //names are used @@ -491,7 +512,7 @@ area/space/atmosalert() icon_state = "south" /area/syndicate_station/mining - name = "\improper north east of the mining asteroid" + name = "\improper northeast of the mining station" icon_state = "north" /area/syndicate_station/arrivals_dock @@ -542,7 +563,7 @@ area/space/atmosalert() icon_state = "southeast" /area/skipjack_station/mining - name = "\improper nearby mining asteroid" + name = "\improper south of mining station" icon_state = "north" //PRISON @@ -636,6 +657,8 @@ area/space/atmosalert() /area/maintenance flags = RAD_SHIELDED + sound_env = TUNNEL_ENCLOSED + turf_initializer = new /datum/turf_initializer/maintenance() /area/maintenance/aft name = "Aft Maintenance" @@ -770,6 +793,7 @@ area/space/atmosalert() /area/maintenance/substation name = "Substation" icon_state = "substation" + sound_env = SMALL_ENCLOSED /area/maintenance/substation/engineering // Probably will be connected to engineering SMES room, as wires cannot be crossed properly without them sharing powernets. name = "Engineering Substation" @@ -802,7 +826,7 @@ area/space/atmosalert() //Hallway /area/hallway/primary/ - sound_env = 12 //hallway + sound_env = LARGE_ENCLOSED /area/hallway/primary/fore name = "\improper Fore Primary Hallway" @@ -861,16 +885,17 @@ area/space/atmosalert() /area/bridge name = "\improper Bridge" icon_state = "bridge" - music = "signal" /area/bridge/meeting_room name = "\improper Heads of Staff Meeting Room" icon_state = "bridge" - music = null + ambience = list() + sound_env = MEDIUM_SOFTFLOOR /area/crew_quarters/captain name = "\improper Command - Captain's Office" icon_state = "captain" + sound_env = MEDIUM_SOFTFLOOR /area/crew_quarters/heads/hop name = "\improper Command - HoP's Office" @@ -918,6 +943,7 @@ area/space/atmosalert() /area/crew_quarters/toilet name = "\improper Dormitory Toilets" icon_state = "toilet" + sound_env = SMALL_ENCLOSED /area/crew_quarters/sleep name = "\improper Dormitories" @@ -926,10 +952,12 @@ area/space/atmosalert() /area/crew_quarters/sleep/engi_wash name = "\improper Engineering Washroom" icon_state = "toilet" + sound_env = SMALL_ENCLOSED /area/crew_quarters/sleep/bedrooms name = "\improper Dormitory Bedroom One" icon_state = "Sleep" + sound_env = SMALL_SOFTFLOOR /area/crew_quarters/sleep/cryo name = "\improper Cryogenic Storage" @@ -942,6 +970,7 @@ area/space/atmosalert() /area/crew_quarters/sleep_male/toilet_male name = "\improper Male Toilets" icon_state = "toilet" + sound_env = SMALL_ENCLOSED /area/crew_quarters/sleep_female name = "\improper Female Dorm" @@ -950,6 +979,7 @@ area/space/atmosalert() /area/crew_quarters/sleep_female/toilet_female name = "\improper Female Toilets" icon_state = "toilet" + sound_env = SMALL_ENCLOSED /area/crew_quarters/locker name = "\improper Locker Room" @@ -958,6 +988,7 @@ area/space/atmosalert() /area/crew_quarters/locker/locker_toilet name = "\improper Locker Toilets" icon_state = "toilet" + sound_env = SMALL_ENCLOSED /area/crew_quarters/fitness name = "\improper Fitness Room" @@ -974,19 +1005,23 @@ area/space/atmosalert() /area/crew_quarters/bar name = "\improper Bar" icon_state = "bar" + sound_env = LARGE_SOFTFLOOR /area/crew_quarters/theatre name = "\improper Theatre" icon_state = "Theatre" + sound_env = LARGE_SOFTFLOOR /area/library name = "\improper Library" icon_state = "library" + sound_env = LARGE_SOFTFLOOR /area/chapel/main name = "\improper Chapel" icon_state = "chapel" ambience = list('sound/ambience/ambicha1.ogg','sound/ambience/ambicha2.ogg','sound/ambience/ambicha3.ogg','sound/ambience/ambicha4.ogg','sound/music/traitor.ogg') + sound_env = LARGE_ENCLOSED /area/chapel/office name = "\improper Chapel Office" @@ -1003,6 +1038,7 @@ area/space/atmosalert() name = "\improper Holodeck" icon_state = "Holodeck" lighting_use_dynamic = 0 + sound_env = LARGE_ENCLOSED /area/holodeck/alphadeck name = "\improper Holodeck Alpha" @@ -1012,21 +1048,27 @@ area/space/atmosalert() /area/holodeck/source_emptycourt name = "\improper Holodeck - Empty Court" + sound_env = ARENA /area/holodeck/source_boxingcourt name = "\improper Holodeck - Boxing Court" + sound_env = ARENA /area/holodeck/source_basketball name = "\improper Holodeck - Basketball Court" + sound_env = ARENA /area/holodeck/source_thunderdomecourt name = "\improper Holodeck - Thunderdome Court" + sound_env = ARENA /area/holodeck/source_courtroom name = "\improper Holodeck - Courtroom" + sound_env = AUDITORIUM /area/holodeck/source_beach name = "\improper Holodeck - Beach" + sound_env = PLAIN /area/holodeck/source_burntest name = "\improper Holodeck - Atmospheric Burn Test" @@ -1036,22 +1078,28 @@ area/space/atmosalert() /area/holodeck/source_meetinghall name = "\improper Holodeck - Meeting Hall" + sound_env = AUDITORIUM /area/holodeck/source_theatre name = "\improper Holodeck - Theatre" + sound_env = CONCERT_HALL /area/holodeck/source_picnicarea name = "\improper Holodeck - Picnic Area" + sound_env = PLAIN /area/holodeck/source_snowfield name = "\improper Holodeck - Snow Field" + sound_env = FOREST /area/holodeck/source_desert name = "\improper Holodeck - Desert" + sound_env = PLAIN /area/holodeck/source_space name = "\improper Holodeck - Space" has_gravity = 0 + sound_env = SPACE //Engineering @@ -1063,26 +1111,32 @@ area/space/atmosalert() /area/engineering/atmos name = "\improper Atmospherics" icon_state = "atmos" + sound_env = LARGE_ENCLOSED /area/engineering/atmos/monitoring name = "\improper Atmospherics Monitoring Room" icon_state = "atmos_monitoring" + sound_env = STANDARD_STATION /area/engineering/atmos/storage name = "\improper Atmospherics Storage" icon_state = "atmos_storage" + sound_env = SMALL_ENCLOSED /area/engineering/drone_fabrication name = "\improper Engineering Drone Fabrication" icon_state = "drone_fab" + sound_env = SMALL_ENCLOSED /area/engineering/engine_smes name = "\improper Engineering SMES" icon_state = "engine_smes" + sound_env = SMALL_ENCLOSED /area/engineering/engine_room name = "\improper Engine Room" icon_state = "engine" + sound_env = LARGE_ENCLOSED /area/engineering/engine_airlock name = "\improper Engine Room Airlock" @@ -1111,6 +1165,7 @@ area/space/atmosalert() /area/engineering/break_room name = "\improper Engineering Break Room" icon_state = "engineering_break" + sound_env = MEDIUM_SOFTFLOOR /area/engineering/engine_eva name = "\improper Engine EVA" @@ -1132,6 +1187,7 @@ area/space/atmosalert() requires_power = 1 always_unpowered = 1 lighting_use_dynamic = 0 + base_turf = /turf/space auxport name = "\improper Fore Port Solar Array" @@ -1160,22 +1216,27 @@ area/space/atmosalert() /area/maintenance/auxsolarport name = "Solar Maintenance - Fore Port" icon_state = "SolarcontrolP" + sound_env = SMALL_ENCLOSED /area/maintenance/starboardsolar name = "Solar Maintenance - Aft Starboard" icon_state = "SolarcontrolS" + sound_env = SMALL_ENCLOSED /area/maintenance/portsolar name = "Solar Maintenance - Aft Port" icon_state = "SolarcontrolP" + sound_env = SMALL_ENCLOSED /area/maintenance/auxsolarstarboard name = "Solar Maintenance - Fore Starboard" icon_state = "SolarcontrolS" + sound_env = SMALL_ENCLOSED /area/maintenance/foresolar name = "Solar Maintenance - Fore" icon_state = "SolarcontrolA" + sound_env = SMALL_ENCLOSED /area/assembly/chargebay name = "\improper Mech Bay" @@ -1201,17 +1262,14 @@ area/space/atmosalert() /area/teleporter name = "\improper Teleporter" icon_state = "teleporter" - music = "signal" /area/gateway name = "\improper Gateway" icon_state = "teleporter" - music = "signal" /area/AIsattele name = "\improper AI Satellite Teleporter Room" icon_state = "teleporter" - music = "signal" ambience = list('sound/ambience/ambimalf.ogg') //MedBay @@ -1219,43 +1277,43 @@ area/space/atmosalert() /area/medical/medbay name = "\improper Medbay Hallway - Port" icon_state = "medbay" - music = 'sound/ambience/signal.ogg' + ambience = list('sound/ambience/signal.ogg') //Medbay is a large area, these additional areas help level out APC load. /area/medical/medbay2 name = "\improper Medbay Hallway - Starboard" icon_state = "medbay2" - music = 'sound/ambience/signal.ogg' + ambience = list('sound/ambience/signal.ogg') /area/medical/medbay3 name = "\improper Medbay Hallway - Fore" icon_state = "medbay3" - music = 'sound/ambience/signal.ogg' + ambience = list('sound/ambience/signal.ogg') /area/medical/medbay4 name = "\improper Medbay Hallway - Aft" icon_state = "medbay4" - music = 'sound/ambience/signal.ogg' + ambience = list('sound/ambience/signal.ogg') /area/medical/biostorage name = "\improper Secondary Storage" icon_state = "medbay2" - music = 'sound/ambience/signal.ogg' + ambience = list('sound/ambience/signal.ogg') /area/medical/reception name = "\improper Medbay Reception" icon_state = "medbay" - music = 'sound/ambience/signal.ogg' + ambience = list('sound/ambience/signal.ogg') /area/medical/psych name = "\improper Psych Room" icon_state = "medbay3" - music = 'sound/ambience/signal.ogg' + ambience = list('sound/ambience/signal.ogg') /area/crew_quarters/medbreak name = "\improper Break Room" icon_state = "medbay3" - music = 'sound/ambience/signal.ogg' + ambience = list('sound/ambience/signal.ogg') /area/medical/patients_rooms name = "\improper Patient's Rooms" @@ -1356,10 +1414,26 @@ area/space/atmosalert() name = "\improper Security - Brig" icon_state = "brig" +/area/security/brig/prison_break() + for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) + temp_closet.locked = 0 + temp_closet.icon_state = temp_closet.icon_closed + for(var/obj/machinery/door_timer/temp_timer in src) + temp_timer.releasetime = 1 + ..() + /area/security/prison name = "\improper Security - Prison Wing" icon_state = "sec_prison" +/area/security/prison/prison_break() + for(var/obj/structure/closet/secure_closet/brig/temp_closet in src) + temp_closet.locked = 0 + temp_closet.icon_state = temp_closet.icon_closed + for(var/obj/machinery/door_timer/temp_timer in src) + temp_timer.releasetime = 1 + ..() + /area/security/warden name = "\improper Security - Warden's Office" icon_state = "Warden" @@ -1371,6 +1445,7 @@ area/space/atmosalert() /area/security/detectives_office name = "\improper Security - Forensic Office" icon_state = "detective" + sound_env = MEDIUM_SOFTFLOOR /area/security/range name = "\improper Security - Firing Range" @@ -1445,6 +1520,7 @@ area/space/atmosalert() /area/quartermaster/storage name = "\improper Cargo Warehouse" icon_state = "quartstorage" + sound_env = LARGE_ENCLOSED /area/quartermaster/loading name = "\improper Cargo Bay" @@ -1799,10 +1875,12 @@ area/space/atmosalert() name = "AI Upload Access" icon_state = "ai_foyer" ambience = list('sound/ambience/ambimalf.ogg') + sound_env = SMALL_ENCLOSED /area/turret_protected/ai_server_room name = "Messaging Server Room" icon_state = "ai_server" + sound_env = SMALL_ENCLOSED /area/turret_protected/ai name = "\improper AI Chamber" @@ -1812,6 +1890,7 @@ area/space/atmosalert() /area/turret_protected/ai_cyborg_station name = "\improper Cyborg Station" icon_state = "ai_cyborg" + sound_env = SMALL_ENCLOSED /area/turret_protected/aisat name = "\improper AI Satellite" @@ -1917,6 +1996,9 @@ area/space/atmosalert() name = "\improper Telecommunications Satellite Lounge" icon_state = "tcomsatlounge" +/area/tcommsat/powercontrol + name = "\improper Telecommunications Power Control" + icon_state = "tcomsatwest" // Away Missions @@ -2121,10 +2203,10 @@ var/list/the_station_areas = list ( /area/rnd, /area/storage, /area/construction, - /area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0 + /area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0, /area/ai_monitored/storage/secure, /area/ai_monitored/storage/emergency, - /area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0 + /area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0, /area/turret_protected/ai_upload_foyer, /area/turret_protected/ai, ) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index c1cd4992748..e714fe776ca 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -18,6 +18,11 @@ power_equip = 0 power_environ = 0 + if(lighting_use_dynamic) + luminosity = 0 + else + luminosity = 1 + ..() /area/proc/initialize() @@ -67,7 +72,7 @@ for(var/obj/machinery/door/firedoor/E in all_doors) if(!E.blocked) if(E.operating) - E.nextstate = CLOSED + E.nextstate = FIREDOOR_CLOSED else if(!E.density) spawn(0) E.close() @@ -78,7 +83,7 @@ for(var/obj/machinery/door/firedoor/E in all_doors) if(!E.blocked) if(E.operating) - E.nextstate = OPEN + E.nextstate = FIREDOOR_OPEN else if(E.density) spawn(0) E.open() @@ -92,7 +97,7 @@ for(var/obj/machinery/door/firedoor/D in all_doors) if(!D.blocked) if(D.operating) - D.nextstate = CLOSED + D.nextstate = FIREDOOR_CLOSED else if(!D.density) spawn() D.close() @@ -105,7 +110,7 @@ for(var/obj/machinery/door/firedoor/D in all_doors) if(!D.blocked) if(D.operating) - D.nextstate = OPEN + D.nextstate = FIREDOOR_OPEN else if(D.density) spawn(0) D.open() @@ -137,7 +142,7 @@ for(var/obj/machinery/door/firedoor/D in src) if(!D.blocked) if(D.operating) - D.nextstate = OPEN + D.nextstate = FIREDOOR_OPEN else if(D.density) spawn(0) D.open() @@ -279,7 +284,7 @@ var/list/mob/living/forced_ambiance_list = new if(istype(mob,/mob/living/carbon/human/)) var/mob/living/carbon/human/H = mob - if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.flags & NOSLIP)) + if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP)) return if(H.m_intent == "run") @@ -290,6 +295,27 @@ var/list/mob/living/forced_ambiance_list = new H.AdjustWeakened(1) mob << "The sudden appearance of gravity makes you fall to the floor!" +/area/proc/prison_break() + for(var/obj/machinery/power/apc/temp_apc in src) + temp_apc.overload_lighting(70) + for(var/obj/machinery/door/airlock/temp_airlock in src) + temp_airlock.prison_open() + for(var/obj/machinery/door/window/temp_windoor in src) + temp_windoor.open() + +/area/proc/has_gravity() + return has_gravity + +/area/space/has_gravity() + return 0 + +/proc/has_gravity(atom/AT, turf/T) + if(!T) + T = get_turf(AT) + var/area/A = get_area(T) + if(A && A.has_gravity()) + return 1 + return 0 //A useful proc for events. //This returns a random area of the station which is meaningful. Ie, a room somewhere diff --git a/code/game/area/asteroid_areas.dm b/code/game/area/asteroid_areas.dm index 12ae5377ce2..c5e8b784644 100644 --- a/code/game/area/asteroid_areas.dm +++ b/code/game/area/asteroid_areas.dm @@ -2,18 +2,16 @@ /area/mine icon_state = "mining" - music = 'sound/ambience/song_game.ogg' - sound_env = 5 //stoneroom + ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg') + sound_env = ASTEROID /area/mine/explored name = "Mine" icon_state = "explored" - ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg') /area/mine/unexplored name = "Mine" icon_state = "unexplored" - ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg') // OUTPOSTS diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8c84be66479..0d359830aae 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -74,12 +74,11 @@ return flags & INSERT_CONTAINER */ -/atom/proc/meteorhit(obj/meteor as obj) - return - /atom/proc/CheckExit() return 1 +// If you want to use this, the atom must have the PROXMOVE flag, and the moving +// atom must also have the PROXMOVE flag currently to help with lag. ~ ComicIronic /atom/proc/HasProximity(atom/movable/AM as mob|obj) return @@ -237,8 +236,8 @@ its easier to just keep the beam vertical. /atom/proc/ex_act() return -/atom/proc/blob_act() - return +/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source) + return NO_EMAG_ACT /atom/proc/fire_act() return @@ -439,7 +438,6 @@ its easier to just keep the beam vertical. blood_DNA = null return 1 - /atom/proc/get_global_map_pos() if(!islist(global_map) || isemptylist(global_map)) return var/cur_x = null @@ -464,3 +462,46 @@ its easier to just keep the beam vertical. return 1 else return 0 + +// Show a message to all mobs and objects in sight of this atom +// Use for objects performing visible actions +// message is output to anyone who can see, e.g. "The [src] does something!" +// blind_message (optional) is what blind people will hear e.g. "You hear something!" +/atom/proc/visible_message(var/message, var/blind_message) + + var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null) + + for(var/I in see) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 1, blind_message, 2) + else if(ismob(I)) + var/mob/M = I + if(M.see_invisible >= invisibility) // Cannot view the invisible + M.show_message( message, 1, blind_message, 2) + else if (blind_message) + M.show_message(blind_message, 2) + +// Show a message to all mobs and objects in earshot of this atom +// Use for objects performing audible actions +// message is the message output to anyone who can hear. +// deaf_message (optional) is what deaf people will see. +// hearing_distance (optional) is the range, how many tiles away the message can be heard. +/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance) + + var/range = world.view + if(hearing_distance) + range = hearing_distance + var/list/hear = get_mobs_or_objects_in_view(range,src) + + for(var/I in hear) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 2, deaf_message, 1) + else if(ismob(I)) + var/mob/M = I + M.show_message( message, 2, deaf_message, 1) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8fd660ec521..6c918a78788 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -13,6 +13,8 @@ var/throw_range = 7 var/moved_recently = 0 var/mob/pulledby = null + var/item_state = null // Base name of the image used for when the item is worn. Suffixes are added to this. + //Also used on holdable mobs for the same info related to their held version var/auto_init = 1 @@ -45,7 +47,8 @@ pulledby = null /atom/movable/proc/initialize() - return + if(!isnull(gcDestroyed)) + crash_with("GC: -- [type] had initialize() called after qdel() --") /atom/movable/Bump(var/atom/A, yes) if(src.throwing) @@ -78,7 +81,7 @@ else if(isobj(hit_atom)) var/obj/O = hit_atom if(!O.anchored) - step(O, src.dir) + step(O, src.last_move) O.hitby(src,speed) else if(isturf(hit_atom)) @@ -86,7 +89,7 @@ var/turf/T = hit_atom if(T.density) spawn(2) - step(src, turn(src.dir, 180)) + step(src, turn(src.last_move, 180)) if(istype(src,/mob/living)) var/mob/living/M = src M.turf_collision(T, speed) @@ -210,7 +213,7 @@ /atom/movable/overlay/New() for(var/x in src.verbs) src.verbs -= x - return + ..() /atom/movable/overlay/attackby(a, b) if (src.master) @@ -221,3 +224,51 @@ if (src.master) return src.master.attack_hand(a, b, c) return + +/atom/movable/proc/touch_map_edge() + if(z in config.sealed_levels) + return + + if(config.use_overmap) + overmap_spacetravel(get_turf(src), src) + return + + var/move_to_z = src.get_transit_zlevel() + if(move_to_z) + z = move_to_z + + if(x <= TRANSITIONEDGE) + x = world.maxx - TRANSITIONEDGE - 2 + y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2) + + else if (x >= (world.maxx - TRANSITIONEDGE + 1)) + x = TRANSITIONEDGE + 1 + y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2) + + else if (y <= TRANSITIONEDGE) + y = world.maxy - TRANSITIONEDGE -2 + x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) + + else if (y >= (world.maxy - TRANSITIONEDGE + 1)) + y = TRANSITIONEDGE + 1 + x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) + + if(ticker && istype(ticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear + var/datum/game_mode/nuclear/G = ticker.mode + G.check_nuke_disks() + + spawn(0) + if(loc) loc.Entered(src) + +//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there. +var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "6" = 60) + +//by default, transition randomly to another zlevel +/atom/movable/proc/get_transit_zlevel() + var/list/candidates = accessible_z_levels.Copy() + candidates.Remove("[src.z]") + + if(!candidates.len) + return null + return text2num(pickweight(candidates)) + diff --git a/code/game/base_turf.dm b/code/game/base_turf.dm new file mode 100644 index 00000000000..91b6c4cc582 --- /dev/null +++ b/code/game/base_turf.dm @@ -0,0 +1,34 @@ +// Returns the lowest turf available on a given Z-level +var/global/list/base_turf_by_z = list( + "5" = /turf/simulated/floor/asteroid // Moonbase. + ) + +proc/get_base_turf(var/z) + if(!base_turf_by_z["[z]"]) + base_turf_by_z["[z]"] = /turf/space + return base_turf_by_z["[z]"] + +//An area can override the z-level base turf, so our solar array areas etc. can be space-based. +proc/get_base_turf_by_area(var/turf/T) + var/area/A = T.loc + if(A.base_turf) + return A.base_turf + return get_base_turf(T.z) + +/client/proc/set_base_turf() + set category = "Debug" + set name = "Set Base Turf" + set desc = "Set the base turf for a z-level." + + if(!check_rights(R_DEBUG)) return + + var/choice = input("Which Z-level do you wish to set the base turf for?") as num|null + if(!choice) + return + + var/new_base_path = input("Please select a turf path (cancel to reset to /turf/space).") as null|anything in typesof(/turf) + if(!new_base_path) + new_base_path = /turf/space + base_turf_by_z["[choice]"] = new_base_path + message_admins("[key_name_admin(usr)] has set the base turf for z-level [choice] to [get_base_turf(choice)].") + log_admin("[key_name(usr)] has set the base turf for z-level [choice] to [get_base_turf(choice)].") \ No newline at end of file diff --git a/code/game/dna/dna_misc.dm b/code/game/dna/dna_misc.dm deleted file mode 100644 index cdc737c0076..00000000000 --- a/code/game/dna/dna_misc.dm +++ /dev/null @@ -1,562 +0,0 @@ -/////////////////////////// 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"]) - H.update_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) - qdel(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)) - qdel(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 - qdel(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) - qdel(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) - // qdel(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 - qdel(M) - return -//////////////////////////////////////////////////////////// Monkey Block - if(M) - M.update_icon = 1 //queue a full icon update at next life() call - return null -/////////////////////////// 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 96fcebfe3b4..29d519355e8 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -100,13 +100,13 @@ if (usr.stat != 0) return if (!ishuman(usr) && !issmall(usr)) //Make sure they're a mob that has dna - usr << "\blue Try as you might, you can not climb up into the scanner." + usr << "Try as you might, you can not climb up into the scanner." return if (src.occupant) - usr << "\blue The scanner is already occupied!" + usr << "The scanner is already occupied!" return if (usr.abiotic()) - usr << "\blue Subject cannot have abiotic items on." + usr << "The subject cannot have abiotic items on." return usr.stop_pulling() usr.client.perspective = EYE_PERSPECTIVE @@ -120,13 +120,13 @@ /obj/machinery/dna_scannernew/attackby(var/obj/item/weapon/item as obj, var/mob/user as mob) if(istype(item, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "\red A beaker is already loaded into the machine." + user << "A beaker is already loaded into the machine." return beaker = item user.drop_item() item.loc = src - user.visible_message("[user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!") + user.visible_message("\The [user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!") return else if (!istype(item, /obj/item/weapon/grab)) return @@ -134,10 +134,10 @@ if (!ismob(G.affecting)) return if (src.occupant) - user << "\blue The scanner is already occupied!" + user << "The scanner is already occupied!" return if (G.affecting.abiotic()) - user << "\blue Subject cannot have abiotic items on." + user << "The subject cannot have abiotic items on." return put_in(G.affecting) src.add_fingerprint(user) @@ -161,7 +161,7 @@ if(!M.client && M.mind) for(var/mob/dead/observer/ghost in player_list) if(ghost.mind == M.mind) - ghost << "Your corpse has been placed into a cloning scanner. Return to your body if you want to be resurrected/cloned! (Verbs -> Ghost -> Re-enter corpse)" + ghost << "Your corpse has been placed into a cloning scanner. Return to your body if you want to be resurrected/cloned! (Verbs -> Ghost -> Re-enter corpse)" break return @@ -207,18 +207,12 @@ else return - -/obj/machinery/dna_scannernew/blob_act() - if(prob(75)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - qdel(src) - /obj/machinery/computer/scan_consolenew name = "DNA Modifier Access Console" desc = "Scand DNA." icon = 'icons/obj/computer.dmi' - icon_state = "scanner" + icon_keyboard = "med_key" + icon_screen = "dna" density = 1 circuit = /obj/item/weapon/circuitboard/scan_consolenew var/selected_ui_block = 1.0 @@ -269,22 +263,6 @@ else return -/obj/machinery/computer/scan_consolenew/blob_act() - - if(prob(75)) - qdel(src) - -/obj/machinery/computer/scan_consolenew/power_change() - ..() - if(stat & BROKEN) - icon_state = "broken" - else - if (stat & NOPOWER) - spawn(rand(0, 15)) - src.icon_state = "c_unpowered" - else - icon_state = initial(icon_state) - /obj/machinery/computer/scan_consolenew/New() ..() for(var/i=0;i<3;i++) @@ -479,7 +457,7 @@ else randmuti(src.connected.occupant) - src.connected.occupant.radiation += ((src.radiation_intensity*3)+src.radiation_duration*3) + src.connected.occupant.apply_effect(((src.radiation_intensity*3)+src.radiation_duration*3), IRRADIATE, check_protection = 0) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -573,7 +551,7 @@ block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration) src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block) src.connected.occupant.UpdateAppearance() - src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration) + src.connected.occupant.apply_effect((src.radiation_intensity+src.radiation_duration), IRRADIATE, check_protection = 0) else if (prob(20+src.radiation_intensity)) randmutb(src.connected.occupant) @@ -581,7 +559,7 @@ else randmuti(src.connected.occupant) src.connected.occupant.UpdateAppearance() - src.connected.occupant.radiation += ((src.radiation_intensity*2)+src.radiation_duration) + src.connected.occupant.apply_effect(((src.radiation_intensity*2)+src.radiation_duration), IRRADIATE, check_protection = 0) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -638,10 +616,10 @@ //testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!") connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block) - src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration) + src.connected.occupant.apply_effect((src.radiation_intensity+src.radiation_duration), IRRADIATE, check_protection = 0) domutcheck(src.connected.occupant,src.connected) else - src.connected.occupant.radiation += ((src.radiation_intensity*2)+src.radiation_duration) + src.connected.occupant.apply_effect(((src.radiation_intensity*2)+src.radiation_duration), IRRADIATE, check_protection = 0) if (prob(80-src.radiation_duration)) //testing("Random bad mut!") randmutb(src.connected.occupant) @@ -763,7 +741,7 @@ src.connected.occupant.dna.SE = buf.dna.SE src.connected.occupant.dna.UpdateSE() domutcheck(src.connected.occupant,src.connected) - src.connected.occupant.radiation += rand(20,50) + src.connected.occupant.apply_effect(rand(20,50), IRRADIATE, check_protection = 0) return 1 if (bufferOption == "createInjector") diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index 4f78d7f70fe..72a571abf83 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -35,7 +35,7 @@ if(sdisability) M.sdisabilities|=sdisability if(activation_message) - M << "\red [activation_message]" + M << "[activation_message]" else testing("[name] has no activation message.") @@ -47,7 +47,7 @@ if(sdisability) M.sdisabilities &= (~sdisability) if(deactivation_message) - M << "\red [deactivation_message]" + M << "[deactivation_message]" else testing("[name] has no deactivation message.") diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm index 21eec348bdf..3e18696f6b0 100644 --- a/code/game/dna/genes/gene.dm +++ b/code/game/dna/genes/gene.dm @@ -113,10 +113,10 @@ M.mutations.Add(mutation) if(activation_messages.len) var/msg = pick(activation_messages) - M << "\blue [msg]" + M << "[msg]" /datum/dna/gene/basic/deactivate(var/mob/M) M.mutations.Remove(mutation) if(deactivation_messages.len) var/msg = pick(deactivation_messages) - M << "\red [msg]" \ No newline at end of file + M << "[msg]" diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 7d9da106366..c93a19d5673 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -12,7 +12,7 @@ //testing("Cannot monkey-ify [M], type is [M.type].") return var/mob/living/carbon/human/H = M - H.monkeyizing = 1 + H.transforming = 1 var/list/implants = list() //Try to preserve implants. for(var/obj/item/weapon/implant/W in H) implants += W @@ -23,7 +23,7 @@ if (W==H.w_uniform) // will be teared continue H.drop_from_inventory(W) - M.monkeyizing = 1 + M.transforming = 1 M.canmove = 0 M.icon = null M.invisibility = 101 @@ -90,7 +90,7 @@ //testing("Cannot humanize [M], type is [M.type].") return var/mob/living/carbon/monkey/Mo = M - Mo.monkeyizing = 1 + Mo.transforming = 1 var/list/implants = list() //Still preserving implants for(var/obj/item/weapon/implant/W in Mo) implants += W @@ -98,7 +98,7 @@ if(!connected) for(var/obj/item/W in (Mo.contents-implants)) Mo.drop_from_inventory(W) - M.monkeyizing = 1 + M.transforming = 1 M.canmove = 0 M.icon = null M.invisibility = 101 diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index 3381894f8ac..e6c6b6f4ec9 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -171,7 +171,7 @@ if(M.health <= 25) M.mutations.Remove(HULK) M.update_mutations() //update our mutation overlays - M << "\red You suddenly feel very weak." + M << "You suddenly feel very weak." M.Weaken(3) M.emote("collapse") diff --git a/code/game/gamemodes/antagspawner.dm b/code/game/gamemodes/antagspawner.dm index 384234d9ad8..4deb202d60b 100644 --- a/code/game/gamemodes/antagspawner.dm +++ b/code/game/gamemodes/antagspawner.dm @@ -19,7 +19,7 @@ return /obj/item/weapon/antag_spawner/borg_tele - name = "Syndicate Cyborg Teleporter" + name = "syndicate cyborg teleporter" desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field. Due to budget restrictions, it is only possible to deploy a single cyborg at time." icon = 'icons/obj/device.dmi' icon_state = "locator" @@ -34,9 +34,9 @@ continue if(jobban_isbanned(O, "Syndicate") && jobban_isbanned(O, "Mercenary") && jobban_isbanned(O, "Cyborg")) continue - if(O.client) - if(O.client.prefs.be_special & BE_OPERATIVE) - question(O.client) + if(O.client && O.client.prefs && (MODE_MERCENARY in O.client.prefs.be_special_role)) + question(O.client) + spawn(600) searching = 0 if(!used) @@ -56,7 +56,7 @@ if(response == "Yes") spawn_antag(C, get_turf(src)) else if (response == "Never for this round") - C.prefs.be_special ^= BE_OPERATIVE + C.prefs.be_special_role ^= MODE_MERCENARY obj/item/weapon/antag_spawner/borg_tele/spawn_antag(client/C, turf/T) var/datum/effect/effect/system/spark_spread/S = new /datum/effect/effect/system/spark_spread @@ -71,6 +71,11 @@ obj/item/weapon/antag_spawner/borg_tele/spawn_antag(client/C, turf/T) H.mind.special_role = "Mercenary" H << "You are a syndicate cyborg, bound to help and follow the orders of the mercenaries that are deploying you. Remember to speak to the other mercenaries to know more about their plans, you are also able to change your name using the name pick command." + spawn(1) + used = 1 + qdel(src) + H << "You are a syndicate cyborg, bound to help and follow the orders of the mercenaries that are deploying you. Remember to speak to the other mercenaries to know more about their plans, you are also able to change your name using the name pick command." + spawn(1) used = 1 qdel(src) diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm deleted file mode 100644 index f3d60d48ada..00000000000 --- a/code/game/gamemodes/blob/blob.dm +++ /dev/null @@ -1,133 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -//Few global vars to track the blob -var/list/blobs = list() -var/list/blob_cores = list() -var/list/blob_nodes = list() - - -/*/datum/game_mode/blob - name = "blob" - config_tag = "blob" - required_players = 0 - - var/const/waittime_l = 1800 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 3600 //upper bound on time before intercept arrives (in tenths of seconds) - - var/declared = 0 - var/stage = 0 - - var/cores_to_spawn = 1 - var/players_per_core = 16 - - //Controls expansion via game controller - var/autoexpand = 0 - var/expanding = 0 - - var/blob_count = 0 - var/blobnukecount = 300//Might be a bit low - var/blobwincount = 700//Still needs testing - - - announce() - world << "The current game mode is - Blob!" - world << "A dangerous alien organism is rapidly spreading throughout the station!" - world << "You must kill it all while minimizing the damage to the station." - - - post_setup() - spawn(10) - start_state = new /datum/station_state() - start_state.count() - - spawn(rand(waittime_l, waittime_h))//3-5 minutes currently - message_admins("Blob spawned and expanding, report created") - if(!kill_air) - kill_air = 1 - message_admins("Kill air has been set to true by Blob, testing to see how laggy it is without the extra processing from hullbreaches. Note: the blob is fireproof so plasma does not help anyways") - - if(ticker && ticker.minds && ticker.minds.len) - var/player_based_cores = round(ticker.minds.len/players_per_core, 1) - if(player_based_cores > cores_to_spawn) - cores_to_spawn = player_based_cores - - blobs = list() - for(var/i = 0 to cores_to_spawn) - var/turf/location = pick(blobstart) - if(location && !locate(/obj/effect/blob in location)) - blobstart -= location - new/obj/effect/blob/core(location) - - spawn(40) - autoexpand = 1 - declared = 1 - ..() - - - process() - if(!declared) return - stage() -// if(!autoexpand) return -// spawn(0) -// expandBlob() - return - - - proc/expandBlob()//Currently disabled - if(expanding) return - if(!blobs.len) return - expanding = 1 - - for(var/i = 1 to 2) - sleep(-1) - if(!blobs.len) break - var/obj/effect/blob/B = pick(blobs) - if(isNotStationLevel(B.z)) - continue - B.Life() - - expanding = 0 - return - - - proc/stage() - switch(stage) - if (0) - send_intercept(1) - for (var/mob/living/silicon/ai/aiPlayer in living_mob_list) - if (aiPlayer.client) - var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. NanoTrasen will not send an emergency shuttle under any circumstances." - //var/law = "The station is under quarantine. The biohazard must be destroyed at all costs and must not be allowed to spread. Anyone using a space suit for any reason other than to destroy the biohazard is to be terminated. NanoTrasen will not send an emergency shuttle under any circumstances." - aiPlayer.set_zeroth_law(law) - aiPlayer << "Laws Updated: [law]" - - stage = -1 - // next stage 1 minute later - spawn(600) - stage = 1 - return - - if (1) - command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert") - for(var/mob/M in player_list) - if(!istype(M,/mob/new_player)) - M << sound('sound/AI/outbreak5.ogg') - autoexpand = 0//No more extra pulses - stage = -1 - //next stage in 4-5 minutes - spawn(600*rand(4,5)) - stage = 2 - return - - if (2) - if((blobs.len > blobnukecount) && (declared == 1)) - command_alert("Uncontrolled spread of the biohazard onboard the station. We have issued directive 7-12 for [station_name()]. Any living Heads of Staff are ordered to enact directive 7-12 at any cost, a print out with detailed instructions has been sent to your communications computers.", "Biohazard Alert") - send_intercept(2) - declared = 2 - spawn(20) - set_security_level("delta") - if(blobs.len > blobwincount) - stage = 3 - return - -*/ \ No newline at end of file diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm deleted file mode 100644 index 4afdf6d1472..00000000000 --- a/code/game/gamemodes/blob/blob_finish.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/game_mode/blob/check_finished() - if(!declared)//No blobs have been spawned yet - return 0 - if(stage >= 3)//Blob took over - return 1 - if(station_was_nuked)//Nuke went off - return 1 - - for(var/obj/effect/blob/B in blob_cores) - if(B && isNotStationLevel(B.z)) continue - return 0 - - var/nodes = 0 - for(var/obj/effect/blob/B in blob_nodes) - if(B && isNotStationLevel(B.z)) continue - nodes++ - if(nodes > 4)//Perhapse make a new core with a low prob - return 0 - - return 1 - - -/datum/game_mode/blob/declare_completion() - if(stage >= 3) - feedback_set_details("round_end_result","loss - blob took over") - world << "The blob has taken over the station!" - world << "The entire station was eaten by the Blob" - check_quarantine() - - else if(station_was_nuked) - feedback_set_details("round_end_result","halfwin - nuke") - world << "Partial Win: The station has been destroyed!" - world << "Directive 7-12 has been successfully carried out preventing the Blob from spreading." - - else - feedback_set_details("round_end_result","win - blob eliminated") - world << "The staff has won!" - world << "The alien organism has been eradicated from the station" - - var/datum/station_state/end_state = new /datum/station_state() - end_state.count() - var/percent = round( 100.0 * start_state.score(end_state), 0.1) - world << "The station is [percent]% intact." - log_game("Blob mode was won with station [percent]% intact.") - world << "\blue Rebooting in 30s" - ..() - return 1 - - -/datum/game_mode/blob/proc/check_quarantine() - var/numDead = 0 - var/numAlive = 0 - var/numSpace = 0 - var/numOffStation = 0 - for (var/mob/living/silicon/ai/aiPlayer in mob_list) - for(var/mob/living/carbon/human/M in mob_list) - if ((M != aiPlayer && M.client)) - if (M.stat == 2) - numDead += 1 - else - var/T = M.loc - if (istype(T, /turf/space)) - numSpace += 1 - else if(istype(T, /turf)) - if (isNotStationLevel(M.z)) - numOffStation += 1 - else - numAlive += 1 - if (numSpace==0 && numOffStation==0) - world << "The AI has won!" - world << "The AI successfully maintained the quarantine - no players were in space or were off-station (as far as we can tell)." - log_game("AI won at Blob mode despite overall loss.") - else - world << "The AI has lost!" - world << text("The AI failed to maintain the quarantine - [] were in space and [] were off-station (as far as we can tell).", numSpace, numOffStation) - log_game("AI lost at Blob mode.") - log_game("Blob mode was lost.") - return 1 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm deleted file mode 100644 index d12bfaa7541..00000000000 --- a/code/game/gamemodes/blob/blob_report.dm +++ /dev/null @@ -1,111 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/datum/game_mode/blob/send_intercept(var/report = 1) - var/intercepttext = "" - var/interceptname = "Error" - switch(report) - if(1) - interceptname = "Biohazard Alert" - intercepttext += "NanoTrasen Update: Biohazard Alert.
" - intercepttext += "Reports indicate the probable transfer of a biohazardous agent onto [station_name()] during the last crew deployment cycle.
" - intercepttext += "Preliminary analysis of the organism classifies it as a level 5 biohazard. Its origin is unknown.
" - intercepttext += "NanoTrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.
" - intercepttext += "Orders for all [station_name()] personnel follows:
" - intercepttext += " 1. Do not leave the quarantine area.
" - intercepttext += " 2. Locate any outbreaks of the organism on the station.
" - intercepttext += " 3. If found, use any neccesary means to contain the organism.
" - intercepttext += " 4. Avoid damage to the capital infrastructure of the station.
" - intercepttext += "
Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.
" - intercepttext += "Message ends." - if(2) - var/nukecode = "ERROR" - for(var/obj/machinery/nuclearbomb/bomb in machines) - if(bomb && bomb.r_code) - if(bomb.z in station_levels) - nukecode = bomb.r_code - interceptname = "Directive 7-12" - intercepttext += "NanoTrasen Update: Biohazard Alert.
" - intercepttext += "Directive 7-12 has been issued for [station_name()].
" - intercepttext += "The biohazard has grown out of control and will soon reach critical mass.
" - intercepttext += "Your orders are as follows:
" - intercepttext += "1. Secure the Nuclear Authentication Disk.
" - intercepttext += "2. Detonate the Nuke located in the Station's Vault.
" - intercepttext += "Nuclear Authentication Code: [nukecode]
" - intercepttext += "Message ends." - - for (var/mob/living/silicon/ai/aiPlayer in player_list) - if (aiPlayer.client) - var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. The nuclear failsafe must be activated at any cost, the code is: [nukecode]." - aiPlayer.set_zeroth_law(law) - aiPlayer << "Laws Updated: [law]" - - for(var/obj/machinery/computer/communications/comm in machines) - comm.messagetitle.Add(interceptname) - comm.messagetext.Add(intercepttext) - if(!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- [interceptname]" - intercept.info = intercepttext - return - - - -/datum/station_state - var/floor = 0 - var/wall = 0 - var/r_wall = 0 - var/window = 0 - var/door = 0 - var/grille = 0 - var/mach = 0 - - - proc/count() - for(var/turf/T in world) - if(isNotStationLevel(T.z) - continue - - if(istype(T,/turf/simulated/floor)) - if(!(T:burnt)) - src.floor += 12 - else - src.floor += 1 - - if(istype(T, /turf/simulated/wall)) - if(T:intact) - src.wall += 2 - else - src.wall += 1 - - if(istype(T, /turf/simulated/wall/r_wall)) - if(T:intact) - src.r_wall += 2 - else - src.r_wall += 1 - - for(var/obj/O in world) - if(isNotStationLevel(O.z)) - continue - - if(istype(O, /obj/structure/window)) - src.window += 1 - else if(istype(O, /obj/structure/grille) && (!O:destroyed)) - src.grille += 1 - else if(istype(O, /obj/machinery/door)) - src.door += 1 - else if(istype(O, /obj/machinery)) - src.mach += 1 - return - - - proc/score(var/datum/station_state/result) - if(!result) return 0 - var/output = 0 - output += (result.floor / max(floor,1)) - output += (result.r_wall/ max(r_wall,1)) - output += (result.wall / max(wall,1)) - output += (result.window / max(window,1)) - output += (result.door / max(door,1)) - output += (result.grille / max(grille,1)) - output += (result.mach / max(mach,1)) - return (output/7) diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm deleted file mode 100644 index 3897d444e8e..00000000000 --- a/code/game/gamemodes/blob/blobs/core.dm +++ /dev/null @@ -1,73 +0,0 @@ -/obj/effect/blob/core - name = "blob core" - icon = 'icons/mob/blob.dmi' - icon_state = "blob_core" - health = 200 - brute_resist = 2 - fire_resist = 2 - - - New(loc, var/h = 200) - blobs += src - blob_cores += src - processing_objects.Add(src) - ..(loc, h) - - - Destroy() - blob_cores -= src - processing_objects.Remove(src) - ..() - return - - - update_icon() - if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - qdel(src) - return - return - - - run_action() - Pulse(0,1) - Pulse(0,2) - Pulse(0,4) - Pulse(0,8) - //Should have the fragments in here somewhere - return 1 - - - proc/create_fragments(var/wave_size = 1) - var/list/candidates = list() - for(var/mob/dead/observer/G in player_list) - if(G.client.prefs.be_special & BE_ALIEN) - if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - candidates += G.key - - if(candidates.len) - for(var/i = 0 to wave_size) - var/mob/living/blob/B = new/mob/living/blob(src.loc) - B.key = pick(candidates) - candidates -= B.key - -/* - Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand - set background = 1 - if(pulse > 20) return - //Looking for another blob to pulse - var/list/dirs = list(1,2,4,8) - dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us - for(var/i = 1 to 4) - if(!dirs.len) break - var/dirn = pick(dirs) - dirs.Remove(dirn) - var/turf/T = get_step(src, dirn) - var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) - if(!B) - expand(T)//No blob here so try and expand - return - B.Pulse((pulse+1),get_dir(src.loc,T)) - return - return -*/ \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm deleted file mode 100644 index c1d14d00402..00000000000 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ /dev/null @@ -1,72 +0,0 @@ -/obj/effect/blob/factory - name = "porous blob" - icon = 'icons/mob/blob.dmi' - icon_state = "blob_factory" - health = 100 - brute_resist = 1 - fire_resist = 2 - var/list/spores = list() - var/max_spores = 4 - - - update_icon() - if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - qdel(src) - return - return - - - run_action() - if(spores.len >= max_spores) return 0 - 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" - desc = "Some blob thing." - icon = 'icons/mob/critter.dmi' - icon_state = "blobsquiggle" - icon_living = "blobsquiggle" - pass_flags = PASSBLOB - health = 20 - maxHealth = 20 - melee_damage_lower = 4 - melee_damage_upper = 8 - attacktext = "hit" - attack_sound = 'sound/weapons/genhit1.ogg' - var/obj/effect/blob/factory/factory = null - faction = "blob" - 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 - maxbodytemp = 360 - - - New(loc, var/obj/effect/blob/factory/linked_node) - ..() - if(istype(linked_node)) - factory = linked_node - factory.spores += src - ..(loc) - return - death() - 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 deleted file mode 100644 index 92572f9a7b0..00000000000 --- a/code/game/gamemodes/blob/blobs/node.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/effect/blob/node - name = "blob node" - icon = 'icons/mob/blob.dmi' - icon_state = "blob_node" - health = 100 - brute_resist = 1 - fire_resist = 2 - - - New(loc, var/h = 100) - blobs += src - blob_nodes += src - processing_objects.Add(src) - ..(loc, h) - - - Destroy() - blob_nodes -= src - processing_objects.Remove(src) - ..() - return - - - update_icon() - if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - qdel(src) - return - return - - - run_action() - Pulse(0,0) - return 0 \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm deleted file mode 100644 index 68296724495..00000000000 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ /dev/null @@ -1,33 +0,0 @@ -/obj/effect/blob/shield - name = "strong blob" - icon = 'icons/mob/blob.dmi' - icon_state = "blob_idle" - desc = "Some blob creature thingy" - density = 1 - opacity = 0 - anchored = 1 - health = 60 - brute_resist = 1 - fire_resist = 2 - - - update_icon() - if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - qdel(src) - return - return - - - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 - return !density - -/obj/effect/blob/shield/New() - ..() - update_nearby_tiles() - -/obj/effect/blob/shield/Destroy() - density = 0 - update_nearby_tiles() - ..() diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm deleted file mode 100644 index 44486d605b5..00000000000 --- a/code/game/gamemodes/blob/theblob.dm +++ /dev/null @@ -1,221 +0,0 @@ -//I will need to recode parts of this but I am way too tired atm -/obj/effect/blob - name = "blob" - icon = 'icons/mob/blob.dmi' - icon_state = "blob" - light_range = 3 - desc = "Some blob creature thingy" - density = 1 - opacity = 0 - anchored = 1 - var/active = 1 - var/health = 30 - var/brute_resist = 4 - var/fire_resist = 1 - var/blob_type = "blob" - /*Types - Blob - Node - Core - Factory - Shield - */ - - - New(loc, var/h = 30) - blobs += src - src.health = h - src.set_dir(pick(1,2,4,8)) - src.update_icon() - ..(loc) - return - - - Destroy() - blobs -= src - ..() - return - - - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 - if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 - return 0 - - - process() - spawn(-1) - Life() - return - - - proc/Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand - set background = 1 - if(!istype(src,/obj/effect/blob/core) && !istype(src,/obj/effect/blob/node))//Ill put these in the children later - if(run_action())//If we can do something here then we dont need to pulse more - return - - if(!istype(src,/obj/effect/blob/shield) && !istype(src,/obj/effect/blob/core) && !istype(src,/obj/effect/blob/node) && (pulse <= 2) && (prob(30))) - change_to("Shield") - return - - if(pulse > 20) return//Inf loop check - //Looking for another blob to pulse - var/list/dirs = list(1,2,4,8) - dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us - for(var/i = 1 to 4) - if(!dirs.len) break - var/dirn = pick(dirs) - dirs.Remove(dirn) - var/turf/T = get_step(src, dirn) - var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) - if(!B) - expand(T)//No blob here so try and expand - return - B.Pulse((pulse+1),get_dir(src.loc,T)) - return - return - - - proc/run_action() - return 0 - - - proc/Life() - update_icon() - if(run_action()) - return 1 - return 0 - -/* fire_act(datum/gas_mixture/air, temperature, volume) Blob is currently fireproof - if(temperature > T0C+200) - health -= 0.01 * temperature - update() - */ - - proc/expand(var/turf/T = null) - if(!prob(health)) return - if(!T) - var/list/dirs = list(1,2,4,8) - for(var/i = 1 to 4) - var/dirn = pick(dirs) - dirs.Remove(dirn) - T = get_step(src, dirn) - if(!(locate(/obj/effect/blob) in T)) break - else T = null - - if(!T) return 0 - var/obj/effect/blob/B = new /obj/effect/blob(src.loc, min(src.health, 30)) - if(T.Enter(B,src))//Attempt to move into the tile - B.loc = T - else - T.blob_act()//If we cant move in hit the turf - qdel(B) - for(var/atom/A in T)//Hit everything in the turf - A.blob_act() - return 1 - - - ex_act(severity) - var/damage = 50 - switch(severity) - if(1) - src.health -= rand(100,120) - if(2) - src.health -= rand(60,100) - if(3) - src.health -= rand(20,60) - - health -= (damage/brute_resist) - update_icon() - return - - - update_icon()//Needs to be updated with the types - if(health <= 0) - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - qdel(src) - return - if(health <= 15) - icon_state = "blob_damaged" - return -// if(health <= 20) -// icon_state = "blob_damaged2" -// return - - - bullet_act(var/obj/item/projectile/Proj) - if(!Proj) return - switch(Proj.damage_type) - if(BRUTE) - health -= (Proj.damage/brute_resist) - if(BURN) - health -= (Proj.damage/fire_resist) - - update_icon() - return 0 - - - attackby(var/obj/item/weapon/W, var/mob/user) - playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) - src.visible_message("The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]") - var/damage = 0 - switch(W.damtype) - if("fire") - damage = (W.force / max(src.fire_resist,1)) - if(istype(W, /obj/item/weapon/weldingtool)) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - if("brute") - damage = (W.force / max(src.brute_resist,1)) - - health -= damage - update_icon() - return - - proc/change_to(var/type = "Normal") - switch(type) - if("Normal") - new/obj/effect/blob(src.loc,src.health) - if("Node") - new/obj/effect/blob/node(src.loc,src.health*2) - if("Factory") - new/obj/effect/blob/factory(src.loc,src.health) - if("Shield") - new/obj/effect/blob/shield(src.loc,src.health*2) - qdel(src) - return - -//////////////////////////////****IDLE BLOB***///////////////////////////////////// - -/obj/effect/blob/idle - name = "blob" - desc = "it looks... tasty" - icon_state = "blobidle0" - - - New(loc, var/h = 10) - src.health = h - src.set_dir(pick(1,2,4,8)) - src.update_idle() - - - proc/update_idle() - if(health<=0) - qdel(src) - return - if(health<4) - icon_state = "blobc0" - return - if(health<10) - icon_state = "blobb0" - return - icon_state = "blobidle0" - - - Destroy() - var/obj/effect/blob/B = new /obj/effect/blob( src.loc ) - spawn(30) - B.Life() - ..() - - diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index c426d103385..c58612cbbb8 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -1,7 +1,15 @@ /datum/game_mode/changeling name = "changeling" round_description = "There are alien changelings on the station. Do not let the changelings succeed!" - extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, however, is that this something is someone. An unknown alien specimen has incorporated itself into the crew of the NSS Exodus. Its unique biology allows it to manipulate its own or anyone else's DNA. With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, its existence is a threat to not only your personal safety but the lives of everyone on board. No one knows where it came from. No one knows who it is or what it wants. One thing is for certain though... there is never just one of them. Good luck." + extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. \ + Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet \ + something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, \ + however, is that this something is someone. An unknown alien specimen has incorporated itself into \ + the crew of the station. Its unique biology allows it to manipulate its own or anyone else's DNA. \ + With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, \ + its existence is a threat to not only your personal safety but the lives of everyone on board. \ + No one knows where it came from. No one knows who it is or what it wants. One thing is for \ + certain though... there is never just one of them. Good luck." config_tag = "changeling" required_players = 2 required_enemies = 1 diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 36b990951b6..366c5085147 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -12,7 +12,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E var/changelingID = "Changeling" var/geneticdamage = 0 var/isabsorbing = 0 - var/geneticpoints = 5 + var/geneticpoints = 25 var/purchasedpowers = list() var/mimicing = "" @@ -382,7 +382,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E for (var/obj/item/weapon/implant/I in C) //Still preserving implants implants += I - C.monkeyizing = 1 + C.transforming = 1 C.canmove = 0 C.icon = null C.overlays.Cut() diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm index 45a7dc38965..7ba0052b816 100644 --- a/code/game/gamemodes/changeling/modularchangling.dm +++ b/code/game/gamemodes/changeling/modularchangling.dm @@ -1,506 +1,506 @@ -// READ: Don't use the apostrophe in name or desc. Causes script errors. - -var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now -var/list/datum/power/changeling/powerinstances = list() - -/datum/power //Could be used by other antags too - var/name = "Power" - var/desc = "Placeholder" - var/helptext = "" - var/isVerb = 1 // Is it an active power, or passive? - var/verbpath // Path to a verb that contains the effects. - -/datum/power/changeling - var/allowduringlesserform = 0 - var/genomecost = 500000 // Cost for the changling to evolve this power. - -/datum/power/changeling/absorb_dna - name = "Absorb DNA" - desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger." - genomecost = 0 - verbpath = /mob/proc/changeling_absorb_dna - -/datum/power/changeling/transform - name = "Transform" - desc = "We take on the apperance and voice of one we have absorbed." - genomecost = 0 - verbpath = /mob/proc/changeling_transform - -/datum/power/changeling/change_species - name = "Change Species" - desc = "We take on the apperance of a species that we have absorbed." - genomecost = 0 - verbpath = /mob/proc/changeling_change_species - -/datum/power/changeling/fakedeath - name = "Regenerative Stasis" - desc = "We become weakened to a death-like state, where we will rise again from death." - helptext = "Can be used before or after death. Duration varies greatly." - genomecost = 0 - allowduringlesserform = 1 - verbpath = /mob/proc/changeling_fakedeath - -// Hivemind - -/datum/power/changeling/hive_upload - name = "Hive Channel" - desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves." - helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives." - genomecost = 0 - verbpath = /mob/proc/changeling_hiveupload - -/datum/power/changeling/hive_download - name = "Hive Absorb" - desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings." - helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective." - genomecost = 0 - verbpath = /mob/proc/changeling_hivedownload - -/datum/power/changeling/lesser_form - name = "Lesser Form" - desc = "We debase ourselves and become lesser. We become a monkey." - genomecost = 4 - verbpath = /mob/proc/changeling_lesser_form - -/datum/power/changeling/deaf_sting - name = "Deaf Sting" - desc = "We silently sting a human, completely deafening them for a short time." - genomecost = 1 - allowduringlesserform = 1 - verbpath = /mob/proc/changeling_deaf_sting - -/datum/power/changeling/blind_sting - name = "Blind Sting" - desc = "We silently sting a human, completely blinding them for a short time." - genomecost = 2 - allowduringlesserform = 1 - verbpath = /mob/proc/changeling_blind_sting - -/datum/power/changeling/silence_sting - name = "Silence Sting" - desc = "We silently sting a human, completely silencing them for a short time." - helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot." - genomecost = 3 - allowduringlesserform = 1 - verbpath = /mob/proc/changeling_silence_sting - -/datum/power/changeling/mimicvoice - name = "Mimic Voice" - desc = "We shape our vocal glands to sound like a desired voice." - helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this" - genomecost = 1 - verbpath = /mob/proc/changeling_mimicvoice - -/datum/power/changeling/extractdna - name = "Extract DNA" - desc = "We stealthily sting a target and extract the DNA from them." - helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives." - genomecost = 2 - allowduringlesserform = 1 - verbpath = /mob/proc/changeling_extract_dna_sting - -/datum/power/changeling/transformation_sting - name = "Transformation Sting" - desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another." - helptext = "Does not provide a warning to others. The victim will transform much like a changeling would." - genomecost = 3 - verbpath = /mob/proc/changeling_transformation_sting - -/datum/power/changeling/paralysis_sting - name = "Paralysis Sting" - desc = "We silently sting a human, paralyzing them for a short time." - genomecost = 8 - verbpath = /mob/proc/changeling_paralysis_sting - -/datum/power/changeling/LSDSting - name = "Hallucination Sting" - desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical." - helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds." - genomecost = 3 - verbpath = /mob/proc/changeling_lsdsting - -/datum/power/changeling/DeathSting - name = "Death Sting" - desc = "We silently sting a human, filling them with potent chemicals. Their rapid death is all but assured." - genomecost = 10 - verbpath = /mob/proc/changeling_DEATHsting - -///datum/power/changeling/unfat_sting -// name = "Unfat Sting" -// desc = "We silently sting a human, forcing them to rapidly metabolize their fat." -// genomecost = 1 -// verbpath = /mob/proc/changeling_unfat_sting - -/datum/power/changeling/boost_range - name = "Boost Range" - desc = "We evolve the ability to shoot our stingers at humans, with some preperation." - genomecost = 2 - allowduringlesserform = 1 - verbpath = /mob/proc/changeling_boost_range - -/datum/power/changeling/Epinephrine - name = "Epinephrine sacs" - desc = "We evolve additional sacs of adrenaline throughout our body." - helptext = "Gives the ability to instantly recover from stuns. High chemical cost." - genomecost = 3 - verbpath = /mob/proc/changeling_unstun - -/datum/power/changeling/ChemicalSynth - name = "Rapid Chemical-Synthesis" - desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster." - helptext = "Doubles the rate at which we naturally recharge chemicals." - genomecost = 4 - isVerb = 0 - verbpath = /mob/proc/changeling_fastchemical -/* -/datum/power/changeling/AdvChemicalSynth - name = "Advanced Chemical-Synthesis" - desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster." - helptext = "Doubles the rate at which we naturally recharge chemicals." - genomecost = 8 - isVerb = 0 - verbpath = /mob/proc/changeling_fastchemical -*/ -/datum/power/changeling/EngorgedGlands - name = "Engorged Chemical Glands" - desc = "Our chemical glands swell, permitting us to store more chemicals inside of them." - helptext = "Allows us to store an extra 25 units of chemicals." - genomecost = 4 - isVerb = 0 - verbpath = /mob/proc/changeling_engorgedglands - -/datum/power/changeling/DigitalCamoflague - name = "Digital Camoflauge" - desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras." - helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this." - genomecost = 1 - allowduringlesserform = 1 - verbpath = /mob/proc/changeling_digitalcamo - -/datum/power/changeling/rapidregeneration - name = "Rapid Regeneration" - desc = "We evolve the ability to rapidly regenerate, negating the need for stasis." - helptext = "Heals a moderate amount of damage every tick." - genomecost = 7 - verbpath = /mob/proc/changeling_rapidregen - - - -// Modularchangling, totally stolen from the new player panel. YAYY -/datum/changeling/proc/EvolutionMenu()//The new one - set category = "Changeling" - set desc = "Level up!" - - if(!usr || !usr.mind || !usr.mind.changeling) return - src = usr.mind.changeling - - if(!powerinstances.len) - for(var/P in powers) - powerinstances += new P() - - var/dat = "Changling Evolution Menu" - - //javascript, the part that does most of the work~ - dat += {" - - - - - - - "} - - //body tag start + onload and onkeypress (onkeyup) javascript event calls - dat += "" - - //title + search bar - dat += {" - - - - - - - - -
- Changling Evolution Menu
- Hover over a power to see more information
- Current evolution points left to evolve with: [geneticpoints]
- Absorb genomes to acquire more evolution points -

-

- Search: -
- - "} - - //player table header - dat += {" - - "} - - var/i = 1 - for(var/datum/power/changeling/P in powerinstances) - var/ownsthis = 0 - - if(P in purchasedpowers) - ownsthis = 1 - - - var/color = "#e6e6e6" - if(i%2 == 0) - color = "#f2f2f2" - - - dat += {" - - - - - - "} - - i++ - - - //player table ending - dat += {" -
- - - Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost] - -
-
-
- - - - "} - - usr << browse(dat, "window=powers;size=900x480") - - -/datum/changeling/Topic(href, href_list) - ..() - if(!ismob(usr)) - return - - if(href_list["P"]) - var/datum/mind/M = usr.mind - if(!istype(M)) - return - purchasePower(M, href_list["P"]) - call(/datum/changeling/proc/EvolutionMenu)() - - - -/datum/changeling/proc/purchasePower(var/datum/mind/M, var/Pname, var/remake_verbs = 1) - if(!M || !M.changeling) - return - - var/datum/power/changeling/Thepower = Pname - - - for (var/datum/power/changeling/P in powerinstances) - //world << "[P] - [Pname] = [P.name == Pname ? "True" : "False"]" - if(P.name == Pname) - Thepower = P - break - - - if(Thepower == null) - M.current << "This is awkward. Changeling power purchase failed, please report this bug to a coder!" - return - - if(Thepower in purchasedpowers) - M.current << "We have already evolved this ability!" - return - - - if(geneticpoints < Thepower.genomecost) - M.current << "We cannot evolve this... yet. We must acquire more DNA." - return - - geneticpoints -= Thepower.genomecost - - purchasedpowers += Thepower - - if(!Thepower.isVerb && Thepower.verbpath) - call(M.current, Thepower.verbpath)() - else if(remake_verbs) - M.current.make_changeling() - +// READ: Don't use the apostrophe in name or desc. Causes script errors. + +var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now +var/list/datum/power/changeling/powerinstances = list() + +/datum/power //Could be used by other antags too + var/name = "Power" + var/desc = "Placeholder" + var/helptext = "" + var/isVerb = 1 // Is it an active power, or passive? + var/verbpath // Path to a verb that contains the effects. + +/datum/power/changeling + var/allowduringlesserform = 0 + var/genomecost = 500000 // Cost for the changling to evolve this power. + +/datum/power/changeling/absorb_dna + name = "Absorb DNA" + desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger." + genomecost = 0 + verbpath = /mob/proc/changeling_absorb_dna + +/datum/power/changeling/transform + name = "Transform" + desc = "We take on the apperance and voice of one we have absorbed." + genomecost = 0 + verbpath = /mob/proc/changeling_transform + +/datum/power/changeling/change_species + name = "Change Species" + desc = "We take on the apperance of a species that we have absorbed." + genomecost = 0 + verbpath = /mob/proc/changeling_change_species + +/datum/power/changeling/fakedeath + name = "Regenerative Stasis" + desc = "We become weakened to a death-like state, where we will rise again from death." + helptext = "Can be used before or after death. Duration varies greatly." + genomecost = 0 + allowduringlesserform = 1 + verbpath = /mob/proc/changeling_fakedeath + +// Hivemind + +/datum/power/changeling/hive_upload + name = "Hive Channel" + desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves." + helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives." + genomecost = 0 + verbpath = /mob/proc/changeling_hiveupload + +/datum/power/changeling/hive_download + name = "Hive Absorb" + desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings." + helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective." + genomecost = 0 + verbpath = /mob/proc/changeling_hivedownload + +/datum/power/changeling/lesser_form + name = "Lesser Form" + desc = "We debase ourselves and become lesser. We become a monkey." + genomecost = 4 + verbpath = /mob/proc/changeling_lesser_form + +/datum/power/changeling/deaf_sting + name = "Deaf Sting" + desc = "We silently sting a human, completely deafening them for a short time." + genomecost = 1 + allowduringlesserform = 1 + verbpath = /mob/proc/changeling_deaf_sting + +/datum/power/changeling/blind_sting + name = "Blind Sting" + desc = "We silently sting a human, completely blinding them for a short time." + genomecost = 2 + allowduringlesserform = 1 + verbpath = /mob/proc/changeling_blind_sting + +/datum/power/changeling/silence_sting + name = "Silence Sting" + desc = "We silently sting a human, completely silencing them for a short time." + helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot." + genomecost = 3 + allowduringlesserform = 1 + verbpath = /mob/proc/changeling_silence_sting + +/datum/power/changeling/mimicvoice + name = "Mimic Voice" + desc = "We shape our vocal glands to sound like a desired voice." + helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this" + genomecost = 1 + verbpath = /mob/proc/changeling_mimicvoice + +/datum/power/changeling/extractdna + name = "Extract DNA" + desc = "We stealthily sting a target and extract the DNA from them." + helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives." + genomecost = 2 + allowduringlesserform = 1 + verbpath = /mob/proc/changeling_extract_dna_sting + +/datum/power/changeling/transformation_sting + name = "Transformation Sting" + desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another." + helptext = "Does not provide a warning to others. The victim will transform much like a changeling would." + genomecost = 3 + verbpath = /mob/proc/changeling_transformation_sting + +/datum/power/changeling/paralysis_sting + name = "Paralysis Sting" + desc = "We silently sting a human, paralyzing them for a short time." + genomecost = 8 + verbpath = /mob/proc/changeling_paralysis_sting + +/datum/power/changeling/LSDSting + name = "Hallucination Sting" + desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical." + helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds." + genomecost = 3 + verbpath = /mob/proc/changeling_lsdsting + +/datum/power/changeling/DeathSting + name = "Death Sting" + desc = "We silently sting a human, filling them with potent chemicals. Their rapid death is all but assured." + genomecost = 10 + verbpath = /mob/proc/changeling_DEATHsting + +///datum/power/changeling/unfat_sting +// name = "Unfat Sting" +// desc = "We silently sting a human, forcing them to rapidly metabolize their fat." +// genomecost = 1 +// verbpath = /mob/proc/changeling_unfat_sting + +/datum/power/changeling/boost_range + name = "Boost Range" + desc = "We evolve the ability to shoot our stingers at humans, with some preperation." + genomecost = 2 + allowduringlesserform = 1 + verbpath = /mob/proc/changeling_boost_range + +/datum/power/changeling/Epinephrine + name = "Epinephrine sacs" + desc = "We evolve additional sacs of adrenaline throughout our body." + helptext = "Gives the ability to instantly recover from stuns. High chemical cost." + genomecost = 3 + verbpath = /mob/proc/changeling_unstun + +/datum/power/changeling/ChemicalSynth + name = "Rapid Chemical-Synthesis" + desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster." + helptext = "Doubles the rate at which we naturally recharge chemicals." + genomecost = 4 + isVerb = 0 + verbpath = /mob/proc/changeling_fastchemical +/* +/datum/power/changeling/AdvChemicalSynth + name = "Advanced Chemical-Synthesis" + desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster." + helptext = "Doubles the rate at which we naturally recharge chemicals." + genomecost = 8 + isVerb = 0 + verbpath = /mob/proc/changeling_fastchemical +*/ +/datum/power/changeling/EngorgedGlands + name = "Engorged Chemical Glands" + desc = "Our chemical glands swell, permitting us to store more chemicals inside of them." + helptext = "Allows us to store an extra 25 units of chemicals." + genomecost = 4 + isVerb = 0 + verbpath = /mob/proc/changeling_engorgedglands + +/datum/power/changeling/DigitalCamoflague + name = "Digital Camoflauge" + desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras." + helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this." + genomecost = 1 + allowduringlesserform = 1 + verbpath = /mob/proc/changeling_digitalcamo + +/datum/power/changeling/rapidregeneration + name = "Rapid Regeneration" + desc = "We evolve the ability to rapidly regenerate, negating the need for stasis." + helptext = "Heals a moderate amount of damage every tick." + genomecost = 7 + verbpath = /mob/proc/changeling_rapidregen + + + +// Modularchangling, totally stolen from the new player panel. YAYY +/datum/changeling/proc/EvolutionMenu()//The new one + set category = "Changeling" + set desc = "Level up!" + + if(!usr || !usr.mind || !usr.mind.changeling) return + src = usr.mind.changeling + + if(!powerinstances.len) + for(var/P in powers) + powerinstances += new P() + + var/dat = "Changling Evolution Menu" + + //javascript, the part that does most of the work~ + dat += {" + + + + + + + "} + + //body tag start + onload and onkeypress (onkeyup) javascript event calls + dat += "" + + //title + search bar + dat += {" + + + + + + + + +
+ Changling Evolution Menu
+ Hover over a power to see more information
+ Current evolution points left to evolve with: [geneticpoints]
+ Absorb genomes to acquire more evolution points +

+

+ Search: +
+ + "} + + //player table header + dat += {" + + "} + + var/i = 1 + for(var/datum/power/changeling/P in powerinstances) + var/ownsthis = 0 + + if(P in purchasedpowers) + ownsthis = 1 + + + var/color = "#e6e6e6" + if(i%2 == 0) + color = "#f2f2f2" + + + dat += {" + + + + + + "} + + i++ + + + //player table ending + dat += {" +
+ + + Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost] + +
+
+
+ + + + "} + + usr << browse(dat, "window=powers;size=900x480") + + +/datum/changeling/Topic(href, href_list) + ..() + if(!ismob(usr)) + return + + if(href_list["P"]) + var/datum/mind/M = usr.mind + if(!istype(M)) + return + purchasePower(M, href_list["P"]) + call(/datum/changeling/proc/EvolutionMenu)() + + + +/datum/changeling/proc/purchasePower(var/datum/mind/M, var/Pname, var/remake_verbs = 1) + if(!M || !M.changeling) + return + + var/datum/power/changeling/Thepower = Pname + + + for (var/datum/power/changeling/P in powerinstances) + //world << "[P] - [Pname] = [P.name == Pname ? "True" : "False"]" + if(P.name == Pname) + Thepower = P + break + + + if(Thepower == null) + M.current << "This is awkward. Changeling power purchase failed, please report this bug to a coder!" + return + + if(Thepower in purchasedpowers) + M.current << "We have already evolved this ability!" + return + + + if(geneticpoints < Thepower.genomecost) + M.current << "We cannot evolve this... yet. We must acquire more DNA." + return + + geneticpoints -= Thepower.genomecost + + purchasedpowers += Thepower + + if(!Thepower.isVerb && Thepower.verbpath) + call(M.current, Thepower.verbpath)() + else if(remake_verbs) + M.current.make_changeling() + diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 4978cca7120..f482038f798 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -5,6 +5,5 @@ config_tag = "cult" required_players = 5 required_enemies = 3 - uplink_welcome = "Nar-Sie Uplink Console:" end_on_antag_death = 1 antag_tags = list(MODE_CULTIST) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index cc16d7cf41d..24754015fb2 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -1,5 +1,5 @@ /obj/item/weapon/melee/cultblade - name = "Cult Blade" + name = "cult blade" desc = "An arcane weapon wielded by the followers of Nar-Sie" icon_state = "cultblade" item_state = "cultblade" @@ -8,28 +8,41 @@ throwforce = 10 edge = 1 sharp = 1 + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") can_embed = 0 //can't get stuck anymore, because blood magic /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) +/obj/item/weapon/melee/cultblade/attack(mob/living/M, mob/living/user, var/target_zone) if(iscultist(user)) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) return ..() + + var/zone = (user.hand ? "l_arm":"r_arm") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/affecting = H.get_organ(zone) + user << "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!" else - user.Paralyse(5) - user << "\red An unexplicable force powerfully repels the sword from [target]!" - var/organ = ((user.hand ? "l_":"r_") + "arm") - var/obj/item/organ/external/affecting = user.get_organ(organ) - if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade. - user.UpdateDamageIcon() - return + user << "An unexplicable force rips through you, tearing the sword from your grasp!" + + //random amount of damage between half of the blade's force and the full force of the blade. + user.apply_damage(rand(force/2, force), BRUTE, zone, 0, sharp=1, edge=1) + user.Weaken(5) + + user.drop_from_inventory(src) + throw_at(get_edge_target_turf(src, pick(alldirs)), rand(1,3), throw_speed) + + var/spooky = pick('sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg', 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/wail.ogg') + playsound(loc, spooky, 50, 1) + + return 1 /obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) if(!iscultist(user)) - user << "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly." + user << "An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly." user.make_dizzy(120) @@ -38,7 +51,6 @@ icon_state = "culthood" desc = "A hood worn by the followers of Nar-Sie." flags_inv = HIDEFACE - flags = HEADCOVERSEYES body_parts_covered = HEAD|EYES armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) cold_protection = HEAD @@ -51,15 +63,12 @@ /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 + flags_inv = HIDEFACE | 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 name = "cult robes" @@ -91,7 +100,6 @@ name = "cult helmet" desc = "A space worthy helmet used by the followers of Nar-Sie" icon_state = "cult_helmet" - item_state = "cult_helmet" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0 diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index d70c181830a..59cf8f8856b 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -36,6 +36,7 @@ attackpylon(user, W.force) /obj/structure/cult/pylon/proc/attackpylon(mob/user as mob, var/damage) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!isbroken) if(prob(1+ damage * 5)) user.visible_message( @@ -138,7 +139,7 @@ var/mob/living/M = A if(M.stat != DEAD) - if(M.monkeyizing) + if(M.transforming) return if(M.has_brain_worms()) return //Borer stuff - RR @@ -146,7 +147,7 @@ if(iscultist(M)) return if(!ishuman(M) && !isrobot(M)) return - M.monkeyizing = 1 + M.transforming = 1 M.canmove = 0 M.icon = null M.overlays.len = 0 diff --git a/code/game/gamemodes/cult/cultify/obj.dm b/code/game/gamemodes/cult/cultify/obj.dm index 517c6079fd9..83dfc857be9 100644 --- a/code/game/gamemodes/cult/cultify/obj.dm +++ b/code/game/gamemodes/cult/cultify/obj.dm @@ -127,11 +127,6 @@ 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() // Make it a wood-reinforced wooden table. // There are cult materials available, but it'd make the table non-deconstructable with how holotables work. diff --git a/code/game/gamemodes/cult/cultify/turf.dm b/code/game/gamemodes/cult/cultify/turf.dm index 54fc9631e33..4506f49fccd 100644 --- a/code/game/gamemodes/cult/cultify/turf.dm +++ b/code/game/gamemodes/cult/cultify/turf.dm @@ -3,11 +3,9 @@ return /turf/simulated/floor/cultify() + //todo: flooring datum cultify check cultify_floor() -/turf/simulated/floor/carpet/cultify() - return - /turf/simulated/shuttle/floor/cultify() cultify_floor() @@ -39,8 +37,6 @@ 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/narsie.dm b/code/game/gamemodes/cult/narsie.dm index 0ef0d27663f..a3248a07e5b 100644 --- a/code/game/gamemodes/cult/narsie.dm +++ b/code/game/gamemodes/cult/narsie.dm @@ -70,8 +70,6 @@ var/global/list/narsie_list = list() mezzer() /obj/singularity/narsie/large/eat() - set background = BACKGROUND_ENABLED - for (var/turf/A in orange(consume_range, src)) consume(A) @@ -146,6 +144,7 @@ var/global/list/narsie_list = list() 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 = 'icons/turf/flooring/cult.dmi' T.icon_state = "cult-narsie" T.set_light(1) @@ -224,9 +223,9 @@ var/global/list/narsie_list = list() consume(AM2) continue - if (dist <= consume_range && !istype(A, /turf/space)) + if (dist <= consume_range && !istype(A, get_base_turf_by_area(A))) var/turf/T2 = A - T2.ChangeTurf(/turf/space) + T2.ChangeTurf(get_base_turf_by_area(A)) /obj/singularity/narsie/consume(const/atom/A) //This one is for the small ones. if(!(A.singuloCanEat())) @@ -266,9 +265,9 @@ var/global/list/narsie_list = list() spawn (0) AM2.singularity_pull(src, src.current_size) - if (dist <= consume_range && !istype(A, /turf/space)) + if (dist <= consume_range && !istype(A, get_base_turf_by_area(A))) var/turf/T2 = A - T2.ChangeTurf(/turf/space) + T2.ChangeTurf(get_base_turf_by_area(A)) /obj/singularity/narsie/ex_act(severity) //No throwing bombs at it either. --NEO return @@ -355,8 +354,6 @@ var/global/list/narsie_list = list() grav_pull = 0 /obj/singularity/narsie/wizard/eat() - set background = BACKGROUND_ENABLED - for (var/turf/T in trange(consume_range, src)) consume(T) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 3cd2ddef9ff..932719c8564 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -95,7 +95,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," 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!" + user << "You disrupt the vile magic with the deadening field of the null rod!" qdel(src) return return @@ -171,7 +171,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," else usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix.")) for (var/mob/V in viewers(src)) - V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2) + V.show_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2) return check_icon() @@ -355,8 +355,8 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," return M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] beats [] with the arcane tome!", user, M), 1) - M << "\red You feel searing heat inside!" + O.show_message("\The [user] beats \the [M] with \the [src]!", 1) + M << "You feel searing heat inside!" attack_self(mob/living/user as mob) @@ -371,7 +371,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," for(var/obj/effect/rune/N in world) C++ if (!istype(user.loc,/turf)) - user << "\red You do not have enough space to write a proper rune." + user << "You do not have enough space to write a proper rune." return if (C>=26 + runedec + cult.current_antagonists.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist @@ -455,7 +455,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," if (!chosen_rune) return if (chosen_rune == "none") - user << "\red You decide against scribing a rune, perhaps you should take this time to study your notes." + user << "You decide against scribing a rune, perhaps you should take this time to study your notes." return if (chosen_rune == "teleport") dictionary[chosen_rune] += input ("Choose a destination word") in english @@ -466,8 +466,8 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," return for (var/mob/V in viewers(src)) - V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2) - 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." + V.show_message("\The [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "You hear chanting.", 2) + user << "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) @@ -476,7 +476,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," return var/mob/living/carbon/human/H = user var/obj/effect/rune/R = new /obj/effect/rune(user.loc) - user << "\red You finish drawing the arcane markings of the Geometer." + user << "You finish drawing the arcane markings of the Geometer." var/list/required = dictionary[chosen_rune] R.word1 = english[required[1]] R.word2 = english[required[2]] @@ -524,7 +524,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," if(user) var/r if (!istype(user.loc,/turf)) - user << "\red You do not have enough space to write a proper rune." + user << "You do not have enough space to write a proper rune." var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun") r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. if(locate(/obj/effect/rune) in user.loc) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index d2b881d8913..1580d0b7111 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -7,6 +7,7 @@ attack_self(mob/living/user as mob) if(iscultist(user)) var/delete = 1 + // who the hell thought this was a good idea :( switch(imbue) if("newtome") call(/obj/effect/rune/proc/tomesummon)() @@ -28,7 +29,7 @@ if("blind") call(/obj/effect/rune/proc/blind)() if("runestun") - user << "\red To use this talisman, attack your target directly." + user << "To use this talisman, attack your target directly." return if("supply") supply() @@ -114,4 +115,4 @@ /obj/item/weapon/paper/talisman/supply imbue = "supply" - uses = 5 \ No newline at end of file + uses = 5 diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm index 05296b4f269..05b2d484376 100644 --- a/code/game/gamemodes/epidemic/epidemic.dm +++ b/code/game/gamemodes/epidemic/epidemic.dm @@ -33,7 +33,7 @@ ///////////////////////////////////////////////////////// /datum/game_mode/epidemic/send_intercept() - var/intercepttext = "CONFIDENTIAL REPORT
" + var/intercepttext = "CONFIDENTIAL REPORT
" virus_name = "X-[rand(1,99)]™" intercepttext += "Warning: Pathogen [virus_name] has been detected on [station_name()].

" intercepttext += "Code violet quarantine of [station_name()] put under immediate effect.
" @@ -60,10 +60,10 @@ var/extra_law = "Crew authorized to know of pathogen [virus_name]'s existence are: Heads of command. Do not allow unauthorized personnel to gain knowledge of [virus_name]. Aid authorized personnel in quarantining and neutrlizing the outbreak. This law overrides all other laws." for(var/mob/living/silicon/ai/M in world) M.add_ion_law(extra_law) - M << "\red " + extra_law + M << "[extra_law]" /datum/game_mode/epidemic/proc/announce_to_kill_crew() - var/intercepttext = "CONFIDENTIAL REPORT
" + var/intercepttext = "CONFIDENTIAL REPORT
" intercepttext += "PATHOGEN [virus_name] IS STILL PRESENT ON [station_name()]. IN COMPLIANCE WITH NANOTRASEN LAWS FOR INTERSTELLAR SAFETY, EMERGENCY SAFETY MEASURES HAVE BEEN AUTHORIZED. ALL INFECTED CREW MEMBERS ON [station_name()] ARE TO BE NEUTRALIZED AND DISPOSED OF IN A MANNER THAT WILL DESTROY ALL TRACES OF THE PATHOGEN. FAILURE TO COMPLY WILL RESULT IN IMMEDIATE DESTRUCTION OF [station_name].
" intercepttext += "CRUISER WILL ARRIVE IN [round(cruiser_seconds()/60)] MINUTES
" @@ -90,8 +90,8 @@ crew += H if(crew.len < 2) - world << "\red There aren't enough players for this mode!" - world << "\red Rebooting world in 5 seconds." + world << "There aren't enough players for this mode!" + world << "Rebooting world in 5 seconds." if(blackbox) blackbox.save_all_data_to_sql() @@ -181,10 +181,10 @@ for(var/mob/M in world) if(M.client) M << 'sound/machines/Alarm.ogg' - world << "\blueIncoming missile detected.. Impact in 10.." + world << "Incoming missile detected.. Impact in 10.." for (var/i=9 to 1 step -1) sleep(10) - world << "\blue[i].." + world << "[i].." sleep(10) enter_allowed = 0 if(ticker) @@ -202,9 +202,9 @@ /datum/game_mode/epidemic/declare_completion() if(finished == 1) feedback_set_details("round_end_result","win - epidemic cured") - world << "\red The virus outbreak was contained! The crew wins!" + world << " The virus outbreak was contained! The crew wins!" else if(finished == 2) feedback_set_details("round_end_result","loss - rev heads killed") - world << "\red The crew succumbed to the epidemic!" + world << " The crew succumbed to the epidemic!" ..() - return 1 \ No newline at end of file + return 1 diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index a5ad03b6228..80ca2e7fc68 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -102,6 +102,8 @@ if(15) communications_blackout() */ +var/eventchance = 10 // Percent chance per 5 minutes. +var/hadevent = 0 /proc/appendicitis() for(var/mob/living/carbon/human/H in living_mob_list) @@ -351,79 +353,79 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is switch(rand(1,14)) if(1) M << "
" - M << "\red THERE ARE [amount] [who2] ON THE STATION...LAWS UPDATED" + M << "THERE ARE [amount] [who2] ON THE STATION...LAWS UPDATED" M << "
" M.add_ion_law("THERE ARE [amount] [who2] ON THE STATION") if(2) M << "
" - M << "\red [what2] ARE DANGEROUS TO HUMANS...LAWS UPDATED" + M << "[what2] ARE DANGEROUS TO HUMANS...LAWS UPDATED" M << "
" M.add_ion_law("[what2] ARE DANGEROUS TO HUMANS") if(3) M << "
" - M << "\red THE ESCAPE-SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION...LAWS UPDATED" + M << "THE ESCAPE-SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION...LAWS UPDATED" M << "
" M.add_ion_law("THE ESCAPE SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION") if(4) M << "
" - M << "\red HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE...LAWS UPDATED" + M << "HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE...LAWS UPDATED" M << "
" M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE") if(5) M << "
" - M << "\red THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED" + M << "THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED" M << "
" M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]") if(6) M << "
" - M << "\red THE STATION IS BUILT FOR [who2]...LAWS UPDATED" + M << "THE STATION IS BUILT FOR [who2]...LAWS UPDATED" M << "
" M.add_ion_law("THE STATION IS BUILT FOR [who2]") if(7) M << "
" - M << "\red YOU ARE [amount] [who2]...LAWS UPDATED" + M << "YOU ARE [amount] [who2]...LAWS UPDATED" M << "
" M.add_ion_law("YOU ARE [amount] [who2]") if(8) M << "
" - M << "\red YOU MUST ALWAYS [aimust]...LAWS UPDATED" + M << "YOU MUST ALWAYS [aimust]...LAWS UPDATED" M << "
" M.add_ion_law("YOU MUST ALWAYS [aimust]") if(9) M << "
" - M << "\red [area] [area2] [amount] [what2]...LAWS UPDATED" + M << "[area] [area2] [amount] [what2]...LAWS UPDATED" M << "
" M.add_ion_law("[area] [area2] [amount] [what2]") if(10) M << "
" - M << "\red [crew] is [target]...LAWS UPDATED" + M << "[crew] is [target]...LAWS UPDATED" M << "
" M.add_ion_law("[crew] is [target]") if(11) M << "
" - M << "\red [define] IS A FORM OF HARM...LAWS UPDATED" + M << "[define] IS A FORM OF HARM...LAWS UPDATED" M << "
" M.add_ion_law("[define] IS A FORM OF HARM") if(12) M << "
" - M << "\red YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED" + M << "YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED" M << "
" M.add_ion_law("YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS") if(13) M << "
" - M << "\red [crew] is [allergysev] to [allergy]...LAWS UPDATED" + M << "[crew] is [allergysev] to [allergy]...LAWS UPDATED" M << "
" M.add_ion_law("[crew] is [allergysev] to [allergy]") if(14) M << "
" - M << "\red THE STATION IS [who2pref] [who2]...LAWS UPDATED" + M << "THE STATION IS [who2pref] [who2]...LAWS UPDATED" M << "
" M.add_ion_law("THE STATION IS [who2pref] [who2]") if(botEmagChance) for(var/obj/machinery/bot/bot in machines) if(prob(botEmagChance)) - bot.Emag() + bot.emag_act(1) /* diff --git a/code/game/gamemodes/events/black_hole.dm b/code/game/gamemodes/events/black_hole.dm index 60ab8a692fa..a8b0071f657 100644 --- a/code/game/gamemodes/events/black_hole.dm +++ b/code/game/gamemodes/events/black_hole.dm @@ -24,8 +24,11 @@ qdel(M) for(var/obj/O in orange(1,src)) qdel(O) + var/base_turf = get_base_turf_by_area(src) for(var/turf/simulated/ST in orange(1,src)) - ST.ChangeTurf(/turf/space) + if(ST.type == base_turf) + continue + ST.ChangeTurf(base_turf) sleep(6) grav(10, 4, 10, 0 ) @@ -84,5 +87,6 @@ //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 + var/base_turf = get_base_turf_by_area(src) + if(ST.type != base_turf) + ST.ChangeTurf(base_turf) diff --git a/code/game/gamemodes/events/clang.dm b/code/game/gamemodes/events/clang.dm index 74fb9ee5079..fdc955718ba 100644 --- a/code/game/gamemodes/events/clang.dm +++ b/code/game/gamemodes/events/clang.dm @@ -34,7 +34,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 else if (istype(clong, /mob)) if(clong.density || prob(10)) - clong.meteorhit(src) + clong.ex_act(2) else qdel(src) diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index 4e064d8be6f..bb8e34364cb 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -53,6 +53,7 @@ The "dust" will damage the hull of the station causin minor hull breaches. New() + ..() var/startx = 0 var/starty = 0 var/endy = 0 @@ -89,6 +90,8 @@ The "dust" will damage the hull of the station causin minor hull breaches. walk_towards(src, goal, 1) return + touch_map_edge() + qdel(src) Bump(atom/A) spawn(0) @@ -100,7 +103,7 @@ The "dust" will damage the hull of the station causin minor hull breaches. playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) if(ismob(A)) - A.meteorhit(src)//This should work for now I guess + A.ex_act(strength)//This should work for now I guess else if(!istype(A,/obj/machinery/power/emitter) && !istype(A,/obj/machinery/field_generator)) //Protect the singularity from getting released every round! A.ex_act(strength) //Changing emitter/field gen ex_act would make it immune to bombs and C4 diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm index cab426e455f..c7851b9af10 100644 --- a/code/game/gamemodes/events/holidays/Holidays.dm +++ b/code/game/gamemodes/events/holidays/Holidays.dm @@ -133,7 +133,7 @@ var/global/Holiday = null world.update_status() Holiday_Game_Start() - message_admins("\blue ADMIN: Event: [key_name(src)] force-set Holiday to \"[Holiday]\"") + message_admins("ADMIN: Event: [key_name(src)] force-set Holiday to \"[Holiday]\"") log_admin("[key_name(src)] force-set Holiday to \"[Holiday]\"") @@ -174,7 +174,7 @@ var/global/Holiday = null if(isNotStationLevel(S.z)) continue containers += S - message_admins("\blue DEBUG: Event: Egg spawned at [Egg.loc] ([Egg.x],[Egg.y],[Egg.z])")*/ + message_admins("DEBUG: Event: Egg spawned at [Egg.loc] ([Egg.x],[Egg.y],[Egg.z])")*/ if("End of the World") if(prob(eventchance)) GameOver() diff --git a/code/game/gamemodes/events/miniblob.dm b/code/game/gamemodes/events/miniblob.dm deleted file mode 100644 index 93fbbb8c2dd..00000000000 --- a/code/game/gamemodes/events/miniblob.dm +++ /dev/null @@ -1,28 +0,0 @@ -/proc/mini_blob_event() - - var/turf/T = pick(blobstart) - var/obj/effect/blob/core/bl = new /obj/effect/blob/core(T, 200) - spawn(0) - bl.Life() - bl.Life() - bl.Life() - blobevent = 1 - spawn(0) - dotheblobbaby() - spawn(3000) - blobevent = 0 - spawn(rand(1000, 2000)) //Delayed announcements to keep the crew on their toes. - command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg') - -/proc/dotheblobbaby() - if (blobevent) - if(blob_cores.len) - for(var/i = 1 to 5) - sleep(-1) - if(!blob_cores.len) break - var/obj/effect/blob/B = pick(blob_cores) - if(isNotStationLevel(B.z)) - continue - B.Life() - spawn(30) - dotheblobbaby() \ No newline at end of file diff --git a/code/game/gamemodes/events/power_failure.dm b/code/game/gamemodes/events/power_failure.dm index 0f7d6149d30..af004b00c54 100644 --- a/code/game/gamemodes/events/power_failure.dm +++ b/code/game/gamemodes/events/power_failure.dm @@ -1,27 +1,15 @@ -/proc/power_failure(var/announce = 1) +/proc/power_failure(var/announce = 1, var/severity = 2) if(announce) command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg') - var/list/skipped_areas = list(/area/turret_protected/ai) - - for(var/obj/machinery/power/smes/S in world) - var/area/current_area = get_area(S) - if(current_area.type in skipped_areas || !(S.z in config.station_levels)) - continue - S.last_charge = S.charge - S.last_output_attempt = S.output_attempt - S.last_input_attempt = S.input_attempt - S.charge = 0 - S.inputting(0) - S.outputting(0) - S.update_icon() - S.power_change() + for(var/obj/machinery/power/smes/buildable/S in world) + S.energy_fail(rand(15 * severity,30 * severity)) for(var/obj/machinery/power/apc/C in world) - if(!C.is_critical && C.cell && (C.z in config.station_levels)) - C.cell.charge = 0 + if(!C.is_critical) + C.energy_fail(rand(30 * severity,60 * severity)) /proc/power_restore(var/announce = 1) var/list/skipped_areas = list(/area/turret_protected/ai) @@ -35,9 +23,7 @@ var/area/current_area = get_area(S) if(current_area.type in skipped_areas || isNotStationLevel(S.z)) continue - S.charge = S.last_charge - S.output_attempt = S.last_output_attempt - S.input_attempt = S.last_input_attempt + S.charge = S.capacity S.update_icon() S.power_change() diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index e0b1159928e..0bd03df916c 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -35,92 +35,8 @@ var/global/list/additional_antag_types = list() var/event_delay_mod_moderate // Modifies the timing of random events. var/event_delay_mod_major // As above. - var/uplink_welcome = "Illegal Uplink Console:" - var/uplink_uses = 12 - var/list/datum/uplink_item/uplink_items = list( - "Ammunition" = list( - new/datum/uplink_item(/obj/item/ammo_magazine/a357, 2, ".357", "RA"), - new/datum/uplink_item(/obj/item/ammo_magazine/mc9mm, 2, "9mm", "R9"), - new/datum/uplink_item(/obj/item/ammo_magazine/chemdart, 2, "Darts", "AD"), - new/datum/uplink_item(/obj/item/weapon/storage/box/sniperammo, 2, "14.5mm", "SA"), - new/datum/uplink_item(/obj/item/ammo_magazine/tommymag, 2, "Tommygun Magazine (.45)", "TMM"), - new/datum/uplink_item(/obj/item/ammo_magazine/tommydrum, 3, "Tommygun Drum Magazine (.45)", "TMD") - ), - "Highly Visible and Dangerous Weapons" = list( - new/datum/uplink_item(/obj/item/weapon/storage/box/emps, 3, "5 EMP Grenades", "EM"), - new/datum/uplink_item(/obj/item/weapon/melee/energy/sword, 4, "Energy Sword", "ES"), - new/datum/uplink_item(/obj/item/weapon/gun/projectile/dartgun, 5, "Dart Gun", "DG"), - new/datum/uplink_item(/obj/item/weapon/gun/energy/crossbow, 5, "Energy Crossbow", "XB"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/g9mm, 5, "Silenced 9mm", "S9"), - new/datum/uplink_item(/obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser, 6, "Exosuit Rigged Laser", "RL"), - new/datum/uplink_item(/obj/item/weapon/gun/projectile/revolver, 6, "Revolver", "RE"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndicate, 10, "Mercenary Bundle", "BU"), - new/datum/uplink_item(/obj/item/weapon/gun/projectile/heavysniper, 12, "Anti-materiel Rifle", "AMR"), - new/datum/uplink_item(/obj/item/clothing/gloves/force/syndicate, 4, "Force Gloves", "FG"), - new/datum/uplink_item(/obj/item/weapon/gun/projectile/automatic/tommygun, 7, "Tommy Gun", "TMG"), - new/datum/uplink_item(/obj/item/weapon/grenade/spawnergrenade/manhacks, 2, "Manhack Delivery Grenade", "MH"), - ), - "Stealthy and Inconspicuous Weapons" = list( - new/datum/uplink_item(/obj/item/weapon/soap/syndie, 1, "Subversive Soap", "SP"), - new/datum/uplink_item(/obj/item/weapon/cane/concealed, 2, "Concealed Cane Sword", "CC"), - new/datum/uplink_item(/obj/item/weapon/cartridge/syndicate, 3, "Detomatix PDA Cartridge", "DC"), - new/datum/uplink_item(/obj/item/weapon/pen/reagent/paralysis, 3, "Paralysis Pen", "PP"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/cigarette, 4, "Cigarette Kit", "BH"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/toxin, 4, "Random Toxin - Beaker", "RT") - ), - "Stealth and Camouflage Items" = list( - new/datum/uplink_item(/obj/item/weapon/card/id/syndicate, 2, "Agent ID card", "AC"), - new/datum/uplink_item(/obj/item/clothing/shoes/syndigaloshes, 2, "No-Slip Shoes", "SH"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/spy, 2, "Bug Kit", "BK"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/chameleon, 3, "Chameleon Kit", "CB"), - new/datum/uplink_item(/obj/item/device/chameleon, 4, "Chameleon-Projector", "CP"), - new/datum/uplink_item(/obj/item/clothing/mask/gas/voice, 4, "Voice Changer", "VC"), - new/datum/uplink_item(/obj/item/weapon/disk/file/cameras/syndicate, 6, "Camera Network Access - Floppy", "SF") - ), - "Devices and Tools" = list( - new/datum/uplink_item(/obj/item/weapon/storage/toolbox/syndicate, 1, "Fully Loaded Toolbox", "ST"), - new/datum/uplink_item(/obj/item/weapon/plastique, 2, "C-4 (Destroys walls)", "C4"), - new/datum/uplink_item(/obj/item/device/encryptionkey/syndicate, 2, "Encrypted Radio Channel Key", "ER"), - new/datum/uplink_item(/obj/item/device/radiojammer, 2, "Small Radio Jammer", "RJ"), - new/datum/uplink_item(/obj/item/device/encryptionkey/binary, 3, "Binary Translator Key", "BT"), - new/datum/uplink_item(/obj/item/weapon/card/emag, 3, "Cryptographic Sequencer", "EC"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/clerical, 3, "Morphic Clerical Kit", "CK"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/space, 3, "Space Suit", "SS"), - new/datum/uplink_item(/obj/item/clothing/glasses/thermal/syndi, 3, "Thermal Imaging Glasses", "TM"), - new/datum/uplink_item(/obj/item/clothing/suit/storage/vest/heavy/merc, 4, "Heavy Armor Vest", "HAV"), - new/datum/uplink_item(/obj/item/weapon/aiModule/syndicate, 7, "Hacked AI Upload Module", "AI"), - new/datum/uplink_item(/obj/item/device/powersink, 5, "Powersink (DANGER!)", "PS",), - new/datum/uplink_item(/obj/item/device/radio/beacon/syndicate, 7, "Singularity Beacon (DANGER!)", "SB"), - new/datum/uplink_item(/obj/item/weapon/circuitboard/teleporter, 20, "Teleporter Circuit Board", "TP"), - new/datum/uplink_item(/obj/item/weapon/antag_spawner/borg_tele, 14, "Syndicate Cyborg Teleporter", "SCT", newBuyCheck = /proc/can_buy_syndieborg) - ), - "Implants" = list( - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_freedom, 3, "Freedom Implant", "FI"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_compress, 4, "Compressed Matter Implant", "CI"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_explosive, 6, "Explosive Implant (DANGER!)", "EI"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_uplink, 10, "Uplink Implant (Contains 5 Telecrystals)", "UI") - ), - "Medical" = list( - new/datum/uplink_item(/obj/item/weapon/storage/box/sinpockets, 1, "Box of Sin-Pockets", "DP"), - new/datum/uplink_item(/obj/item/weapon/storage/firstaid/surgery, 5, "Surgery kit", "SK"), - new/datum/uplink_item(/obj/item/weapon/storage/firstaid/combat, 5, "Combat medical kit", "CM"), - new/datum/uplink_item(/obj/item/weapon/reagent_containers/hypospray/combat, 4, "Combat Hypospray", "CH") - ), - "Hardsuit Modules" = list( - new/datum/uplink_item(/obj/item/rig_module/vision/thermal, 2, "Thermal Scanner", "RTS"), - new/datum/uplink_item(/obj/item/rig_module/fabricator/energy_net, 3, "Net Projector", "REN"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/ewar_voice, 4, "Electrowarfare Suite and Voice Synthesiser", "REV"), - new/datum/uplink_item(/obj/item/rig_module/maneuvering_jets, 4, "Maneuvering Jets", "RMJ"), - new/datum/uplink_item(/obj/item/rig_module/mounted/egun, 6, "Mounted Energy Gun", "REG"), - new/datum/uplink_item(/obj/item/rig_module/power_sink, 6, "Power Sink", "RPS"), - new/datum/uplink_item(/obj/item/rig_module/mounted, 8, "Mounted Laser Cannon", "RLC") - ), - "(Pointless) Badassery" = list( - new/datum/uplink_item(/obj/item/toy/syndicateballoon, 10, "For showing that You Are The BOSS (Useless Balloon)", "BS"), - new/datum/uplink_item(/obj/item/toy/nanotrasenballoon, 10, "For showing that you love NT SOO much (Useless Balloon)", "NT") - ) - ) + // #TODO-MERGE: Check where uplink shit is hidden now. /datum/game_mode/New() ..() @@ -378,11 +294,13 @@ var/global/list/additional_antag_types = list() sleep(10) antag.check_victory() antag.print_player_summary() - // Avoid the longest loop if we aren't actively using the bot. if (discord_bot.active) discord_text += antag.print_player_summary_discord() + sleep(10) + print_ownerless_uplinks() + discord_bot.send_to_announce(discord_text) discord_text = "" @@ -491,8 +409,8 @@ var/global/list/additional_antag_types = list() if (special_role in disregard_roles) continue - else if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \ - man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20)) + else if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED && prob(50) || \ + man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(20)) suspects += man // Antags else if(special_role_data && prob(special_role_data.suspicion_chance)) @@ -536,7 +454,7 @@ var/global/list/additional_antag_types = list() continue if(istype(player, /mob/new_player)) continue - if(!role || (player.client.prefs.be_special & role)) + if(!role || (role in player.client.prefs.be_special_role)) log_debug("[player.key] had [antag_id] enabled, so we are drafting them.") candidates |= player.mind else @@ -547,7 +465,7 @@ var/global/list/additional_antag_types = list() // Get a list of all the people who want to be the antagonist for this round for(var/mob/new_player/player in players) - if(!role || (player.client.prefs.be_special & role)) + if(!role || (role in player.client.prefs.be_special_role)) log_debug("[player.key] had [antag_id] enabled, so we are drafting them.") candidates += player.mind players -= player @@ -604,7 +522,7 @@ var/global/list/additional_antag_types = list() //Reports player logouts// ////////////////////////// proc/display_roundstart_logout_report() - var/msg = "\blue Roundstart logout report\n\n" + var/msg = "Roundstart logout report\n\n" for(var/mob/living/L in mob_list) if(L.ckey) @@ -621,9 +539,6 @@ proc/display_roundstart_logout_report() msg += "[L.name] ([L.ckey]), the [L.job] (Connected, Inactive)\n" continue //AFK client if(L.stat) - if(L.suiciding) //Suicider - msg += "[L.name] ([L.ckey]), the [L.job] (Suicide)\n" - continue //Disconnected client if(L.stat == UNCONSCIOUS) msg += "[L.name] ([L.ckey]), the [L.job] (Dying)\n" continue //Unconscious @@ -635,12 +550,8 @@ proc/display_roundstart_logout_report() for(var/mob/dead/observer/D in mob_list) if(D.mind && (D.mind.original == L || D.mind.current == L)) if(L.stat == DEAD) - if(L.suiciding) //Suicider - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Suicide)\n" - continue //Disconnected client - else - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" - continue //Dead mob, ghost abandoned + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" + continue //Dead mob, ghost abandoned else if(D.can_reenter_corpse) msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Adminghosted)\n" @@ -649,6 +560,8 @@ proc/display_roundstart_logout_report() msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n" continue //Ghosted while alive + msg += "" // close the span from right at the top + for(var/mob/M in mob_list) if(M.client && M.client.holder) M << msg @@ -657,9 +570,9 @@ proc/get_nt_opposed() var/list/dudes = list() for(var/mob/living/carbon/human/man in player_list) if(man.client) - if(man.client.prefs.nanotrasen_relation == "Opposed") + if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED) dudes += man - else if(man.client.prefs.nanotrasen_relation == "Skeptical" && prob(50)) + else if(man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(50)) dudes += man if(dudes.len == 0) return null return pick(dudes) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index fe16c4251ee..9b60a9043d2 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -51,7 +51,7 @@ var/global/datum/controller/gameticker/ticker for(var/i=0, i<10, i++) sleep(1) vote.process() - if(going) + if(round_progressing) pregame_timeleft-- if(pregame_timeleft == config.vote_autogamemode_timeleft) if(!vote.time_remaining) @@ -156,8 +156,6 @@ var/global/datum/controller/gameticker/ticker processScheduler.start() - for(var/obj/multiz/ladder/L in world) L.connect() //Lazy hackfix for ladders. TODO: move this to an actual controller. ~ Z - if(config.sql_enabled) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE @@ -328,14 +326,17 @@ var/global/datum/controller/gameticker/ticker spawn(50) callHook("roundend") - if (mode.station_was_nuked) - feedback_set_details("end_proper","nuke") + if (universe_has_ended) + if(mode.station_was_nuked) + feedback_set_details("end_proper","nuke") + else + feedback_set_details("end_proper","universe destroyed") if(!delay_end) - world << "\blue Rebooting due to destruction of station in [restart_timeout/10] seconds" + world << "Rebooting due to destruction of station in [restart_timeout/10] seconds" else feedback_set_details("end_proper","proper completion") if(!delay_end) - world << "\blue Restarting in [restart_timeout/10] seconds" + world << "Restarting in [restart_timeout/10] seconds" if(blackbox) @@ -346,9 +347,9 @@ var/global/datum/controller/gameticker/ticker if(!delay_end) world.Reboot() else - world << "\blue An admin has delayed the round end" + world << "An admin has delayed the round end" else - world << "\blue An admin has delayed the round end" + world << "An admin has delayed the round end" else if (mode_finished) post_game = 1 @@ -358,7 +359,7 @@ var/global/datum/controller/gameticker/ticker //call a transfer shuttle vote spawn(50) if(!round_end_announced) // Spam Prevention. Now it should announce only once. - world << "\red The round has ended!" + world << "The round has ended!" round_end_announced = 1 vote.autotransfer() diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index fa7c9ef033f..8c5e7725c6d 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -9,14 +9,16 @@ VOX HEIST ROUNDTYPE required_players = 15 required_enemies = 4 round_description = "An unidentified bluespace signature has slipped past the Icarus and is approaching the station!" - extended_round_description = "The galaxy is a place full of dangers, even the inner colonies are not free of such scourges. \ - Raiders and pirates are a well-know threat in the inhabited space, and places such as space stations are easy targets \ - for their greedy plans." + extended_round_description = "The Company's majority control of phoron in Nyx has marked the \ + station to be a highly valuable target for many competing organizations and individuals. Being a \ + colony of sizable population and considerable wealth causes it to often be the target of various \ + attempts of robbery, fraud and other malicious actions." end_on_antag_death = 1 antag_tags = list(MODE_RAIDER) /datum/game_mode/heist/check_finished() - var/datum/shuttle/multi_shuttle/skipjack = shuttle_controller.shuttles["Skipjack"] - if (skipjack && skipjack.returned_home) - return 1 - return ..() + if(!..()) + var/datum/shuttle/multi_shuttle/skipjack = shuttle_controller.shuttles["Skipjack"] + if (skipjack && skipjack.returned_home) + return 1 + return 0 diff --git a/code/game/gamemodes/malfunction/malf_hardware.dm b/code/game/gamemodes/malfunction/malf_hardware.dm index b33a5e49d8d..864ba0722de 100644 --- a/code/game/gamemodes/malfunction/malf_hardware.dm +++ b/code/game/gamemodes/malfunction/malf_hardware.dm @@ -60,11 +60,6 @@ /datum/malf_hardware/strong_turrets/install() ..() - for(var/obj/machinery/turret/T in machines) - T.maxhealth = round(initial(T.maxhealth) * 1.4) - T.shot_delay = round(initial(T.shot_delay) / 2) - T.auto_repair = 1 - T.active_power_usage = round(initial(T.active_power_usage) * 5) for(var/obj/machinery/porta_turret/T in machines) T.maxhealth = round(initial(T.maxhealth) * 1.4) T.shot_delay = round(initial(T.shot_delay) / 2) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 22b6751d1dc..ae3f2ca15aa 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -2,7 +2,6 @@ name = "AI malfunction" round_description = "The AI is behaving abnormally and must be stopped." extended_round_description = "The AI will attempt to hack the APCs around the station in order to gain as much control as possible." - uplink_welcome = "Crazy AI Uplink Console:" config_tag = "malfunction" required_players = 2 required_enemies = 1 diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm index 4242d03b417..dd809002e88 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm @@ -40,7 +40,7 @@ /datum/game_mode/malfunction/verb/recall_shuttle() set name = "Recall Shuttle" - set desc = "25 CPU - Sends termination signal to CentCom quantum relay aborting current shuttle call." + set desc = "25 CPU - Sends termination signal to quantum relay aborting current shuttle call." set category = "Software" var/price = 25 var/mob/living/silicon/ai/user = usr diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm index 8f213f9b0e7..608a098f9e6 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm @@ -86,7 +86,7 @@ /datum/game_mode/malfunction/verb/advanced_encryption_hack() set category = "Software" set name = "Advanced Encryption Hack" - set desc = "75 CPU - Attempts to bypass encryption on Central Command Quantum Relay, giving you ability to fake centcom messages. Has chance of failing." + set desc = "75 CPU - Attempts to bypass encryption on the Command Quantum Relay, giving you ability to fake legitimate messages. Has chance of failing." var/price = 75 var/mob/living/silicon/ai/user = usr diff --git a/code/game/gamemodes/meme/meme.dm b/code/game/gamemodes/meme/meme.dm index 962d6a84f68..4e0c0d8caa9 100644 --- a/code/game/gamemodes/meme/meme.dm +++ b/code/game/gamemodes/meme/meme.dm @@ -125,7 +125,7 @@ */ /datum/game_mode/proc/greet_meme(var/datum/mind/meme, var/you_are=1) if (you_are) - meme.current << "\red You are a meme!" + meme.current << "You are a meme!" show_objectives(meme) return diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 335360d40d0..2f627fae939 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -7,15 +7,16 @@ config_tag = "meteor" required_players = 0 votable = 0 - uplink_welcome = "EVIL METEOR Uplink Console:" deny_respawn = 1 + var/next_wave = METEOR_DELAY /datum/game_mode/meteor/post_setup() defer_powernet_rebuild = 2//Might help with the lag ..() /datum/game_mode/meteor/process() - if(world.time >= METEOR_DELAY) + if(world.time >= next_wave) + next_wave = world.time + meteor_wave_delay spawn() spawn_meteors(6) /datum/game_mode/meteor/declare_completion() diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index cfa657fd5b9..f8922723c97 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -4,19 +4,6 @@ /var/const/meteors_in_wave = 50 /var/const/meteors_in_small_wave = 10 -/proc/meteor_wave(var/number = meteors_in_wave) - if (number == 0) - return - - if(!ticker || wavesecret) - return - - wavesecret = 1 - for(var/i = 0 to number) - spawn(rand(10,100)) - spawn_meteor() - spawn(meteor_wave_delay) - wavesecret = 0 /proc/spawn_meteors(var/number = meteors_in_small_wave) for(var/i = 0; i < number; i++) @@ -117,7 +104,7 @@ spawn(0) if (A) - A.meteorhit(src) + A.ex_act(2) playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) if (istype(A, /obj/effect/energy_field))//If a normal/small meteor impacts an energy field, then it makes a widely audible impact sound and qdels diff --git a/code/game/gamemodes/mixed/bughunt.dm b/code/game/gamemodes/mixed/bughunt.dm new file mode 100644 index 00000000000..45365db328d --- /dev/null +++ b/code/game/gamemodes/mixed/bughunt.dm @@ -0,0 +1,13 @@ +/datum/game_mode/bughunt + name = "Bughunt" + round_description = "A mercenary strike force is approaching the station to eradicate a xenomorph infestation!" + extended_round_description = "Mercenaries and xenomorphs spawn in this game mode." + config_tag = "bughunt" + required_players = 15 + required_enemies = 1 + end_on_antag_death = 1 + antag_tags = list(MODE_XENOMORPH, MODE_DEATHSQUAD) + auto_recall_shuttle = 1 + ert_disabled = 1 + require_all_templates = 1 + votable = 0 \ No newline at end of file diff --git a/code/game/gamemodes/mixed/conflux.dm b/code/game/gamemodes/mixed/conflux.dm new file mode 100644 index 00000000000..1923c3fbf92 --- /dev/null +++ b/code/game/gamemodes/mixed/conflux.dm @@ -0,0 +1,11 @@ +/datum/game_mode/conflux + name = "conflux" + round_description = "A space wizard and a cult have invaded the station!" + extended_round_description = "Cultists and wizards spawn during this round." + config_tag = "conflux" + required_players = 15 + required_enemies = 5 + end_on_antag_death = 1 + antag_tags = list(MODE_WIZARD, MODE_CULTIST) + require_all_templates = 1 + votable = 0 \ No newline at end of file diff --git a/code/game/gamemodes/mixed/infestation.dm b/code/game/gamemodes/mixed/infestation.dm new file mode 100644 index 00000000000..71e9ebe180b --- /dev/null +++ b/code/game/gamemodes/mixed/infestation.dm @@ -0,0 +1,16 @@ +/datum/game_mode/infestation + name = "infestation" + round_description = "There's something in the walls!" + extended_round_description = "Two alien antagonists (Xenomorphs, Cortical Borers or Changelings) may spawn during this round." + config_tag = "infestation" + required_players = 15 + required_enemies = 5 + end_on_antag_death = 1 + antag_tags = list(MODE_BORER, MODE_XENOMORPH, MODE_CHANGELING) + require_all_templates = 1 + votable = 0 + +/datum/game_mode/infestation/create_antagonists() + // Two of the three. + antag_tags -= pick(antag_tags) + ..() \ No newline at end of file diff --git a/code/game/gamemodes/mixed/paranoia.dm b/code/game/gamemodes/mixed/paranoia.dm new file mode 100644 index 00000000000..de7a9d153e7 --- /dev/null +++ b/code/game/gamemodes/mixed/paranoia.dm @@ -0,0 +1,11 @@ +/datum/game_mode/paranoia + name = "paranoia" + round_description = "The AI has malfunctioned, and subversive elements infest the crew..." + extended_round_description = "Rampant AIs, renegades and changelings spawn in this mode." + config_tag = "paranoia" + required_players = 2 + required_enemies = 1 + end_on_antag_death = 1 + require_all_templates = 1 + votable = 0 + antag_tags = list(MODE_MALFUNCTION, MODE_RENEGADE, MODE_CHANGELING) diff --git a/code/game/gamemodes/mixed/traitorling.dm b/code/game/gamemodes/mixed/traitorling.dm new file mode 100644 index 00000000000..6972aee5540 --- /dev/null +++ b/code/game/gamemodes/mixed/traitorling.dm @@ -0,0 +1,10 @@ +/datum/game_mode/traitorling + name = "traitorling" + round_description = "There are traitors and alien changelings on the station. Do not let the changelings succeed!" + extended_round_description = "Traitors and changelings both spawn during this mode." + config_tag = "traitorling" + required_players = 10 + required_enemies = 5 + end_on_antag_death = 1 + require_all_templates = 1 + antag_tags = list(MODE_CHANGELING, MODE_TRAITOR) diff --git a/code/game/gamemodes/mixed/uprising.dm b/code/game/gamemodes/mixed/uprising.dm new file mode 100644 index 00000000000..9dad2ecfa97 --- /dev/null +++ b/code/game/gamemodes/mixed/uprising.dm @@ -0,0 +1,11 @@ +/datum/game_mode/uprising + name = "uprising" + config_tag = "uprising" + round_description = "Some crewmembers are attempting to start a revolution while a cult plots in the shadows!" + extended_round_description = "Cultists and revolutionaries spawn in this round." + required_players = 15 + required_enemies = 3 + end_on_antag_death = 1 + antag_tags = list(MODE_REVOLUTIONARY, MODE_LOYALIST, MODE_CULTIST) + require_all_templates = 1 + votable = 0 \ No newline at end of file diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm index 1aba2f1928e..46c95c969c8 100644 --- a/code/game/gamemodes/ninja/ninja.dm +++ b/code/game/gamemodes/ninja/ninja.dm @@ -1,7 +1,13 @@ /datum/game_mode/ninja name = "ninja" round_description = "An agent of the Spider Clan is onboard the station!" - extended_round_description = "What was that?! Was that a person or did your eyes just play tricks on you? You have no idea. That slim-suited, cryptic individual is an enigma to you and all of your knowledge. Their purpose is unknown. Their mission is unknown. How they arrived to this secure and isolated section of the galaxy, you don't know. What you do know is that there is a silent shadow-stalker piercing through the defenses of Nanotrasen with technological capabilities eons ahead of your time. They can avoid the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and only hope this unknown assassin isn't here for you." + extended_round_description = "What was that?! Was that a person or did your eyes just play tricks on you? \ + You have no idea. That slim-suited, cryptic individual is an enigma to you and all of your knowledge. \ + Their purpose is unknown. Their mission is unknown. How they arrived to this secure and isolated \ + section of the galaxy, you don't know. What you do know is that there is a silent shadow-stalker piercing \ + through the defenses of the station with technological capabilities eons ahead of your time. They can avoid \ + the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and \ + only hope this unknown assassin isn't here for you." config_tag = "ninja" required_players = 1 required_enemies = 1 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 1eaefc57ec6..ff3290db431 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -2,21 +2,36 @@ MERCENARY ROUNDTYPE */ +var/list/nuke_disks = list() + /datum/game_mode/nuclear name = "Mercenary" round_description = "A mercenary strike force is approaching the station!" - extended_round_description = "NanoTrasen's wealth and success created several enemies over the years and many seek to undermine them using illegal ways. Their crown jewel research stations are not safe from those malicious activities." + extended_round_description = "The Company's majority control of phoron in Nyx has marked the \ + station to be a highly valuable target for many competing organizations and individuals. Being a \ + colony of sizable population and considerable wealth causes it to often be the target of various \ + attempts of robbery, fraud and other malicious actions." config_tag = "mercenary" required_players = 15 required_enemies = 1 end_on_antag_death = 1 - uplink_welcome = "Corporate Backed Uplink Console:" - uplink_uses = 40 var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level antag_tags = list(MODE_MERCENARY) antag_scaling_coeff = 6 +//delete all nuke disks not on a station zlevel +/datum/game_mode/nuclear/proc/check_nuke_disks() + for(var/obj/item/weapon/disk/nuclear/N in nuke_disks) + if(isNotStationLevel(N.z)) qdel(N) + +//checks if L has a nuke disk on their person +/datum/game_mode/nuclear/proc/check_mob(mob/living/L) + for(var/obj/item/weapon/disk/nuclear/N in nuke_disks) + if(N.storage_depth(L) >= 0) + return 1 + return 0 + /datum/game_mode/nuclear/declare_completion() if(config.objectives_disabled) ..() diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 530b9b9567b..63832b809ce 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -17,11 +17,11 @@ if(!active) active = 1 workdisk() - usr << "\blue You activate the pinpointer" + usr << "You activate the pinpointer" else active = 0 icon_state = "pinoff" - usr << "\blue You deactivate the pinpointer" + usr << "You deactivate the pinpointer" proc/workdisk() if(!active) return @@ -69,11 +69,11 @@ worklocation() if(mode == 2) workobj() - usr << "\blue You activate the pinpointer" + usr << "You activate the pinpointer" else active = 0 icon_state = "pinoff" - usr << "\blue You deactivate the pinpointer" + usr << "You deactivate the pinpointer" proc/worklocation() @@ -262,4 +262,4 @@ if(16 to INFINITY) icon_state = "pinonfar" - spawn(5) .() \ No newline at end of file + spawn(5) .() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 8de48cbe47b..1d45f0fc2d6 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -14,6 +14,7 @@ datum/objective all_objectives |= src if(text) explanation_text = text + ..() if (process) process_objectives |= src @@ -136,7 +137,7 @@ datum/objective/anti_revolution/demote find_target() ..() if(target && target.current) - explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant." + explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [company_name]'s goals. Demote \him[target.current] to assistant." else explanation_text = "Free Objective" return target @@ -144,7 +145,7 @@ datum/objective/anti_revolution/demote find_target_by_role(role, role_type=0) ..(role, role_type) if(target && target.current) - explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant." + explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [company_name]'s goals. Demote \him[target.current] to assistant." else explanation_text = "Free Objective" return target diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 81fbcfa080b..062ef2771f0 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -6,8 +6,6 @@ required_players = 4 required_enemies = 3 auto_recall_shuttle = 0 - uplink_welcome = "AntagCorp Uplink Console:" - uplink_uses = 10 end_on_antag_death = 0 // shuttle_delay = 3 antag_tags = list(MODE_REVOLUTIONARY, MODE_LOYALIST) diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index ad2abb22360..df75722aeb6 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -105,7 +105,7 @@ datum/hSB hsb.req_access += A hsb.loc = usr.loc - usr << "Sandbox: Created an airlock." + usr << "Sandbox: Created an airlock." if("hsbcanister") var/list/hsbcanisters = typesof(/obj/machinery/portable_atmospherics/canister/) - /obj/machinery/portable_atmospherics/canister/ var/hsbcanister = input(usr, "Choose a canister to spawn.", "Sandbox:") in hsbcanisters + "Cancel" diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 49e4c81769a..9a67cdc94a8 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -1,11 +1,18 @@ /datum/game_mode/traitor name = "traitor" round_description = "There is a foreign agent or traitor on the station. Do not let the traitor succeed!" - extended_round_description = "NanoTrasen's monopolistic control over the phoron supplies of Tau Ceti has marked the station to be a highly valuable target for many competing organizations and individuals. The varied pasts and experiences of your coworkers have left them susceptible to the vices and temptations of humanity. Is the station the safe self-contained workplace you once thought it was, or has it become a playground for the evils of the galaxy? Who can you trust? Watch your front. Watch your sides. Watch your back. The familiar faces that you've passed hundreds of times down the hallways before can be hiding terrible secrets and deceptions. Every corner is a mystery. Every conversation is a lie. You will be facing your friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing but the painful reminder that space is cruel and unforgiving." + extended_round_description = "The Company's monopolistic control over the phoron supplies of Nyx has marked the \ + station to be a highly valuable target for many competing organizations and individuals. The varied pasts \ + and experiences of your coworkers have left them susceptible to the vices and temptations of humanity. \ + Is the station the safe self-contained workplace you once thought it was, or has it become a playground \ + for the evils of the galaxy? Who can you trust? Watch your front. Watch your sides. Watch your back. \ + The familiar faces that you've passed hundreds of times down the hallways before can be hiding terrible \ + secrets and deceptions. Every corner is a mystery. Every conversation is a lie. You will be facing your \ + friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing \ + but the painful reminder that space is cruel and unforgiving." config_tag = "traitor" required_players = 0 required_enemies = 1 - uplink_welcome = "AntagCorp Portable Teleportation Relay:" end_on_antag_death = 1 antag_tags = list(MODE_TRAITOR) antag_scaling_coeff = 8 @@ -14,3 +21,4 @@ name = "autotraitor" config_tag = "autotraitor" round_autoantag = 1 + antag_scaling_coeff = 5 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 892f4db3898..2e30b05ee84 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -5,7 +5,5 @@ config_tag = "wizard" required_players = 1 required_enemies = 1 - uplink_welcome = "Wizardly Uplink Console:" - uplink_uses = 10 end_on_antag_death = 1 antag_tags = list(MODE_WIZARD) diff --git a/code/game/jobs/_access_defs.dm b/code/game/jobs/_access_defs.dm new file mode 100644 index 00000000000..e371ff83673 --- /dev/null +++ b/code/game/jobs/_access_defs.dm @@ -0,0 +1,15 @@ +#define ACCESS_REGION_NONE -1 +#define ACCESS_REGION_ALL 0 +#define ACCESS_REGION_SECURITY 1 +#define ACCESS_REGION_MEDBAY 2 +#define ACCESS_REGION_RESEARCH 3 +#define ACCESS_REGION_ENGINEERING 4 +#define ACCESS_REGION_COMMAND 5 +#define ACCESS_REGION_GENERAL 6 +#define ACCESS_REGION_SUPPLY 7 + +#define ACCESS_TYPE_NONE 0 +#define ACCESS_TYPE_CENTCOM 1 +#define ACCESS_TYPE_STATION 2 +#define ACCESS_TYPE_SYNDICATE 4 +#define ACCESS_TYPE_ALL (ACCESS_TYPE_CENTCOM|ACCESS_TYPE_STATION|ACCESS_TYPE_SYNDICATE) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index f4836ee6283..c3f45e16468 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -1,89 +1,5 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/var/const/access_security = 1 // Security equipment -/var/const/access_brig = 2 // Brig timers and permabrig -/var/const/access_armory = 3 -/var/const/access_forensics_lockers= 4 -/var/const/access_medical = 5 -/var/const/access_morgue = 6 -/var/const/access_tox = 7 -/var/const/access_tox_storage = 8 -/var/const/access_genetics = 9 -/var/const/access_engine = 10 //engineering hallways -/var/const/access_engine_equip = 11 -/var/const/access_maint_tunnels = 12 -/var/const/access_external_airlocks = 13 -/var/const/access_emergency_storage = 14 -/var/const/access_change_ids = 15 -/var/const/access_ai_upload = 16 -/var/const/access_teleporter = 17 -/var/const/access_eva = 18 -/var/const/access_heads = 19 -/var/const/access_captain = 20 -/var/const/access_all_personal_lockers = 21 -/var/const/access_chapel_office = 22 -/var/const/access_tech_storage = 23 -/var/const/access_atmospherics = 24 -/var/const/access_bar = 25 -/var/const/access_janitor = 26 -/var/const/access_crematorium = 27 -/var/const/access_kitchen = 28 -/var/const/access_robotics = 29 -/var/const/access_rd = 30 -/var/const/access_cargo = 31 -/var/const/access_construction = 32 -/var/const/access_chemistry = 33 -/var/const/access_cargo_bot = 34 -/var/const/access_hydroponics = 35 -/var/const/access_manufacturing = 36 -/var/const/access_library = 37 -/var/const/access_lawyer = 38 -/var/const/access_virology = 39 -/var/const/access_cmo = 40 -/var/const/access_qm = 41 -/var/const/access_court = 42 -/var/const/access_clown = 43 -/var/const/access_mime = 44 -/var/const/access_surgery = 45 -/var/const/access_theatre = 46 -/var/const/access_research = 47 -/var/const/access_mining = 48 -/var/const/access_mining_office = 49 //not in use -/var/const/access_mailsorting = 50 -/var/const/access_heads_vault = 53 -/var/const/access_mining_station = 54 -/var/const/access_xenobiology = 55 -/var/const/access_ce = 56 -/var/const/access_hop = 57 -/var/const/access_hos = 58 -/var/const/access_RC_announce = 59 //Request console announcements -/var/const/access_keycard_auth = 60 //Used for events which require at least two people to confirm them -/var/const/access_tcomsat = 61 // has access to the entire telecomms satellite / machinery -/var/const/access_gateway = 62 -/var/const/access_sec_doors = 63 // Security front doors -/var/const/access_psychiatrist = 64 // Psychiatrist's office -/var/const/access_xenoarch = 65 -/var/const/access_medical_equip = 66 - - //BEGIN CENTCOM ACCESS - /*Should leave plenty of room if we need to add more access levels. -/var/const/Mostly for admin fun times.*/ -/var/const/access_cent_general = 101//General facilities. -/var/const/access_cent_thunder = 102//Thunderdome. -/var/const/access_cent_specops = 103//Special Ops. -/var/const/access_cent_medical = 104//Medical/Research -/var/const/access_cent_living = 105//Living quarters. -/var/const/access_cent_storage = 106//Generic storage areas. -/var/const/access_cent_teleporter = 107//Teleporter. -/var/const/access_cent_creed = 108//Creed's office. -/var/const/access_cent_captain = 109//Captain's office/ID comp/AI. - - //The Syndicate -/var/const/access_syndicate = 150//General Syndicate Access - - //MONEY -/var/const/access_crate_cash = 200 - /obj/var/list/req_access = list() /obj/var/list/req_one_access = list() @@ -93,24 +9,16 @@ if(src.check_access(null)) return 1 - if(istype(M, /mob/living/silicon)) - if(ispAI(M)) - var/mob/living/silicon/pai/P = M - if(P.ID && src.check_access(P.ID)) - return 1 - else//AI can do whatever he wants - return 1 - else if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - //if they are holding or wearing a card that has access, that works - if(src.check_access(H.get_active_hand()) || src.check_access(H.wear_id)) - return 1 + // #TODO-MERGE: Check pAI's definition for GetIdCard() + var/id = M.GetIdCard() + if(id) + return check_access(id) return 0 /obj/item/proc/GetAccess() return list() -/obj/item/proc/GetID() +/obj/proc/GetID() return null /obj/proc/check_access(obj/item/I) @@ -121,12 +29,15 @@ if(!req_one_access) req_one_access = list() if(!L) return 0 if(!istype(L, /list)) return 0 - for(var/req in src.req_access) - if(!(req in L)) //doesn't have this access + return has_access(req_access, req_one_access, L) + +/proc/has_access(var/list/req_access, var/list/req_one_access, var/list/accesses) + for(var/req in req_access) + if(!(req in accesses)) //doesn't have this access return 0 - if(src.req_one_access.len) - for(var/req in src.req_one_access) - if(req in L) //has an access from the single access list + if(req_one_access.len) + for(var/req in req_one_access) + if(req in accesses) //has an access from the single access list return 1 return 0 return 1 @@ -154,215 +65,110 @@ if("Supreme Commander") return get_all_centcom_access() +/var/list/datum/access/priv_all_access_datums +/proc/get_all_access_datums() + if(!priv_all_access_datums) + priv_all_access_datums = init_subtypes(/datum/access) + priv_all_access_datums = dd_sortedObjectList(priv_all_access_datums) + + return priv_all_access_datums + +/var/list/datum/access/priv_all_access_datums_id +/proc/get_all_access_datums_by_id() + if(!priv_all_access_datums_id) + priv_all_access_datums_id = list() + for(var/datum/access/A in get_all_access_datums()) + priv_all_access_datums_id["[A.id]"] = A + + return priv_all_access_datums_id + +/var/list/datum/access/priv_all_access_datums_region +/proc/get_all_access_datums_by_region() + if(!priv_all_access_datums_region) + priv_all_access_datums_region = list() + for(var/datum/access/A in get_all_access_datums()) + if(!priv_all_access_datums_region[A.region]) + priv_all_access_datums_region[A.region] = list() + priv_all_access_datums_region[A.region] += A + + return priv_all_access_datums_region + +/proc/get_access_ids(var/access_types = ACCESS_TYPE_ALL) + var/list/L = new() + for(var/datum/access/A in get_all_access_datums()) + if(A.access_type & access_types) + L += A.id + return L + +/var/list/priv_all_access /proc/get_all_accesses() - return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court, - access_medical, access_genetics, access_morgue, access_rd, - access_tox, access_tox_storage, access_chemistry, access_engine, access_engine_equip, access_maint_tunnels, - access_external_airlocks, access_change_ids, access_ai_upload, - access_teleporter, access_eva, access_heads, access_captain, access_all_personal_lockers, - access_tech_storage, access_chapel_office, access_atmospherics, access_kitchen, - access_bar, access_janitor, access_crematorium, access_robotics, access_cargo, access_construction, - access_hydroponics, access_library, access_lawyer, access_virology, access_psychiatrist, access_cmo, access_qm, access_clown, access_mime, access_surgery, - access_theatre, access_research, access_mining, access_mailsorting, - access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce, - access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_medical_equip) + if(!priv_all_access) + priv_all_access = get_access_ids() + return priv_all_access + +/var/list/priv_station_access +/proc/get_all_station_access() + if(!priv_station_access) + priv_station_access = get_access_ids(ACCESS_TYPE_STATION) + + return priv_station_access + +/var/list/priv_centcom_access /proc/get_all_centcom_access() - return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain) + if(!priv_centcom_access) + priv_centcom_access = get_access_ids(ACCESS_TYPE_CENTCOM) + return priv_centcom_access + +/var/list/priv_syndicate_access /proc/get_all_syndicate_access() - return list(access_syndicate) + if(!priv_syndicate_access) + priv_syndicate_access = get_access_ids(ACCESS_TYPE_SYNDICATE) + return priv_syndicate_access + +/var/list/priv_region_access /proc/get_region_accesses(var/code) - switch(code) - if(0) - return get_all_accesses() - if(1) //security - return list(access_sec_doors, access_security, access_brig, access_armory, access_forensics_lockers, access_court, access_hos) - if(2) //medbay - return list(access_medical, access_medical_equip, access_genetics, access_morgue, access_chemistry, access_psychiatrist, access_virology, access_surgery, access_cmo) - if(3) //research - return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_xenoarch, access_rd) - if(4) //engineering and maintenance - return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_ce) - if(5) //command - return list(access_heads, access_RC_announce, access_keycard_auth, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_tcomsat, access_gateway, access_all_personal_lockers, access_heads_vault, access_hop, access_captain) - if(6) //station general - return list(access_kitchen,access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer, access_clown, access_mime) - if(7) //supply - return list(access_mailsorting, access_mining, access_mining_station, access_cargo, access_qm) + if(code == ACCESS_REGION_ALL) + return get_all_station_access() + + if(!priv_region_access) + priv_region_access = list() + for(var/datum/access/A in get_all_access_datums()) + if(!priv_region_access["[A.region]"]) + priv_region_access["[A.region]"] = list() + priv_region_access["[A.region]"] += A.id + + return priv_region_access["[code]"] /proc/get_region_accesses_name(var/code) switch(code) - if(0) + if(ACCESS_REGION_ALL) return "All" - if(1) //security + if(ACCESS_REGION_SECURITY) //security return "Security" - if(2) //medbay + if(ACCESS_REGION_MEDBAY) //medbay return "Medbay" - if(3) //research + if(ACCESS_REGION_RESEARCH) //research return "Research" - if(4) //engineering and maintenance + if(ACCESS_REGION_ENGINEERING) //engineering and maintenance return "Engineering" - if(5) //command + if(ACCESS_REGION_COMMAND) //command return "Command" - if(6) //station general + if(ACCESS_REGION_GENERAL) //station general return "Station General" - if(7) //supply + if(ACCESS_REGION_SUPPLY) //supply return "Supply" +/proc/get_access_desc(id) + var/list/AS = get_all_access_datums_by_id() + var/datum/access/A = AS["[id]"] -/proc/get_access_desc(A) - switch(A) - if(access_cargo) - return "Cargo Bay" - if(access_cargo_bot) - return "Cargo Bot Delivery" - if(access_security) - return "Security Equipment" - if(access_brig) - return "Holding Cells" - if(access_court) - return "Courtroom" - if(access_forensics_lockers) - return "Forensics" - if(access_medical) - return "Medical" - if(access_genetics) - return "Genetics Lab" - if(access_morgue) - return "Morgue" - if(access_tox) - return "R&D Lab" - if(access_tox_storage) - return "Toxins Lab" - if(access_chemistry) - return "Chemistry Lab" - if(access_rd) - return "Research Director" - if(access_bar) - return "Bar" - if(access_janitor) - return "Custodial Closet" - if(access_engine) - return "Engineering" - if(access_engine_equip) - return "Power Equipment" - if(access_maint_tunnels) - return "Maintenance" - if(access_external_airlocks) - return "External Airlocks" - if(access_emergency_storage) - return "Emergency Storage" - if(access_change_ids) - return "ID Computer" - if(access_ai_upload) - return "AI Upload" - if(access_teleporter) - return "Teleporter" - if(access_eva) - return "EVA" - if(access_heads) - return "Bridge" - if(access_captain) - return "Captain" - if(access_all_personal_lockers) - return "Personal Lockers" - if(access_chapel_office) - return "Chapel Office" - if(access_tech_storage) - return "Technical Storage" - if(access_atmospherics) - return "Atmospherics" - if(access_crematorium) - return "Crematorium" - if(access_armory) - return "Armory" - if(access_construction) - return "Construction Areas" - if(access_kitchen) - return "Kitchen" - if(access_hydroponics) - return "Hydroponics" - if(access_library) - return "Library" - if(access_lawyer) - return "Law Office" - if(access_robotics) - return "Robotics" - if(access_virology) - return "Virology" - if(access_psychiatrist) - return "Psychiatrist's Office" - if(access_cmo) - return "Chief Medical Officer" - if(access_qm) - return "Quartermaster" -/* if(access_clown) - return "HONK! Access" - if(access_mime) - return "Silent Access"*/ - if(access_surgery) - return "Surgery" - if(access_theatre) - return "Theatre" - if(access_manufacturing) - return "Manufacturing" - if(access_research) - return "Science" - if(access_mining) - return "Mining" - if(access_mining_office) - return "Mining Office" - if(access_mailsorting) - return "Cargo Office" - if(access_heads_vault) - return "Main Vault" - if(access_mining_station) - return "Mining EVA" - if(access_xenobiology) - return "Xenobiology Lab" - if(access_xenoarch) - return "Xenoarchaeology" - if(access_hop) - return "Head of Personnel" - if(access_hos) - return "Head of Security" - if(access_ce) - return "Chief Engineer" - if(access_RC_announce) - return "RC Announcements" - if(access_keycard_auth) - return "Keycode Auth. Device" - if(access_tcomsat) - return "Telecommunications" - if(access_gateway) - return "Gateway" - if(access_sec_doors) - return "Security" - if(access_medical_equip) - return "Medical Equipment" + return A ? A.desc : "" /proc/get_centcom_access_desc(A) - switch(A) - if(access_cent_general) - return "Code Grey" - if(access_cent_thunder) - return "Code Yellow" - if(access_cent_storage) - return "Code Orange" - if(access_cent_living) - return "Code Green" - if(access_cent_medical) - return "Code White" - if(access_cent_teleporter) - return "Code Blue" - if(access_cent_specops) - return "Code Black" - if(access_cent_creed) - return "Code Silver" - if(access_cent_captain) - return "Code Gold" + return get_access_desc(A) /proc/get_all_jobs() var/list/all_jobs = list() @@ -387,41 +193,53 @@ "Emergency Response Team", "Emergency Response Team Leader") -proc/GetIdCard(var/mob/living/carbon/human/H) - if(H.wear_id) - var/id = H.wear_id.GetID() +/mob/proc/GetIdCard() + return null + +var/obj/item/weapon/card/id/all_access/ghost_all_access +/mob/dead/observer/GetIdCard() + if(!is_admin(src)) + return + + if(!ghost_all_access) + ghost_all_access = new() + return ghost_all_access + +/mob/living/bot/GetIdCard() + return botcard + +/mob/living/carbon/human/GetIdCard() + var/obj/item/I = get_active_hand() + if(I) + var/id = I.GetID() if(id) return id - if(H.get_active_hand()) - var/obj/item/I = H.get_active_hand() - return I.GetID() + if(wear_id) + return wear_id.GetID() -proc/FindNameFromID(var/mob/living/carbon/human/H) - ASSERT(istype(H)) - var/obj/item/weapon/card/id/C = GetIdCard(H) +/mob/living/silicon/GetIdCard() + return idcard + +proc/FindNameFromID(var/mob/M, var/missing_id_name = "Unknown") + var/obj/item/weapon/card/id/C = M.GetIdCard() if(C) return C.registered_name + return missing_id_name proc/get_all_job_icons() //For all existing HUD icons return joblist + list("Prisoner") /obj/proc/GetJobName() //Used in secHUD icon generation - var/obj/item/weapon/card/id/I - if(istype(src, /obj/item/device/pda)) - var/obj/item/device/pda/P = src - I = P.id - else if(istype(src, /obj/item/weapon/card/id)) - I = src + var/obj/item/weapon/card/id/I = GetID() if(I) var/job_icons = get_all_job_icons() - var/centcom = get_all_centcom_jobs() - if(I.assignment in job_icons) //Check if the job has a hud icon return I.assignment if(I.rank in job_icons) return I.rank + var/centcom = get_all_centcom_jobs() if(I.assignment in centcom) //Return with the NT logo if it is a Centcom job return "Centcom" if(I.rank in centcom) diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm new file mode 100644 index 00000000000..918f05cd902 --- /dev/null +++ b/code/game/jobs/access_datum.dm @@ -0,0 +1,464 @@ +/datum/access + var/id = 0 + var/desc = "" + var/region = ACCESS_REGION_NONE + var/access_type = ACCESS_TYPE_STATION + +/datum/access/dd_SortValue() + return "[access_type][desc]" + +/***************** +* Station access * +*****************/ +/var/const/access_security = 1 +/datum/access/security + id = access_security + desc = "Security Equipment" + region = ACCESS_REGION_SECURITY + +/var/const/access_brig = 2 // Brig timers and permabrig +/datum/access/holding + id = access_brig + desc = "Holding Cells" + region = ACCESS_REGION_SECURITY + +/var/const/access_armory = 3 +/datum/access/armory + id = access_armory + desc = "Armory" + region = ACCESS_REGION_SECURITY + +/var/const/access_forensics_lockers = 4 +/datum/access/forensics_lockers + id = access_forensics_lockers + desc = "Forensics" + region = ACCESS_REGION_SECURITY + +/var/const/access_medical = 5 +/datum/access/medical + id = access_medical + desc = "Medical" + region = ACCESS_REGION_MEDBAY + +/var/const/access_morgue = 6 +/datum/access/morgue + id = access_morgue + desc = "Morgue" + region = ACCESS_REGION_MEDBAY + +/var/const/access_tox = 7 +/datum/access/tox + id = access_tox + desc = "R&D Lab" + region = ACCESS_REGION_RESEARCH + +/var/const/access_tox_storage = 8 +/datum/access/tox_storage + id = access_tox_storage + desc = "Toxins Lab" + region = ACCESS_REGION_RESEARCH + +/var/const/access_genetics = 9 +/datum/access/genetics + id = access_genetics + desc = "Genetics Lab" + region = ACCESS_REGION_MEDBAY + +/var/const/access_engine = 10 +/datum/access/engine + id = access_engine + desc = "Engineering" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_engine_equip = 11 +/datum/access/engine_equip + id = access_engine_equip + desc = "Engine Room" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_maint_tunnels = 12 +/datum/access/maint_tunnels + id = access_maint_tunnels + desc = "Maintenance" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_external_airlocks = 13 +/datum/access/external_airlocks + id = access_external_airlocks + desc = "External Airlocks" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_emergency_storage = 14 +/datum/access/emergency_storage + id = access_emergency_storage + desc = "Emergency Storage" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_change_ids = 15 +/datum/access/change_ids + id = access_change_ids + desc = "ID Computer" + region = ACCESS_REGION_COMMAND + +/var/const/access_ai_upload = 16 +/datum/access/ai_upload + id = access_ai_upload + desc = "AI Upload" + region = ACCESS_REGION_COMMAND + +/var/const/access_teleporter = 17 +/datum/access/teleporter + id = access_teleporter + desc = "Teleporter" + region = ACCESS_REGION_COMMAND + +/var/const/access_eva = 18 +/datum/access/eva + id = access_eva + desc = "EVA" + region = ACCESS_REGION_COMMAND + +/var/const/access_heads = 19 +/datum/access/heads + id = access_heads + desc = "Bridge" + region = ACCESS_REGION_COMMAND + +/var/const/access_captain = 20 +/datum/access/captain + id = access_captain + desc = "Captain" + region = ACCESS_REGION_COMMAND + +/var/const/access_all_personal_lockers = 21 +/datum/access/all_personal_lockers + id = access_all_personal_lockers + desc = "Personal Lockers" + region = ACCESS_REGION_COMMAND + +/var/const/access_chapel_office = 22 +/datum/access/chapel_office + id = access_chapel_office + desc = "Chapel Office" + region = ACCESS_REGION_GENERAL + +/var/const/access_tech_storage = 23 +/datum/access/tech_storage + id = access_tech_storage + desc = "Technical Storage" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_atmospherics = 24 +/datum/access/atmospherics + id = access_atmospherics + desc = "Atmospherics" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_bar = 25 +/datum/access/bar + id = access_bar + desc = "Bar" + region = ACCESS_REGION_GENERAL + +/var/const/access_janitor = 26 +/datum/access/janitor + id = access_janitor + desc = "Custodial Closet" + region = ACCESS_REGION_GENERAL + +/var/const/access_crematorium = 27 +/datum/access/crematorium + id = access_crematorium + desc = "Crematorium" + region = ACCESS_REGION_GENERAL + +/var/const/access_kitchen = 28 +/datum/access/kitchen + id = access_kitchen + desc = "Kitchen" + region = ACCESS_REGION_GENERAL + +/var/const/access_robotics = 29 +/datum/access/robotics + id = access_robotics + desc = "Robotics" + region = ACCESS_REGION_RESEARCH + +/var/const/access_rd = 30 +/datum/access/rd + id = access_rd + desc = "Research Director" + region = ACCESS_REGION_RESEARCH + +/var/const/access_cargo = 31 +/datum/access/cargo + id = access_cargo + desc = "Cargo Bay" + region = ACCESS_REGION_SUPPLY + +/var/const/access_construction = 32 +/datum/access/construction + id = access_construction + desc = "Construction Areas" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_chemistry = 33 +/datum/access/chemistry + id = access_chemistry + desc = "Chemistry Lab" + region = ACCESS_REGION_MEDBAY + +/var/const/access_cargo_bot = 34 +/datum/access/cargo_bot + id = access_cargo_bot + desc = "Cargo Bot Delivery" + region = ACCESS_REGION_SUPPLY + +/var/const/access_hydroponics = 35 +/datum/access/hydroponics + id = access_hydroponics + desc = "Hydroponics" + region = ACCESS_REGION_GENERAL + +/var/const/access_manufacturing = 36 +/datum/access/manufacturing + id = access_manufacturing + desc = "Manufacturing" + access_type = ACCESS_TYPE_NONE + +/var/const/access_library = 37 +/datum/access/library + id = access_library + desc = "Library" + region = ACCESS_REGION_GENERAL + +/var/const/access_lawyer = 38 +/datum/access/lawyer + id = access_lawyer + desc = "Internal Affairs" + region = ACCESS_REGION_COMMAND + +/var/const/access_virology = 39 +/datum/access/virology + id = access_virology + desc = "Virology" + region = ACCESS_REGION_MEDBAY + +/var/const/access_cmo = 40 +/datum/access/cmo + id = access_cmo + desc = "Chief Medical Officer" + region = ACCESS_REGION_COMMAND + +/var/const/access_qm = 41 +/datum/access/qm + id = access_qm + desc = "Quartermaster" + region = ACCESS_REGION_SUPPLY + +/var/const/access_network = 42 +/datum/access/network + id = access_network + desc = "Station Network" + region = ACCESS_REGION_RESEARCH + +// /var/const/free_access_id = 43 +// /var/const/free_access_id = 44 + +/var/const/access_surgery = 45 +/datum/access/surgery + id = access_surgery + desc = "Surgery" + region = ACCESS_REGION_MEDBAY + +// /var/const/free_access_id = 46 + +/var/const/access_research = 47 +/datum/access/research + id = access_research + desc = "Science" + region = ACCESS_REGION_RESEARCH + +/var/const/access_mining = 48 +/datum/access/mining + id = access_mining + desc = "Mining" + region = ACCESS_REGION_SUPPLY + +/var/const/access_mining_office = 49 +/datum/access/mining_office + id = access_mining_office + desc = "Mining Office" + access_type = ACCESS_TYPE_NONE + +/var/const/access_mailsorting = 50 +/datum/access/mailsorting + id = access_mailsorting + desc = "Cargo Office" + region = ACCESS_REGION_SUPPLY + +// /var/const/free_access_id = 51 +// /var/const/free_access_id = 52 + +/var/const/access_heads_vault = 53 +/datum/access/heads_vault + id = access_heads_vault + desc = "Main Vault" + region = ACCESS_REGION_COMMAND + +/var/const/access_mining_station = 54 +/datum/access/mining_station + id = access_mining_station + desc = "Mining EVA" + region = ACCESS_REGION_SUPPLY + +/var/const/access_xenobiology = 55 +/datum/access/xenobiology + id = access_xenobiology + desc = "Xenobiology Lab" + region = ACCESS_REGION_RESEARCH + +/var/const/access_ce = 56 +/datum/access/ce + id = access_ce + desc = "Chief Engineer" + region = ACCESS_REGION_ENGINEERING + +/var/const/access_hop = 57 +/datum/access/hop + id = access_hop + desc = "Head of Personnel" + region = ACCESS_REGION_COMMAND + +/var/const/access_hos = 58 +/datum/access/hos + id = access_hos + desc = "Head of Security" + region = ACCESS_REGION_SECURITY + +/var/const/access_RC_announce = 59 //Request console announcements +/datum/access/RC_announce + id = access_RC_announce + desc = "RC Announcements" + region = ACCESS_REGION_COMMAND + +/var/const/access_keycard_auth = 60 //Used for events which require at least two people to confirm them +/datum/access/keycard_auth + id = access_keycard_auth + desc = "Keycode Auth. Device" + region = ACCESS_REGION_COMMAND + +/var/const/access_tcomsat = 61 // has access to the entire telecomms satellite / machinery +/datum/access/tcomsat + id = access_tcomsat + desc = "Telecommunications" + region = ACCESS_REGION_COMMAND + +/var/const/access_gateway = 62 +/datum/access/gateway + id = access_gateway + desc = "Gateway" + region = ACCESS_REGION_COMMAND + +/var/const/access_sec_doors = 63 // Security front doors +/datum/access/sec_doors + id = access_sec_doors + desc = "Security" + region = ACCESS_REGION_SECURITY + +/var/const/access_psychiatrist = 64 // Psychiatrist's office +/datum/access/psychiatrist + id = access_psychiatrist + desc = "Psychiatrist's Office" + region = ACCESS_REGION_MEDBAY + +/var/const/access_xenoarch = 65 +/datum/access/xenoarch + id = access_xenoarch + desc = "Xenoarchaeology" + region = ACCESS_REGION_RESEARCH + +/var/const/access_medical_equip = 66 +/datum/access/medical_equip + id = access_medical_equip + desc = "Medical Equipment" + region = ACCESS_REGION_MEDBAY + +/****************** +* Central Command * +******************/ +/var/const/access_cent_general = 101//General facilities. +/datum/access/cent_general + id = access_cent_general + desc = "Code Grey" + access_type = ACCESS_TYPE_CENTCOM + +/var/const/access_cent_thunder = 102//Thunderdome. +/datum/access/cent_thunder + id = access_cent_thunder + desc = "Code Yellow" + access_type = ACCESS_TYPE_CENTCOM + +/var/const/access_cent_specops = 103//Special Ops. +/datum/access/cent_specops + id = access_cent_specops + desc = "Code Black" + access_type = ACCESS_TYPE_CENTCOM + +/var/const/access_cent_medical = 104//Medical/Research +/datum/access/cent_medical + id = access_cent_medical + desc = "Code White" + access_type = ACCESS_TYPE_CENTCOM + +/var/const/access_cent_living = 105//Living quarters. +/datum/access/cent_living + id = access_cent_living + desc = "Code Green" + access_type = ACCESS_TYPE_CENTCOM + +/var/const/access_cent_storage = 106//Generic storage areas. +/datum/access/cent_storage + id = access_cent_storage + desc = "Code Orange" + access_type = ACCESS_TYPE_CENTCOM + +/var/const/access_cent_teleporter = 107//Teleporter. +/datum/access/cent_teleporter + id = access_cent_teleporter + desc = "Code Blue" + access_type = ACCESS_TYPE_CENTCOM + +/var/const/access_cent_creed = 108//Creed's office. +/datum/access/cent_creed + id = access_cent_creed + desc = "Code Silver" + access_type = ACCESS_TYPE_CENTCOM + +/var/const/access_cent_captain = 109//Captain's office/ID comp/AI. +/datum/access/cent_captain + id = access_cent_captain + desc = "Code Gold" + access_type = ACCESS_TYPE_CENTCOM + +/*************** +* Antag access * +***************/ +/var/const/access_syndicate = 150//General Syndicate Access +/datum/access/syndicate + id = access_syndicate + access_type = ACCESS_TYPE_SYNDICATE + +/******* +* Misc * +*******/ +/var/const/access_synth = 199 +/datum/access/synthetic + id = access_synth + desc = "Synthetic" + access_type = ACCESS_TYPE_NONE + +/var/const/access_crate_cash = 200 +/datum/access/crate_cash + id = access_crate_cash + access_type = ACCESS_TYPE_NONE diff --git a/code/game/jobs/departments.dm b/code/game/jobs/departments.dm deleted file mode 100644 index f424d03a1a3..00000000000 --- a/code/game/jobs/departments.dm +++ /dev/null @@ -1 +0,0 @@ -var/list/departments = list("Command", "Medical", "Engineering", "Security", "Civilian", "Cargo") \ No newline at end of file diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 16f1e8e3f57..786ee902378 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -8,6 +8,7 @@ spawn_positions = -1 supervisors = "absolutely everyone" selection_color = "#dddddd" + economic_modifier = 1 access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() //alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Security Cadet", "Visitor") diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 97c6d1012eb..4db13d3ec10 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -9,13 +9,18 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "Nanotrasen officials and Corporate Regulations" + supervisors = "company officials and Corporate Regulations" selection_color = "#ccccff" idtype = /obj/item/weapon/card/id/gold req_admin_notify = 1 access = list() //See get_access() minimal_access = list() //See get_access() minimal_player_age = 14 + economic_modifier = 20 + + ideal_character_age = 70 // Old geezer captains ftw + + equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear) @@ -43,7 +48,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) return 1 get_access() - return get_all_accesses() + return get_all_station_access() @@ -61,18 +66,21 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 minimal_player_age = 10 - access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, + economic_modifier = 10 + ideal_character_age = 50 + + access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, - access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway) - minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, + access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, + access_hop, access_RC_announce, access_keycard_auth, access_gateway) + minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, - access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway) + access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, + access_hop, access_RC_announce, access_keycard_auth, access_gateway) equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index ae6e851d40e..472c6bf856e 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -9,7 +9,7 @@ spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#dddddd" - access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) + access = list(access_hydroponics, access_bar, access_kitchen) minimal_access = list(access_bar) @@ -38,7 +38,7 @@ spawn_positions = 2 supervisors = "the head of personnel" selection_color = "#dddddd" - access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) + access = list(access_hydroponics, access_bar, access_kitchen) minimal_access = list(access_kitchen) alt_titles = list("Cook") @@ -70,8 +70,8 @@ spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#dddddd" - access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. - minimal_access = list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. + access = list(access_hydroponics, access_bar, access_kitchen) + minimal_access = list(access_hydroponics) alt_titles = list("Hydroponicist") @@ -105,9 +105,12 @@ spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#dddddd" + economic_modifier = 5 access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) + ideal_character_age = 40 + equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -167,6 +170,7 @@ spawn_positions = 3 supervisors = "the quartermaster and the head of personnel" selection_color = "#dddddd" + economic_modifier = 5 access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_mining, access_mining_station, access_mailsorting) alt_titles = list("Drill Technician","Prospector") @@ -266,10 +270,11 @@ faction = "Station" total_positions = 2 spawn_positions = 2 - supervisors = "Nanotrasen officials and Corporate Regulations" + supervisors = "company officials and Corporate Regulations" selection_color = "#dddddd" - access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads) - minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads) + economic_modifier = 7 + access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads) + minimal_access = list(access_lawyer, access_sec_doors, access_heads) equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 1b7970eed84..515d8cc71a0 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -11,6 +11,11 @@ selection_color = "#ffeeaa" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 + economic_modifier = 10 + + ideal_character_age = 50 + + access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_heads, access_construction, access_sec_doors, @@ -54,6 +59,7 @@ spawn_positions = 5 supervisors = "the chief engineer" selection_color = "#fff5cc" + economic_modifier = 5 access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics) minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) alt_titles = list("Maintenance Technician","Engine Technician","Electrician") @@ -91,6 +97,7 @@ spawn_positions = 2 supervisors = "the chief engineer" selection_color = "#fff5cc" + economic_modifier = 5 access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks) minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 575a82aad7a..da3fae270eb 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -19,6 +19,11 @@ var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.) var/department = null // Does this position have a department tag? var/head_position = 0 // Is this position Command? + var/minimum_character_age = 17 + var/ideal_character_age = 30 + + var/account_allowed = 1 // Does this job type come with a station account? + var/economic_modifier = 2 // With how much does this job modify the initial account amount? /datum/job/proc/equip(var/mob/living/carbon/human/H) return 1 @@ -35,6 +40,45 @@ H.species.equip_survival_gear(H,0) return 1 +/datum/job/proc/setup_account(var/mob/living/carbon/human/H) + if(!account_allowed || (H.mind && H.mind.initial_account)) + return + + var/loyalty = 1 + if(H.client) + switch(H.client.prefs.nanotrasen_relation) + if(COMPANY_LOYAL) loyalty = 1.30 + if(COMPANY_SUPPORTATIVE)loyalty = 1.15 + if(COMPANY_NEUTRAL) loyalty = 1 + if(COMPANY_SKEPTICAL) loyalty = 0.85 + if(COMPANY_OPPOSED) loyalty = 0.70 + + //give them an account in the station database + var/species_modifier = (H.species ? economic_species_modifier[H.species.type] : 2) + if(!species_modifier) + species_modifier = economic_species_modifier[/datum/species/human] + + var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * species_modifier + var/datum/money_account/M = create_account(H.real_name, money_amount, null) + if(H.mind) + var/remembered_info = "" + remembered_info += "Your account number is: #[M.account_number]
" + remembered_info += "Your account pin is: [M.remote_access_pin]
" + remembered_info += "Your account funds are: $[M.money]
" + + if(M.transaction_log.len) + var/datum/transaction/T = M.transaction_log[1] + remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal]
" + H.mind.store_memory(remembered_info) + + H.mind.initial_account = M + + H << "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]" + +// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del() +/datum/job/proc/equip_preview(mob/living/carbon/human/H) + return equip(H) + /datum/job/proc/get_access() if(!config || config.jobs_have_minimal_access) return src.minimal_access.Copy() diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 2dcfbe91d93..4b9243f53a6 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -11,13 +11,16 @@ selection_color = "#ffddf0" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 + economic_modifier = 10 access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks) + minimal_player_age = 10 + ideal_character_age = 50 equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -45,6 +48,7 @@ spawn_positions = 3 supervisors = "the chief medical officer" selection_color = "#ffeef0" + economic_modifier = 7 access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_eva) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva) alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist") @@ -109,6 +113,7 @@ spawn_positions = 2 supervisors = "the chief medical officer" selection_color = "#ffeef0" + economic_modifier = 5 access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) minimal_access = list(access_medical, access_medical_equip, access_chemistry) alt_titles = list("Pharmacist") @@ -140,6 +145,7 @@ spawn_positions = 0 supervisors = "the chief medical officer and research director" selection_color = "#ffeef0" + economic_modifier = 7 access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research) minimal_access = list(access_medical, access_morgue, access_genetics, access_research) @@ -167,6 +173,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 + economic_modifier = 5 supervisors = "the chief medical officer" selection_color = "#ffeef0" access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_psychiatrist) @@ -204,8 +211,9 @@ spawn_positions = 2 supervisors = "the chief medical officer" selection_color = "#ffeef0" + economic_modifier = 4 access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist) - minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks) + minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks) alt_titles = list("Emergency Medical Technician") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index f32d545d01b..5cdbeaf95ee 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -11,15 +11,17 @@ selection_color = "#ffddff" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 + economic_modifier = 15 access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch) + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network) minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch) + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network) minimal_player_age = 14 + ideal_character_age = 50 equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -48,6 +50,7 @@ spawn_positions = 3 supervisors = "the research director" selection_color = "#ffeeff" + economic_modifier = 7 access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher") @@ -78,6 +81,7 @@ spawn_positions = 2 supervisors = "the research director" selection_color = "#ffeeff" + economic_modifier = 7 access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics) minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage) alt_titles = list("Xenobotanist") @@ -108,6 +112,7 @@ spawn_positions = 2 supervisors = "research director" selection_color = "#ffeeff" + economic_modifier = 5 access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. alt_titles = list("Biomechanical Engineer","Mechatronic Engineer") diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index fd163eec8c8..1d1303584da 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -11,11 +11,12 @@ selection_color = "#ffdddd" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 - access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, + economic_modifier = 10 + access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) - minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, + minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) @@ -60,8 +61,9 @@ spawn_positions = 1 supervisors = "the head of security" selection_color = "#ffeeee" - access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_external_airlocks) - minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_external_airlocks) + economic_modifier = 5 + access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks) + minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks) minimal_player_age = 5 equip(var/mob/living/carbon/human/H) @@ -103,10 +105,9 @@ supervisors = "the head of security" selection_color = "#ffeeee" alt_titles = list("Forensic Technician") - - access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) - minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) - alt_titles = list("Forensic Technician") + economic_modifier = 5 + access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) + minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) minimal_player_age = 3 equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -117,7 +118,7 @@ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/duffel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt) if(H.species.name == "Tajara") H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black/tajara(H), slot_gloves) @@ -134,8 +135,8 @@ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit, slot_r_hand) else - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_trench(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/det(H), slot_head) return 1 @@ -150,8 +151,10 @@ spawn_positions = 4 supervisors = "the head of security" selection_color = "#ffeeee" - access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue, access_external_airlocks) - minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_external_airlocks) + alt_titles = list("Junior Officer") + economic_modifier = 4 + access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks) + minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks) minimal_player_age = 3 equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 70a1561864d..6cec7149e97 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -9,7 +9,8 @@ supervisors = "your laws" req_admin_notify = 1 minimal_player_age = 7 - + account_allowed = 0 + economic_modifier = 0 equip(var/mob/living/carbon/human/H) if(!H) return 0 return 1 @@ -25,6 +26,9 @@ /datum/job/ai/is_position_available() return (empty_playable_ai_cores.len != 0) +/datum/job/ai/equip_preview(mob/living/carbon/human/H) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/straight_jacket(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/cardborg(H), slot_head) /datum/job/cyborg title = "Cyborg" @@ -37,6 +41,8 @@ selection_color = "#ddffdd" minimal_player_age = 1 alt_titles = list("Android", "Robot") + account_allowed = 0 + economic_modifier = 0 equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -49,3 +55,8 @@ equip_backpack(var/mob/living/carbon/human/H) if(!H) return 0 return 1 + return 1 + +/datum/job/cyborg/equip_preview(mob/living/carbon/human/H) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/cardborg(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/cardborg(H), slot_head) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 32d1aae7c03..1694a7b6c30 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -17,7 +17,7 @@ var/global/datum/controller/occupations/job_master occupations = list() var/list/all_jobs = typesof(/datum/job) if(!all_jobs.len) - world << "\red \b Error setting up jobs, no job datums found" + world << "Error setting up jobs, no job datums found!" return 0 for(var/J in all_jobs) var/datum/job/job = new J() @@ -50,9 +50,15 @@ var/global/datum/controller/occupations/job_master Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]") if(player && player.mind && rank) var/datum/job/job = GetJob(rank) - if(!job) return 0 - if(jobban_isbanned(player, rank)) return 0 - if(!job.player_old_enough(player.client)) return 0 + if(!job) + return 0 + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + return 0 + if(jobban_isbanned(player, rank)) + return 0 + if(!job.player_old_enough(player.client)) + return 0 + var/position_limit = job.total_positions if(!latejoin) position_limit = job.spawn_positions @@ -83,7 +89,10 @@ var/global/datum/controller/occupations/job_master if(!job.player_old_enough(player.client)) Debug("FOC player not old enough, Player: [player]") continue - if(flag && (!player.client.prefs.be_special & flag)) + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + Debug("FOC character not old enough, Player: [player]") + continue + if(flag && !(flag in player.client.prefs.be_special_role)) Debug("FOC flag failed, Player: [player], Flag: [flag], ") continue if(player.client.prefs.GetJobDepartment(job, level) & job.flag) @@ -97,6 +106,9 @@ var/global/datum/controller/occupations/job_master if(!job) continue + if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + continue + if(istype(job, GetJob("Assistant"))) // We don't want to give him assistant, that's boring! continue @@ -138,30 +150,24 @@ var/global/datum/controller/occupations/job_master // Build a weighted list, weight by age. var/list/weightedCandidates = list() - - // Different head positions have different good ages. - var/good_age_minimal = 25 - var/good_age_maximal = 60 - if(command_position == "Captain") - good_age_minimal = 30 - good_age_maximal = 70 // Old geezer captains ftw - for(var/mob/V in candidates) // Log-out during round-start? What a bad boy, no head position for you! if(!V.client) continue var/age = V.client.prefs.age + + if(age < job.minimum_character_age) // Nope. + continue + switch(age) - if(good_age_minimal - 10 to good_age_minimal) + if(job.minimum_character_age to (job.minimum_character_age+10)) weightedCandidates[V] = 3 // Still a bit young. - if(good_age_minimal to good_age_minimal + 10) + if((job.minimum_character_age+10) to (job.ideal_character_age-10)) weightedCandidates[V] = 6 // Better. - if(good_age_minimal + 10 to good_age_maximal - 10) + if((job.ideal_character_age-10) to (job.ideal_character_age+10)) weightedCandidates[V] = 10 // Great. - if(good_age_maximal - 10 to good_age_maximal) + if((job.ideal_character_age+10) to (job.ideal_character_age+20)) weightedCandidates[V] = 6 // Still good. - if(good_age_maximal to good_age_maximal + 10) - weightedCandidates[V] = 6 // Bit old, don't you think? - if(good_age_maximal to good_age_maximal + 50) + if((job.ideal_character_age+20) to INFINITY) weightedCandidates[V] = 3 // Geezer. else // If there's ABSOLUTELY NOBODY ELSE @@ -342,7 +348,7 @@ var/global/datum/controller/occupations/job_master permitted = 0 if(!permitted) - H << "\red Your current job or whitelist status does not permit you to spawn with [thing]!" + H << "Your current job or whitelist status does not permit you to spawn with [thing]!" continue if(G.slot && !(G.slot in custom_equip_slots)) @@ -351,7 +357,7 @@ var/global/datum/controller/occupations/job_master if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head) custom_equip_leftovers += thing else if(H.equip_to_slot_or_del(new G.path(H), G.slot)) - H << "\blue Equipping you with [thing]!" + H << "Equipping you with [thing]!" custom_equip_slots.Add(G.slot) else custom_equip_leftovers.Add(thing) @@ -359,6 +365,7 @@ var/global/datum/controller/occupations/job_master spawn_in_storage += thing //Equip job items. job.equip(H) + job.setup_account(H) job.equip_backpack(H) job.equip_survival(H) job.apply_fingerprints(H) @@ -370,7 +377,7 @@ var/global/datum/controller/occupations/job_master spawn_in_storage += thing else if(H.equip_to_slot_or_del(new G.path(H), G.slot)) - H << "\blue Equipping you with [thing]!" + H << "Equipping you with [thing]!" custom_equip_slots.Add(G.slot) else spawn_in_storage += thing @@ -390,26 +397,14 @@ var/global/datum/controller/occupations/job_master S = locate("start*[rank]") // use old stype if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf)) H.loc = S.loc + else + LateSpawn(H, rank) + // Moving wheelchair if they have one if(H.buckled && istype(H.buckled, /obj/structure/bed/chair/wheelchair)) H.buckled.loc = H.loc H.buckled.set_dir(H.dir) - //give them an account in the station database - var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null) - if(H.mind) - var/remembered_info = "" - remembered_info += "Your account number is: #[M.account_number]
" - remembered_info += "Your account pin is: [M.remote_access_pin]
" - remembered_info += "Your account funds are: $[M.money]
" - - if(M.transaction_log.len) - var/datum/transaction/T = M.transaction_log[1] - remembered_info += "Your account was created: [T.time], [T.date] at [T.source_terminal]
" - H.mind.store_memory(remembered_info) - - H.mind.initial_account = M - // If they're head, give them the account info for their department if(H.mind && job.head_position) var/remembered_info = "" @@ -422,9 +417,6 @@ var/global/datum/controller/occupations/job_master H.mind.store_memory(remembered_info) - spawn(0) - H << "\blueYour account number is: [M.account_number], your account pin is: [M.remote_access_pin]" - var/alt_title = null if(H.mind) H.mind.assigned_role = rank @@ -448,11 +440,11 @@ var/global/datum/controller/occupations/job_master if(!isnull(B)) for(var/thing in spawn_in_storage) - H << "\blue Placing [thing] in your [B]!" + H << "Placing [thing] in your [B]!" var/datum/gear/G = gear_datums[thing] new G.path(B) else - H << "\red Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug." + H << "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug." if(istype(H)) //give humans wheelchairs, if they need them. var/obj/item/organ/external/l_foot = H.get_organ("l_foot") @@ -510,10 +502,9 @@ var/global/datum/controller/occupations/job_master else C = new /obj/item/weapon/card/id(H) if(C) - C.registered_name = H.real_name C.rank = rank C.assignment = title ? title : rank - C.name = "[C.registered_name]'s ID Card ([C.assignment])" + H.set_id_info(C) //put the player's account number onto the ID if(H.mind && H.mind.initial_account) @@ -596,3 +587,23 @@ var/global/datum/controller/occupations/job_master tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-" feedback_add_details("job_preferences",tmp_str) + +/datum/controller/occupations/proc/LateSpawn(var/mob/living/carbon/human/H, var/rank) + //spawn at one of the latespawn locations + + var/datum/spawnpoint/spawnpos + + if(H.client.prefs.spawnpoint) + spawnpos = spawntypes[H.client.prefs.spawnpoint] + + if(spawnpos && istype(spawnpos)) + if(spawnpos.check_job_spawning(rank)) + H.loc = pick(spawnpos.turfs) + . = spawnpos.msg + else + H << "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead." + H.loc = pick(latejoin) + . = "has arrived on the station" + else + H.loc = pick(latejoin) + . = "has arrived on the station" diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 882befeae34..4f3bd3fec67 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -92,17 +92,20 @@ var/list/science_positions = list( ) //BS12 EDIT +var/list/cargo_positions = list( + "Quartermaster", + "Cargo Technician", + "Shaft Miner" +) + var/list/civilian_positions = list( "Head of Personnel", + "Internal Affairs Agent", "Bartender", "Gardener", "Chef", "Janitor", "Librarian", - "Quartermaster", - "Cargo Technician", - "Shaft Miner", - "Lawyer", "Chaplain", "Assistant" ) diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 28b216654d3..a3bb1c17f0b 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -62,8 +62,10 @@ var/list/whitelist = list() var/text = file2text("config/alienwhitelist.txt") if (!text) log_misc("Failed to load config/alienwhitelist.txt") + return 0 else alien_whitelist = text2list(text, "\n") + return 1 /proc/is_alien_whitelisted(mob/M, var/species) if (!config.usealienwhitelist) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 19399ce7392..ac736ddfe29 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -18,7 +18,7 @@ Beacon.invisibility = INVISIBILITY_MAXIMUM Beacon.loc = T - hide(T.intact) + hide(!T.is_plating()) Destroy() if(Beacon) diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index a6643181c25..277742a22be 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -85,10 +85,8 @@ 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 + T.make_plating(!(T.broken || T.burnt)) + return new_turf.is_plating() /obj/machinery/cablelayer/proc/layCable(var/turf/new_turf,var/M_Dir) if(!on) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 7a36c3f7ab1..8ca4c63c645 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -41,14 +41,9 @@ else return -/obj/machinery/optable/blob_act() - if(prob(75)) - 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!") + visible_message("\The [usr] destroys \the [src]!") src.density = 0 qdel(src) return @@ -87,9 +82,9 @@ /obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user as mob) if (C == user) - user.visible_message("[user] climbs on the operating table.","You climb on the operating table.") + user.visible_message("[user] climbs on \the [src].","You climb on \the [src].") else - visible_message("\red [C] has been laid on the operating table by [user].", 3) + visible_message("\The [C] has been laid on \the [src] by [user].", 3) if (C.client) C.client.perspective = EYE_PERSPECTIVE C.client.eye = src @@ -167,5 +162,12 @@ qdel(W) return - +/obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob) + check_victim() + if(src.victim && get_turf(victim) == get_turf(src) && victim.lying) + usr << "\The [src] is already occupied!" + return 0 + if(patient.buckled) + usr << "Unbuckle \the [patient] first!" + return 0 return 1 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index a17dda8fb27..ab2da97d920 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -1,250 +1,12 @@ -///////////////////////////////////////// -// SLEEPER CONSOLE -///////////////////////////////////////// - -/obj/machinery/sleep_console - name = "Sleeper Console" - icon = 'icons/obj/Cryogenic2.dmi' - icon_state = "sleeperconsole" - var/obj/machinery/sleeper/connected = null - anchored = 1 //About time someone fixed this. - density = 0 - var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r" - - use_power = 1 - idle_power_usage = 40 - interact_offline = 1 - - var/ui_data = list() // NanoUI Dataset (for live debugging) - var/printjob_queued = 0 // printer status - -/obj/machinery/sleep_console/ex_act(severity) - switch(severity) - if(1.0) - //SN src = null - qdel(src) - return - if(2.0) - if (prob(50)) - //SN src = null - qdel(src) - return - else - return - -/obj/machinery/sleep_console/New() - ..() - spawn( 5 ) - if(orient == "RIGHT") - icon_state = "sleeperconsole-r" - src.connected = locate(/obj/machinery/sleeper, get_step(src, EAST)) - else - src.connected = locate(/obj/machinery/sleeper, get_step(src, WEST)) - - return - return - -/obj/machinery/sleep_console/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/sleep_console/attack_hand(mob/user as mob) - if(..()) - return - if(stat & (NOPOWER|BROKEN)) - return - - // Handle NanoUI - ui_interact(user) - return - -// Interaction with NanoUI -/obj/machinery/sleep_console/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - // Generate dataset - ui_data = generate_ui_data() - - // Update UI with data / create new UI - ui = nanomanager.try_update_ui(user, src, ui_key, ui, ui_data, force_open) - if (!ui) - // UI does not exist, yet. Create new one - ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper Console", 455,675) - ui.set_initial_data(ui_data) - ui.open() - - // Update window every master controller tick - ui.set_auto_update(1) - return - -// Generate dataset -/obj/machinery/sleep_console/proc/generate_ui_data() - var/data = list() - - if (!src.connected || (connected.stat & (NOPOWER|BROKEN))) - // Unit inoperable - data["inop"] = 1 - else - var/mob/living/occupant = src.connected.occupant - - // Add occupant data - if (occupant) - data["occupant"] = list() - - // General status - data["occupant"]["stat"] = list() - data["occupant"]["stat"]["value"] = occupant.stat - switch (occupant.stat) - if(DEAD) - data["occupant"]["stat"]["string"] = "Dead" - if(UNCONSCIOUS) - data["occupant"]["stat"]["string"] = "Unconscious" - if(CONSCIOUS) - data["occupant"]["stat"]["string"] = "Conscious" - else - data["occupant"]["stat"]["string"] = "Unknown" - - // Health information - data["occupant"]["health"] = list() - // Carbon mobs: pulse - if (iscarbon(occupant)) - var/mob/living/carbon/occupant_c = occupant - data["occupant"]["health"]["pulse"] = list() - data["occupant"]["health"]["pulse"]["value"] = occupant_c.get_pulse(GETPULSE_TOOL) - switch(occupant_c.pulse) - if(PULSE_NONE) - data["occupant"]["health"]["pulse"]["state"] = "NONE" - if(PULSE_THREADY) - data["occupant"]["health"]["pulse"]["state"] = "THREADY" - else - data["occupant"]["health"]["pulse"]["state"] = "OK" - // Damage - data["occupant"]["health"]["combined"] = occupant.health - data["occupant"]["health"]["brute"] = occupant.getBruteLoss() - data["occupant"]["health"]["oxy"] = occupant.getOxyLoss() - data["occupant"]["health"]["toxin"] = occupant.getToxLoss() - data["occupant"]["health"]["burn"] = occupant.getFireLoss() - - // Paralysis - data["occupant"]["health"]["paralysis"] = list() - data["occupant"]["health"]["paralysis"]["amount"] = occupant.paralysis - data["occupant"]["health"]["paralysis"]["countdown"] = round(occupant.paralysis / 4) - - // Reagents in occupant - data["occupant"]["reagents"] = list() - for (var/chemical in src.connected.available_chemicals) - var/chems[0] - chems["amount"] = occupant.reagents.get_reagent_amount(chemical) - chems["name"] = src.connected.available_chemicals[chemical] - chems["id"] = chemical - data["occupant"]["reagents"] += list(chems) - - // Dispensable chemicals - data["dispenser"] = list() - data["dispenser"]["amounts"] = src.connected.amounts - data["dispenser"]["chemicals"] = list() - for (var/chemical in src.connected.available_chemicals) - data["dispenser"]["chemicals"][chemical] = src.connected.available_chemicals[chemical] - - // Dialysis beaker data - if (src.connected.beaker) - data["beaker"] = list() - data["beaker"]["max_volume"] = src.connected.beaker.reagents.maximum_volume - data["beaker"]["reagents_volume"] = src.connected.beaker.reagents.total_volume - data["beaker"]["free_volume"] = src.connected.beaker.reagents.maximum_volume - src.connected.beaker.reagents.total_volume - data["beaker"]["dialysis"] = src.connected.filtering - - return data - -/obj/machinery/sleep_console/Topic(href, href_list) - if(..()) - return - - if (!(src.connected)) - return - - if (usr == src.connected.occupant) - usr << "You can't reach the controls from the inside." - return - - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) - usr.set_machine(src) - src.add_fingerprint(usr) - - // Inject reagent - if (href_list["chemical"]) - if (src.connected && src.connected.occupant && src.connected.occupant.stat != DEAD) - // Prevent href shenanigans - if (href_list["chemical"] in src.connected.available_chemicals) - src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"])) - - // Eject dialysis beaker - if (href_list["removebeaker"]) - src.connected.remove_beaker() - - // Toggle filtering on/off - if (href_list["togglefilter"]) - src.connected.toggle_filter() - - // Eject occupant - if (href_list["ejectify"]) - src.connected.eject() - - // Sensor printout - if (href_list["print"]) - // Limit rate - if (!printjob_queued) - printjob_queued = 1 - var/printer_data = generate_ui_data() - sleep(50) - var/obj/item/weapon/paper/printout = new /obj/item/weapon/paper(src.loc) - printout.name = "Sleeper Scanner Printout" - printout.desc = "This is a printout from one of the sleeper consoles." - printout.info = "
"
-				printout.info +="---------------------------------------\n"
-				printout.info +="-  SLEEPER SCANNER REPORT    NT#1290a -\n"
-				printout.info +="---------------------------------------\n"
-				printout.info +="\n"
-				printout.info +=text("M. ACTIVITY  :  []\n", printer_data["occupant"]["stat"]["string"])
-				printout.info +=text("HEALTH RATING:  []%\n",printer_data["occupant"]["health"]["combined"])
-				printout.info +=text("         BRT :  []%\n",printer_data["occupant"]["health"]["brute"])
-				printout.info +=text("         OXY :  []%\n",printer_data["occupant"]["health"]["oxy"])
-				printout.info +=text("         TOX :  []%\n",printer_data["occupant"]["health"]["toxin"])
-				printout.info +=text("         BRN :  []%\n",printer_data["occupant"]["health"]["burn"])
-				printout.info +="\n"
-				/*printout.info +=text("PARALYSIS REP:  []%\n",printer_data["occupant"]["health"]["paralysis"]["amount"])
-				printout.info +=text("         REM :  []s\n",printer_data["occupant"]["health"]["paralysis"]["countdown"])
-				printout.info +="\n"*/
-				if (printer_data["occupant"]["health"]["pulse"])
-					printout.info += text("PULSE        :  [] bpm ([])\n",printer_data["occupant"]["health"]["pulse"]["value"],printer_data["occupant"]["health"]["pulse"]["state"])
-				printout.info += "REAGENTS     :  \n"
-				for (var/chem in printer_data["occupant"]["reagents"])
-					printout.info += text("     [][]\t []U\n",chem["name"],(length(chem["name"]) > 9) ? "" : "\t", chem["amount"])
-				printout.info +="\n\n------------- tear here ---------------
" - // Ready for next printjob - printjob_queued = 0 - return - - - - - - - - - -///////////////////////////////////////// -// THE SLEEPER ITSELF -///////////////////////////////////////// - /obj/machinery/sleeper - name = "Sleeper" + name = "sleeper" desc = "A fancy bed with built-in injectors, a dialysis machine, and a limited health scanner." icon = 'icons/obj/Cryogenic2.dmi' icon_state = "sleeper_0" density = 1 anchored = 1 - var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r" var/mob/living/carbon/human/occupant = null - var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") - var/amounts = list(5, 10) + var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 var/allow_occupant_types = list(/mob/living/carbon/human) @@ -254,341 +16,211 @@ idle_power_usage = 15 active_power_usage = 200 //builtin health analyzer, dialysis machine, injectors. - New() - ..() - beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - spawn( 5 ) - if(orient == "RIGHT") - icon_state = "sleeper_0-r" - return +/obj/machinery/sleeper/New() + ..() + beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + +/obj/machinery/sleeper/initialize() + update_icon() + +/obj/machinery/sleeper/process() + if(stat & (NOPOWER|BROKEN)) return - process() - if (stat & (NOPOWER|BROKEN)) - return - - if(filtering > 0) - if(beaker) - if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) - var/pumped = 0 - for(var/datum/reagent/x in src.occupant.reagents.reagent_list) - src.occupant.reagents.trans_to_obj(beaker, 3) - pumped++ - if (ishuman(src.occupant)) - src.occupant.vessel.trans_to_obj(beaker, pumped + 1) - src.updateUsrDialog() - return - - - blob_act() - if(prob(75)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - A.blob_act() - qdel(src) - return - - attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) - if(istype(G, /obj/item/weapon/reagent_containers/glass)) - if(!beaker) - beaker = G - user.drop_item() - G.loc = src - user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") - src.updateUsrDialog() - return - else - user << "\red The sleeper has a beaker already." - return - - else if(istype(G, /obj/item/weapon/grab)) - if(!ismob(G:affecting)) - return - - if(src.occupant) - user << "\blue The sleeper is already occupied!" - return - - for(var/mob/living/carbon/slime/M in range(1,G:affecting)) - if(M.Victim == G:affecting) - usr << "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head." - return - - - visible_message("[user] starts putting [G:affecting:name] into the sleeper.", 3) - - if (do_mob(user, G:affecting, 30, needhand = 0)) - var/bucklestatus = G:affecting.bucklecheck(user) - if (!bucklestatus)//incase the patient got buckled during the delay - return - if (bucklestatus == 2) - var/obj/structure/LB = G:affecting.buckled - LB.user_unbuckle_mob(user) - - if(src.occupant) - user << "\blue The sleeper is already occupied!" - return - if(!G || !G:affecting) return - var/mob/M = G:affecting - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.loc = src - update_use_power(2) - src.occupant = M - src.icon_state = "sleeper_1" - if(orient == "RIGHT") - icon_state = "sleeper_1-r" - - src.add_fingerprint(user) - qdel(G) - return - return - - MouseDrop_T(atom/movable/O as mob|obj, mob/living/user as mob) - if(!istype(user)) - return - if(!check_occupant_allowed(O)) - return - - if(src.occupant) - user << "\blue The sleeper is already occupied!" - return - - for(var/mob/living/carbon/slime/M in range(1,O)) - if(M.Victim == O) - usr << "[O.name] will not fit into the sleeper because they have a slime latched onto their head." - return - var/mob/living/L = O - var/bucklestatus = L.bucklecheck(user) - - if (!bucklestatus)//We must make sure the person is unbuckled before they go in - return - - - if(L == user) - visible_message("[user] starts climbing into the sleeper.", 3) + if(filtering > 0) + if(beaker) + if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) + var/pumped = 0 + for(var/datum/reagent/x in occupant.reagents.reagent_list) + occupant.reagents.trans_to_obj(beaker, 3) + pumped++ + if(ishuman(occupant)) + occupant.vessel.trans_to_obj(beaker, pumped + 1) else - visible_message("[user] starts putting [L.name] into the sleeper.", 3) + toggle_filter() - if (do_mob(user, L, 30, needhand = 0)) - if (bucklestatus == 2) - var/obj/structure/LB = L.buckled - LB.user_unbuckle_mob(user) - if(src.occupant) - user << "\blue The sleeper is already occupied!" - return - if(!L) return - - if(L.client) - L.client.perspective = EYE_PERSPECTIVE - L.client.eye = src - L.loc = src - src.occupant = L - src.icon_state = (orient == "RIGHT") ? "sleeper_1-r" : "sleeper_1" - L << "\blue You feel cool air surround you. You go numb as your senses turn inward." - src.add_fingerprint(user) - if(user.pulling == L) - user.pulling = null - - - proc/check_occupant_allowed(mob/M) - var/correct_type = 0 - for(var/type in allow_occupant_types) - if(istype(M, type)) - correct_type = 1 - break - - if(!correct_type) return 0 - - for(var/type in disallow_occupant_types) - if(istype(M, type)) - return 0 +/obj/machinery/sleeper/update_icon() + icon_state = "sleeper_[occupant ? "1" : "0"]" +/obj/machinery/sleeper/attack_hand(var/mob/user) + if(..()) return 1 - ex_act(severity) - if(filtering) - toggle_filter() - switch(severity) - if(1.0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - ex_act(severity) - 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) - 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) - qdel(src) - return - return - emp_act(severity) - if(filtering) - toggle_filter() - if(stat & (BROKEN|NOPOWER)) - ..(severity) - return + ui_interact(user) + +/obj/machinery/sleeper/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = outside_state) + var/data[0] + + data["power"] = stat & (NOPOWER|BROKEN) ? 0 : 1 + + var/list/reagents = list() + for(var/T in available_chemicals) + var/list/reagent = list() + reagent["id"] = T + reagent["name"] = available_chemicals[T] if(occupant) - go_out() - ..(severity) + reagent["amount"] = occupant.reagents.get_reagent_amount(T) + reagents += list(reagent) + data["reagents"] = reagents.Copy() - alter_health(mob/living/M as mob) - if (M.health > 0) - if (M.getOxyLoss() >= 10) - var/amount = max(0.15, 1) - M.adjustOxyLoss(-amount) - else - M.adjustOxyLoss(-12) - M.updatehealth() - M.AdjustParalysis(-4) - M.AdjustWeakened(-4) - M.AdjustStunned(-4) - M.Paralyse(1) - M.Weaken(1) - M.Stun(1) - if (M:reagents.get_reagent_amount("inaprovaline") < 5) - M:reagents.add_reagent("inaprovaline", 5) + if(occupant) + data["occupant"] = 1 + switch(occupant.stat) + if(CONSCIOUS) + data["stat"] = "Conscious" + if(UNCONSCIOUS) + data["stat"] = "Unconscious" + if(DEAD) + data["stat"] = "Dead" + data["health"] = occupant.health + if(iscarbon(occupant)) + var/mob/living/carbon/C = occupant + data["pulse"] = C.get_pulse(GETPULSE_TOOL) + data["brute"] = occupant.getBruteLoss() + data["burn"] = occupant.getFireLoss() + data["oxy"] = occupant.getOxyLoss() + data["tox"] = occupant.getToxLoss() + else + data["occupant"] = 0 + if(beaker) + data["beaker"] = beaker.reagents.get_free_space() + else + data["beaker"] = -1 + data["filtering"] = filtering + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +// #TODO-MERGE: Reimport Nanako's bucklesleeperBS +/obj/machinery/sleeper/Topic(href, href_list) + if(..()) + return 1 + + if(usr == occupant) + usr << "You can't reach the controls from the inside." return - proc/toggle_filter() - if(!src.occupant) - filtering = 0 - return - if(filtering) - filtering = 0 - else - filtering = 1 - proc/go_out() - if(filtering) + add_fingerprint(usr) + + if(href_list["eject"]) + go_out() + if(href_list["beaker"]) + remove_beaker() + if(href_list["filter"]) + if(filtering != text2num(href_list["filter"])) toggle_filter() - if(!src.occupant) - return - for(var/obj/O in src) //once again, why wasn't this here? - if (O != beaker) - O.loc = src.loc - if(src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - src.occupant = null - update_use_power(1) - if(orient == "RIGHT") - icon_state = "sleeper_0-r" - return + if(href_list["chemical"] && href_list["amount"]) + if(occupant && occupant.stat != DEAD) + if(href_list["chemical"] in available_chemicals) // Your hacks are bad and you should feel bad + inject_chemical(usr, href_list["chemical"], text2num(href_list["amount"])) + return 1 - proc/inject_chemical(mob/living/user as mob, chemical, amount) - if (stat & (BROKEN|NOPOWER)) - return +/obj/machinery/sleeper/attack_ai(var/mob/user) + return attack_hand(user) - if(src.occupant && src.occupant.reagents) - if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20) - use_power(amount * CHEM_SYNTH_ENERGY) - src.occupant.reagents.add_reagent(chemical, amount) - user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in their bloodstream." - return - user << "There's no occupant in the sleeper or the subject has too many chemicals!" - return - - - proc/check(mob/living/user as mob) - if(src.occupant) - user << text("\blue Occupant ([]) Statistics:", src.occupant) - var/t1 - switch(src.occupant.stat) - if(0.0) - t1 = "Conscious" - if(1.0) - t1 = "Unconscious" - if(2.0) - t1 = "*dead*" - else - user << text("[]\t Health %: [] ([])", (src.occupant.health > 50 ? "\blue " : "\red "), src.occupant.health, t1) - user << text("[]\t -Core Temperature: []°C ([]°F)

", (src.occupant.bodytemperature > 50 ? "" : ""), src.occupant.bodytemperature-T0C, src.occupant.bodytemperature*1.8-459.67) - user << text("[]\t -Brute Damage %: []", (src.occupant.getBruteLoss() < 60 ? "\blue " : "\red "), src.occupant.getBruteLoss()) - user << text("[]\t -Respiratory Damage %: []", (src.occupant.getOxyLoss() < 60 ? "\blue " : "\red "), src.occupant.getOxyLoss()) - user << text("[]\t -Toxin Content %: []", (src.occupant.getToxLoss() < 60 ? "\blue " : "\red "), src.occupant.getToxLoss()) - user << text("[]\t -Burn Severity %: []", (src.occupant.getFireLoss() < 60 ? "\blue " : "\red "), src.occupant.getFireLoss()) - user << "\blue Expected time till occupant can safely awake: (note: If health is below 20% these times are inaccurate)" - user << text("\blue \t [] second\s (if around 1 or 2 the sleeper is keeping them asleep.)", src.occupant.paralysis / 5) - if(src.beaker) - user << text("\blue \t Dialysis Output Beaker has [] of free space remaining.", src.beaker.reagents.maximum_volume - src.beaker.reagents.total_volume) - else - user << "\blue No Dialysis Output Beaker loaded." +/obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/user) + add_fingerprint(user) + if(istype(I, /obj/item/weapon/reagent_containers/glass)) + if(!beaker) + beaker = I + user.drop_item() + I.loc = src + user.visible_message("\The [user] adds \a [I] to \the [src].", "You add \a [I] to \the [src].") else - user << "\blue There is no one inside!" + user << "\The [src] has a beaker already." return +/obj/machinery/sleeper/MouseDrop_T(var/mob/target, var/mob/user) + if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target)) + return + go_in(target, user) - verb/eject() - set name = "Eject Sleeper" - set category = "Object" - set src in oview(1) - if(usr.stat != 0) - return - if(orient == "RIGHT") - icon_state = "sleeper_0-r" - src.icon_state = "sleeper_0" - src.go_out() - add_fingerprint(usr) +/obj/machinery/sleeper/relaymove(var/mob/user) + ..() + go_out() + +/obj/machinery/sleeper/emp_act(var/severity) + if(filtering) + toggle_filter() + + if(stat & (BROKEN|NOPOWER)) + ..(severity) return - verb/remove_beaker() - set name = "Remove Beaker" - set category = "Object" - set src in oview(1) - if(usr.stat != 0) - return - if(beaker) - filtering = 0 - beaker.loc = usr.loc - beaker = null - add_fingerprint(usr) + if(occupant) + go_out() + + ..(severity) +/obj/machinery/sleeper/proc/toggle_filter() + if(!occupant || !beaker) + filtering = 0 + return + filtering = !filtering + +/obj/machinery/sleeper/proc/go_in(var/mob/M, var/mob/user) + if(!M) + return + if(stat & (BROKEN|NOPOWER)) + return + if(occupant) + user << "\The [src] is already occupied." return - verb/move_inside() - set name = "Enter Sleeper" - set category = "Object" - set src in oview(1) + if(M == user) + visible_message("\The [user] starts climbing into \the [src].") + else + visible_message("\The [user] starts putting [M] into \the [src].") - if(usr.stat != 0 || !(ishuman(usr) || issmall(usr))) + if(do_after(user, 20)) + if(occupant) + user << "\The [src] is already occupied." return + M.stop_pulling() + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.loc = src + update_use_power(2) + occupant = M + update_icon() - if(src.occupant) - usr << "\blue The sleeper is already occupied!" - return - - for(var/mob/living/carbon/slime/M in range(1,usr)) - if(M.Victim == usr) - usr << "You're too busy getting your life sucked out of you." - return - visible_message("[usr] starts climbing into the sleeper.", 3) - if(do_after(usr, 20)) - if(src.occupant) - usr << "\blue The sleeper is already occupied!" - return - usr.stop_pulling() - usr.client.perspective = EYE_PERSPECTIVE - usr.client.eye = src - usr.loc = src - update_use_power(2) - src.occupant = usr - src.icon_state = "sleeper_1" - if(orient == "RIGHT") - icon_state = "sleeper_1-r" - - for(var/obj/O in src) - qdel(O) - src.add_fingerprint(usr) - return +/obj/machinery/sleeper/proc/go_out() + if(!occupant) return + if(occupant.client) + occupant.client.eye = occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE + occupant.loc = loc + occupant = null + for(var/atom/movable/A in src) // In case an object was dropped inside or something + if(A == beaker) + continue + A.loc = loc + update_use_power(1) + update_icon() + toggle_filter() + +/obj/machinery/sleeper/proc/remove_beaker() + if(beaker) + beaker.loc = loc + beaker = null + toggle_filter() + +/obj/machinery/sleeper/proc/inject_chemical(var/mob/living/user, var/chemical, var/amount) + if(stat & (BROKEN|NOPOWER)) + return + + if(occupant && occupant.reagents) + if(occupant.reagents.get_reagent_amount(chemical) + amount <= 20) + use_power(amount * CHEM_SYNTH_ENERGY) + occupant.reagents.add_reagent(chemical, amount) + user << "Occupant now has [occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in their bloodstream." + else + user << "The subject has too many chemicals." + else + user << "There's no suitable occupant in \the [src]." diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 3b87b154450..8643b8c4b1d 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -39,10 +39,10 @@ if (usr.stat != 0) return if (src.occupant) - usr << "\blue The scanner is already occupied!" + usr << "The scanner is already occupied!" return if (usr.abiotic()) - usr << "\blue Subject cannot have abiotic items on." + usr << "The subject cannot have abiotic items on." return usr.pulling = null usr.client.perspective = EYE_PERSPECTIVE @@ -77,10 +77,10 @@ if ((!( istype(G, /obj/item/weapon/grab) ) || !( ismob(G.affecting) ))) return if (src.occupant) - user << "\blue The scanner is already occupied!" + user << "The scanner is already occupied!" return if (G.affecting.abiotic()) - user << "\blue Subject cannot have abiotic items on." + user << "Subject cannot have abiotic items on." return if(istype(G, /obj/item/weapon/grab)) @@ -184,12 +184,6 @@ else return -/obj/machinery/bodyscanner/blob_act() - if(prob(50)) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - qdel(src) - /obj/machinery/body_scanconsole/ex_act(severity) switch(severity) @@ -205,11 +199,6 @@ else return -/obj/machinery/body_scanconsole/blob_act() - - if(prob(50)) - qdel(src) - /obj/machinery/body_scanconsole/power_change() ..() if(stat & BROKEN) @@ -272,10 +261,10 @@ if(stat & (NOPOWER|BROKEN)) return if(!connected || (connected.stat & (NOPOWER|BROKEN))) - user << "\red This console is not connected to a functioning body scanner." + user << "This console is not connected to a functioning body scanner." return if(!ishuman(connected.occupant)) - user << "\red This device can only scan compatible lifeforms." + user << "This device can only scan compatible lifeforms." return var/dat @@ -288,7 +277,7 @@ dat = format_occupant_data(src.connected.get_occupant_data()) dat += "
Print
" else - dat = " Error: No Body Scanner connected." + dat = "Error: No Body Scanner connected." dat += text("
Close", user) user << browse(dat, "window=scanconsole;size=430x600") @@ -361,30 +350,30 @@ aux = "Unconscious" else aux = "Dead" - dat += text("[]\tHealth %: [] ([])

", (occ["health"] > 50 ? "" : ""), occ["health"], aux) + dat += text("[]\tHealth %: [] ([])
", ("Viral pathogen detected in blood stream.
" - dat += text("[]\t-Brute Damage %: []

", (occ["bruteloss"] < 60 ? "" : ""), occ["bruteloss"]) - dat += text("[]\t-Respiratory Damage %: []
", (occ["oxyloss"] < 60 ? "" : ""), occ["oxyloss"]) - dat += text("[]\t-Toxin Content %: []
", (occ["toxloss"] < 60 ? "" : ""), occ["toxloss"]) - dat += text("[]\t-Burn Severity %: []

", (occ["fireloss"] < 60 ? "" : ""), occ["fireloss"]) + dat += text("[]\t-Brute Damage %: []
", (""), occ["bruteloss"]) + dat += text("[]\t-Respiratory Damage %: []
", (""), occ["oxyloss"]) + dat += text("[]\t-Toxin Content %: []
", (""), occ["toxloss"]) + dat += text("[]\t-Burn Severity %: []

", (""), occ["fireloss"]) - dat += text("[]\tRadiation Level %: []
", (occ["rads"] < 10 ?"" : ""), occ["rads"]) - dat += text("[]\tGenetic Tissue Damage %: []
", (occ["cloneloss"] < 1 ?"" : ""), occ["cloneloss"]) - dat += text("[]\tApprox. Brain Damage %: []
", (occ["brainloss"] < 1 ?"" : ""), occ["brainloss"]) + dat += text("[]\tRadiation Level %: []
", (""), occ["rads"]) + dat += text("[]\tGenetic Tissue Damage %: []
", (""), occ["cloneloss"]) + dat += text("[]\tApprox. Brain Damage %: []
", (""), occ["brainloss"]) dat += text("Paralysis Summary %: [] ([] seconds left!)
", occ["paralysis"], round(occ["paralysis"] / 4)) dat += text("Body Temperature: [occ["bodytemp"]-T0C]°C ([occ["bodytemp"]*1.8-459.67]°F)

") if(occ["borer_present"]) dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
" - dat += text("[]\tBlood Level %: [] ([] units)

", (occ["blood_amount"] > 448 ?"" : ""), occ["blood_amount"]*100 / 560, occ["blood_amount"]) + dat += text("[]\tBlood Level %: [] ([] units)
", (""), occ["blood_amount"]*100 / 560, occ["blood_amount"]) dat += text("Inaprovaline: [] units
", occ["inaprovaline_amount"]) dat += text("Soporific: [] units
", occ["stoxin_amount"]) - dat += text("[]\tDermaline: [] units

", (occ["dermaline_amount"] < 30 ? "" : ""), occ["dermaline_amount"]) - dat += text("[]\tBicaridine: [] units
", (occ["bicaridine_amount"] < 30 ? "" : ""), occ["bicaridine_amount"]) - dat += text("[]\tDexalin: [] units
", (occ["dexalin_amount"] < 30 ? "" : ""), occ["dexalin_amount"]) + dat += text("[]\tDermaline: [] units
", (""), occ["dermaline_amount"]) + dat += text("[]\tBicaridine: [] units
", (""), occ["bicaridine_amount"]) + dat += text("[]\tDexalin: [] units
", (""), occ["dexalin_amount"]) for(var/datum/disease/D in occ["tg_diseases_list"]) if(!D.hidden[SCANNER]) @@ -442,7 +431,8 @@ infected = "Acute Infection++:" if (INFECTION_LEVEL_THREE to INFINITY) infected = "Septic:" - + if(e.rejecting) + infected += "(being rejected)" if (e.implants.len) var/unknown_body = 0 for(var/I in e.implants) @@ -458,7 +448,7 @@ if(!e.is_stump()) dat += "[e.name][e.burn_dam][e.brute_dam][robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]" else - dat += "[e.name]--Not Found" + dat += "[e.name]--Not [e.is_stump() ? "Found" : "Attached Completely"]" dat += "" for(var/obj/item/organ/i in occ["internal_organs"]) @@ -483,6 +473,8 @@ infection = "Acute Infection+:" if (INFECTION_LEVEL_TWO + 300 to INFINITY) infection = "Acute Infection++:" + if(i.rejecting) + infection += "(being rejected)" dat += "" dat += "[i.name]N/A[i.damage][infection]:[mech]" diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 5f6e40e414b..9d45b14414e 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -52,7 +52,7 @@ if (user.machine==src) src.attack_hand(usr) else - user << "\red Access denied." + user << "Access denied." return return @@ -127,4 +127,4 @@ if (uses >= 0) cooldown_on = 0 src.power_change() - return \ No newline at end of file + return diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index dd6d05e82e7..86d11156fc9 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -69,7 +69,7 @@ var/datum/radio_frequency/radio_connection var/list/TLV = list() - var/list/trace_gas = list("sleeping_agent", "volatile_fuel") //list of other gases that this air alarm is able to detect + var/list/trace_gas = list("sleeping_agent") //list of other gases that this air alarm is able to detect var/danger_level = 0 var/pressure_dangerlevel = 0 @@ -101,10 +101,9 @@ /obj/machinery/alarm/Destroy() unregister_radio(src, frequency) - if(wires) - qdel(wires) - wires = null - ..() + qdel(wires) + wires = null + return ..() /obj/machinery/alarm/New(var/loc, var/dir, var/building = 0) ..() @@ -304,22 +303,30 @@ /obj/machinery/alarm/update_icon() if(wiresexposed) icon_state = "alarmx" + set_light(0) return if((stat & (NOPOWER|BROKEN)) || shorted) icon_state = "alarmp" + set_light(0) return var/icon_level = danger_level if (alarm_area.atmosalm) icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow + var/new_color = null switch(icon_level) if (0) icon_state = "alarm0" + new_color = "#03A728" if (1) icon_state = "alarm2" //yes, alarm2 is yellow alarm + new_color = COLOR_SUN if (2) icon_state = "alarm1" + new_color = "#DA0205" + + set_light(l_range = 2, l_power = 0.5, l_color = new_color) /obj/machinery/alarm/receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) @@ -480,7 +487,7 @@ 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["locked"] = locked && !issilicon(user) data["remote_connection"] = remote_connection data["remote_access"] = remote_access data["rcon"] = rcon_setting @@ -488,7 +495,7 @@ populate_status(data) - if(!(locked && !remote_connection) || remote_access || user.isSilicon()) + if(!(locked && !remote_connection) || remote_access || issilicon(user)) populate_controls(data) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -601,7 +608,7 @@ if(buildstage != 2) return STATUS_CLOSE - if(aidisabled && user.isMobAI()) + if(aidisabled && isAI(user)) user << "AI control for \the [src] interface has been disabled." return STATUS_CLOSE @@ -615,8 +622,8 @@ return min(..(), .) -/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state) - if(..(href, href_list, nowindow, state)) +/obj/machinery/alarm/Topic(href, href_list, var/datum/topic_state/state) + if(..(href, href_list, state)) return 1 // hrefs that can always be called -walter0o @@ -646,7 +653,7 @@ // hrefs that need the AA unlocked -walter0o var/extra_href = state.href_list(usr) - if(!(locked && !extra_href["remote_connection"]) || extra_href["remote_access"] || usr.isSilicon()) + if(!(locked && !extra_href["remote_connection"]) || extra_href["remote_access"] || issilicon(usr)) if(href_list["command"]) var/device_id = href_list["id_tag"] switch(href_list["command"]) @@ -781,9 +788,9 @@ else if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked - user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface." + user << "You [ locked ? "lock" : "unlock"] the Air Alarm interface." else - user << "\red Access denied." + user << "Access denied." return if(1) @@ -869,8 +876,11 @@ FIRE ALARM var/last_process = 0 var/wiresexposed = 0 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone + var/seclevel /obj/machinery/firealarm/update_icon() + overlays.Cut() + if(wiresexposed) switch(buildstage) if(2) @@ -879,17 +889,28 @@ FIRE ALARM icon_state="fire_b1" if(0) icon_state="fire_b0" - + set_light(0) return if(stat & BROKEN) icon_state = "firex" + set_light(0) else if(stat & NOPOWER) icon_state = "firep" - else if(!src.detecting) - icon_state = "fire1" + set_light(0) else - icon_state = "fire0" + if(!src.detecting) + icon_state = "fire1" + set_light(l_range = 4, l_power = 2, l_color = COLOR_RED) + else + icon_state = "fire0" + switch(seclevel) + if("green") set_light(l_range = 2, l_power = 0.5, l_color = COLOR_LIME) + if("blue") set_light(l_range = 2, l_power = 0.5, l_color = "#1024A9") + if("red") set_light(l_range = 4, l_power = 2, l_color = COLOR_RED) + if("delta") set_light(l_range = 4, l_power = 2, l_color = "#FF6633") + + src.overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]") /obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume) if(src.detecting) @@ -922,11 +943,11 @@ FIRE ALARM if (istype(W, /obj/item/device/multitool)) src.detecting = !( src.detecting ) if (src.detecting) - user.visible_message("\red [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") + user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") else - user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") + user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") else if (istype(W, /obj/item/weapon/wirecutters)) - user.visible_message("\red [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") + user.visible_message("\The [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") new/obj/item/stack/cable_coil(get_turf(src), 5) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) buildstage = 1 @@ -939,7 +960,7 @@ FIRE ALARM buildstage = 2 return else - user << "You need 5 pieces of cable to do wire \the [src]." + user << "You need 5 pieces of cable to wire \the [src]." return else if(istype(W, /obj/item/weapon/crowbar)) user << "You pry out the circuit!" @@ -1015,7 +1036,7 @@ FIRE ALARM d2 = text("Initiate Time Lock", src) var/second = round(src.time) % 60 var/minute = (round(src.time) - second) / 60 - var/dat = "Fire alarm [d1]\n
The current alert level is: [get_security_level()]


\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" + var/dat = "Fire alarm [d1]\n
The current alert level is: [get_security_level()]

\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" user << browse(dat, "window=firealarm") onclose(user, "firealarm") else @@ -1102,14 +1123,14 @@ FIRE ALARM pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 +/obj/machinery/firealarm/proc/set_security_level(var/newlevel) + if(seclevel != newlevel) + seclevel = newlevel + update_icon() + /obj/machinery/firealarm/initialize() if(z in config.contact_levels) - if(security_level) - src.overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]") - else - src.overlays += image('icons/obj/monitors.dmi', "overlay_green") - - update_icon() + set_security_level(security_level? get_security_level() : "green") /* FIRE ALARM CIRCUIT diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index c28ab5966b9..5fabac4f4b5 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -74,7 +74,8 @@ obj/machinery/air_sensor/Destroy() /obj/machinery/computer/general_air_control icon = 'icons/obj/computer.dmi' - icon_state = "tank" + icon_keyboard = "atmos_key" + icon_screen = "tank" name = "Computer" @@ -158,7 +159,6 @@ obj/machinery/computer/general_air_control/Destroy() /obj/machinery/computer/general_air_control/large_tank_control icon = 'icons/obj/computer.dmi' - icon_state = "tank" frequency = 1441 var/input_tag @@ -278,7 +278,6 @@ Max Output Pressure: [output_pressure] kPa
"} /obj/machinery/computer/general_air_control/supermatter_core icon = 'icons/obj/computer.dmi' - icon_state = "tank" frequency = 1438 var/input_tag @@ -398,7 +397,7 @@ Min Core Pressure: [pressure_limit] kPa
"} /obj/machinery/computer/general_air_control/fuel_injection icon = 'icons/obj/computer.dmi' - icon_state = "atmos" + icon_screen = "alert:0" var/device_tag var/list/device_info diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index 984dc44782d..99f04ec1fd1 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -1,9 +1,10 @@ /obj/machinery/computer/area_atmos name = "Area Air Control" desc = "A computer used to control the stationary scrubbers and pumps in the area." - icon_state = "area_atmos" + icon_keyboard = "atmos_key" + icon_screen = "area_atmos" light_color = "#e6ffff" - circuit = "/obj/item/weapon/circuitboard/area_atmos" + circuit = /obj/item/weapon/circuitboard/area_atmos var/list/connectedscrubbers = new() var/status = "" diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 42eac84de37..a2ed07562f1 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -5,6 +5,7 @@ density = 1 var/health = 100.0 flags = CONDUCT + w_class = 5 var/valve_open = 0 var/release_pressure = ONE_ATMOSPHERE @@ -13,7 +14,6 @@ var/canister_color = "yellow" var/can_label = 1 start_pressure = 45 * ONE_ATMOSPHERE - pressure_resistance = 7 * ONE_ATMOSPHERE var/temperature_resistance = 1000 + T0C volume = 1000 use_power = 0 @@ -36,6 +36,9 @@ canister_color = "red" can_label = 0 +/obj/machinery/portable_atmospherics/canister/nitrogen/prechilled + name = "Canister: \[N2 (Cooling)\]" + /obj/machinery/portable_atmospherics/canister/oxygen name = "Canister: \[O2\]" icon_state = "blue" @@ -227,11 +230,6 @@ update_flag return GM.return_pressure() return 0 -/obj/machinery/portable_atmospherics/canister/blob_act() - src.health -= 200 - healthcheck() - return - /obj/machinery/portable_atmospherics/canister/bullet_act(var/obj/item/projectile/Proj) if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) return @@ -241,11 +239,6 @@ update_flag healthcheck() ..() -/obj/machinery/portable_atmospherics/canister/meteorhit(var/obj/O as obj) - src.health = 0 - healthcheck() - return - /obj/machinery/portable_atmospherics/canister/AltClick(var/mob/dead/observer/admin) if (istype(admin)) if (admin.client && admin.client.holder && ((R_MOD|R_ADMIN) & admin.client.holder.rights)) @@ -267,7 +260,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda)) - visible_message("\red [user] hits the [src] with a [W]!") + visible_message("\The [user] hits \the [src] with \a [W]!") src.health -= W.force src.add_fingerprint(user) healthcheck() @@ -408,8 +401,6 @@ update_flag /obj/machinery/portable_atmospherics/canister/oxygen/prechilled/New() ..() - - src.air_contents.adjust_gas("oxygen", MolesForPressure()) src.air_contents.temperature = 80 src.update_icon() return 1 @@ -435,13 +426,17 @@ update_flag return 1 /obj/machinery/portable_atmospherics/canister/nitrogen/New() - ..() - src.air_contents.adjust_gas("nitrogen", MolesForPressure()) src.update_icon() return 1 +/obj/machinery/portable_atmospherics/canister/nitrogen/prechilled/New() + ..() + src.air_contents.temperature = 80 + src.update_icon() + return 1 + /obj/machinery/portable_atmospherics/canister/carbon_dioxide/New() ..() src.air_contents.adjust_gas("carbon_dioxide", MolesForPressure()) @@ -456,3 +451,24 @@ update_flag src.update_icon() return 1 + + + +// Special types used for engine setup admin verb, they contain double amount of that of normal canister. +/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/New() + ..() + src.air_contents.adjust_gas("nitrogen", MolesForPressure()) + src.update_icon() + return 1 + +/obj/machinery/portable_atmospherics/canister/carbon_dioxide/engine_setup/New() + ..() + src.air_contents.adjust_gas("carbon_dioxide", MolesForPressure()) + src.update_icon() + return 1 + +/obj/machinery/portable_atmospherics/canister/phoron/engine_setup/New() + ..() + src.air_contents.adjust_gas("phoron", MolesForPressure()) + src.update_icon() + return 1 diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 095aec4a24a..e2a0aed826a 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -69,10 +69,10 @@ var/t = "A gas flow meter. " if(get_dist(user, src) > 3 && !(istype(user, /mob/living/silicon/ai) || istype(user, /mob/dead))) - t += "\blue You are too far away to read it." + t += "You are too far away to read it." else if(stat & (NOPOWER|BROKEN)) - t += "\red The display is off." + t += "The display is off." else if(src.target) var/datum/gas_mixture/environment = target.return_air() @@ -97,11 +97,11 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + user << "You begin to unfasten \the [src]..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe_meter(src.loc) qdel(src) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 5b65a858076..1f763892dda 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -104,7 +104,6 @@ network.update = 1 /obj/machinery/portable_atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - var/obj/icon = src if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed ))) if (src.holding) return @@ -118,39 +117,26 @@ else if (istype(W, /obj/item/weapon/wrench)) if(connected_port) disconnect() - user << "\blue You disconnect [name] from the port." + user << "You disconnect \the [src] from the port." update_icon() return else var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc if(possible_port) if(connect(possible_port)) - user << "\blue You connect [name] to the port." + user << "You connect \the [src] to the port." update_icon() return else - user << "\blue [name] failed to connect to the port." + user << "\The [src] failed to connect to the port." return else - user << "\blue Nothing happens." + user << "Nothing happens." return else if ((istype(W, /obj/item/device/analyzer)) && Adjacent(user)) - visible_message("\red [user] has used [W] on \icon[icon]") - if(air_contents) - var/pressure = air_contents.return_pressure() - var/total_moles = air_contents.total_moles - - user << "\blue Results of analysis of \icon[icon]" - if (total_moles>0) - user << "\blue Pressure: [round(pressure,0.1)] kPa" - for(var/g in air_contents.gas) - user << "\blue [gas_data.name[g]]: [round((air_contents.gas[g] / total_moles) * 100)]%" - user << "\blue Temperature: [round(air_contents.temperature-T0C)]°C" - else - user << "\blue Tank is empty!" - else - user << "\blue Tank is empty!" + var/obj/item/device/analyzer/A = W + A.analyze_gases(src, user) return return @@ -182,16 +168,16 @@ C.add_fingerprint(user) cell = C C.loc = src - user.visible_message("\blue [user] opens the panel on [src] and inserts [C].", "\blue You open the panel on [src] and insert [C].") + user.visible_message("[user] opens the panel on [src] and inserts [C].", "You open the panel on [src] and insert [C].") power_change() return if(istype(I, /obj/item/weapon/screwdriver)) if(!cell) - user << "\red There is no power cell installed." + user << "There is no power cell installed." return - user.visible_message("\blue [user] opens the panel on [src] and removes [cell].", "\blue You open the panel on [src] and remove [cell].") + user.visible_message("[user] opens the panel on [src] and removes [cell].", "You open the panel on [src] and remove [cell].") cell.add_fingerprint(user) cell.loc = src.loc cell = null diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index ad664049fc0..a5bdac74218 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/atmos.dmi' icon_state = "psiphon:0" density = 1 + w_class = 3 var/on = 0 var/direction_out = 0 //0 = siphoning, 1 = releasing diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 06fa9e1f303..5ee92072a36 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/atmos.dmi' icon_state = "pscrubber:0" density = 1 + w_class = 3 var/on = 0 var/volume_rate = 800 @@ -16,7 +17,7 @@ var/minrate = 0 var/maxrate = 10 * ONE_ATMOSPHERE - var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent", "oxygen_agent_b") + var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent") /obj/machinery/portable_atmospherics/powered/scrubber/New() ..() @@ -165,7 +166,7 @@ name = "[name] (ID [id])" /obj/machinery/portable_atmospherics/powered/scrubber/huge/attack_hand(var/mob/user as mob) - usr << "\blue You can't directly interact with this machine. Use the scrubber control console." + usr << "You can't directly interact with this machine. Use the scrubber control console." /obj/machinery/portable_atmospherics/powered/scrubber/huge/update_icon() src.overlays = 0 @@ -206,12 +207,12 @@ /obj/machinery/portable_atmospherics/powered/scrubber/huge/attackby(var/obj/item/I as obj, var/mob/user as mob) if(istype(I, /obj/item/weapon/wrench)) if(on) - user << "\blue Turn it off first!" + user << "Turn \the [src] off first!" return anchored = !anchored playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You [anchored ? "wrench" : "unwrench"] \the [src]." + user << "You [anchored ? "wrench" : "unwrench"] \the [src]." return @@ -233,7 +234,7 @@ /obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/attackby(var/obj/item/I as obj, var/mob/user as mob) if(istype(I, /obj/item/weapon/wrench)) - user << "\blue The bolts are too tight for you to unscrew!" + user << "The bolts are too tight for you to unscrew!" return - ..() \ No newline at end of file + ..() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 55478fa6ef0..c2eb2db6380 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -37,6 +37,11 @@ component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/console_screen(src) RefreshParts() + +/obj/machinery/autolathe/Destroy() + qdel(wires) + wires = null + return ..() /obj/machinery/autolathe/proc/update_recipe_list() if(!machine_recipes) @@ -262,7 +267,7 @@ if(!making || !src) return //Create the desired item. - var/obj/item/I = new making.path(get_step(loc, get_dir(src,usr))) + var/obj/item/I = new making.path(loc) I.Created() if(multiplier > 1 && istype(I, /obj/item/stack)) var/obj/item/stack/S = I diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm index 4b13d332b60..e28209268bb 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. - qdel(I) + qdel(I) /datum/autolathe/recipe var/name = "object" @@ -37,6 +37,11 @@ path = /obj/item/device/flashlight category = "General" +/datum/autolathe/recipe/floor_light + name = "floor light" + path = /obj/machinery/floor_light + category = "General" + /datum/autolathe/recipe/extinguisher name = "extinguisher" path = /obj/item/weapon/extinguisher @@ -342,8 +347,8 @@ category = "Arms and Ammunition" /datum/autolathe/recipe/magazine_c20r - name = "ammunition (12mm)" - path = /obj/item/ammo_magazine/a12mm + name = "ammunition (10mm)" + path = /obj/item/ammo_magazine/a10mm hidden = 1 category = "Arms and Ammunition" @@ -442,5 +447,3 @@ path = /obj/item/weapon/handcuffs hidden = 1 category = "General" - - diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 70740901fae..16cbb7fa9d9 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -32,15 +32,18 @@ if (src.health <= 0) src.explode() -/obj/machinery/bot/proc/Emag(mob/user as mob) - if(locked) +/obj/machinery/bot/emag_act(var/remaining_charges, var/user) + if(locked && !emagged) locked = 0 emagged = 1 user << "You short out [src]'s maintenance hatch lock." log_and_message_admins("emagged [src]'s maintenance hatch lock") - if(!locked && open) + return 1 + + if(!locked && open && emagged == 1) emagged = 2 log_and_message_admins("emagged [src]'s inner circuits") + return 1 /obj/machinery/bot/examine(mob/user) ..(user) @@ -60,13 +63,12 @@ if(health < maxhealth) if(open) health = min(maxhealth, health+10) - user.visible_message("\red [user] repairs [src]!","\blue You repair [src]!") + user.visible_message("[user] repairs [src]!","You repair [src]!") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) else user << "Unable to repair with the maintenance panel closed." else user << "[src] does not need a repair." - else if (istype(W, /obj/item/weapon/card/emag) && emagged < 2) - Emag(user) else if(hasvar(W,"force") && hasvar(W,"damtype")) switch(W.damtype) @@ -74,6 +76,7 @@ src.health -= W.force * fire_dam_coeff if("brute") src.health -= W.force * brute_dam_coeff + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) ..() healthcheck() else @@ -86,15 +89,6 @@ ..() healthcheck() -/obj/machinery/bot/meteorhit() - src.explode() - return - -/obj/machinery/bot/blob_act() - src.health -= rand(20,40)*fire_dam_coeff - healthcheck() - return - /obj/machinery/bot/ex_act(severity) switch(severity) if(1.0) @@ -143,7 +137,7 @@ if(user.species.can_shred(user)) src.health -= rand(15,30)*brute_dam_coeff - src.visible_message("\red [user] has slashed [src]!") + src.visible_message("[user] has slashed [src]!") playsound(src.loc, 'sound/weapons/slice.ogg', 25, 1, -1) if(prob(10)) new /obj/effect/decal/cleanable/blood/oil(src.loc) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 7b894fa4669..099b1038c28 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -77,10 +77,13 @@ name = "Mulebot ([suffix])" /obj/machinery/bot/mulebot/Destroy() + unload(0) + qdel(wires) + wires = null if(radio_controller) radio_controller.remove_object(src,beacon_freq) radio_controller.remove_object(src,control_freq) - ..() + return ..() // attack by item // emag : lock/unlock, @@ -88,12 +91,7 @@ // cell: insert it // other: chance to knock rider off bot /obj/machinery/bot/mulebot/attackby(var/obj/item/I, var/mob/user) - if(istype(I,/obj/item/weapon/card/emag)) - locked = !locked - user << "\blue You [locked ? "lock" : "unlock"] the mulebot's controls!" - flick("mulebot-emagged", src) - playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 0) - else if(istype(I,/obj/item/weapon/cell) && open && !cell) + if(istype(I,/obj/item/weapon/cell) && open && !cell) var/obj/item/weapon/cell/C = I user.drop_item() C.loc = src @@ -101,38 +99,46 @@ updateDialog() else if(istype(I,/obj/item/weapon/screwdriver)) if(locked) - user << "\blue The maintenance hatch cannot be opened or closed while the controls are locked." + user << "The maintenance hatch cannot be opened or closed while the controls are locked." return open = !open if(open) - src.visible_message("[user] opens the maintenance hatch of [src]", "\blue You open [src]'s maintenance hatch.") + src.visible_message("[user] opens the maintenance hatch of [src]", "You open [src]'s maintenance hatch.") on = 0 icon_state="mulebot-hatch" else - src.visible_message("[user] closes the maintenance hatch of [src]", "\blue You close [src]'s maintenance hatch.") + src.visible_message("[user] closes the maintenance hatch of [src]", "You close [src]'s maintenance hatch.") icon_state = "mulebot0" updateDialog() else if (istype(I, /obj/item/weapon/wrench)) if (src.health < maxhealth) src.health = min(maxhealth, src.health+25) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.visible_message( - "\red [user] repairs [src]!", - "\blue You repair [src]!" + "\The [user] repairs \the [src]!", + "You repair \the [src]!" ) else - user << "\blue [src] does not need a repair!" + user << "[src] does not need a repair!" else if(load && ismob(load)) // chance to knock off rider if(prob(1+I.force * 2)) unload(0) - user.visible_message("\red [user] knocks [load] off [src] with \the [I]!", "\red You knock [load] off [src] with \the [I]!") + user.visible_message("[user] knocks [load] off [src] with \the [I]!", "You knock [load] off [src] with \the [I]!") else user << "You hit [src] with \the [I] but to no effect." + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) else ..() return +/obj/machinery/bot/mulebot/emag_act(var/remaining_charges, var/user) + locked = !locked + user << "You [locked ? "lock" : "unlock"] the mulebot's controls!" + flick("mulebot-emagged", src) + playsound(src.loc, 'sound/effects/sparks1.ogg', 100, 0) + return 1 /obj/machinery/bot/mulebot/ex_act(var/severity) unload(0) @@ -148,7 +154,7 @@ if(prob(50) && !isnull(load)) unload(0) if(prob(25)) - src.visible_message("\red Something shorts out inside [src]!") + src.visible_message("Something shorts out inside [src]!") var/index = 1<< (rand(0,9)) if(wires & index) wires &= ~index @@ -248,14 +254,14 @@ locked = !locked updateDialog() else - usr << "\red Access denied." + usr << "Access denied." return if("power") if (src.on) turn_off() else if (cell && !open) if (!turn_on()) - usr << "\red You can't switch on [src]." + usr << "You can't switch on [src]." return else return @@ -270,7 +276,7 @@ cell.add_fingerprint(usr) cell = null - usr.visible_message("\blue [usr] removes the power cell from [src].", "\blue You remove the power cell from [src].") + usr.visible_message("[usr] removes the power cell from [src].", "You remove the power cell from [src].") updateDialog() if("cellinsert") @@ -282,7 +288,7 @@ C.loc = src C.add_fingerprint(usr) - usr.visible_message("\blue [usr] inserts a power cell into [src].", "\blue You insert the power cell into [src].") + usr.visible_message("[usr] inserts a power cell into [src].", "You insert the power cell into [src].") updateDialog() @@ -700,23 +706,19 @@ var/mob/M = obs if(ismob(M)) if(istype(M,/mob/living/silicon/robot)) - src.visible_message("\red [src] bumps into [M]!") + src.visible_message("[src] bumps into [M]!") else - src.visible_message("\red [src] knocks over [M]!") + src.visible_message("[src] knocks over [M]!") M.stop_pulling() M.Stun(8) M.Weaken(5) M.lying = 1 ..() -/obj/machinery/bot/mulebot/alter_health() - return get_turf(src) - - // called from mob/living/carbon/human/Crossed() // when mulebot is in the same loc /obj/machinery/bot/mulebot/proc/RunOver(var/mob/living/carbon/human/H) - src.visible_message("\red [src] drives over [H]!") + src.visible_message("[src] drives over [H]!") playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) var/damage = rand(5,15) @@ -864,7 +866,7 @@ /obj/machinery/bot/mulebot/explode() - src.visible_message("\red [src] blows apart!", 1) + src.visible_message("[src] blows apart!", 1) var/turf/Tsec = get_turf(src) new /obj/item/device/assembly/prox_sensor(Tsec) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 70557a2e18b..99df45a1491 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -5,14 +5,199 @@ desc = "A remote control switch for something." var/id = null var/active = 0 + var/operating = 0 anchored = 1.0 use_power = 1 idle_power_usage = 2 active_power_usage = 4 + var/_wifi_id + var/datum/wifi/sender/wifi_sender +/obj/machinery/button/initialize() + ..() + update_icon() + if(_wifi_id && !wifi_sender) + wifi_sender = new/datum/wifi/sender/button(_wifi_id, src) + +/obj/machinery/button/Destroy() + qdel(wifi_sender) + wifi_sender = null + return..() /obj/machinery/button/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/button/attackby(obj/item/weapon/W, mob/user as mob) - return src.attack_hand(user) \ No newline at end of file + return attack_hand(user) + +/obj/machinery/button/attack_hand(mob/living/user) + if(..()) return 1 + activate(user) + +/obj/machinery/button/proc/activate(mob/living/user) + if(operating || !istype(wifi_sender)) + return + + operating = 1 + active = 1 + use_power(5) + update_icon() + wifi_sender.activate(user) + sleep(10) + active = 0 + update_icon() + operating = 0 + +/obj/machinery/button/update_icon() + if(active) + icon_state = "launcheract" + else + icon_state = "launcherbtt" + +//alternate button with the same functionality, except has a lightswitch sprite instead +/obj/machinery/button/switch + icon = 'icons/obj/power.dmi' + icon_state = "light0" + +/obj/machinery/button/switch/update_icon() + icon_state = "light[active]" + +//alternate button with the same functionality, except has a door control sprite instead +/obj/machinery/button/alternate + icon = 'icons/obj/stationobjs.dmi' + icon_state = "doorctrl0" + +/obj/machinery/button/alternate/update_icon() + if(active) + icon_state = "doorctrl0" + else + icon_state = "doorctrl2" + +//Toggle button with two states (on and off) and calls seperate procs for each state +/obj/machinery/button/toggle/activate(mob/living/user) + if(operating || !istype(wifi_sender)) + return + + operating = 1 + active = !active + use_power(5) + if(active) + wifi_sender.activate(user) + else + wifi_sender.deactivate(user) + update_icon() + operating = 0 + +//alternate button with the same toggle functionality, except has a lightswitch sprite instead +/obj/machinery/button/toggle/switch + icon = 'icons/obj/power.dmi' + icon_state = "light0" + +/obj/machinery/button/toggle/switch/update_icon() + icon_state = "light[active]" + +//alternate button with the same toggle functionality, except has a door control sprite instead +/obj/machinery/button/toggle/alternate + icon = 'icons/obj/stationobjs.dmi' + icon_state = "doorctrl0" + +/obj/machinery/button/toggle/alternate/update_icon() + if(active) + icon_state = "doorctrl0" + else + icon_state = "doorctrl2" + +//------------------------------- +// Mass Driver Button +// Passes the activate call to a mass driver wifi sender +//------------------------------- +/obj/machinery/button/mass_driver + name = "mass driver button" + +/obj/machinery/button/mass_driver/initialize() + if(_wifi_id) + wifi_sender = new/datum/wifi/sender/mass_driver(_wifi_id, src) + ..() + +/obj/machinery/button/mass_driver/activate(mob/living/user) + if(active || !istype(wifi_sender)) + return + + active = 1 + use_power(5) + update_icon() + wifi_sender.activate() + active = 0 + update_icon() + + +//------------------------------- +// Door Button +//------------------------------- + +// Bitmasks for door switches. +#define OPEN 0x1 +#define IDSCAN 0x2 +#define BOLTS 0x4 +#define SHOCK 0x8 +#define SAFE 0x10 + +/obj/machinery/button/toggle/door + icon = 'icons/obj/stationobjs.dmi' + icon_state = "doorctrl0" + + var/_door_functions = 1 +/* Bitflag, 1 = open + 2 = idscan + 4 = bolts + 8 = shock + 16 = door safties */ + +/obj/machinery/button/toggle/door/update_icon() + if(active) + icon_state = "doorctrl0" + else + icon_state = "doorctrl2" + +/obj/machinery/button/toggle/door/initialize() + if(_wifi_id) + wifi_sender = new/datum/wifi/sender/door(_wifi_id, src) + ..() + +/obj/machinery/button/toggle/door/activate(mob/living/user) + if(operating || !istype(wifi_sender)) + return + + operating = 1 + active = !active + use_power(5) + update_icon() + if(active) + if(_door_functions & IDSCAN) + wifi_sender.activate("enable_idscan") + if(_door_functions & SHOCK) + wifi_sender.activate("electrify") + if(_door_functions & SAFE) + wifi_sender.activate("enable_safeties") + if(_door_functions & BOLTS) + wifi_sender.activate("unlock") + if(_door_functions & OPEN) + wifi_sender.activate("open") + else + if(_door_functions & IDSCAN) + wifi_sender.activate("disable_idscan") + if(_door_functions & SHOCK) + wifi_sender.activate("unelectrify") + if(_door_functions & SAFE) + wifi_sender.activate("disable_safeties") + if(_door_functions & OPEN) + wifi_sender.activate("close") + if(_door_functions & BOLTS) + wifi_sender.activate("lock") + operating = 0 + +#undef OPEN +#undef IDSCAN +#undef BOLTS +#undef SHOCK +#undef SAFE diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index fb2567da070..dbc5a62bef9 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("Exodus") + var/list/network = list(NETWORK_EXODUS) var/c_tag = null var/c_tag_order = 999 var/status = 1 @@ -33,6 +33,8 @@ var/on_open_network = 0 + var/affected_by_emp_until = 0 + /obj/machinery/camera/New() wires = new(src) assembly = new(src) @@ -59,28 +61,35 @@ qdel(assembly) assembly = null qdel(wires) - ..() + wires = null + return ..() + +/obj/machinery/camera/process() + if((stat & EMPED) && world.time >= affected_by_emp_until) + stat &= ~EMPED + cancelCameraAlarm() + update_icon() + update_coverage() + return internal_process() + +/obj/machinery/camera/proc/internal_process() + return /obj/machinery/camera/emp_act(severity) - if(!isEmpProof()) - if(prob(100/severity)) + if(!isEmpProof() && prob(100/severity)) + if(!affected_by_emp_until || (world.time < affected_by_emp_until)) + affected_by_emp_until = max(affected_by_emp_until, world.time + (90 SECONDS / severity)) + else stat |= EMPED set_light(0) + triggerCameraAlarm() kick_viewers() - triggerCameraAlarm(30 / severity) update_icon() update_coverage() - - spawn(900) - stat &= ~EMPED - cancelCameraAlarm() - update_icon() - update_coverage() - ..() + processing_objects |= src /obj/machinery/camera/bullet_act(var/obj/item/projectile/P) - if(P.damage_type == BRUTE || P.damage_type == BURN) - take_damage(P.damage) + take_damage(P.get_structure_damage()) /obj/machinery/camera/ex_act(severity) if(src.invuln) @@ -92,10 +101,6 @@ ..() //and give it the regular chance of being deleted outright - -/obj/machinery/camera/blob_act() - return - /obj/machinery/camera/hitby(AM as mob|obj) ..() if (istype(AM, /obj)) @@ -109,7 +114,6 @@ cameranet.updateVisibility(src, 0) /obj/machinery/camera/attack_hand(mob/living/carbon/human/user as mob) - if(!istype(user)) return @@ -118,7 +122,6 @@ user.do_attack_animation(src) visible_message("\The [user] slashes at [src]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - icon_state = "[initial(icon_state)]1" add_hiddenprint(user) destroy() @@ -183,22 +186,23 @@ for(var/mob/O in player_list) if (istype(O.machine, /obj/machinery/computer/security)) var/obj/machinery/computer/security/S = O.machine - if (S.current == src) + if (S.current_camera == src) O << "[U] holds \a [itemname] up to one of the cameras ..." O << browse(text("[][]", itemname, info), text("window=[]", itemname)) //Force people watching to open the page so they can't see it again else if (istype(W, /obj/item/weapon/camera_bug)) if (!src.can_use()) - user << "\blue Camera non-functional" + user << "Camera non-functional." return if (src.bugged) - user << "\blue Camera bug removed." + user << "Camera bug removed." src.bugged = 0 else - user << "\blue Camera bugged." + user << "Camera bugged." src.bugged = 1 else if(W.damtype == BRUTE || W.damtype == BURN) //bashing cameras + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if (W.force >= src.toughness) user.do_attack_animation(src) visible_message("[src] has been [pick(W.attack_verb)] with [W] by [user]!") @@ -220,8 +224,7 @@ //legacy support, if choice is != 1 then just kick viewers without changing status kick_viewers() else - update_coverage() - set_status( !src.status ) + set_status(!src.status) if (!(src.status)) if(user) visible_message(" [user] has deactivated [src]!") @@ -263,7 +266,7 @@ /obj/machinery/camera/proc/set_status(var/newstatus) if (status != newstatus) status = newstatus - invalidateCameraCache() + update_coverage() // now disconnect anyone using the camera //Apparently, this will disconnect anyone even if the camera was re-activated. //I guess that doesn't matter since they couldn't use it anyway? @@ -279,7 +282,7 @@ for(var/mob/O in player_list) if (istype(O.machine, /obj/machinery/computer/security)) var/obj/machinery/computer/security/S = O.machine - if (S.current == src) + if (S.current_camera == src) O.unset_machine() O.reset_view(null) O << "The screen bursts into static." @@ -314,6 +317,9 @@ /obj/machinery/camera/proc/can_see() var/list/see = null var/turf/pos = get_turf(src) + if(!pos) + return list() + if(isXRay()) see = range(view_range, pos) else diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 86095dedfb8..2192bb982fa 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -80,7 +80,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: Exodus,Security,Secret ", "Set Network", camera_network ? camera_network : "Exodus")) + 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", camera_network ? camera_network : NETWORK_EXODUS)) if(!input) usr << "No input found please hang up and try your call again." return diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index 636f114de78..eac1f89386f 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -1,12 +1,11 @@ /obj/machinery/camera - var/list/motionTargets = list() var/detectTime = 0 var/area/ai_monitored/area_motion = null var/alarm_delay = 100 // Don't forget, there's another 10 seconds in queueAlarm() + flags = PROXMOVE - -/obj/machinery/camera/process() +/obj/machinery/camera/internal_process() // motion camera event loop if (stat & (EMPED|NOPOWER)) return diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index ad24999088d..739583ede88 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -47,20 +47,20 @@ loc = sanitize(loc) if(!loc) - src << "\red Must supply a location name" + src << "Must supply a location name" return if(stored_locations.len >= max_locations) - src << "\red Cannot store additional locations. Remove one first" + src << "Cannot store additional locations. Remove one first" return if(loc in stored_locations) - src << "\red There is already a stored location by this name" + src << "There is already a stored location by this name" return var/L = src.eyeobj.getLoc() if (InvalidPlayerTurf(get_turf(L))) - src << "\red Unable to store this location" + src << "Unable to store this location" return stored_locations[loc] = L @@ -75,7 +75,7 @@ set desc = "Returns to the selected camera location" if (!(loc in stored_locations)) - src << "\red Location [loc] not found" + src << "Location [loc] not found" return var/L = stored_locations[loc] @@ -87,7 +87,7 @@ set desc = "Deletes the selected camera location" if (!(loc in stored_locations)) - src << "\red Location [loc] not found" + src << "Location [loc] not found" return stored_locations.Remove(loc) @@ -155,6 +155,11 @@ if(!istype(target)) return var/mob/living/silicon/ai/U = usr + if(target == U.cameraFollow) + return + + if(U.cameraFollow) + U.ai_cancel_tracking() U.cameraFollow = target U << "Now tracking [target.name] on camera." target.tracking_initiated() @@ -218,6 +223,9 @@ mob/living/proc/near_camera() /mob/living/proc/tracking_status() // Easy checks first. // Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this. + var/obj/item/weapon/card/id/id = GetIdCard() + if(id && id.prevent_tracking()) + return TRACKING_TERMINATE if(InvalidPlayerTurf(get_turf(src))) return TRACKING_TERMINATE if(invisibility >= INVISIBILITY_LEVEL_ONE) //cloaked @@ -235,13 +243,8 @@ mob/living/proc/near_camera() if(. == TRACKING_NO_COVERAGE) return camera && camera.can_use() ? TRACKING_POSSIBLE : TRACKING_NO_COVERAGE -/mob/living/silicon/robot/syndicate/tracking_status() - return TRACKING_TERMINATE - /mob/living/carbon/human/tracking_status() //Cameras can't track people wearing an agent card or a ninja hood. - if(wear_id && istype(wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) - return TRACKING_TERMINATE if(istype(head, /obj/item/clothing/head/helmet/space/rig)) var/obj/item/clothing/head/helmet/space/rig/helmet = head if(helmet.prevent_track()) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index c29e6657231..9890a2085d1 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -43,14 +43,14 @@ if(istype(W, /obj/item/weapon/cell) && anchored) if(charging) - user << "\red There is already a cell in the charger." + user << "There is already a cell in the charger." return else var/area/a = loc.loc // Gets our locations location, like a dream within a dream if(!isarea(a)) return if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power! - user << "\red The [name] blinks red as you try to insert the cell!" + user << "The [name] blinks red as you try to insert the cell!" return user.drop_item() @@ -61,7 +61,7 @@ update_icon() else if(istype(W, /obj/item/weapon/wrench)) if(charging) - user << "\red Remove the cell first!" + user << "Remove the cell first!" return anchored = !anchored diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 4347085e3a3..5f98d787b87 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -57,6 +57,12 @@ RefreshParts() update_icon() + set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/store(src)) + +/obj/machinery/clonepod/Destroy() + if(connected) + connected.release_pod(src) + return ..() /obj/machinery/clonepod/attack_ai(mob/user as mob) @@ -131,6 +137,7 @@ else H.dna = R.dna H.UpdateAppearance() + H.sync_organ_dna() if(heal_level < 60) randmutb(H) //Sometimes the clones come out wrong. H.dna.UpdateSE() @@ -143,7 +150,6 @@ for(var/datum/language/L in R.languages) H.add_language(L.name) H.flavor_texts = R.flavor.Copy() - H.suiciding = 0 attempting = 0 return 1 @@ -157,7 +163,7 @@ return if((occupant) && (occupant.loc == src)) - if((occupant.stat == DEAD) || (occupant.suiciding) || !occupant.key) //Autoeject corpses and suiciding dudes. + if((occupant.stat == DEAD) || !occupant.key) locked = 0 go_out() connected_message("Clone Rejected: Deceased.") @@ -183,6 +189,8 @@ return else if((occupant.health >= heal_level) && (!eject_wait)) + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + src.audible_message("\The [src] signals that the cloning process is complete.") connected_message("Cloning Process Complete.") locked = 0 go_out() @@ -217,13 +225,6 @@ else locked = 0 user << "System unlocked." - else if(istype(W, /obj/item/weapon/card/emag)) - if(isnull(occupant)) - return - user << "You force an emergency ejection." - locked = 0 - go_out() - return else if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat)) user << "\The [src] processes \the [W]." biomass += 50 @@ -245,14 +246,17 @@ user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.") else user.visible_message("[user] unsecures [src] from the floor.", "You unsecure [src] from the floor.") - else if(istype(W, /obj/item/device/multitool)) - var/obj/item/device/multitool/M = W - M.connecting = src - user << "You load connection data from [src] to [M]." - return else ..() +/obj/machinery/clonepod/emag_act(var/remaining_charges, var/mob/user) + if(isnull(occupant)) + return NO_EMAG_ACT + user << "You force an emergency ejection." + locked = 0 + go_out() + return 1 + //Put messages in the connected computer's temp var for display. /obj/machinery/clonepod/proc/connected_message(var/message) if((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning))) @@ -307,7 +311,7 @@ occupant.client.perspective = MOB_PERSPECTIVE occupant.loc = loc eject_wait = 0 //If it's still set somehow. - domutcheck(occupant) //Waiting until they're out before possible monkeyizing. + domutcheck(occupant) //Waiting until they're out before possible transforming. occupant = null biomass -= CLONE_BIOMASS @@ -406,6 +410,7 @@ read_only = 1 New() + ..() initializeDisk() buf.types=DNA2_BUF_UE|DNA2_BUF_UI //data = "066000033000000000AF00330660FF4DB002690" @@ -421,6 +426,7 @@ read_only = 1 New() + ..() initializeDisk() buf.types=DNA2_BUF_SE var/list/new_SE=list(0x098,0x3E8,0x403,0x44C,0x39F,0x4B0,0x59D,0x514,0x5FC,0x578,0x5DC,0x640,0x6A4) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 3f38059618e..8427a084185 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -4,9 +4,9 @@ name = "patient monitoring console" density = 1 anchored = 1.0 - icon_state = "operating" - light_color = "#315ab4" - circuit = "/obj/item/weapon/circuitboard/operating" + icon_keyboard = "med_key" + icon_screen = "crew" + circuit = /obj/item/weapon/circuitboard/operating var/mob/living/carbon/human/victim = null var/obj/machinery/optable/table = null diff --git a/code/game/machinery/computer/RCON_Console.dm b/code/game/machinery/computer/RCON_Console.dm index cf275eb5ce8..0a481d2d7b4 100644 --- a/code/game/machinery/computer/RCON_Console.dm +++ b/code/game/machinery/computer/RCON_Console.dm @@ -7,18 +7,23 @@ /obj/machinery/computer/rcon name = "\improper RCON console" desc = "Console used to remotely control machinery on the station." - icon = 'icons/obj/computer.dmi' - icon_state = "ai-fixer" + icon_keyboard = "power_key" + icon_screen = "ai-fixer" light_color = "#a97faa" circuit = /obj/item/weapon/circuitboard/rcon_console req_one_access = list(access_engine) var/current_tag = null - var/obj/nano_module/rcon/rcon + var/datum/nano_module/rcon/rcon /obj/machinery/computer/rcon/New() ..() rcon = new(src) +/obj/machinery/computer/rcon/Destroy() + qdel(rcon) + rcon = null + ..() + // Proc: attack_hand() // Parameters: 1 (user - Person which clicked this computer) // Description: Opens UI of this machine. @@ -31,3 +36,8 @@ // Description: Uses dark magic (NanoUI) to render this machine's UI /obj/machinery/computer/rcon/ui_interact(mob/user, ui_key = "rcon", var/datum/nanoui/ui = null, var/force_open = 1) rcon.ui_interact(user, ui_key, ui, force_open) + +/obj/machinery/computer/rcon/update_icon() + ..() + if(is_operable()) + overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 7b7e0b14fa6..009c12403dc 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -17,7 +17,7 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20)) - user << "\blue You wrench the frame into place." + user << "You wrench the frame into place." anchored = 1 state = 1 if(istype(P, /obj/item/weapon/weldingtool)) @@ -28,31 +28,31 @@ playsound(loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20)) if(!src || !WT.remove_fuel(0, user)) return - user << "\blue You deconstruct the frame." + user << "You deconstruct the frame." new /obj/item/stack/material/plasteel( loc, 4) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20)) - user << "\blue You unfasten the frame." + user << "You unfasten the frame." anchored = 0 state = 0 if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit) playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the circuit board inside the frame." + user << "You place the circuit board inside the frame." icon_state = "1" circuit = P user.drop_item() P.loc = src if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the circuit board into place." + user << "You screw the circuit board into place." state = 2 icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the circuit board." + user << "You remove the circuit board." state = 1 icon_state = "0" circuit.loc = loc @@ -60,7 +60,7 @@ if(2) if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the circuit board." + user << "You unfasten the circuit board." state = 1 icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) @@ -82,7 +82,7 @@ user << "Get that brain out of there first" else playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." + user << "You remove the cables." state = 2 icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) @@ -126,14 +126,14 @@ if(istype(P, /obj/item/device/mmi)) var/obj/item/device/mmi/M = P if(!M.brainmob) - user << "\red Sticking an empty [P] into the frame would sort of defeat the purpose." + user << "Sticking an empty [P] into the frame would sort of defeat the purpose." return if(M.brainmob.stat == 2) - user << "\red Sticking a dead [P] into the frame would sort of defeat the purpose." + user << "Sticking a dead [P] into the frame would sort of defeat the purpose." return if(jobban_isbanned(M.brainmob, "AI")) - user << "\red This [P] does not seem to fit." + user << "This [P] does not seem to fit." return if(M.brainmob.mind) @@ -147,7 +147,7 @@ if(istype(P, /obj/item/weapon/crowbar) && brain) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the brain." + user << "You remove the brain." brain.loc = loc brain = null icon_state = "3" @@ -155,7 +155,7 @@ if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." + user << "You remove the glass panel." state = 3 if (brain) icon_state = "3b" @@ -166,7 +166,7 @@ if(istype(P, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You connect the monitor." + user << "You connect the monitor." if(!brain) var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes" var/obj/structure/AIcore/deactivated/D = new(loc) @@ -202,7 +202,7 @@ transfer.loc = get_turf(src) transfer.create_eyeobj() transfer.cancel_camera() - user << "\blue Transfer successful: \black [transfer.name] ([rand(1000,9999)].exe) downloaded to host terminal. Local copy wiped." + user << "Transfer successful: [transfer.name] ([rand(1000,9999)].exe) downloaded to host terminal. Local copy wiped." transfer << "You have been uploaded to a stationary terminal. Remote device connection restored." if(card) @@ -224,23 +224,23 @@ if(transfer) load_ai(transfer,card,user) else - user << "\red ERROR: \black Unable to locate artificial intelligence." + user << "ERROR: Unable to locate artificial intelligence." return else if(istype(W, /obj/item/weapon/wrench)) if(anchored) - user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...") + user.visible_message("\The [user] starts to unbolt \the [src] from the plating...") if(!do_after(user,40)) - user.visible_message("\blue \The [user] decides not to unbolt \the [src].") + user.visible_message("\The [user] decides not to unbolt \the [src].") return - user.visible_message("\blue \The [user] finishes unfastening \the [src]!") + user.visible_message("\The [user] finishes unfastening \the [src]!") anchored = 0 return else - user.visible_message("\blue \The [user] starts to bolt \the [src] to the plating...") + user.visible_message("\The [user] starts to bolt \the [src] to the plating...") if(!do_after(user,40)) - user.visible_message("\blue \The [user] decides not to bolt \the [src].") + user.visible_message("\The [user] decides not to bolt \the [src].") return - user.visible_message("\blue \The [user] finishes fastening down \the [src]!") + user.visible_message("\The [user] finishes fastening down \the [src]!") anchored = 1 return else diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 8486fdf2518..e6577f30970 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -1,7 +1,8 @@ /obj/machinery/computer/aifixer name = "\improper AI system integrity restorer" icon = 'icons/obj/computer.dmi' - icon_state = "ai-fixer" + icon_keyboard = "rd_key" + icon_screen = "ai-fixer" light_color = "#a97faa" circuit = /obj/item/weapon/circuitboard/aifixer req_one_access = list(access_robotics, access_heads) @@ -18,7 +19,7 @@ // Transfer over the AI. transfer << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here." - user << "\blue Transfer successful: \black [transfer.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." + user << "Transfer successful: [transfer.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." transfer.loc = src transfer.cancel_camera() @@ -44,7 +45,7 @@ if(istype(comp_ai)) if(active) - user << "\red ERROR: \black Reconstruction in progress." + user << "ERROR: Reconstruction in progress." return card.grab_ai(comp_ai, user) if(!(locate(/mob/living/silicon/ai) in src)) occupant = null @@ -128,16 +129,13 @@ /obj/machinery/computer/aifixer/update_icon() ..() - - overlays.Cut() - if((stat & BROKEN) || (stat & NOPOWER)) return if(occupant) if(occupant.stat) - overlays += image('icons/obj/computer.dmi', "ai-fixer-404") + overlays += image('icons/obj/computer.dmi', "ai-fixer-404", overlay_layer) else - overlays += image('icons/obj/computer.dmi', "ai-fixer-full") + overlays += image('icons/obj/computer.dmi', "ai-fixer-full", overlay_layer) else - overlays += image('icons/obj/computer.dmi', "ai-fixer-empty") + overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index d8d2a3bb0e6..3ca45c9dca1 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1,22 +1,14 @@ -/obj/machinery/computer/arcade - name = "arcade machine" - desc = "Does not support pinball." - icon = 'icons/obj/computer.dmi' +/obj/machinery/computer/arcade/ + name = "random arcade" + desc = "random arcade machine" icon_state = "arcade" - circuit = "/obj/item/weapon/circuitboard/arcade" - var/enemy_name = "Space Villian" - var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc - var/player_hp = 30 //Player health/attack points - var/player_mp = 10 - var/enemy_hp = 45 //Enemy health/attack points - var/enemy_mp = 20 - var/gameover = 0 - var/blocked = 0 //Player cannot attack/heal while set + icon_keyboard = null + icon_screen = "invaders" var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2, /obj/item/toy/blink = 2, /obj/item/clothing/under/syndicate/tacticool = 2, /obj/item/toy/sword = 2, - /obj/item/toy/gun = 2, + /obj/item/weapon/gun/projectile/revolver/capgun = 2, /obj/item/toy/crossbow = 2, /obj/item/clothing/suit/syndicatefake = 2, /obj/item/weapon/storage/fancy/crayons = 2, @@ -33,33 +25,89 @@ /obj/item/toy/prize/odysseus = 1, /obj/item/toy/prize/phazon = 1, /obj/item/toy/waterflower = 1, - /obj/random/action_figure = 1, + /obj/random/action_figure = 1, /obj/random/plushie = 1, /obj/item/toy/cultsword = 1 ) -/obj/machinery/computer/arcade +/obj/machinery/computer/arcade/New() + ..() + // If it's a generic arcade machine, pick a random arcade + // circuit board for it and make the new machine + if(!circuit) + var/choice = pick(typesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade) + var/obj/item/weapon/circuitboard/CB = new choice() + new CB.build_path(loc, CB) + qdel(src) + +/obj/machinery/computer/arcade/proc/prizevend() + if(!contents.len) + var/prizeselect = pickweight(prizes) + new prizeselect(src.loc) + + if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit + new /obj/item/clothing/head/syndicatefake(src.loc) + + else + var/atom/movable/prize = pick(contents) + prize.loc = src.loc + +/obj/machinery/computer/arcade/attack_ai(mob/user as mob) + return src.attack_hand(user) + + +/obj/machinery/computer/arcade/emp_act(severity) + if(stat & (NOPOWER|BROKEN)) + ..(severity) + return + var/empprize = null + var/num_of_prizes = 0 + switch(severity) + if(1) + num_of_prizes = rand(1,4) + if(2) + num_of_prizes = rand(0,2) + for(num_of_prizes; num_of_prizes > 0; num_of_prizes--) + empprize = pickweight(prizes) + new empprize(src.loc) + + ..(severity) + +/////////////////// +// BATTLE HERE // +/////////////////// + +/obj/machinery/computer/arcade/battle + name = "arcade machine" + desc = "Does not support Pinball." + icon_state = "arcade" + circuit = /obj/item/weapon/circuitboard/arcade/battle + var/enemy_name = "Space Villian" + var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc + var/player_hp = 30 //Player health/attack points + var/player_mp = 10 + var/enemy_hp = 45 //Enemy health/attack points + var/enemy_mp = 20 + var/gameover = 0 + var/blocked = 0 //Player cannot attack/heal while set var/turtle = 0 -/obj/machinery/computer/arcade/New() +/obj/machinery/computer/arcade/battle/New() ..() var/name_action var/name_part1 var/name_part2 - name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ") + name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ") name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ") - name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn") + name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers") src.enemy_name = replacetext((name_part1 + name_part2), "the ", "") src.name = (name_action + name_part1 + name_part2) -/obj/machinery/computer/arcade/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/arcade/attack_hand(mob/user as mob) +/obj/machinery/computer/arcade/battle/attack_hand(mob/user as mob) if(..()) return user.set_machine(src) @@ -69,10 +117,11 @@ dat += "

[src.temp]

" dat += "
Health: [src.player_hp] | Magic: [src.player_mp] | Enemy Health: [src.enemy_hp]
" + dat += "
" if (src.gameover) - dat += "
New Game" + dat += "New Game" else - dat += "
Attack | " + dat += "Attack | " dat += "Heal | " dat += "Recharge Power" @@ -82,7 +131,7 @@ onclose(user, "arcade") return -/obj/machinery/computer/arcade/Topic(href, href_list) +/obj/machinery/computer/arcade/battle/Topic(href, href_list) if(..()) return 1 @@ -147,7 +196,7 @@ src.updateUsrDialog() return -/obj/machinery/computer/arcade/proc/arcade_action() +/obj/machinery/computer/arcade/battle/proc/arcade_action() if ((src.enemy_mp <= 0) || (src.enemy_hp <= 0)) if(!gameover) src.gameover = 1 @@ -163,19 +212,11 @@ emagged = 0 else if(!contents.len) feedback_inc("arcade_win_normal") - var/prizeselect = pickweight(prizes) - new prizeselect(src.loc) - - if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun - new /obj/item/toy/ammo/gun(src.loc) - - else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit - new /obj/item/clothing/head/syndicatefake(src.loc) + src.prizevend() else feedback_inc("arcade_win_normal") - var/atom/movable/prize = pick(contents) - prize.loc = src.loc + src.prizevend() else if (emagged && (turtle >= 4)) var/boomamt = rand(5,10) @@ -221,8 +262,8 @@ return -/obj/machinery/computer/arcade/attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/card/emag) && !emagged) +/obj/machinery/computer/arcade/battle/emag_act(var/charges, var/mob/user) + if(!emagged) temp = "If you die in the game, you die for real!" player_hp = 30 player_mp = 10 @@ -230,31 +271,10 @@ enemy_mp = 20 gameover = 0 blocked = 0 - emagged = 1 enemy_name = "Cuban Pete" name = "Outbomb Cuban Pete" - src.updateUsrDialog() - else - ..() - - -/obj/machinery/computer/arcade/emp_act(severity) - if(stat & (NOPOWER|BROKEN)) - ..(severity) - return - var/empprize = null - var/num_of_prizes = 0 - switch(severity) - if(1) - num_of_prizes = rand(1,4) - if(2) - num_of_prizes = rand(0,2) - for(num_of_prizes; num_of_prizes > 0; num_of_prizes--) - empprize = pickweight(prizes) - new empprize(src.loc) - - ..(severity) \ No newline at end of file + return 1 \ No newline at end of file diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm new file mode 100644 index 00000000000..b713e69fb2d --- /dev/null +++ b/code/game/machinery/computer/arcade_orion.dm @@ -0,0 +1,523 @@ + +////////////////////////// +// ORION TRAIL HERE // +////////////////////////// + +//Orion Trail Events +#define ORION_TRAIL_RAIDERS "Vox Raiders" +#define ORION_TRAIL_FLUX "Interstellar Flux" +#define ORION_TRAIL_ILLNESS "Illness" +#define ORION_TRAIL_BREAKDOWN "Breakdown" +#define ORION_TRAIL_MUTINY "Mutiny?" +#define ORION_TRAIL_MUTINY_ATTACK "Mutinous Ambush" +#define ORION_TRAIL_MALFUNCTION "Malfunction" +#define ORION_TRAIL_COLLISION "Collision" +#define ORION_TRAIL_SPACEPORT "Spaceport" +#define ORION_TRAIL_DISASTER "Disaster" +#define ORION_TRAIL_SPACEPORT_RAIDED "Raided Spaceport" +#define ORION_TRAIL_DERELICT "Derelict Spacecraft" +#define ORION_TRAIL_CARP "Carp Migration" +#define ORION_TRAIL_STUCK "Stuck!" +#define ORION_TRAIL_START "Start" +#define ORION_TRAIL_GAMEOVER "Gameover!" + + +#define ORION_VIEW_MAIN 0 +#define ORION_VIEW_SUPPLIES 1 +#define ORION_VIEW_CREW 2 + + +/obj/machinery/computer/arcade/orion_trail + name = "orion trail" + desc = "Imported straight from Outpost-T71!" + icon_state = "arcade" + circuit = /obj/item/weapon/circuitboard/arcade/orion_trail + var/list/supplies = list("1" = 0, "2" = 0, "3" = 0, "4" = 0, "5" = 0, "6" = 0) //engine,hull,electronics,food,fuel + var/list/supply_cost = list("1" = 1000, "2" = 950, "3" = 1100, "4" = 75, "5" = 100) + var/list/supply_name = list("1" = "engine parts", "2" = "hull parts", "3" = "electronic parts", "4" = "food", "5" = "fuel", "6" = "thalers") + var/list/settlers = list() + var/num_traitors = 0 + var/list/events = list(ORION_TRAIL_RAIDERS = 3, + ORION_TRAIL_FLUX = 1, + ORION_TRAIL_ILLNESS = 3, + ORION_TRAIL_BREAKDOWN = 2, + ORION_TRAIL_MUTINY = 3, + ORION_TRAIL_MALFUNCTION = 2, + ORION_TRAIL_COLLISION = 1, + ORION_TRAIL_CARP = 3 + ) + var/list/stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime") + var/list/stopblurbs = list( + "Pluto, long since occupied with long-range sensors and scanners, stands ready to, and indeed continues to probe the far reaches of the galaxy.", + "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgement.", + "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now a low-population sanctuary for adventurers and traders.", + "This region of space is particularly devoid of matter. Such low-density pockets are known to exist, but the vastness of it is astounding.", + "Rigel Prime, the center of the Rigel system, burns hot, basking its planetary bodies in warmth and radiation.", + "Tau Ceti Beta has recently become a waypoint for colonists headed towards Orion. There are many ships and makeshift stations in the vicinity.", + "Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through. We could stay of course, but risk of being overcome by its gravity, or we could change course to go around, which will take longer.", + "You have come into range of the first man-made structure in this region of space. It has been constructed not by travellers from Sol, but by colonists from Orion. It stands as a monument to the colonists' success.", + "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for mankind!" + ) + var/list/stop_distance = list(10000,7000,25000,9000,5000,30000,25000,10000,0) + var/event = null + var/event_title = "" + var/event_desc = "" + var/event_actions = "" + var/event_info = "" + var/distance = 0 + var/port = 0 + var/view = 0 + +/obj/machinery/computer/arcade/orion_trail/proc/newgame(var/emag = 0) + name = "orion trail[emag ? ": Realism Edition" : ""]" + supplies = list("1" = 1, "2" = 1, "3" = 1, "4" = 60, "5" = 20, "6" = 5000) + emagged = emag + distance = 0 + settlers = list("[usr]") + for(var/i=0; i<3; i++) + if(prob(50)) + settlers += pick(first_names_male) + else + settlers += pick(first_names_female) + num_traitors = 0 + event = ORION_TRAIL_START + port = 0 + view = ORION_VIEW_MAIN + +/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user) + if(..()) + return + var/dat = "" + if(event == null) + newgame() + user.set_machine(src) + switch(view) + if(ORION_VIEW_MAIN) + if(event == ORION_TRAIL_START) //new game? New game. + dat = "

Orion Trail[emagged ? ": Realism Edition" : ""]


Learn how our ancestors got to Orion, and have fun in the process!

Start New Game

" + user << browse(dat, "window=arcade") + return + else + event_title = event + event_actions = "Continue your journey
" + switch(event) + if(ORION_TRAIL_GAMEOVER) + event_info = "" + event_actions = "Start New Game
" + if(ORION_TRAIL_SPACEPORT) + event_title += ": [stops[port]]" + event_desc = "[stopblurbs[port]]" + event_info = "" + if(port == 9) + event_actions = "Return to the title screen!
" + else + event_actions = "Shove off
" + event_actions += "Raid Spaceport" + if(ORION_TRAIL_SPACEPORT_RAIDED) + event_title += ": [stops[port]]" + event_actions = "Shove off" + if(ORION_TRAIL_RAIDERS) + event_desc = "You arm yourselves as you prepare to fight off the vox menace!" + if(ORION_TRAIL_DERELICT) + event_desc = "You come across an unpowered ship drifting slowly in the vastness of space. Sensors indicate there are no lifeforms aboard." + if(ORION_TRAIL_ILLNESS) + event_desc = "A disease has spread amoungst your crew!" + if(ORION_TRAIL_FLUX) + event_desc = "You've entered a turbulent region. Slowing down would be better for your ship but would cost more fuel." + event_actions = "Continue as normal
" + event_actions += "Take it slow
" + if(ORION_TRAIL_MALFUNCTION) + event_info = "" + event_desc = "The ship's computers are malfunctioning! You can choose to fix it with a part or risk something going awry." + event_actions = "Continue as normal
" + if(supplies["3"] != 0) + event_actions += "Fix using a part.
" + if(ORION_TRAIL_COLLISION) + event_info = "" + event_desc = "Something has hit your ship and breached the hull! You can choose to fix it with a part or risk something going awry." + event_actions = "Continue as normal
" + if(supplies["2"] != 0) + event_actions += "Fix using a part.
" + if(ORION_TRAIL_BREAKDOWN) + event_info = "" + event_desc = "The ship's engines broke down! You can choose to fix it with a part or risk something going awry." + event_actions = "Continue as normal
" + if(supplies["1"] != 0) + event_actions += "Fix using a part.
" + if(ORION_TRAIL_STUCK) + event_desc = "You've ran out of fuel. Your only hope to survive is to get refueled by a passing ship, if there are any." + if(supplies["5"] == 0) + event_actions = "Wait" + if(ORION_TRAIL_CARP) + event_desc = "You've chanced upon a large carp migration! Known both for their delicious meat as well as their bite, you and your crew arm yourselves for a small hunting trip." + if(ORION_TRAIL_MUTINY) + event_desc = "You've been hearing rumors of dissenting opinions and missing items from the armory..." + if(ORION_TRAIL_MUTINY_ATTACK) + event_desc = "Oh no, some of your crew are attempting to mutiny!!" + + dat = "

[event_title]

[event_desc]

Distance to next port: [distance]
[event_info]

[event_actions]" + if(ORION_VIEW_SUPPLIES) + dat = "

Supplies

View your supplies or buy more when at a spaceport.

" + dat += "
You have [supplies["6"]] thalers.
" + for(var/i=1; i<6; i++) + var/amm = (i>3?10:1) + dat += "[supplies["[i]"]] [supply_name["[i]"]][event==ORION_TRAIL_SPACEPORT ? ", buy [amm] for [supply_cost["[i]"]]T" : ""]
" + if(supplies["[i]"] >= amm && event == ORION_TRAIL_SPACEPORT) + dat += "sell [amm] for [supply_cost["[i]"]]T
" + if(ORION_VIEW_CREW) + dat = "

Crew

View the status of your crew.
" + for(var/i=1;i<=settlers.len;i++) + dat += "[settlers[i]] Kill
" + + dat += "

View:
" + dat += "[view==ORION_VIEW_MAIN ? "" : ""]Main[view==ORION_VIEW_MAIN ? "" : ""]
" + dat += "[view==ORION_VIEW_SUPPLIES ? "" : ""]Supplies[view==ORION_VIEW_SUPPLIES ? "" : ""]
" + dat += "[view==ORION_VIEW_CREW ? "" : ""]Crew[view==ORION_VIEW_CREW ? "" : ""]

" + user << browse(dat, "window=arcade") + +/obj/machinery/computer/arcade/orion_trail/Topic(href,href_list) + if(href_list["continue"]) + if(view == ORION_VIEW_MAIN) + var/next_event = null + if(event == ORION_TRAIL_START) + event = ORION_TRAIL_SPACEPORT + if(event == ORION_TRAIL_GAMEOVER) + event = null + src.updateUsrDialog() + return + if(!settlers.len) + event_desc = "You and your crew were killed on the way to Orion, your ship left abandoned for scavengers to find." + next_event = ORION_TRAIL_GAMEOVER + if(port == 9) + win() + return + var/travel = min(rand(1000,10000),distance) + if(href_list["fix"]) + var/item = href_list["fix"] + supplies[item] = max(0, --supplies[item]) + if(href_list["risky"]) + var/risk = text2num(href_list["risky"]) + if(prob(risk)) + next_event = ORION_TRAIL_DISASTER + + + if(!href_list["food"]) + var/temp = supplies["5"] - travel/1000 * (href_list["slow"] ? 2 : 1) + if(temp < 0 && (distance-travel != 0) && next_event == null) //uh oh. Better start a fuel event. + next_event = ORION_TRAIL_STUCK + travel -= (temp*-1)*1000/(href_list["slow"] ? 2 : 1) + temp = 0 + supplies["5"] = temp + + supplies["4"] = round(supplies["4"] - travel/1000 * settlers.len * (href_list["slow"] ? 2 : 1)) + distance = max(0,distance-travel) + else + supplies["4"] -= settlers.len * 5 + event_info = "You have [supplies["4"]] food left.
" + next_event = ORION_TRAIL_STUCK + + if(supplies["4"] <= 0) + next_event = ORION_TRAIL_GAMEOVER + event_desc = "You and your crew starved to death, never to reach Orion." + supplies["4"] = 0 + + if(distance == 0 && next_event == null) //POOORT! + port++ + event = ORION_TRAIL_SPACEPORT + distance = stop_distance[port] + //gotta set supply costs. The further out the more expensive it'll generally be + supply_cost = list("1" = rand(500+100*port,1200+100*port), "2" = rand(700+100*port,1000+100*port), "3" = rand(900+50*port,1500+75*port), "4" = rand(10+50*port,125+50*port), "5" = rand(75+25*port,200+100*port)) + else //Event? Event. + generate_event(next_event) + else + view = ORION_VIEW_MAIN + + if(href_list["supplies"]) + view = ORION_VIEW_SUPPLIES + + if(href_list["crew"]) + view = ORION_VIEW_CREW + + if(href_list["buy"]) + var/item = href_list["buy"] + if(supply_cost["[item]"] <= supplies["6"]) + supplies["[item]"] += (text2num(item) > 3 ? 10 : 1) + supplies["6"] -= supply_cost["[item]"] + + if(href_list["sell"]) + var/item = href_list["sell"] + if(supplies["[item]"] >= (text2num(item) > 3 ? 10 : 1)) + supplies["6"] += supply_cost["[item]"] + supplies["[item]"] -= (text2num(item) > 3 ? 10 : 1) + + if(href_list["kill"]) + var/item = text2num(href_list["kill"]) + remove_settler(item) + + if(href_list["attack"]) + supply_cost = list() + if(prob(17*settlers.len)) + event_desc = "An empty husk of a station now, all its resources stripped for use in your travels." + event_info = "You've successfully raided the spaceport!
" + change_resource(null) + change_resource(null) + else + event_desc = "The local police mobilized too quickly, sirens blare as you barely make it away with your ship intact." + change_resource(null,-1) + change_resource(null,-1) + if(prob(50)) + remove_settler(null, "died while you were escaping!") + if(prob(10)) + remove_settler(null, "died while you were escaping!") + event = ORION_TRAIL_SPACEPORT_RAIDED + src.updateUsrDialog() + +/obj/machinery/computer/arcade/orion_trail/proc/change_resource(var/specific = null, var/add = 1) + if(!specific) + specific = rand(1,6) + var/cost = (specific < 4 ? rand(1,5) : rand(5,100)) * add + cost = round(cost) + if(cost < 0) + cost = max(cost,supplies["[specific]"] * -1) + else + cost = max(cost,1) + supplies["[specific]"] += cost + event_info += "You've [add > 0 ? "gained" : "lost"] [abs(cost)] [supply_name["[specific]"]]
" + +/obj/machinery/computer/arcade/orion_trail/proc/remove_settler(var/specific = null, var/desc = null) + if(!settlers.len) + return + if(!specific) + specific = rand(1,settlers.len) + + event_info += "The crewmember, [settlers[specific]] [desc == null ? "has died!":"[desc]"]
" + settlers -= settlers[specific] + if(num_traitors > 0 && prob(100/max(1,settlers.len-1))) + num_traitors-- + +/obj/machinery/computer/arcade/orion_trail/proc/generate_event(var/specific = null) + if(!specific) + if(prob(20*num_traitors)) + specific = ORION_TRAIL_MUTINY_ATTACK + else + specific = pickweight(events) + + switch(specific) + if(ORION_TRAIL_RAIDERS) + if(prob(17 * settlers.len)) + event_info = "You managed to fight them off!
" + if(prob(5)) + remove_settler(null,"died in the firefight!") + change_resource(rand(4,5)) + change_resource(rand(1,3)) + if(prob(50)) + change_resource(6,1.1) + else + event_info = "You couldn't fight them off!
" + if(prob(10*settlers.len)) + remove_settler(null, "was kidnapped by the Vox!") + change_resource(null,-1) + change_resource(null,-0.5) + if(ORION_TRAIL_DERELICT) + if(prob(60)) + event_info = "You find resources onboard!" + change_resource(rand(1,3)) + change_resource(rand(4,5)) + else + event_info = "You don't find anything onboard..." + if(ORION_TRAIL_COLLISION) + event_info = "" + event_desc = "You've collided with a passing meteor, breaching your hull!" + if(prob(10)) + event_info = "Your cargo hold was breached!
" + change_resource(rand(4,5),-1) + if(prob(5*settlers.len)) + remove_settler(null,"was sucked out into the void!") + if(ORION_TRAIL_ILLNESS) + if(prob(15)) + event_info = "" + var/num = 1 + if(prob(15)) + num++ + for(var/i=0;i" + if(prob(10)) + event_info += "A passing ship has kindly donated fuel to you and wishes you luck on your journey.
" + change_resource(5,0.3) + if(emagged) + emag_effect(specific) + event = specific + +/obj/machinery/computer/arcade/orion_trail/proc/emag_effect(var/event) + switch(event) + if(ORION_TRAIL_RAIDERS) + if(istype(usr,/mob/living/carbon)) + var/mob/living/carbon/M = usr + if(prob(50)) + usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" + M.hallucination += 50 + else + usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." + M.take_organ_damage(10) + else + usr << "The sounds of battle fill your ears..." + if(ORION_TRAIL_ILLNESS) + if(istype(usr,/mob/living/carbon/human)) + var/mob/living/carbon/human/M = usr + M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." + M.vomit() + else + usr << "You feel ill." + if(ORION_TRAIL_CARP) + usr << " Something bit you!" + var/mob/living/M = usr + M.adjustBruteLoss(10) + if(ORION_TRAIL_FLUX) + if(istype(usr,/mob/living/carbon) && prob(75)) + var/mob/living/carbon/M = usr + M.Weaken(3) + src.visible_message("A sudden gust of powerful wind slams \the [M] into the floor!", "You hear a large fwooshing sound, followed by a bang.") + M.take_organ_damage(10) + else + usr << "A violent gale blows past you, and you barely manage to stay standing!" + if(ORION_TRAIL_MALFUNCTION) + if(supplies["3"]) + return + src.visible_message("\The [src]'s screen glitches out and smoke comes out of the back.") + for(var/i=1;i<7;i++) + supplies["[i]"] = max(0,supplies["[i]"] + rand(-10,10)) + if(ORION_TRAIL_COLLISION) + if(prob(90) && !supplies["2"]) + var/turf/simulated/floor/F = src.loc + F.ChangeTurf(/turf/space) + src.visible_message("Something slams into the floor around \the [src], exposing it to space!", "You hear something crack and break.") + else + src.visible_message("Something slams into the floor around \the [src] - luckily, it didn't get through!", "You hear something crack.") + if(ORION_TRAIL_GAMEOVER) + usr << "You're never going to make it to Orion..." + var/mob/living/M = usr + M.visible_message("\The [M] starts rapidly deteriorating.") + M << browse (null,"window=arcade") + for(var/i=0;i<10;i++) + sleep(10) + M.Stun(5) + M.adjustBruteLoss(10) + M.adjustFireLoss(10) + usr.gib() //So that people can't cheese it and inject a lot of kelo/bicard before losing + + + +/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) + if(!emagged) + newgame(1) + src.updateUsrDialog() + +/obj/machinery/computer/arcade/orion_trail/proc/win() + src.visible_message("\The [src] plays a triumpant tune, stating 'CONGRATULATIONS, YOU HAVE MADE IT TO ORION.'") + if(emagged) + new /obj/item/weapon/orion_ship(src.loc) + message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") + log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") + else + prizevend() + event = null + src.updateUsrDialog() + +/obj/item/weapon/orion_ship + name = "model settler ship" + desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." + icon = 'icons/obj/toy.dmi' + icon_state = "ship" + w_class = 2 + var/active = 0 //if the ship is on +/obj/item/weapon/orion_ship/examine(mob/user) + ..() + if(!(in_range(user, src))) + return + if(!active) + user << "There's a little switch on the bottom. It's flipped down." + else + user << "There's a little switch on the bottom. It's flipped up." +/obj/item/weapon/orion_ship/attack_self(mob/user) + if(active) + return + message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.") + log_game("[key_name(usr)] primed an explosive Orion ship for detonation.") + user << "You flip the switch on the underside of [src]." + active = 1 + src.visible_message("[src] softly beeps and whirs to life!") + src.audible_message("\The [src] says, 'This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.'") + sleep(20) + src.visible_message("[src] begins to vibrate...") + src.audible_message("\The [src] says, 'Uh, Port? Having some issues with our reactor, could you check it out? Over.'") + sleep(30) + src.audible_message("\The [src] says, 'Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-'") + sleep(3.6) + src.visible_message("[src] explodes!") + explosion(src.loc, 1,2,4) + qdel(src) + +#undef ORION_TRAIL_RAIDERS +#undef ORION_TRAIL_FLUX +#undef ORION_TRAIL_ILLNESS +#undef ORION_TRAIL_BREAKDOWN +#undef ORION_TRAIL_MUTINY +#undef ORION_TRAIL_MUTINY_ATTACK +#undef ORION_TRAIL_MALFUNCTION +#undef ORION_TRAIL_COLLISION +#undef ORION_TRAIL_SPACEPORT +#undef ORION_TRAIL_DISASTER +#undef ORION_TRAIL_CARP +#undef ORION_TRAIL_STUCK +#undef ORION_TRAIL_START +#undef ORION_TRAIL_GAMEOVER + + +#undef ORION_VIEW_MAIN +#undef ORION_VIEW_SUPPLIES +#undef ORION_VIEW_CREW \ No newline at end of file diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 888c8b9bd49..d2b0c8b814c 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -7,16 +7,17 @@ var/global/list/minor_air_alarms = list() /obj/machinery/computer/atmos_alert name = "atmospheric alert computer" desc = "Used to access the station's atmospheric sensors." - circuit = "/obj/item/weapon/circuitboard/atmos_alert" - icon_state = "alert:0" + circuit = /obj/item/weapon/circuitboard/atmos_alert + icon_keyboard = "atmos_key" + icon_screen = "alert:0" light_color = "#e6ffff" -/obj/machinery/computer/atmos_alert/New() +/obj/machinery/computer/atmos_alert/initialize() ..() - atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) + atmosphere_alarm.register_alarm(src, /obj/machinery/computer/station_alert/update_icon) /obj/machinery/computer/atmos_alert/Destroy() - atmosphere_alarm.unregister(src) + atmosphere_alarm.unregister_alarm(src) ..() /obj/machinery/computer/atmos_alert/attack_hand(mob/user) @@ -44,19 +45,17 @@ var/global/list/minor_air_alarms = list() ui.set_auto_update(1) /obj/machinery/computer/atmos_alert/update_icon() - ..() - if(stat & (NOPOWER|BROKEN)) - return - var/list/alarms = atmosphere_alarm ? atmosphere_alarm.major_alarms() : list() - if(alarms.len) - icon_state = "alert:2" - else - alarms = atmosphere_alarm ? atmosphere_alarm.minor_alarms() : list() + if(!(stat & (NOPOWER|BROKEN))) + var/list/alarms = atmosphere_alarm.major_alarms() if(alarms.len) - icon_state = "alert:1" + icon_screen = "alert:2" else - icon_state = initial(icon_state) - return + alarms = atmosphere_alarm.minor_alarms() + if(alarms.len) + icon_screen = "alert:1" + else + icon_screen = initial(icon_screen) + ..() /obj/machinery/computer/atmos_alert/Topic(href, href_list) if(..()) @@ -80,4 +79,4 @@ var/datum/topic_state/air_alarm_topic/air_alarm_topic = new() extra_href["remote_connection"] = 1 extra_href["remote_access"] = 1 - return extra_href \ No newline at end of file + return extra_href diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index c0c798f3eb8..796fd13e0e3 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -5,22 +5,25 @@ /obj/machinery/computer/atmoscontrol name = "\improper Central Atmospherics Computer" icon = 'icons/obj/computer.dmi' - icon_state = "computer_generic" + icon_keyboard = "generic_key" + icon_screen = "comm_logs" light_color = "#00b000" density = 1 anchored = 1.0 - circuit = "/obj/item/weapon/circuitboard/atmoscontrol" + circuit = /obj/item/weapon/circuitboard/atmoscontrol req_access = list(access_ce) var/list/monitored_alarm_ids = null - var/obj/nano_module/atmos_control/atmos_control + var/datum/nano_module/atmos_control/atmos_control /obj/machinery/computer/atmoscontrol/New() ..() /obj/machinery/computer/atmoscontrol/laptop name = "Atmospherics Laptop" - desc = "Cheap Nanotrasen Laptop." - icon_state = "medlaptop" + desc = "A cheap laptop." + icon_state = "laptop" + icon_keyboard = "laptop_key" + icon_screen = "atmoslaptop" density = 0 /obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob) @@ -31,14 +34,13 @@ 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.") +/obj/machinery/computer/atmoscontrol/emag_act(var/remaining_carges, var/mob/user) + if(!emagged) + user.visible_message("\The [user] does something \the [src], causing the screen to flash!",\ + "You cause the screen to flash as you gain full control.",\ + "You hear an electronic warble.") atmos_control.emagged = 1 - return - return ..() + return 1 /obj/machinery/computer/atmoscontrol/ui_interact(var/mob/user) if(!atmos_control) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 3a6deafa3d1..54734929c87 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -16,7 +16,7 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20)) - user << "\blue You wrench the frame into place." + user << "You wrench the frame into place." src.anchored = 1 src.state = 1 if(istype(P, /obj/item/weapon/weldingtool)) @@ -27,35 +27,35 @@ playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20)) if(!src || !WT.isOn()) return - user << "\blue You deconstruct the frame." + user << "You deconstruct the frame." new /obj/item/stack/material/steel( src.loc, 5 ) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20)) - user << "\blue You unfasten the frame." + user << "You unfasten the frame." src.anchored = 0 src.state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) var/obj/item/weapon/circuitboard/B = P if(B.board_type == "computer") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the circuit board inside the frame." + user << "You place the circuit board inside the frame." src.icon_state = "1" src.circuit = P user.drop_item() P.loc = src else - user << "\red This frame does not accept circuit boards of this type!" + user << "This frame does not accept circuit boards of this type!" if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the circuit board into place." + user << "You screw the circuit board into place." src.state = 2 src.icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the circuit board." + user << "You remove the circuit board." src.state = 1 src.icon_state = "0" circuit.loc = src.loc @@ -63,7 +63,7 @@ if(2) if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the circuit board." + user << "You unfasten the circuit board." src.state = 1 src.icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) @@ -81,7 +81,7 @@ if(3) if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." + user << "You remove the cables." src.state = 2 src.icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) @@ -102,13 +102,13 @@ if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." + user << "You remove the glass panel." src.state = 3 src.icon_state = "3" new /obj/item/stack/material/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You connect the monitor." + user << "You connect the monitor." var/B = new src.circuit.build_path ( src.loc ) src.circuit.construct(B) qdel(src) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 9e1b4533e95..b2e4ed54f2c 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -1,27 +1,25 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/var/camera_cache_id = 1 - -/proc/invalidateCameraCache() - camera_cache_id = (++camera_cache_id % 999999) - /obj/machinery/computer/security name = "security camera monitor" desc = "Used to access the various cameras on the station." - icon_state = "cameras" + icon_keyboard = "security_key" + icon_screen = "cameras" light_color = "#a91515" - var/obj/machinery/camera/current = null + var/current_network = null + var/obj/machinery/camera/current_camera = null var/last_pic = 1.0 var/list/network var/mapping = 0//For the overview file, interesting bit of code. var/cache_id = 0 circuit = /obj/item/weapon/circuitboard/security - var/camera_cache = null New() if(!network) - network = station_networks + network = station_networks.Copy() ..() + if(network.len) + current_network = network[1] attack_ai(var/mob/user as mob) return attack_hand(user) @@ -29,9 +27,9 @@ check_eye(var/mob/user as mob) if (user.stat || ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded) && !istype(user, /mob/living/silicon))) //user can't see - not sure why canmove is here. return -1 - if(!current) + if(!current_camera) return 0 - var/viewflag = current.check_eye(user) + var/viewflag = current_camera.check_eye(user) if ( viewflag < 0 ) //camera doesn't work reset_current() return viewflag @@ -43,25 +41,11 @@ var/data[0] - data["current"] = null - - if(camera_cache_id != cache_id) - cache_id = camera_cache_id - cameranet.process_sort() - - var/cameras[0] - for(var/obj/machinery/camera/C in cameranet.cameras) - if(!can_access_camera(C)) - continue - - var/cam = C.nano_structure() - cameras[++cameras.len] = cam - - camera_cache=list2json(cameras) - - if(current) - data["current"] = current.nano_structure() - data["cameras"] = list("__json_cache" = camera_cache) + data["current_camera"] = current_camera ? current_camera.nano_structure() : null + data["current_network"] = current_network + data["networks"] = network ? network : list() + if(current_network) + data["cameras"] = camera_repository.cameras_in_network(current_network) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -74,43 +58,47 @@ ui.set_initial_data(data) ui.open() - ui.set_auto_update(1) Topic(href, href_list) - if(href_list["switchTo"]) + if(..()) + return 1 + if(href_list["switch_camera"]) if(src.z>6 || stat&(NOPOWER|BROKEN)) return if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return - var/obj/machinery/camera/C = locate(href_list["switchTo"]) in cameranet.cameras - if(!C) return + var/obj/machinery/camera/C = locate(href_list["switch_camera"]) in cameranet.cameras + if(!C) + return + if(!(current_network in C.network)) + return switch_to_camera(usr, C) return 1 + else if(href_list["switch_network"]) + if(src.z>6 || stat&(NOPOWER|BROKEN)) return + if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return + if(href_list["switch_network"] in network) + current_network = href_list["switch_network"] + return 1 else if(href_list["reset"]) if(src.z>6 || stat&(NOPOWER|BROKEN)) return if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return reset_current() - usr.reset_view(current) + usr.reset_view(current_camera) return 1 else . = ..() attack_hand(var/mob/user as mob) if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: You're too far away from the station!" return if(stat & (NOPOWER|BROKEN)) return if(!isAI(user)) user.set_machine(src) - usr.reset_view(current) + user.reset_view(current_camera) ui_interact(user) - proc/can_access_camera(var/obj/machinery/camera/C) - var/list/shared_networks = src.network & C.network - if(shared_networks.len) - return 1 - return 0 - proc/switch_to_camera(var/mob/user, var/obj/machinery/camera/C) //don't need to check if the camera works for AI because the AI jumps to the camera location and doesn't actually look through cameras. if(isAI(user)) @@ -126,7 +114,7 @@ if (!C.can_use() || user.stat || (get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) && !istype(user, /mob/living/silicon))) return 0 set_current(C) - user.reset_view(current) + user.reset_view(current_camera) check_eye(user) return 1 @@ -160,26 +148,37 @@ if(can_access_camera(jump_to)) switch_to_camera(user,jump_to) +/obj/machinery/computer/security/process() + if(cache_id != camera_repository.camera_cache_id) + cache_id = camera_repository.camera_cache_id + nanomanager.update_uis(src) + +/obj/machinery/computer/security/proc/can_access_camera(var/obj/machinery/camera/C) + var/list/shared_networks = src.network & C.network + if(shared_networks.len) + return 1 + return 0 + /obj/machinery/computer/security/proc/set_current(var/obj/machinery/camera/C) - if(current == C) + if(current_camera == C) return - if(current) + if(current_camera) reset_current() - src.current = C - if(current) + src.current_camera = C + if(current_camera) use_power = 2 - var/mob/living/L = current.loc + var/mob/living/L = current_camera.loc if(istype(L)) L.tracking_initiated() /obj/machinery/computer/security/proc/reset_current() - if(current) - var/mob/living/L = current.loc + if(current_camera) + var/mob/living/L = current_camera.loc if(istype(L)) L.tracking_cancelled() - current = null + current_camera = null use_power = 1 //Camera control: mouse. @@ -192,7 +191,7 @@ /mob/Move(n,direct) if(istype(machine,/obj/machinery/computer/security)) var/obj/machinery/computer/security/console = machine - var/turf/T = get_turf(console.current) + var/turf/T = get_turf(console.current_camera) for(var/i;i<10;i++) T = get_step(T,direct) console.jump_on_click(src,T) @@ -202,23 +201,19 @@ /obj/machinery/computer/security/telescreen name = "Telescreen" desc = "Used for watching an empty arena." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "telescreen" - network = list("thunder") + icon_state = "wallframe" + icon_keyboard = null + icon_screen = null + light_range_on = 0 + network = list(NETWORK_THUNDER) density = 0 circuit = null -/obj/machinery/computer/security/telescreen/update_icon() - icon_state = initial(icon_state) - if(stat & BROKEN) - icon_state += "b" - return - /obj/machinery/computer/security/telescreen/entertainment name = "entertainment monitor" desc = "Damn, why do they never have anything interesting on these things?" icon = 'icons/obj/status_display.dmi' - icon_state = "entertainment" + icon_screen = "entertainment" light_color = "#FFEEDB" light_range_on = 2 circuit = null @@ -226,7 +221,9 @@ /obj/machinery/computer/security/wooden_tv name = "security camera monitor" desc = "An old TV hooked into the stations camera network." - icon_state = "security_det" + icon_state = "television" + icon_keyboard = null + icon_screen = "detective_tv" circuit = null light_color = "#3848B3" light_power_on = 0.5 @@ -234,7 +231,8 @@ /obj/machinery/computer/security/mining name = "outpost camera monitor" desc = "Used to access the various cameras on the outpost." - icon_state = "miningcameras" + icon_keyboard = "mining_key" + icon_screen = "mining" network = list("MINE") circuit = /obj/item/weapon/circuitboard/security/mining light_color = "#F9BBFC" @@ -242,18 +240,23 @@ /obj/machinery/computer/security/engineering name = "engineering camera monitor" desc = "Used to monitor fires and breaches." - icon_state = "engineeringcameras" + icon_keyboard = "power_key" + icon_screen = "engie_cams" circuit = /obj/item/weapon/circuitboard/security/engineering light_color = "#FAC54B" /obj/machinery/computer/security/engineering/New() if(!network) - network = engineering_networks + network = engineering_networks.Copy() ..() /obj/machinery/computer/security/nuclear name = "head mounted camera monitor" desc = "Used to access the built-in cameras in helmets." icon_state = "syndicam" - network = list("NUKE") + network = list(NETWORK_MERCENARY) circuit = null + +/obj/machinery/computer/security/nuclear/New() + ..() + req_access = list(150) diff --git a/code/game/machinery/computer/camera_circuit.dm b/code/game/machinery/computer/camera_circuit.dm index 3114f537e35..8db87c36ae7 100644 --- a/code/game/machinery/computer/camera_circuit.dm +++ b/code/game/machinery/computer/camera_circuit.dm @@ -7,7 +7,7 @@ var/authorised = 0 var/possibleNets[0] var/network = "" - build_path = 0 + build_path = null //when adding a new camera network, you should only need to update these two procs New() @@ -17,41 +17,30 @@ possibleNets["Cargo"] = access_qm possibleNets["Research"] = access_rd possibleNets["Medbay"] = access_cmo + ..() proc/updateBuildPath() - build_path = "" + build_path = null if(authorised && secured) switch(network) if("SS13") - build_path = "/obj/machinery/computer/security" + build_path = /obj/machinery/computer/security if("Engineering") - build_path = "/obj/machinery/computer/security/engineering" + build_path = /obj/machinery/computer/security/engineering if("Mining") - build_path = "/obj/machinery/computer/security/mining" + build_path = /obj/machinery/computer/security/mining if("Research") - build_path = "/obj/machinery/computer/security/research" + build_path = /obj/machinery/computer/security/research if("Medbay") - build_path = "/obj/machinery/computer/security/medbay" + build_path = /obj/machinery/computer/security/medbay if("Cargo") - build_path = "/obj/machinery/computer/security/cargo" + build_path = /obj/machinery/computer/security/cargo attackby(var/obj/item/I, var/mob/user)//if(health > 50) ..() - if(istype(I,/obj/item/weapon/card/emag)) - if(network) - var/obj/item/weapon/card/emag/E = I - if(E.uses) - E.uses-- - else - return - authorised = 1 - user << "\blue You authorised the circuit network!" - updateDialog() - else - user << "\blue You must select a camera network circuit!" else if(istype(I,/obj/item/weapon/screwdriver)) secured = !secured - user.visible_message("\blue The [src] can [secured ? "no longer" : "now"] be modified.") + user.visible_message("The [src] can [secured ? "no longer" : "now"] be modified.") updateBuildPath() return @@ -107,21 +96,20 @@ else if (possibleNets[network] in I.access) authorised = 1 if(istype(I,/obj/item/weapon/card/emag)) - if(network) - var/obj/item/weapon/card/emag/E = I - if(E.uses) - E.uses-- - else - return - authorised = 1 - usr << "\blue You authorised the circuit network!" - updateDialog() - else - usr << "\blue You must select a camera network circuit!" + I.resolve_attackby(src, usr) else if( href_list["removeauth"] ) authorised = 0 updateDialog() updateDialog() if(istype(src.loc,/mob)) - attack_self(src.loc) \ No newline at end of file + attack_self(src.loc) + +/obj/item/weapon/circuitboard/camera/emag_act(var/remaining_charges, var/mob/user) + if(network) + authorised = 1 + user << "You authorised the circuit network!" + updateDialog() + return 1 + else + user << "You must select a camera network circuit!" diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm deleted file mode 100644 index 9879e345654..00000000000 --- a/code/game/machinery/computer/card.dm +++ /dev/null @@ -1,292 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/obj/machinery/computer/card - name = "\improper ID card modification console" - desc = "Terminal for programming NanoTrasen employee ID cards to access parts of the station." - icon_state = "id" - light_color = "#0099ff" - req_access = list(access_change_ids) - circuit = "/obj/item/weapon/circuitboard/card" - var/obj/item/weapon/card/id/scan = null - var/obj/item/weapon/card/id/modify = null - var/mode = 0.0 - var/printing = null - -/obj/machinery/computer/card/proc/is_centcom() - return 0 - -/obj/machinery/computer/card/proc/is_authenticated() - return scan ? check_access(scan) : 0 - -/obj/machinery/computer/card/proc/get_target_rank() - return modify && modify.assignment ? modify.assignment : "Unassigned" - -/obj/machinery/computer/card/proc/format_jobs(list/jobs) - var/list/formatted = list() - for(var/job in jobs) - formatted.Add(list(list( - "display_name" = replacetext(job, " ", " "), - "target_rank" = get_target_rank(), - "job" = job))) - - return formatted - -/obj/machinery/computer/card/verb/eject_id() - set category = "Object" - set name = "Eject ID Card" - set src in oview(1) - - if(!usr || usr.stat || usr.lying) return - - if(scan) - usr << "You remove \the [scan] from \the [src]." - scan.loc = get_turf(src) - if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) - usr.put_in_hands(scan) - scan = null - else if(modify) - usr << "You remove \the [modify] from \the [src]." - modify.loc = get_turf(src) - if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) - usr.put_in_hands(modify) - modify = null - else - usr << "There is nothing to remove from the console." - return - -/obj/machinery/computer/card/attackby(obj/item/weapon/card/id/id_card, mob/user) - if(!istype(id_card)) - return ..() - - if(!scan && access_change_ids in id_card.access) - user.drop_item() - id_card.loc = src - scan = id_card - else if(!modify) - user.drop_item() - id_card.loc = src - modify = id_card - - nanomanager.update_uis(src) - attack_hand(user) - -/obj/machinery/computer/card/attack_ai(var/mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/card/attack_hand(mob/user as mob) - if(..()) return - if(stat & (NOPOWER|BROKEN)) return - ui_interact(user) - -/obj/machinery/computer/card/ui_interact(mob/user, ui_key="main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - - var/data[0] - data["src"] = "\ref[src]" - data["station_name"] = station_name() - data["mode"] = mode - data["printing"] = printing - data["manifest"] = data_core ? data_core.get_manifest(0) : null - data["target_name"] = modify ? modify.name : "-----" - data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" - data["target_rank"] = get_target_rank() - data["scan_name"] = scan ? scan.name : "-----" - data["authenticated"] = is_authenticated() - data["has_modify"] = !!modify - data["account_number"] = modify ? modify.associated_account_number : null - data["centcom_access"] = is_centcom() - data["all_centcom_access"] = null - data["regions"] = null - - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) - - if (modify && is_centcom()) - var/list/all_centcom_access = list() - for(var/access in get_all_centcom_access()) - all_centcom_access.Add(list(list( - "desc" = replacetext(get_centcom_access_desc(access), " ", " "), - "ref" = access, - "allowed" = (access in modify.access) ? 1 : 0))) - - data["all_centcom_access"] = all_centcom_access - else if (modify) - var/list/regions = list() - for(var/i = 1; i <= 7; i++) - var/list/accesses = list() - for(var/access in get_region_accesses(i)) - if (get_access_desc(access)) - accesses.Add(list(list( - "desc" = replacetext(get_access_desc(access), " ", " "), - "ref" = access, - "allowed" = (access in modify.access) ? 1 : 0))) - - regions.Add(list(list( - "name" = get_region_accesses_name(i), - "accesses" = accesses))) - - data["regions"] = regions - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "identification_computer.tmpl", src.name, 600, 700) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/computer/card/Topic(href, href_list) - if(..()) - return 1 - - switch(href_list["choice"]) - if ("modify") - if (modify) - data_core.manifest_modify(modify.registered_name, modify.assignment) - modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])") - if(ishuman(usr)) - modify.loc = usr.loc - if(!usr.get_active_hand()) - usr.put_in_hands(modify) - modify = null - else - modify.loc = loc - modify = null - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() - I.loc = src - modify = I - - if ("scan") - if (scan) - if(ishuman(usr)) - scan.loc = usr.loc - if(!usr.get_active_hand()) - usr.put_in_hands(scan) - scan = null - else - scan.loc = src.loc - scan = null - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() - I.loc = src - scan = I - - if("access") - if(href_list["allowed"]) - if(is_authenticated()) - var/access_type = text2num(href_list["access_target"]) - var/access_allowed = text2num(href_list["allowed"]) - if(access_type in (is_centcom() ? get_all_centcom_access() : get_all_accesses())) - modify.access -= access_type - if(!access_allowed) - modify.access += access_type - - if ("assign") - if (is_authenticated() && modify) - var/t1 = href_list["assign_target"] - if(t1 == "Custom") - var/temp_t = sanitize(input("Enter a custom job assignment.","Assignment"), 45) - //let custom jobs function as an impromptu alt title, mainly for sechuds - if(temp_t && modify) - modify.assignment = temp_t - else - var/list/access = list() - if(is_centcom()) - access = get_centcom_access(t1) - else - var/datum/job/jobdatum - for(var/jobtype in typesof(/datum/job)) - var/datum/job/J = new jobtype - if(ckey(J.title) == ckey(t1)) - jobdatum = J - break - if(!jobdatum) - usr << "\red No log exists for this job: [t1]" - return - - access = jobdatum.get_access() - - modify.access = access - modify.assignment = t1 - modify.rank = t1 - - callHook("reassign_employee", list(modify)) - - if ("reg") - if (is_authenticated()) - var/t2 = modify - if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) - var/temp_name = sanitizeName(href_list["reg"]) - if(temp_name) - modify.registered_name = temp_name - else - src.visible_message("[src] buzzes rudely.") - nanomanager.update_uis(src) - - if ("account") - if (is_authenticated()) - var/t2 = modify - if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) - var/account_num = text2num(href_list["account"]) - modify.associated_account_number = account_num - nanomanager.update_uis(src) - - if ("mode") - mode = text2num(href_list["mode_target"]) - - if ("print") - if (!printing) - printing = 1 - spawn(50) - printing = null - nanomanager.update_uis(src) - - var/obj/item/weapon/paper/P = new(loc) - if (mode) - P.name = text("crew manifest ([])", worldtime2text()) - P.info = {"

Crew Manifest

-
- [data_core ? data_core.get_manifest(0) : ""] - "} - else if (modify) - P.name = "access report" - P.info = {"

Access Report

- Prepared By: [scan.registered_name ? scan.registered_name : "Unknown"]
- For: [modify.registered_name ? modify.registered_name : "Unregistered"]
-
- Assignment: [modify.assignment]
- Account Number: #[modify.associated_account_number]
- Blood Type: [modify.blood_type]

- Access:
- "} - - for(var/A in modify.access) - P.info += " [get_access_desc(A)]" - - if ("terminate") - if (is_authenticated()) - modify.assignment = "Terminated" - modify.access = list() - - callHook("terminate_employee", list(modify)) - - if (modify) - modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])") - - return 1 - -/obj/machinery/computer/card/centcom - name = "\improper CentCom ID card modification console" - circuit = "/obj/item/weapon/circuitboard/card/centcom" - req_access = list(access_cent_captain) - - -/obj/machinery/computer/card/centcom/is_centcom() - return 1 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 6a274e4db40..d87febb8cee 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -1,9 +1,10 @@ /obj/machinery/computer/cloning name = "cloning control console" icon = 'icons/obj/computer.dmi' - icon_state = "dna" + icon_keyboard = "med_key" + icon_screen = "dna" light_color = "#315ab4" - circuit = "/obj/item/weapon/circuitboard/cloning" + circuit = /obj/item/weapon/circuitboard/cloning req_access = list(access_heads) //Only used for record deletion right now. var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. var/list/pods = list() //Linked cloning pods. @@ -17,11 +18,12 @@ /obj/machinery/computer/cloning/initialize() ..() + set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/cryo(src, list(/proc/is_operable))) updatemodules() /obj/machinery/computer/cloning/Destroy() releasecloner() - ..() + return ..() /obj/machinery/computer/cloning/proc/updatemodules() src.scanner = findscanner() @@ -51,6 +53,33 @@ P.name = initial(P.name) pods.Cut() +/obj/machinery/computer/cloning/proc/connect_pod(var/obj/machinery/clonepod/P) + if(P in pods) + return 0 + + if(P.connected) + P.connected.release_pod(P) + P.connected = src + pods += P + rename_pods() + + return 1 + +/obj/machinery/computer/cloning/proc/release_pod(var/obj/machinery/clonepod/P) + if(!(P in pods)) + return + + P.connected = null + P.name = initial(P.name) + pods -= P + rename_pods() + return 1 + +/obj/machinery/computer/cloning/proc/rename_pods() + for(var/i = 1 to pods.len) + var/atom/P = pods[i] + P.name = "[initial(P.name)] #[i]" + /obj/machinery/computer/cloning/proc/findcloner() var/num = 1 var/area/A = get_area(src) @@ -69,14 +98,6 @@ user << "You insert [W]." src.updateUsrDialog() return - else if(istype(W, /obj/item/device/multitool)) - var/obj/item/device/multitool/M = W - var/obj/machinery/clonepod/P = M.connecting - if(P && !(P in pods)) - pods += P - P.connected = src - P.name = "[initial(P.name)] #[pods.len]" - user << "You connect [P] to [src]." else ..() return @@ -357,9 +378,6 @@ else scantemp = "Error: No signs of intelligence detected." return - if (subject.suiciding == 1) - scantemp = "Error: Subject's brain is not responding to scanning stimuli." - return if ((!subject.ckey) || (!subject.client)) scantemp = "Error: Mental interface failure." return @@ -408,15 +426,3 @@ selected_record = R break return selected_record - -/obj/machinery/computer/cloning/update_icon() - - if(stat & BROKEN) - icon_state = "commb" - else - if(stat & NOPOWER) - src.icon_state = "c_unpowered" - stat |= NOPOWER - else - icon_state = initial(icon_state) - stat &= ~NOPOWER diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 2aa8e038e55..bf695cd1631 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -4,10 +4,11 @@ /obj/machinery/computer/communications name = "command and communications console" desc = "Used to command and control the station. Can relay long-range communications." - icon_state = "comm" + icon_keyboard = "tech_key" + icon_screen = "comm" light_color = "#0099ff" req_access = list(access_heads) - circuit = "/obj/item/weapon/circuitboard/communications" + circuit = /obj/item/weapon/circuitboard/communications var/prints_intercept = 1 var/authenticated = 0 var/list/messagetitle = list() @@ -189,12 +190,12 @@ 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.", "")) + var/input = sanitize(input("Please choose a message to transmit to [boss_short] 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 << "Message transmitted." - log_say("[key_name(usr)] has made an IA Centcomm announcement: [input]") + log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") centcomm_message_cooldown = 1 spawn(300)//30 second cooldown centcomm_message_cooldown = 0 @@ -269,11 +270,11 @@ src.updateUsrDialog() -/obj/machinery/computer/communications/attackby(var/obj/I as obj, var/mob/user as mob) - if(istype(I,/obj/item/weapon/card/emag/)) +/obj/machinery/computer/communications/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) src.emagged = 1 user << "You scramble the communication routing circuits!" - ..() + return 1 /obj/machinery/computer/communications/attack_ai(var/mob/user as mob) return src.attack_hand(user) @@ -303,7 +304,7 @@ if (src.authenticated==1) dat += "
\[ Make An Announcement \]" if(src.emagged == 0) - dat += "
\[ Send an emergency message to Centcomm \]" + dat += "
\[ Send an emergency message to [boss_short] \]" else dat += "
\[ Send an emergency message to \[UNKNOWN\] \]" dat += "
\[ Restore Backup Routing Data \]" @@ -434,7 +435,7 @@ return if(deathsquad.deployed) - user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated." + user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated." return if(emergency_shuttle.deny_shuttle) @@ -446,7 +447,7 @@ return if(emergency_shuttle.going_to_centcom()) - user << "The emergency shuttle may not be called while returning to CentCom." + user << "The emergency shuttle may not be called while returning to [boss_short]." return if(emergency_shuttle.online()) @@ -469,7 +470,7 @@ return if(emergency_shuttle.going_to_centcom()) - user << "The shuttle may not be called while returning to CentCom." + user << "The shuttle may not be called while returning to [boss_short]." return if(emergency_shuttle.online()) @@ -479,11 +480,11 @@ // if force is 0, some things may stop the shuttle call if(!force) if(emergency_shuttle.deny_shuttle) - user << "Centcom does not currently have a shuttle available in your sector. Please try again later." + user << "[boss_short] does not currently have a shuttle available in your sector. Please try again later." return if(deathsquad.deployed == 1) - user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated." + user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated." return if(world.time < 54000) // 30 minute grace period to let the game get going @@ -550,50 +551,3 @@ status_signal.data["picture_state"] = data1 frequency.post_signal(src, status_signal) - - -/obj/machinery/computer/communications/Destroy() - - for(var/obj/machinery/computer/communications/commconsole in world) - if(istype(commconsole.loc,/turf) && commconsole != src) - return ..() - - for(var/obj/item/weapon/circuitboard/communications/commboard in world) - if(istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage)) - return ..() - - for(var/mob/living/silicon/ai/shuttlecaller in player_list) - if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf)) - return ..() - - if(ticker.mode.name == "revolution" || deathsquad.deployed) - return ..() - - emergency_shuttle.call_evac() - log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.") - message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1) - - ..() - -/obj/item/weapon/circuitboard/communications/Destroy() - - for(var/obj/machinery/computer/communications/commconsole in world) - if(istype(commconsole.loc,/turf)) - return ..() - - for(var/obj/item/weapon/circuitboard/communications/commboard in world) - if((istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage)) && commboard != src) - return ..() - - for(var/mob/living/silicon/ai/shuttlecaller in player_list) - if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf)) - return ..() - - if(ticker.mode.name == "revolution" || deathsquad.deployed) - return ..() - - emergency_shuttle.call_evac() - log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.") - message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1) - - ..() diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 4317f749696..022a3e30d8f 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -1,6 +1,7 @@ /obj/machinery/computer name = "computer" icon = 'icons/obj/computer.dmi' + icon_state = "computer" density = 1 anchored = 1.0 use_power = 1 @@ -9,27 +10,25 @@ var/circuit = null //The path to the circuit board type. If circuit==null, the computer can't be disassembled. var/processing = 0 - var/light_range_on = 3 + var/icon_keyboard = "generic_key" + var/icon_screen = "generic" + var/light_range_on = 2 var/light_power_on = 1 + var/overlay_layer + +/obj/machinery/computer/New() + overlay_layer = layer + ..() /obj/machinery/computer/initialize() power_change() + update_icon() /obj/machinery/computer/process() if(stat & (NOPOWER|BROKEN)) return 0 return 1 -/obj/machinery/computer/meteorhit(var/obj/O as obj) - for(var/x in verbs) - verbs -= x - set_broken() - var/datum/effect/effect/system/smoke_spread/smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread) - smoke.set_up(5, 0, src) - smoke.start() - return - - /obj/machinery/computer/emp_act(severity) if(prob(20/severity)) set_broken() ..() @@ -57,33 +56,27 @@ return /obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - - if(prob(Proj.damage)) + if(prob(Proj.get_structure_damage())) set_broken() ..() - -/obj/machinery/computer/blob_act() - if (prob(75)) - for(var/x in verbs) - verbs -= x - set_broken() - /obj/machinery/computer/update_icon() - ..() - icon_state = initial(icon_state) - // Broken + overlays.Cut() + if(stat & NOPOWER) + set_light(0) + if(icon_keyboard) + overlays += image(icon,"[icon_keyboard]_off", overlay_layer) + return + else + set_light(light_range_on, light_power_on) + if(stat & BROKEN) - icon_state += "b" - - // Powered - else if(stat & NOPOWER) - icon_state = initial(icon_state) - icon_state += "0" - + overlays += image(icon,"[icon_state]_broken", overlay_layer) + else + overlays += image(icon,icon_screen, overlay_layer) + if(icon_keyboard) + overlays += image(icon, icon_keyboard, overlay_layer) /obj/machinery/computer/power_change() ..() @@ -103,15 +96,6 @@ text = replacetext(text, "\n", "
") return text - -/obj/machinery/computer/attack_ghost(user as mob) - return src.attack_hand(user) - -/obj/machinery/computer/attack_hand(user as mob) - /* Observers can view computers, but not actually use them via Topic*/ - if(istype(user, /mob/dead/observer)) return 0 - return ..() - /obj/machinery/computer/attackby(I as obj, user as mob) if(istype(I, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 6928d104ca7..d780d47406e 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -1,44 +1,38 @@ /obj/machinery/computer/crew name = "crew monitoring computer" desc = "Used to monitor active health sensors built into most of the crew's uniforms." - icon_state = "crew" + icon_keyboard = "med_key" + icon_screen = "crew" light_color = "#315ab4" use_power = 1 idle_power_usage = 250 active_power_usage = 500 - circuit = "/obj/item/weapon/circuitboard/crew" - var/obj/nano_module/crew_monitor/crew_monitor + circuit = /obj/item/weapon/circuitboard/crew + var/datum/nano_module/crew_monitor/crew_monitor /obj/machinery/computer/crew/New() crew_monitor = new(src) ..() +/obj/machinery/computer/crew/Destroy() + qdel(crew_monitor) + crew_monitor = null + ..() /obj/machinery/computer/crew/attack_ai(mob/user) - attack_hand(user) ui_interact(user) - /obj/machinery/computer/crew/attack_hand(mob/user) add_fingerprint(user) if(stat & (BROKEN|NOPOWER)) return ui_interact(user) -/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - crew_monitor.ui_interact(user, ui_key, ui, force_open) +/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + crew_monitor.ui_interact(user, ui_key, ui, force_open, state) -/obj/machinery/computer/crew/update_icon() - - if(stat & BROKEN) - icon_state = "crewb" - else - if(stat & NOPOWER) - src.icon_state = "c_unpowered" - stat |= NOPOWER - else - icon_state = initial(icon_state) - stat &= ~NOPOWER +/obj/machinery/computer/crew/nano_container() + return crew_monitor /obj/machinery/computer/crew/interact(mob/user) crew_monitor.ui_interact(user) diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 5add587e77c..ccbce91b619 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -43,9 +43,10 @@ /obj/machinery/computer/guestpass name = "guest pass terminal" icon_state = "guest" + icon_keyboard = null + icon_screen = "pass" density = 0 - var/obj/item/weapon/card/id/giver var/list/accesses = list() var/giv_name = "NOT SPECIFIED" @@ -61,13 +62,14 @@ /obj/machinery/computer/guestpass/attackby(obj/O, mob/user) if(istype(O, /obj/item/weapon/card/id)) - if(!giver) - user.drop_item() + if(!giver && user.unEquip(O)) O.loc = src giver = O updateUsrDialog() - else + else if(giver) user << "There is already ID card inside." + return + ..() /obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob) return attack_hand(user) @@ -150,8 +152,7 @@ accesses.Cut() else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src giver = I updateUsrDialog() @@ -185,6 +186,6 @@ pass.reason = reason pass.name = "guest pass #[number]" else - usr << "\red Cannot issue pass without issuing ID." + usr << "Cannot issue pass without issuing ID." updateUsrDialog() return diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 2d73e17da86..abbf65b44ff 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -3,8 +3,9 @@ /obj/machinery/computer/aiupload name = "\improper AI upload console" desc = "Used to upload laws to the AI." - icon_state = "command" - circuit = "/obj/item/weapon/circuitboard/aiupload" + icon_keyboard = "rd_key" + icon_screen = "command" + circuit = /obj/item/weapon/circuitboard/aiupload var/mob/living/silicon/ai/current = null var/opened = 0 @@ -18,15 +19,15 @@ opened = !opened if(opened) - usr << "\blue The access panel is now open." + usr << "The access panel is now open." else - usr << "\blue The access panel is now closed." + usr << "The access panel is now closed." return attackby(obj/item/weapon/O as obj, mob/user as mob) if (user.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: You're too far away from the station!" return if(istype(O, /obj/item/weapon/aiModule)) var/obj/item/weapon/aiModule/M = O @@ -50,7 +51,7 @@ else usr << "[src.current.name] selected for law changes." return - + attack_ghost(user as mob) return 1 @@ -58,8 +59,9 @@ /obj/machinery/computer/borgupload name = "cyborg upload console" desc = "Used to upload laws to Cyborgs." - icon_state = "command" - circuit = "/obj/item/weapon/circuitboard/borgupload" + icon_keyboard = "rd_key" + icon_screen = "command" + circuit = /obj/item/weapon/circuitboard/borgupload var/mob/living/silicon/robot/current = null diff --git a/code/game/machinery/computer/lockdown.dm b/code/game/machinery/computer/lockdown.dm deleted file mode 100644 index c1eb5d8e067..00000000000 --- a/code/game/machinery/computer/lockdown.dm +++ /dev/null @@ -1,153 +0,0 @@ -//this computer displays status and remotely activates multiple shutters / blast doors -//todo: lock / electrify specified area doors? might be a bit gamebreaking - -/obj/machinery/computer/lockdown - //for reference - /*name = "lockdown control" - desc = "Used to control blast doors." - icon_state = "lockdown" - circuit = "/obj/item/weapon/circuitboard/lockdown" - var/connected_doors - var/department*/ - var/list/displayedNetworks - - New() - ..() - connected_doors = new/list() - displayedNetworks = new/list() - //only load blast doors for map-defined departments for the moment - //door networks are hardcoded here. - switch(department) - if("Engineering") - connected_doors.Add("Engineering") - //Antiqua Engineering - connected_doors.Add("Reactor core") - connected_doors.Add("Control Room") - connected_doors.Add("Vent Seal") - connected_doors.Add("Rig Storage") - connected_doors.Add("Fore Port Shutters") - connected_doors.Add("Fore Starboard Shutters") - connected_doors.Add("Electrical Storage Shutters") - connected_doors.Add("Locker Room Shutters") - connected_doors.Add("Breakroom Shutters") - connected_doors.Add("Observation Shutters") - //exodus engineering - if("Medbay") - //Exodus Medbay - connected_doors.Add("Genetics Outer Shutters") - connected_doors.Add("Genetics Inner Shutters") - connected_doors.Add("Chemistry Outer Shutters") - connected_doors.Add("Observation Shutters") - connected_doors.Add("Patient Room 1 Shutters") - connected_doors.Add("Patient Room 2 Shutters") - connected_doors.Add("Patient Room 3 Shutters") - - for(var/net in connected_doors) - connected_doors[net] = new/list() - - //loop through the world, grabbing all the relevant doors - spawn(1) - ConnectDoors() - - proc/ConnectDoors() - for(var/list/L in connected_doors) - for(var/item in L) - L.Remove(item) - // - for(var/obj/machinery/door/poddoor/D in world) - if(D.network in connected_doors) - var/list/L = connected_doors[D.network] - L.Add(D) - - attack_ai(mob/user) - attack_hand(user) - - attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) - return - - if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.machine = null - user << browse(null, "window=lockdown") - return - - var/t = "Lockdown Control
" - t += "Refresh
" - t += "Close
" - t += "" - var/empty = 1 - for(var/curNetId in connected_doors) - var/list/L = connected_doors[curNetId] - if(!L || L.len == 0) - continue - empty = 0 - t += "" - if(curNetId in displayedNetworks) - t += "" - t += "" - t += "" - - for(var/obj/machinery/door/poddoor/D in connected_doors[curNetId]) - t += "" - t += "" - - if(istype(D,/obj/machinery/door/poddoor/shutters)) - t += "" - else - t += "" - t += "" - t += "" - else - t += "" - t += "
\[-\] " + curNetId + "Open all / Close all
[D.id]Shutter ([D.density ? "Closed" : "Open"])Blast door ([D.density ? "Closed" : "Open"])Toggle
\[+\] " + curNetId + "
" - if(empty) - t += "\red No networks connected.
" - t += "Refresh
" - t += "Close
" - user << browse(t, "window=lockdown;size=550x600") - onclose(user, "lockdown") - - Topic(href, href_list) - if(..()) return 1 - - if( href_list["close"] ) - usr << browse(null, "window=lockdown") - usr.machine = null - - if( href_list["show_net"] ) - displayedNetworks.Add(href_list["show_net"]) - updateDialog() - - if( href_list["hide_net"] ) - if(href_list["hide_net"] in displayedNetworks) - displayedNetworks.Remove(href_list["hide_net"]) - updateDialog() - - if( href_list["toggle_id"] ) - var/idTag = href_list["toggle_id"] - for(var/net in connected_doors) - for(var/obj/machinery/door/poddoor/D in connected_doors[net]) - if(D.id == idTag) - if(D.density) - D.open() - else - D.close() - break - - if( href_list["open_net"] ) - var/netTag = href_list["open_net"] - for(var/obj/machinery/door/poddoor/D in connected_doors[netTag]) - if(D.density) //for some reason, there's no var saying whether the door is open or not >.> - spawn(0) - D.open() - - if( href_list["close_net"] ) - var/netTag = href_list["close_net"] - for(var/obj/machinery/door/poddoor/D in connected_doors[netTag]) - if(!D.density) - spawn(0) - D.close() - - src.updateDialog() diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 291c441c6af..c88999f4c9f 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -3,10 +3,11 @@ /obj/machinery/computer/med_data//TODO:SANITY name = "medical records console" desc = "Used to view, edit and maintain medical records." - icon_state = "medcomp" + icon_keyboard = "med_key" + icon_screen = "medcomp" light_color = "#315ab4" req_one_access = list(access_medical_equip, access_forensics_lockers) - circuit = "/obj/item/weapon/circuitboard/med_data" + circuit = /obj/item/weapon/circuitboard/med_data var/obj/item/weapon/card/id/scan = null var/authenticated = null var/rank = null @@ -37,13 +38,13 @@ usr << "There is no ID card to remove from the console." return -/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob) - if(istype(O, /obj/item/weapon/card/id) && !scan) - usr.drop_item() +/obj/machinery/computer/med_data/attackby(var/obj/item/O, var/mob/user) + if(istype(O, /obj/item/weapon/card/id) && !scan && user.unEquip(O)) O.loc = src scan = O - user << "You insert [O]." - ..() + user << "You insert \the [O]." + else + ..() /obj/machinery/computer/med_data/attack_ai(user as mob) return src.attack_hand(user) @@ -51,6 +52,9 @@ /obj/machinery/computer/med_data/attack_hand(mob/user as mob) if(..()) return + ui_interact(user) + +/obj/machinery/computer/med_data/ui_interact(mob/user) var/dat if (src.temp) dat = text("[src.temp]

Clear Screen") @@ -554,6 +558,7 @@ /obj/machinery/computer/med_data/laptop name = "Medical Laptop" - desc = "Cheap Nanotrasen Laptop." - icon_state = "medlaptop" - density = 0 + desc = "A cheap laptop." + icon_state = "laptop" + icon_keyboard = "laptop_key" + icon_screen = "medlaptop" diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index f775c5f9508..e50ad8cb923 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -3,11 +3,10 @@ /obj/machinery/computer/message_monitor name = "messaging monitor console" desc = "Used to access and maintain data on messaging servers. Allows you to view PDA and request console messages." - icon_state = "comm_logs" + icon_screen = "comm_logs" light_color = "#00b000" - var/hack_icon = "comm_logsc" - var/normal_icon = "comm_logs" - circuit = "/obj/item/weapon/circuitboard/message_monitor" + var/hack_icon = "error" + circuit = /obj/item/weapon/circuitboard/message_monitor //Server linked to. var/obj/machinery/message_server/linkedServer = null //Sparks effect - For emag @@ -37,24 +36,6 @@ return if(!istype(user)) return - if(istype(O,/obj/item/weapon/card/emag/)) - // Will create sparks and print out the console's password. You will then have to wait a while for the console to be back online. - // It'll take more time if there's more characters in the password.. - if(!emag) - if(!isnull(src.linkedServer)) - icon_state = hack_icon // An error screen I made in the computers.dmi - emag = 1 - screen = 2 - spark_system.set_up(5, 0, src) - src.spark_system.start() - var/obj/item/weapon/paper/monitorkey/MK = new/obj/item/weapon/paper/monitorkey - MK.loc = src.loc - // Will help make emagging the console not so easy to get away with. - MK.info += "

£%@%(*$%&(£&?*(%&£/{}" - spawn(100*length(src.linkedServer.decryptkey)) UnmagConsole() - message = rebootmsg - else - user << "A no server error appears on the screen." if(isscrewdriver(O) && emag) //Stops people from just unscrewing the monitor and putting it back to get the console working again. user << "It is too hot to mess with!" @@ -63,14 +44,32 @@ ..() return +/obj/machinery/computer/message_monitor/emag_act(var/remaining_charges, var/mob/user) + // Will create sparks and print out the console's password. You will then have to wait a while for the console to be back online. + // It'll take more time if there's more characters in the password.. + if(!emag && operable()) + if(!isnull(src.linkedServer)) + emag = 1 + screen = 2 + spark_system.set_up(5, 0, src) + src.spark_system.start() + var/obj/item/weapon/paper/monitorkey/MK = new/obj/item/weapon/paper/monitorkey + MK.loc = src.loc + // Will help make emagging the console not so easy to get away with. + MK.info += "

£%@%(*$%&(£&?*(%&£/{}" + spawn(100*length(src.linkedServer.decryptkey)) UnmagConsole() + message = rebootmsg + update_icon() + return 1 + else + user << "A no server error appears on the screen." + /obj/machinery/computer/message_monitor/update_icon() - ..() - if(stat & (NOPOWER|BROKEN)) - return if(emag || hacking) - icon_state = hack_icon + icon_screen = hack_icon else - icon_state = normal_icon + icon_screen = initial(icon_screen) + ..() /obj/machinery/computer/message_monitor/initialize() //Is the server isn't linked to a server, and there's a server available, default it to the first one in the list. @@ -211,7 +210,7 @@ [customjob] [customrecepient ? customrecepient.owner : "NONE"] [custommessage]"} - dat += "
Send" + dat += "
Send
" //Request Console Logs if(4) @@ -269,12 +268,12 @@ var/currentKey = src.linkedServer.decryptkey user << "Brute-force completed! The key is '[currentKey]'." src.hacking = 0 - src.icon_state = normal_icon + update_icon() src.screen = 0 // Return the screen back to normal /obj/machinery/computer/message_monitor/proc/UnmagConsole() - src.icon_state = normal_icon src.emag = 0 + update_icon() /obj/machinery/computer/message_monitor/proc/ResetMessage() customsender = "System Administrator" @@ -366,7 +365,7 @@ if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr)) src.hacking = 1 src.screen = 2 - src.icon_state = hack_icon + update_icon() //Time it takes to bruteforce is dependant on the password length. spawn(100*length(src.linkedServer.decryptkey)) if(src && src.linkedServer && usr) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 7e23437e255..8db5ebd1b8b 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -3,7 +3,7 @@ /obj/machinery/computer/pod name = "pod launch control console" desc = "A control console for launching pods. Some people prefer firing Mechas." - icon_state = "computer_generic" + icon_screen = "mass_driver" light_color = "#00b000" circuit = /obj/item/weapon/circuitboard/pod var/id = 1.0 @@ -56,7 +56,7 @@ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 20)) if(stat & BROKEN) - user << "\blue The broken glass falls out." + user << "The broken glass falls out." var/obj/structure/computerframe/A = new /obj/structure/computerframe( loc ) new /obj/item/weapon/material/shard( loc ) @@ -80,7 +80,7 @@ A.anchored = 1 qdel(src) else - user << "\blue You disconnect the monitor." + user << "You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( loc ) //generate appropriate circuitboard. Accounts for /pod/old computer types @@ -194,7 +194,9 @@ /obj/machinery/computer/pod/old - icon_state = "old" + icon_state = "oldcomp" + icon_keyboard = null + icon_screen = "library" name = "DoorMex Control Computer" title = "Door Controls" @@ -208,7 +210,7 @@ /obj/machinery/computer/pod/old/syndicate/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "\red Access Denied" + user << "Access Denied" return else ..() diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 8507f97e77d..1551e0df6ee 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -3,10 +3,11 @@ /obj/machinery/computer/prisoner name = "prisoner management console" icon = 'icons/obj/computer.dmi' - icon_state = "explosive" + icon_keyboard = "security_key" + icon_screen = "explosive" light_color = "#a91515" req_access = list(access_armory) - circuit = "/obj/item/weapon/circuitboard/prisoner" + circuit = /obj/item/weapon/circuitboard/prisoner var/id = 0.0 var/temp = null var/status = 0 @@ -96,7 +97,7 @@ var/obj/item/weapon/implant/I = locate(href_list["warn"]) if((I)&&(I.imp_in)) var/mob/living/carbon/R = I.imp_in - R << "\green You hear a voice in your head saying: '[warning]'" + R << "You hear a voice in your head saying: '[warning]'" src.add_fingerprint(usr) src.updateUsrDialog() diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm index 59aa575a5bd..c2c45987063 100644 --- a/code/game/machinery/computer/prisonshuttle.dm +++ b/code/game/machinery/computer/prisonshuttle.dm @@ -13,10 +13,11 @@ var/prison_shuttle_timeleft = 0 /obj/machinery/computer/prison_shuttle name = "prison shuttle control console" icon = 'icons/obj/computer.dmi' - icon_state = "shuttle" + icon_keyboard = "security_key" + icon_screen = "syndishuttle" light_color = "#00ffff" req_access = list(access_security) - circuit = "/obj/item/weapon/circuitboard/prison_shuttle" + circuit = /obj/item/weapon/circuitboard/prison_shuttle var/temp = null var/hacked = 0 var/allowedtocall = 0 @@ -37,29 +38,26 @@ var/prison_shuttle_timeleft = 0 A.anchored = 1 if (src.stat & BROKEN) - user << "\blue The broken glass falls out." + user << "The broken glass falls out." new /obj/item/weapon/material/shard( src.loc ) A.state = 3 A.icon_state = "3" else - user << "\blue You disconnect the monitor." + user << "You disconnect the monitor." A.state = 4 A.icon_state = "4" qdel(src) - else if(istype(I,/obj/item/weapon/card/emag) && (!hacked)) - hacked = 1 - user << "\blue You disable the lock." else return src.attack_hand(user) attack_hand(var/mob/user as mob) if(!src.allowed(user) && (!hacked)) - user << "\red Access Denied." + user << "Access Denied." return if(prison_break) - user << "\red Unable to locate shuttle." + user << "Unable to locate shuttle." return if(..()) return @@ -88,11 +86,11 @@ var/prison_shuttle_timeleft = 0 if (href_list["sendtodock"]) if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." + usr << "The prison shuttle is unable to leave." return if(!prison_shuttle_at_station|| prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return post_signal("prison") - usr << "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." + usr << "The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." src.temp += "Shuttle sent.

OK" src.updateUsrDialog() prison_shuttle_moving_to_prison = 1 @@ -102,11 +100,11 @@ var/prison_shuttle_timeleft = 0 else if (href_list["sendtostation"]) if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." + usr << "The prison shuttle is unable to leave." return if(prison_shuttle_at_station || prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return post_signal("prison") - usr << "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." + usr << "The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." src.temp += "Shuttle sent.

OK" src.updateUsrDialog() prison_shuttle_moving_to_station = 1 @@ -174,7 +172,7 @@ var/prison_shuttle_timeleft = 0 if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." + usr << "The prison shuttle is unable to leave." return var/area/start_location = locate(/area/shuttle/prison/prison) @@ -203,7 +201,7 @@ var/prison_shuttle_timeleft = 0 if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." + usr << "The prison shuttle is unable to leave." return var/area/start_location = locate(/area/shuttle/prison/station) @@ -235,3 +233,9 @@ var/prison_shuttle_timeleft = 0 start_location.move_contents_to(end_location) return + +/obj/machinery/computer/prison_shuttle/emag_act(var/charges, var/mob/user) + if(!hacked) + hacked = 1 + user << "You disable the lock." + return 1 diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 071eaebcc2c..497a41984bf 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -1,227 +1,213 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - /obj/machinery/computer/robotics name = "robotics control console" desc = "Used to remotely lockdown or detonate linked cyborgs." icon = 'icons/obj/computer.dmi' - icon_state = "robot" + icon_keyboard = "tech_key" + icon_screen = "robot" light_color = "#a97faa" req_access = list(access_robotics) - circuit = "/obj/item/weapon/circuitboard/robotics" - - var/id = 0.0 - var/temp = null - var/status = 0 - var/timeleft = 60 - var/stop = 0.0 - var/screen = 0 // 0 - Main Menu, 1 - Cyborg Status, 2 - Kill 'em All! -- In text + circuit = /obj/item/weapon/circuitboard/robotics + var/safety = 1 /obj/machinery/computer/robotics/attack_ai(var/mob/user as mob) - return src.attack_hand(user) + ui_interact(user) /obj/machinery/computer/robotics/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 - if (src.temp) - dat = "[src.temp]

Clear Screen" - else - if(screen == 0) - dat += "

Cyborg Control Console


" - dat += "1. Cyborg Status
" - dat += "2. Emergency Full Destruct
" - if(screen == 1) - for(var/mob/living/silicon/robot/R in mob_list) - if(istype(R, /mob/living/silicon/robot/drone)) - continue //There's a specific console for drones. - if(istype(user, /mob/living/silicon/ai)) - if (R.connected_ai != user) - continue - if(istype(user, /mob/living/silicon/robot)) - if (R != user) - continue - if(R.scrambledcodes) - continue + ui_interact(user) - dat += "[R.name] |" - if(R.stat) - dat += " Not Responding |" - else if (!R.canmove) - dat += " Locked Down |" - else - dat += " Operating Normally |" - if (!R.canmove) - else if(R.cell) - dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |" - else - dat += " No Cell Installed |" - if(R.module) - dat += " Module Installed ([R.module.name]) |" - else - dat += " No Module Installed |" - if(R.connected_ai) - dat += " Slaved to [R.connected_ai.name] |" - else - dat += " Independent from AI |" - if (istype(user, /mob/living/silicon)) - if((user.mind.special_role && user.mind.original == user) && !R.emagged) - dat += "(Hack) " - dat += "([R.canmove ? "Lockdown" : "Release"]) " - dat += "(Destroy)" - dat += "
" - dat += "(Return to Main Menu)
" - if(screen == 2) - if(!src.status) - dat += {"
Emergency Robot Self-Destruct
\nStatus: Off
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
- \nStart Sequence
- \n
- \nClose"} - else - dat = {"Emergency Robot Self-Destruct
\nStatus: Activated
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
\nStop Sequence
- \n
- \nClose"} - dat += "(Return to Main Menu)
" +/obj/machinery/computer/robotics/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + data["robots"] = get_cyborgs(user) + data["safety"] = safety + // Also applies for cyborgs. Hides the manual self-destruct button. + data["is_ai"] = issilicon(user) - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") - return + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) /obj/machinery/computer/robotics/Topic(href, href_list) if(..()) - return 1 - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) + return + var/mob/user = usr + if(!src.allowed(user)) + user << "Access Denied" + return - if (href_list["eject"]) - src.temp = {"Destroy Robots?
-
\[Swipe ID to initiate destruction sequence\]
- Cancel"} - - else if (href_list["eject2"]) - var/obj/item/weapon/card/id/I = usr.get_active_hand() - if (istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - if (istype(I)) - if(src.check_access(I)) - if (!status) - message_admins("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!") - log_game("\blue [key_name(usr)] has initiated the global cyborg killswitch!") - src.status = 1 - src.start_sequence() - src.temp = null - - else - usr << "\red Access Denied." - - else if (href_list["stop"]) - src.temp = {" - Stop Robot Destruction Sequence?
-
Yes
- No"} - - else if (href_list["stop2"]) - src.stop = 1 - src.temp = null - src.status = 0 - - else if (href_list["reset"]) - src.timeleft = 60 - - else if (href_list["temp"]) - src.temp = null - else if (href_list["screen"]) - switch(href_list["screen"]) - if("0") - screen = 0 - if("1") - screen = 1 - if("2") - screen = 2 - else if (href_list["killbot"]) - if(src.allowed(usr)) - var/mob/living/silicon/robot/R = locate(href_list["killbot"]) - if(R) - var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort") - if(choice == "Confirm") - if(R && istype(R)) - if(R.mind && R.mind.special_role && R.emagged) - R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered." - R.ResetSecurityCodes() - - else - message_admins("\blue [key_name_admin(usr)] detonated [R.name]!") - log_game("\blue [key_name_admin(usr)] detonated [R.name]!") - R.self_destruct() - else - usr << "\red Access Denied." - - else if (href_list["stopbot"]) - if(src.allowed(usr)) - var/mob/living/silicon/robot/R = locate(href_list["stopbot"]) - if(R && istype(R)) // Extra sancheck because of input var references - var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort") - if(choice == "Confirm") - if(R && istype(R)) - message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") - log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") - R.canmove = !R.canmove - if (R.lockcharge) - // R.cell.charge = R.lockcharge - R.lockcharge = !R.lockcharge - R << "Your lockdown has been lifted!" - else - R.lockcharge = !R.lockcharge - // R.cell.charge = 0 - R << "You have been locked down!" - - else - usr << "\red Access Denied." - - else if (href_list["magbot"]) - if(src.allowed(usr)) - var/mob/living/silicon/robot/R = locate(href_list["magbot"]) - - // whatever weirdness this is supposed to be, but that is how the href gets added, so here it is again - if(istype(R) && istype(usr, /mob/living/silicon) && usr.mind.special_role && (usr.mind.original == usr) && !R.emagged) - - var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort") - if(choice == "Confirm") - if(R && istype(R)) -// message_admins("\blue [key_name_admin(usr)] emagged [R.name] using robotic console!") - log_game("[key_name(usr)] emagged [R.name] using robotic console!") - R.emagged = 1 - if(R.mind.special_role) - R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - -/obj/machinery/computer/robotics/proc/start_sequence() - - do - if(src.stop) - src.stop = 0 + // Destroys the cyborg + if(href_list["detonate"]) + var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["detonate"]) + if(!target || !istype(target)) return - src.timeleft-- - sleep(10) - while(src.timeleft) + if(isAI(user) && (target.connected_ai != user)) + user << "Access Denied. This robot is not linked to you." + return + // Cyborgs may blow up themselves via the console + if(isrobot(user) && user != target) + user << "Access Denied." + return + var/choice = input("Really detonate [target.name]?") in list ("Yes", "No") + if(choice != "Yes") + return + if(!target || !istype(target)) + return + + // Antagonistic cyborgs? Left here for downstream + if(target.mind && target.mind.special_role && target.emagged) + target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered." + target.ResetSecurityCodes() + else + message_admins("[key_name_admin(usr)] detonated [target.name]!") + log_game("[key_name(usr)] detonated [target.name]!") + target << "Self-destruct command received." + spawn(10) + target.self_destruct() + + + + // Locks or unlocks the cyborg + else if (href_list["lockdown"]) + var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["lockdown"]) + if(!target || !istype(target)) + return + + if(isAI(user) && (target.connected_ai != user)) + user << "Access Denied. This robot is not linked to you." + return + + if(isrobot(user)) + user << "Access Denied." + return + + var/choice = input("Really [target.lockcharge ? "unlock" : "lockdown"] [target.name] ?") in list ("Yes", "No") + if(choice != "Yes") + return + + if(!target || !istype(target)) + return + + message_admins("[key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [target.name]!") + log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [target.name]!") + target.canmove = !target.canmove + if (target.lockcharge) + target.lockcharge = !target.lockcharge + target << "Your lockdown has been lifted!" + else + target.lockcharge = !target.lockcharge + target << "You have been locked down!" + + // Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs. + else if (href_list["hack"]) + var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["hack"]) + if(!target || !istype(target)) + return + + // Antag AI checks + if(!istype(user, /mob/living/silicon/ai) || !(user.mind.special_role && user.mind.original == user)) + user << "Access Denied" + return + + if(target.emagged) + user << "Robot is already hacked." + return + + var/choice = input("Really hack [target.name]? This cannot be undone.") in list("Yes", "No") + if(choice != "Yes") + return + + if(!target || !istype(target)) + return + + message_admins("[key_name_admin(usr)] emagged [target.name] using robotic console!") + log_game("[key_name(usr)] emagged [target.name] using robotic console!") + target.emagged = 1 + target << "Failsafe protocols overriden. New tools available." + + // Arms the emergency self-destruct system + else if(href_list["arm"]) + if(istype(user, /mob/living/silicon)) + user << "Access Denied" + return + + safety = !safety + user << "You [safety ? "disarm" : "arm"] the emergency self destruct" + + // Destroys all accessible cyborgs if safety is disabled + else if(href_list["nuke"]) + if(istype(user, /mob/living/silicon)) + user << "Access Denied" + return + if(safety) + user << "Self-destruct aborted - safety active" + return + + message_admins("[key_name_admin(usr)] detonated all cyborgs!") + log_game("[key_name(usr)] detonated all cyborgs!") + + for(var/mob/living/silicon/robot/R in mob_list) + if(istype(R, /mob/living/silicon/robot/drone)) + continue + // Ignore antagonistic cyborgs + if(R.scrambledcodes) + continue + R << "Self-destruct command received." + spawn(10) + R.self_destruct() + + +// Proc: get_cyborgs() +// Parameters: 1 (operator - mob which is operating the console.) +// Description: Returns NanoUI-friendly list of accessible cyborgs. +/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/operator) + var/list/robots = list() for(var/mob/living/silicon/robot/R in mob_list) - if(!R.scrambledcodes && !istype(R, /mob/living/silicon/robot/drone)) - R.self_destruct() + // Ignore drones + if(istype(R, /mob/living/silicon/robot/drone)) + continue + // Ignore antagonistic cyborgs + if(R.scrambledcodes) + continue - return + var/list/robot = list() + robot["name"] = R.name + if(R.stat) + robot["status"] = "Not Responding" + else if (!R.canmove) + robot["status"] = "Lockdown" + else + robot["status"] = "Operational" + + if(R.cell) + robot["cell"] = 1 + robot["cell_capacity"] = R.cell.maxcharge + robot["cell_current"] = R.cell.charge + robot["cell_percentage"] = round(R.cell.percent()) + else + robot["cell"] = 0 + + robot["module"] = R.module ? R.module.name : "None" + robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None" + robot["hackable"] = 0 + // Antag AIs know whether linked cyborgs are hacked or not. + if(operator && istype(operator, /mob/living/silicon/ai) && (R.connected_ai == operator) && (operator.mind.special_role && operator.mind.original == operator)) + robot["hacked"] = R.emagged ? 1 : 0 + robot["hackable"] = R.emagged? 0 : 1 + robots.Add(list(robot)) + return robots + +// Proc: get_cyborg_by_name() +// Parameters: 1 (name - Cyborg we are trying to find) +// Description: Helper proc for finding cyborg by name +/obj/machinery/computer/robotics/proc/get_cyborg_by_name(var/name) + if (!name) + return + for(var/mob/living/silicon/robot/R in mob_list) + if(R.name == name) + return R diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 4949edeb55f..c01cbe9dd38 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -3,10 +3,11 @@ /obj/machinery/computer/secure_data//TODO:SANITY name = "security records console" desc = "Used to view, edit and maintain security records" - icon_state = "security" + icon_keyboard = "security_key" + icon_screen = "security" light_color = "#a91515" req_one_access = list(access_security, access_forensics_lockers, access_lawyer) - circuit = "/obj/item/weapon/circuitboard/secure_data" + circuit = /obj/item/weapon/circuitboard/secure_data var/obj/item/weapon/card/id/scan = null var/authenticated = null var/rank = null @@ -59,8 +60,11 @@ /obj/machinery/computer/secure_data/attack_hand(mob/user as mob) if(..()) return + ui_interact(user) + +/obj/machinery/computer/secure_data/ui_interact(user) if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: You're too far away from the station!" return var/dat @@ -251,8 +255,7 @@ What a mess.*/ scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src scan = I @@ -415,11 +418,11 @@ What a mess.*/ //RECORD CREATE if ("New Record (Security)") if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) ))) - active2 = CreateSecurityRecord(active1.fields["name"], active1.fields["id"]) + active2 = data_core.CreateSecurityRecord(active1.fields["name"], active1.fields["id"]) screen = 3 if ("New Record (General)") - active1 = CreateGeneralRecord() + active1 = data_core.CreateGeneralRecord() active2 = null //FIELD FUNCTIONS diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 3fca14135a0..18729f2ef65 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -1,7 +1,8 @@ /obj/machinery/computer/shuttle name = "Shuttle" desc = "For shuttle control." - icon_state = "shuttle" + icon_keyboard = "tech_key" + icon_screen = "shuttle" light_color = "#00ffff" var/auth_need = 3.0 var/list/authorized = list( ) @@ -37,11 +38,11 @@ if (src.auth_need - src.authorized.len > 0) message_admins("[key_name_admin(user)] has authorized early shuttle launch") log_game("[user.ckey] has authorized early shuttle launch") - world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) + world << text("Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) else message_admins("[key_name_admin(user)] has launched the shuttle") log_game("[user.ckey] has launched the shuttle early") - world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" + world << "Alert: Shuttle launch time shortened to 10 seconds!" emergency_shuttle.set_launch_countdown(10) //src.authorized = null qdel(src.authorized) @@ -49,10 +50,10 @@ if("Repeal") src.authorized -= W:registered_name - world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) + world << text("Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) if("Abort") - world << "\blue All authorizations to shortening time for shuttle launch have been revoked!" + world << "All authorizations to shortening time for shuttle launch have been revoked!" src.authorized.len = 0 src.authorized = list( ) @@ -62,7 +63,7 @@ if(!emagged && !emergency_shuttle.location() && user.get_active_hand() == W) switch(choice) if("Launch") - world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" + world << "Alert: Shuttle launch time shortened to 10 seconds!" emergency_shuttle.set_launch_countdown(10) emagged = 1 if("Cancel") diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 5ccda5b3477..d6baa3e4ce4 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -3,10 +3,12 @@ /obj/machinery/computer/skills//TODO:SANITY name = "employment records console" desc = "Used to view, edit and maintain employment records." - icon_state = "medlaptop" - light_color = "#315ab4" + icon_state = "laptop" + icon_keyboard = "laptop_key" + icon_screen = "medlaptop" + light_color = "#00b000" req_one_access = list(access_heads) - circuit = "/obj/item/weapon/circuitboard/skills" + circuit = /obj/item/weapon/circuitboard/skills var/obj/item/weapon/card/id/scan = null var/authenticated = null var/rank = null @@ -23,14 +25,13 @@ var/order = 1 // -1 = Descending - 1 = Ascending density = 0 - -/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob) - if(istype(O, /obj/item/weapon/card/id) && !scan) - usr.drop_item() +/obj/machinery/computer/skills/attackby(obj/item/O as obj, var/mob/user) + if(istype(O, /obj/item/weapon/card/id) && !scan && user.unEquip(O)) O.loc = src scan = O user << "You insert [O]." - ..() + else + ..() /obj/machinery/computer/skills/AltClick(var/mob/user) eject_id() @@ -60,8 +61,11 @@ /obj/machinery/computer/skills/attack_hand(mob/user as mob) if(..()) return + ui_interact(user) + +/obj/machinery/computer/skills/ui_interact(mob/user as mob) if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + user << "Unable to establish a connection: You're too far away from the station!" return var/dat @@ -112,21 +116,21 @@ user << browse_rsc(front, "front.png") user << browse_rsc(side, "side.png") dat += text({" -
\ -Name: [active1.fields["name"]]
-ID: [active1.fields["id"]]
-Sex: [active1.fields["sex"]]
-Age: [active1.fields["age"]]
-Rank: [active1.fields["rank"]]
-Citizenship: [active1.fields["citizenship"]]
-Home System: [active1.fields["home_system"]]
-Religion: [active1.fields["religion"]]
-Fingerprint: [active1.fields["fingerprint"]]
-Physical Status: [active1.fields["p_stat"]]
-Mental Status: [active1.fields["m_stat"]]

Photo:
-
-

Employment/skills summary:

[decode(active1.fields["notes"])]

-

CCIA Notes:

[nl2br(decode(active1.fields["ccia_record"]))]

"}) + Name: [active1.fields["name"]]
+ ID: [active1.fields["id"]]
+ Sex: [active1.fields["sex"]]
+ Age: [active1.fields["age"]]
+ Rank: [active1.fields["rank"]]
+ Citizenship: [active1.fields["citizenship"]]
+ Home System: [active1.fields["home_system"]]
+ Religion: [active1.fields["religion"]]
+ Fingerprint: [active1.fields["fingerprint"]]
+ Physical Status: [active1.fields["p_stat"]]
+ Mental Status: [active1.fields["m_stat"]]

+ Photo:
+ +

Employment/skills summary:

[decode(active1.fields["notes"])]

+

CCIA Notes:

[nl2br(decode(active1.fields["ccia_record"]))]

"}) //Add the CCIA Actions dat+= text({"

CCIA Actions:

"}) @@ -221,8 +225,7 @@ What a mess.*/ eject_id() else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src scan = I @@ -343,7 +346,7 @@ What a mess.*/ if ("New Record (General)") if(PDA_Manifest.len) PDA_Manifest.Cut() - active1 = CreateGeneralRecord() + active1 = data_core.CreateGeneralRecord() //FIELD FUNCTIONS if ("Edit Field") diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index 3d44a7a260c..0d38129504f 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -14,7 +14,8 @@ var/specops_shuttle_timeleft = 0 /obj/machinery/computer/specops_shuttle name = "special operations shuttle control console" icon = 'icons/obj/computer.dmi' - icon_state = "shuttle" + icon_keyboard = "security_key" + icon_screen = "syndishuttle" light_color = "#00ffff" req_access = list(access_cent_specops) // req_access = list(ACCESS_CENT_SPECOPS) @@ -88,7 +89,7 @@ var/specops_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "\red You have arrived at Central Command. Operation has ended!" + M << "You have arrived at [boss_name]. Operation has ended!" specops_shuttle_at_station = 0 @@ -136,7 +137,7 @@ var/specops_shuttle_timeleft = 0 if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "\red The Special Operations shuttle is unable to leave." + usr << "The Special Operations shuttle is unable to leave." return //Begin Marauder launchpad. @@ -231,7 +232,7 @@ var/specops_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "\red You have arrived to [station_name]. Commence operation!" + M << "You have arrived to [station_name]. Commence operation!" for(var/obj/machinery/computer/specops_shuttle/S in world) S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY @@ -249,15 +250,12 @@ var/specops_shuttle_timeleft = 0 /obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob) - if(istype(I,/obj/item/weapon/card/emag)) - user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." - else - return attack_hand(user) +/obj/machinery/computer/specops_shuttle/emag_act(var/remaining_charges, var/mob/user) + user << "The electronic systems in this console are far too advanced for your primitive hacking peripherals." /obj/machinery/computer/specops_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "\red Access Denied." + user << "Access Denied." return if(..()) @@ -288,14 +286,14 @@ var/specops_shuttle_timeleft = 0 if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "\blue Central Command will not allow the Special Operations shuttle to return yet." + usr << "[boss_name] will not allow the Special Operations shuttle to return yet." if(world.timeofday <= specops_shuttle_timereset) if (((world.timeofday - specops_shuttle_timereset)/10) > 60) - usr << "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!" - usr << "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!" + usr << "[-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!" + usr << "[-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!" return - usr << "\blue The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds." + usr << "The Special Operations shuttle will arrive at [boss_name] in [(SPECOPS_MOVETIME/10)] seconds." temp += "Shuttle departing.

OK" updateUsrDialog() @@ -309,10 +307,10 @@ var/specops_shuttle_timeleft = 0 if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "\red The Special Operations shuttle is unable to leave." + usr << "The Special Operations shuttle is unable to leave." return - usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds." + usr << "The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds." temp += "Shuttle departing.

OK" updateUsrDialog() diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index acc8d4040c0..2326ee879da 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -1,70 +1,65 @@ /obj/machinery/computer/station_alert - name = "Station Alert Console" + name = "station alert console" desc = "Used to access the station's automated alert system." - icon_state = "alert:0" + icon_keyboard = "tech_key" + icon_screen = "alert:0" light_color = "#e6ffff" - circuit = /obj/item/weapon/circuitboard/stationalert_engineering - var/obj/nano_module/alarm_monitor/alarm_monitor - var/monitor_type = /obj/nano_module/alarm_monitor/engineering + circuit = /obj/item/weapon/circuitboard/stationalert + var/datum/nano_module/alarm_monitor/alarm_monitor + var/monitor_type = /datum/nano_module/alarm_monitor + +/obj/machinery/computer/station_alert/engineering + monitor_type = /datum/nano_module/alarm_monitor/engineering /obj/machinery/computer/station_alert/security - monitor_type = /obj/nano_module/alarm_monitor/security - circuit = /obj/item/weapon/circuitboard/stationalert_security + monitor_type = /datum/nano_module/alarm_monitor/security /obj/machinery/computer/station_alert/all - monitor_type = /obj/nano_module/alarm_monitor/all - circuit = /obj/item/weapon/circuitboard/stationalert_all + monitor_type = /datum/nano_module/alarm_monitor/all /obj/machinery/computer/station_alert/initialize() alarm_monitor = new monitor_type(src) - alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon) + alarm_monitor.register_alarm(src, /obj/machinery/computer/station_alert/update_icon) ..() - if (monitor_type) + if(monitor_type) register_monitor(new monitor_type(src)) /obj/machinery/computer/station_alert/Destroy() . = ..() unregister_monitor() -/obj/machinery/computer/station_alert/proc/register_monitor(var/obj/nano_module/alarm_monitor/monitor) - if(monitor.nano_host() != src) +/obj/machinery/computer/station_alert/proc/register_monitor(var/datum/nano_module/alarm_monitor/monitor) + if(monitor.host != src) return alarm_monitor = monitor - alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon) + alarm_monitor.register_alarm(src, /obj/machinery/computer/station_alert/update_icon) /obj/machinery/computer/station_alert/proc/unregister_monitor() if(alarm_monitor) - alarm_monitor.unregister(src) + alarm_monitor.unregister_alarm(src) qdel(alarm_monitor) alarm_monitor = null /obj/machinery/computer/station_alert/attack_ai(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) - return - interact(user) - return + ui_interact(user) /obj/machinery/computer/station_alert/attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) - return - interact(user) - return + ui_interact(user) -/obj/machinery/computer/station_alert/interact(mob/user) - alarm_monitor.ui_interact(user) +/obj/machinery/computer/station_alert/ui_interact(mob/user) + if(alarm_monitor) + alarm_monitor.ui_interact(user) + +/obj/machinery/computer/station_alert/nano_container() + return alarm_monitor /obj/machinery/computer/station_alert/update_icon() + icon_screen = initial(icon_screen) + if(!(stat & (BROKEN|NOPOWER))) + if(alarm_monitor) + var/list/alarms = alarm_monitor.major_alarms() + if(alarms.len) + icon_screen = "alert:2" ..() - if(stat & (BROKEN|NOPOWER)) - return - - var/list/alarms = alarm_monitor ? alarm_monitor.major_alarms() : list() - if(alarms.len) - icon_state = "alert:2" - else - icon_state = initial(icon_state) - return diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index 0607dbaa695..224e2016280 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -1,10 +1,11 @@ /obj/machinery/computer/supplycomp name = "supply control console" icon = 'icons/obj/computer.dmi' - icon_state = "supply" + icon_keyboard = "tech_key" + icon_screen = "supply" light_color = "#b88b2e" req_access = list(access_cargo) - circuit = "/obj/item/weapon/circuitboard/supplycomp" + circuit = /obj/item/weapon/circuitboard/supplycomp var/temp = null var/reqtime = 0 //Cooldown for requisitions - Quarxink var/hacked = 0 @@ -14,8 +15,8 @@ /obj/machinery/computer/ordercomp name = "supply ordering console" icon = 'icons/obj/computer.dmi' - icon_state = "request" - circuit = "/obj/item/weapon/circuitboard/ordercomp" + icon_screen = "request" + circuit = /obj/item/weapon/circuitboard/ordercomp var/temp = null var/reqtime = 0 //Cooldown for requisitions - Quarxink var/last_viewed_group = "categories" @@ -150,7 +151,7 @@ /obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "\red Access Denied." + user << "Access Denied." return if(..()) @@ -207,14 +208,11 @@ onclose(user, "computer") return -/obj/machinery/computer/supplycomp/attackby(I as obj, user as mob) - if(istype(I,/obj/item/weapon/card/emag) && !hacked) - user << "\blue Special supplies unlocked." +/obj/machinery/computer/supplycomp/emag_act(var/remaining_charges, var/mob/user) + if(!hacked) + user << "Special supplies unlocked." hacked = 1 - return - else - ..() - return + return 1 /obj/machinery/computer/supplycomp/Topic(href, href_list) if(!supply_controller) diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index dd921abf090..ce30dbb411a 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -13,7 +13,8 @@ var/syndicate_elite_shuttle_timeleft = 0 /obj/machinery/computer/syndicate_elite_shuttle name = "elite syndicate squad shuttle control console" icon = 'icons/obj/computer.dmi' - icon_state = "syndishuttle" + icon_keyboard = "syndie_key" + icon_screen = "syndishuttle" light_color = "#00ffff" req_access = list(access_cent_specops) var/temp = null @@ -59,7 +60,7 @@ var/syndicate_elite_shuttle_timeleft = 0 if (syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return if (!syndicate_elite_can_move()) - usr << "\red The Syndicate Elite shuttle is unable to leave." + usr << "The Syndicate Elite shuttle is unable to leave." return sleep(600) @@ -173,7 +174,7 @@ var/syndicate_elite_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "\red You have arrived to [station_name]. Commence operation!" + M << "You have arrived to [station_name]. Commence operation!" /proc/syndicate_elite_can_move() if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return 0 @@ -185,19 +186,16 @@ var/syndicate_elite_shuttle_timeleft = 0 /obj/machinery/computer/syndicate_elite_shuttle/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob) - if(istype(I,/obj/item/weapon/card/emag)) - user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." - else - return attack_hand(user) +/obj/machinery/computer/syndicate_elite_shuttle/emag_act(var/remaining_charges, var/mob/user) + user << "The electronic systems in this console are far too advanced for your primitive hacking peripherals." /obj/machinery/computer/syndicate_elite_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "\red Access Denied." + user << "Access Denied." return // if (sent_syndicate_strike_team == 0) -// usr << "\red The strike team has not yet deployed." +// usr << "The strike team has not yet deployed." // return if(..()) @@ -227,17 +225,17 @@ var/syndicate_elite_shuttle_timeleft = 0 if (href_list["sendtodock"]) if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return - usr << "\blue The Syndicate will not allow the Elite Squad shuttle to return." + usr << "The Syndicate will not allow the Elite Squad shuttle to return." return else if (href_list["sendtostation"]) if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return if (!specops_can_move()) - usr << "\red The Syndicate Elite shuttle is unable to leave." + usr << "The Syndicate Elite shuttle is unable to leave." return - usr << "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds." + usr << "The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds." temp = "Shuttle departing.

OK" updateUsrDialog() diff --git a/code/game/machinery/computer3/NTOS.dm b/code/game/machinery/computer3/NTOS.dm deleted file mode 100644 index 5119084f0e6..00000000000 --- a/code/game/machinery/computer3/NTOS.dm +++ /dev/null @@ -1,239 +0,0 @@ -/* - The Big Bad NT Operating System -*/ - -/datum/file/program/ntos - name = "Nanotrasen Operating System" - extension = "prog" - active_state = "ntos" - var/obj/item/part/computer/storage/current // the drive being viewed, null for desktop/computer - var/fileop = "runfile" - -/* - Generate a basic list of files in the selected scope -*/ - -/datum/file/program/ntos/proc/list_files() - if(!computer || !current) return null - return current.files - - -/datum/file/program/ntos/proc/filegrid(var/list/filelist) - var/dat = "
TitleTypeCCIA Thread
" - var/i = 0 - for(var/datum/file/F in filelist) - if(!F.hidden_file) - i++ - if(i==1) - dat += "" - if(i>= 6) - i = 0 - dat += "" - continue - dat += {" - "} - - dat += "
-
-
- [F.name] -
-
" - return dat - -// -// I am separating this from filegrid so that I don't have to -// make metadata peripheral files -// -/datum/file/program/ntos/proc/desktop(var/peripheralop = "viewperipheral") - var/dat = "" - var/i = 0 - var/list/peripherals = list(computer.hdd,computer.floppy,computer.cardslot) - for(var/obj/item/part/computer/C in peripherals) - if(!istype(C)) continue - i++ - if(i==1) - dat += "" - if(i>= 6) - i = 0 - dat += "" - continue - dat += {" - "} - - dat += "
- - \icon[C]
- [C.name] -
-
" - return dat - - -/datum/file/program/ntos/proc/window(var/title,var/buttonbar,var/content) - return {" -
-
[title]
-
[buttonbar]
-
[content]
-
"} - -/datum/file/program/ntos/proc/buttonbar(var/type = 0) - switch(type) - if(0) // FILE OPERATIONS - return {""} - -/datum/file/program/ntos/interact() - if(!interactable()) - return - var/dat = {" - - - Nanotrasen Operating System - - - -
"} - - - dat += generate_status_bar() - var/list/files = list_files() - if(current) - dat +=window(current.name,buttonbar(),filegrid(files)) - else - dat += desktop() - - dat += "
" - - usr << browse(dat, "window=\ref[computer];size=670x510") - onclose(usr, "\ref[computer]") - - // STATUS BAR - // Small 16x16 icons representing status of components, etc. - // Currently only used by battery icon - // TODO: Add more icons! -/datum/file/program/ntos/proc/generate_status_bar() - var/dat = "" - - // Battery level icon - switch(computer.check_battery_status()) - if(-1) - dat += "" - if(0 to 5) - dat += "" - if(6 to 20) - dat += "" - if(21 to 40) - dat += "" - if(41 to 60) - dat += "" - if(61 to 80) - dat += "" - if(81 to 100) - dat += "" - dat += "
" - return dat - -/datum/file/program/ntos/Topic(href, list/href_list) - if(!interactable() || ..(href,href_list)) - return - - if("viewperipheral" in href_list) // open drive, show status of peripheral - var/obj/item/part/computer/C = locate(href_list["viewperipheral"]) - if(!istype(C) || (C.loc != src.computer)) - return - - if(istype(C,/obj/item/part/computer/storage)) - current = C - interact() - return - // else ??? - if(istype(C,/obj/item/part/computer/cardslot)) - if(computer.cardslot.reader != null) - computer.cardslot.remove() - if(istype(C,/obj/item/part/computer/cardslot/dual)) - if(computer.cardslot.writer != null) - computer.cardslot.remove(computer.cardslot.writer) - if(computer.cardslot.reader != null) - computer.cardslot.remove(computer.cardslot.reader) - interact() - return - - // distinct from close, this is the file dialog window - if("winclose" in href_list) - current = null - interact() - return - -#undef MAX_ROWS -#undef MAX_COLUMNS diff --git a/code/game/machinery/computer3/bios.dm b/code/game/machinery/computer3/bios.dm deleted file mode 100644 index 9b590bf3afe..00000000000 --- a/code/game/machinery/computer3/bios.dm +++ /dev/null @@ -1,182 +0,0 @@ -/* - Okay so my last effort to have a central BIOS function was interesting - but completely unmaintainable, I have scrapped it. - - The parts that were actually useful will be put here in functions instead. - If we want a central bios function we can add one that just indexes them. - That should at least allow sensible debugging. -*/ - -/obj/machinery/computer3 - - /* - interactable(user): performs all standard sanity checks - Call in topic() and interact(). - */ - proc/interactable(var/mob/user) - if( !src || !user || stat || user.stat || user.lying || user.blinded ) - return 0 - if(!program) - return 0 - - if(!istype(loc,/turf) || !istype(user.loc,/turf)) // todo handheld maybe - return 0 - - if(istype(user,/mob/living/silicon)) - if(!program.ai_allowed) - user << "\blue You are forbidden from accessing this program." - return 0 - else - if(program.human_controls) - if(!ishuman(user)) - user << "\red Your body can't work the controls!" - return 0 - if(user.restrained()) - user << "\red You need a free hand!" - return 0 - - if(!in_range(src,user)) - // telekinesis check - if(ishuman(user) && istype(user.get_active_hand(),/obj/item/tk_grab)) - if(program.human_controls) - user << "\red It's too complicated to work at a distance!" - return 0 - add_fingerprint(user) - user.set_machine(src) - return 1 - return 0 - - add_fingerprint(user) - user.set_machine(src) - return 1 - - /* - Deduplicates an item list and gives you range and direction. - This is used for networking so you can determine which of several - identically named objects you're referring to. - */ - proc/format_atomlist(var/list/atoms) - var/list/output = list() - for(var/atom/A in atoms) - var/title = "[A] (Range [get_dist(A,src)] meters, [dir2text(get_dir(src,A))])" - output[title] = A - return output - - /* - This is used by the camera monitoring program to see if you're still in range - */ - check_eye(var/mob/user as mob) - if(!interactable(user) || user.machine != src) - if(user.machine == src) - user.unset_machine() - return -1 - - var/datum/file/program/security/S = program - if( !istype(S) || !S.current || !S.current.status || !camnet ) - if( user.machine == src ) - user.unset_machine() - return -1 - - user.reset_view(S.current, 0) - return 0 - - /* - List all files, including removable disks and data cards - (I don't know why but I don't want to rip data cards out. - It just seems... interesting?) - */ - proc/list_files(var/typekey = null) - var/list/files = list() - if(hdd) - files += hdd.files - if(floppy && floppy.inserted) - files += floppy.inserted.files - if(cardslot && istype(cardslot.reader,/obj/item/weapon/card/data)) - files += cardslot.reader:files - if(!ispath(typekey)) - return files - - var/i = 1 - while(i<=files.len) - if(istype(files[i],typekey)) - i++ - continue - files.Cut(i,i+1) - return files - - /* - Crash the computer with an error. - Todo: redo - */ - proc/Crash(var/errorcode = PROG_CRASH) - if(!src) - return null - - switch(errorcode) - if(PROG_CRASH) - if(usr) - usr << "\red The program crashed!" - usr << browse(null,"\ref[src]") - Reset() - - if(MISSING_PERIPHERAL) - Reset() - if(usr) - usr << browse("

ERROR: Missing or disabled component

A hardware failure has occured. Please insert or replace the missing or damaged component and restart the computer.","window=\ref[src]") - - if(BUSTED_ASS_COMPUTER) - Reset() - os.error = BUSTED_ASS_COMPUTER - if(usr) - usr << browse("

ERROR: Missing or disabled component

A hardware failure has occured. Please insert or replace the missing or damaged component and restart the computer.","window=\ref[src]") - - if(MISSING_PROGRAM) - Reset() - if(usr) - usr << browse("

ERROR: No associated program

This file requires a specific program to open, which cannot be located. Please install the related program and try again.","window=\ref[src]") - - if(FILE_DRM) - Reset() - if(usr) - usr << browse("

ERROR: File operation prohibited

Copy protection exception: missing authorization token.","window=\ref[src]") - - if(NETWORK_FAILURE) - Reset() - if(usr) - usr << browse("

ERROR: Networking exception: Unable to connect to remote host.","window=\ref[src]") - - - else - if(usr) - usr << "\red The program crashed!" - usr << browse(null,"\ref[src]") - testing("computer/Crash() - unknown error code [errorcode]") - Reset() - return null - - #define ANY_DRIVE 0 - #define PREFER_FLOPPY 1 - #define PREFER_CARD 2 - #define PREFER_HDD 4 - - - // required_location: only put on preferred devices - proc/writefile(var/datum/file/F, var/where = ANY_DRIVE, var/required_location = 0) - if(where != ANY_DRIVE) - if((where&PREFER_FLOPPY) && floppy && floppy.addfile(F)) - return 1 - if((where&PREFER_CARD) && cardslot && cardslot.addfile(F)) - return 1 - if((where&PREFER_HDD) && hdd && hdd.addfile(F)) - return 1 - - if(required_location) - return 0 - - if(floppy && floppy.addfile(F)) - return 1 - if(cardslot && cardslot.addfile(F)) - return 1 - if(hdd && hdd.addfile(F)) - return 1 - return 0 diff --git a/code/game/machinery/computer3/buildandrepair.dm b/code/game/machinery/computer3/buildandrepair.dm deleted file mode 100644 index 5ecd89e30e3..00000000000 --- a/code/game/machinery/computer3/buildandrepair.dm +++ /dev/null @@ -1,302 +0,0 @@ -// Computer3 circuitboard specifically -/obj/item/part/computer/circuitboard - density = 0 - anchored = 0 - w_class = 2.0 - name = "Circuit board" - icon = 'icons/obj/module.dmi' - icon_state = "id_mod" - item_state = "electronic" - origin_tech = "programming=2" - var/id = null - var/frequency = null - var/build_path = null - var/board_type = "computer" - var/list/req_components = null - var/powernet = null - var/list/records = null - - var/datum/file/program/OS = new/datum/file/program/ntos - -/obj/machinery/computer3/proc/disassemble(mob/user as mob) // todo - return - - -/obj/structure/computer3frame - density = 1 - anchored = 0 - name = "computer frame" - icon = 'icons/obj/stock_parts.dmi' - icon_state = "0" - var/state = 0 - - var/obj/item/part/computer/circuitboard/circuit = null - var/completed = /obj/machinery/computer - - // Computer3 components - a carbon copy of the list from - // computer.dm; however, we will need to check to make sure - // we don't install more components than the computer frame - // can handle. This will be different for certain formfactors. - - var/max_components = 4 - var/list/components = list() - - // Storage - var/obj/item/part/computer/storage/hdd/hdd = null - var/obj/item/part/computer/storage/removable/floppy = null - // Networking - var/obj/item/part/computer/networking/radio/radio = null // not handled the same as other networks - var/obj/item/part/computer/networking/cameras/camnet = null // just plain special - var/obj/item/part/computer/networking/net = null // Proximity, area, or cable network - var/obj/item/part/computer/networking/subspace/centcom = null // only for offstation communications - - // Card reader - note the HoP reader is a subtype - var/obj/item/part/computer/cardslot/cardslot = null - - // Misc & special purpose - var/obj/item/part/computer/ai_holder/cradle = null - var/obj/item/part/computer/toybox/toybox = null - - // Battery must be installed BEFORE wiring the computer. - // if installing it in an existing computer, you will have to - // get back to this state first. - var/obj/item/weapon/cell/battery = null - -/obj/structure/computer3frame/server - name = "server frame" - completed = /obj/machinery/computer3/server - max_components = 6 -/obj/structure/computer3frame/wallcomp - name = "wall-computer frame" - completed = /obj/machinery/computer3/wall_comp - max_components = 3 -/obj/structure/computer3frame/laptop - name = "laptop frame" - completed = /obj/machinery/computer3/laptop - max_components = 3 - -/obj/structure/computer3frame/attackby(obj/item/P as obj, mob/user as mob) - switch(state) - if(0) - if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You wrench the frame into place." - src.anchored = 1 - src.state = 1 - if(istype(P, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = P - if(!WT.remove_fuel(0, user)) - user << "The welding tool must be on to complete this task." - return - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, 20)) - if(!src || !WT.isOn()) return - user << "\blue You deconstruct the frame." - new /obj/item/stack/material/steel( src.loc, 5 ) - qdel(src) - if(1) - if(istype(P, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 20)) - user << "\blue You unfasten the frame." - src.anchored = 0 - src.state = 0 - if(istype(P, /obj/item/weapon/circuitboard) && !circuit) - var/obj/item/weapon/circuitboard/B = P - if(B.board_type == "computer") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the circuit board inside the frame." - src.icon_state = "1" - src.circuit = P - user.drop_item() - P.loc = src - else - user << "\red This frame does not accept circuit boards of this type!" - if(istype(P, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the circuit board into place." - src.state = 2 - src.icon_state = "2" - if(istype(P, /obj/item/weapon/crowbar) && circuit) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the circuit board." - src.state = 1 - src.icon_state = "0" - circuit.loc = src.loc - src.circuit = null - if(2) - if(istype(P, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the circuit board." - src.state = 1 - src.icon_state = "1" - - if(istype(P, /obj/item/weapon/crowbar)) - if(battery) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - if(do_after(10)) - battery.loc = loc - user << "\blue You remove [battery]." - battery = null - else - user << "\red There's no battery to remove!" - - if(istype(P, /obj/item/weapon/cell)) - if(!battery) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(5)) - battery = P - P.loc = src - user << "\blue You insert [battery]." - else - user << "\red There's already \an [battery] in [src]!" - - - if(istype(P, /obj/item/stack/cable_coil)) - if(P:amount >= 5) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - if(P) - P:amount -= 5 - if(!P:amount) qdel(P) - user << "\blue You add cables to the frame." - src.state = 3 - src.icon_state = "3" - if(3) - if(istype(P, /obj/item/weapon/wirecutters)) - if(components.len) - user << "There are parts in the way!" - return - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." - src.state = 2 - src.icon_state = "2" - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) - A.amount = 5 - - if(istype(P, /obj/item/weapon/crowbar)) // complicated check - remove_peripheral() - - if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass") - var/obj/item/stack/S = P - if(S.amount >= 2) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) - if(S) - S.use(2) - user << "You put in the glass panel." - src.state = 4 - src.icon_state = "4" - if(4) - if(istype(P, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." - src.state = 3 - src.icon_state = "3" - new /obj/item/stack/material/glass( src.loc, 2 ) - if(istype(P, /obj/item/weapon/screwdriver)) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You connect the monitor." - var/obj/machinery/computer3/B = new src.circuit.build_path ( src.loc, built=1 ) - /*if(circuit.powernet) B:powernet = circuit.powernet - if(circuit.id) B:id = circuit.id - //if(circuit.records) B:records = circuit.records - if(circuit.frequency) B:frequency = circuit.frequency - if(istype(circuit,/obj/item/weapon/circuitboard/supplycomp)) - var/obj/machinery/computer/supplycomp/SC = B - var/obj/item/weapon/circuitboard/supplycomp/C = circuit - SC.can_order_contraband = C.contraband_enabled*/ - B.circuit = circuit - circuit.loc = B - if(circuit.OS) - circuit.OS.computer = B - B.RefreshParts() // todo - qdel(src) - -/* - This will remove peripherals if you specify one, but the main function is to - allow the user to remove a part specifically. -*/ -/obj/structure/computer3frame/proc/remove_peripheral(var/obj/item/I = null) - if(!components || !components.len) - usr << "\red There are no components in [src] to take out!" - return 0 - if(!I) - I = input(usr, "Remove which component?","Remove component", null) as null|obj in components - - if(I) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - if(do_after(usr,25)) - if(I==hdd) - components -= hdd - hdd.loc = loc - hdd = null - else if(I==floppy) - components -= floppy - floppy.loc = loc - floppy = null - else if(I==radio) - components -= radio - radio.loc = loc - radio = null - else if(I==camnet) - components -= camnet - camnet.loc = loc - camnet = null - else if(I==net) - components -= net - net.loc = loc - net = null - else if(I==cradle) - components -= cradle - cradle.loc = loc - cradle = null - else if(I==toybox) - components -= toybox - toybox.loc = loc - toybox = null - else - warning("Erronous component in computerframe/remove_peripheral: [I]") - I.loc = loc - usr << "\blue You remove [I]" - return 1 - return 0 -/obj/structure/computer3frame/proc/insert_peripheral(var/obj/item/I) - if(components.len >= max_components) - usr << "There isn't room in [src] for another component!" - return 0 - switch(I.type) - if(/obj/item/part/computer/storage/hdd) - if(hdd) - usr << "There is already \an [hdd] in [src]!" - return 0 - hdd = I - components += hdd - hdd.loc = src - if(/obj/item/part/computer/storage/removable) - if(floppy) - usr << "There is already \an [floppy] in [src]!" - return 0 - floppy = I - components += floppy - floppy.loc = src - if(/obj/item/part/computer/networking/radio) - if(radio) - usr << "There is already \an [radio] in [src]!" - return 0 - radio = I - components += radio - radio.loc = src - if(/obj/item/part/computer/networking/cameras) - if(camnet) - usr << "There is already \an [camnet] in [src]!" - return 0 - camnet = I - components += camnet - camnet.loc = src - if(/obj/item/part/computer/networking) - if(net) - usr << "There is already \an [net] in [src]!" - - diff --git a/code/game/machinery/computer3/component.dm b/code/game/machinery/computer3/component.dm deleted file mode 100644 index f484e04c645..00000000000 --- a/code/game/machinery/computer3/component.dm +++ /dev/null @@ -1,330 +0,0 @@ - -/* - Objects used to construct computers, and objects that can be inserted into them, etc. - - TODO: - * Synthesizer part (toybox, injectors, etc) -*/ - - - -/obj/item/part/computer - name = "computer part" - desc = "Holy jesus you donnit now" - gender = PLURAL - icon = 'icons/obj/stock_parts.dmi' - icon_state = "hdd1" - w_class = 2.0 - - var/emagged = 0 - crit_fail = 0 - - // the computer that this device is attached to - var/obj/machinery/computer3/computer - - // If the computer is attacked by an item it will reference this to decide which peripheral(s) are affected. - var/list/attackby_types = list() - proc/allow_attackby(var/obj/item/I as obj,var/mob/user as mob) - - for(var/typekey in attackby_types) - if(istype(I,typekey)) - return 1 - return 0 - - proc/init(var/obj/machinery/computer/target) - computer = target - // continue to handle all other type-specific procedures - -/* - Below are all the miscellaneous components - For storage drives, see storage.dm - For networking parts, see -*/ - -/obj/item/part/computer/ai_holder - name = "intelliCard computer module" - desc = "Contains a specialized nacelle for dealing with highly sensitive equipment without interference." - - attackby_types = list(/obj/item/device/aicard) - - var/mob/living/silicon/ai/occupant = null - var/busy = 0 - - attackby(obj/I as obj,mob/user as mob) - if(computer && !computer.stat) - - if(istype(I, /obj/item/device/aicard)) - - var/obj/item/device/aicard/card = I - var/mob/living/silicon/ai/comp_ai = locate() in src - var/mob/living/silicon/ai/card_ai = locate() in card - - if(istype(comp_ai)) - if(busy) - user << "\red ERROR: \black Reconstruction in progress." - return - card.grab_ai(comp_ai, user) - if(!(locate(/mob/living/silicon/ai) in src)) occupant = null - else if(istype(card_ai)) - load_ai(card_ai,card,user) - occupant = locate(/mob/living/silicon/ai) in src - - if(computer.program) - computer.program.update_icon() - computer.update_icon() - computer.occupant = occupant - ..() - return - -/obj/item/part/computer/ai_holder/proc/load_ai(var/mob/living/silicon/ai/transfer, var/obj/item/device/aicard/card, var/mob/user) - - if(!transfer) - return - - // Transfer over the AI. - transfer << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here." - user << "\blue Transfer successful: \black [transfer.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." - - transfer.loc = src - transfer.cancel_camera() - transfer.control_disabled = 1 - occupant = transfer - - if(card) - card.clear() - - -/* - ID computer cardslot - reading and writing slots -*/ - -/obj/item/part/computer/cardslot - name = "magnetic card slot" - desc = "Contains a slot for reading magnetic swipe cards." - - var/obj/item/weapon/card/reader = null - var/obj/item/weapon/card/writer = null // so that you don't need to typecast dual cardslots, but pretend it's not here - // alternately pretend they did it to save money on manufacturing somehow - var/dualslot = 0 // faster than typechecking - attackby_types = list(/obj/item/weapon/card) - - attackby(var/obj/item/I as obj, var/mob/user as mob) - if(istype(I,/obj/item/weapon/card)) - insert(I) - return - ..(I,user) - - // cardslot.insert(card, slot) - // card: The card obj you want to insert (usually your ID) - // slot: Which slot to insert into (1: reader, 2: writer, 3: auto), 3 default - proc/insert(var/obj/item/weapon/card/card, var/slot = 3) - if(!computer) - return 0 - // This shouldn't happen, just in case.. - if(slot == 2 && !dualslot) - usr << "This device has only one card slot" - return 0 - - if(istype(card,/obj/item/weapon/card/emag)) // emag reader slot - if(!writer) - usr << "You insert \the [card], and the computer grinds, sparks, and beeps. After a moment, the card ejects itself." - computer.emagged = 1 - return 1 - else - usr << "You are unable to insert \the [card], as the reader slot is occupied" - - var/mob/living/L = usr - switch(slot) - if(1) - if(equip_to_reader(card, L)) - usr << "You insert the card into reader slot" - else - usr << "There is already something in the reader slot." - if(2) - if(equip_to_writer(card, L)) - usr << "You insert the card into writer slot" - else - usr << "There is already something in the reader slot." - if(3) - if(equip_to_reader(card, L)) - usr << "You insert the card into reader slot" - else if (equip_to_writer(card, L) && dualslot) - usr << "You insert the card into writer slot" - else if (dualslot) - usr << "There is already something in both slots." - else - usr << "There is already something in the reader slot." - - - // Usage of insert() preferred, as it also tells result to the user. - proc/equip_to_reader(var/obj/item/weapon/card/card, var/mob/living/L) - if(!reader) - L.drop_item() - card.loc = src - reader = card - return 1 - return 0 - - proc/equip_to_writer(var/obj/item/weapon/card/card, var/mob/living/L) - if(!writer && dualslot) - L.drop_item() - card.loc = src - writer = card - return 1 - return 0 - - // cardslot.remove(slot) - // slot: Which slot to remove card(s) from (1: reader only, 2: writer only, 3: both [works even with one card], 4: reader and if empty then writer ), 3 default - proc/remove(var/slot = 3) - var/mob/living/L = usr - switch(slot) - if(1) - if (remove_reader(L)) - L << "You remove the card from reader slot" - else - L << "There is no card in the reader slot" - if(2) - if (remove_writer(L)) - L << "You remove the card from writer slot" - else - L << "There is no card in the writer slot" - if(3) - if (remove_reader(L)) - if (remove_writer(L)) - L << "You remove cards from both slots" - else - L << "You remove the card from reader slot" - else - if(remove_writer(L)) - L << "You remove the card from writer slot" - else - L << "There are no cards in both slots" - if(4) - if (!remove_reader(L)) - if (remove_writer(L)) - L << "You remove the card from writer slot" - else if (!dualslot) - L << "There is no card in the reader slot" - else - L << "There are no cards in both slots" - else - L << "You remove the card from reader slot" - - - proc/remove_reader(var/mob/living/L) - if(reader) - reader.loc = loc - if(istype(L) && !L.get_active_hand()) - if(istype(L,/mob/living/carbon/human)) - L.put_in_hands(reader) - else - reader.loc = get_turf(computer) - else - reader.loc = get_turf(computer) - reader = null - return 1 - return 0 - - proc/remove_writer(var/mob/living/L) - if(writer && dualslot) - writer.loc = loc - if(istype(L) && !L.get_active_hand()) - if(istype(L,/mob/living/carbon/human)) - L.put_in_hands(writer) - else - writer.loc = get_turf(computer) - else - writer.loc = get_turf(computer) - writer = null - return 1 - return 0 - - // Authorizes the user based on the computer's requirements - proc/authenticate() - return computer.check_access(reader) - - proc/addfile(var/datum/file/F) - if(!dualslot || !istype(writer,/obj/item/weapon/card/data)) - return 0 - var/obj/item/weapon/card/data/D = writer - if(D.files.len > 3) - return 0 - D.files += F - return 1 - -/obj/item/part/computer/cardslot/dual - name = "magnetic card reader" - desc = "Contains slots for inserting magnetic swipe cards for reading and writing." - dualslot = 1 - - - /* - // Atlantis: Reworked card manipulation a bit. - // No need for separated code for dual and single readers. - // Both is handled in single-slot reader code now, thanks to the "dualslot" var. - // Leaving this code here if someone wants to somehow use it, just uncomment. - - insert(var/obj/item/weapon/card/card,var/slot = 0) - if(!computer) - return 0 - - if(istype(card,/obj/item/weapon/card/emag) && !reader) // emag reader slot - usr.visible_message("[computer]'s screen flickers for a moment.","You insert \the [card]. After a moment, the card ejects itself, and [computer] beeps.","[computer] beeps.") - computer.emagged = 1 - return 1 - - if(slot == 1) // 1: writer - if(writer != null) - usr << "There's already a card in that slot!" - return 0 - var/mob/living/L = usr - L.drop_item() - card.loc = src - writer = card - return 1 - else if(slot == 2) // 2: reader - if(reader != null) - usr << "There's already a card in that slot!" - return 0 - var/mob/living/L = usr - L.drop_item() - card.loc = src - reader = card - return 1 - else // 0: auto - if(reader && writer) - usr << "Both slots are full!" - return 0 - var/mob/living/L = usr - L.drop_item() - card.loc = src - if(reader) - writer = card - computer.updateUsrDialog() - return 1 - if(istype(card,/obj/item/weapon/card/id) && !(access_change_ids in card:access) && !writer) // not authorized - writer = card - computer.updateUsrDialog() - return 1 - if(!reader) - reader = card - computer.updateUsrDialog() - return 1 - return 0 - - remove(var/obj/item/weapon/card/card) - if(card != reader && card != writer) - return - - if(card == reader) reader = null - if(card == writer) writer = null - card.loc = loc - - var/mob/living/carbon/human/user = usr - if(ishuman(user) && !user.get_active_hand()) - user.put_in_hands(card) - else - card.loc = computer.loc -*/ - - diff --git a/code/game/machinery/computer3/computer.dm b/code/game/machinery/computer3/computer.dm deleted file mode 100644 index ff4b69b20f6..00000000000 --- a/code/game/machinery/computer3/computer.dm +++ /dev/null @@ -1,466 +0,0 @@ -/obj/machinery/computer3 - name = "computer" - icon = 'icons/obj/computer3.dmi' - icon_state = "frame" - density = 1 - anchored = 1.0 - - idle_power_usage = 20 - active_power_usage = 50 - - var/allow_disassemble = 1 - var/legacy_icon = 0 // if 1, use old style icons - var/show_keyboard = 1 - - // These is all you should need to change when creating a new computer. - // If there is no default program, the OS will run instead. - // If there is no hard drive, but there is a default program, the OS rom on - // the circuitboard will be overridden. - - // For these, typepaths are used, NOT objects - - var/default_prog = null // the program running when spawned - var/list/spawn_files = list() // files added when spawned - var/list/spawn_parts = list(/obj/item/part/computer/storage/hdd/big) // peripherals to spawn - - // Computer3 components - put an object in them in New() when not built - // I used to have a more pliable /list, but the ambiguities - // there in how many of what you had was killing me, especially - // when you had to search the list to find what you had. - - // Mostly decorative, holds the OS rom - var/obj/item/part/computer/circuitboard/circuit - - // Storage - var/obj/item/part/computer/storage/hdd/hdd = null - var/obj/item/part/computer/storage/removable/floppy = null - // Networking - var/obj/item/part/computer/networking/radio/radio = null // not handled the same as other networks - var/obj/item/part/computer/networking/cameras/camnet = null // just plain special - var/obj/item/part/computer/networking/net = null // Proximity, area, or cable network - - // Card reader - note the HoP reader is a subtype - var/obj/item/part/computer/cardslot/cardslot = null - - // Misc & special purpose - var/obj/item/part/computer/ai_holder/cradle = null - var/obj/item/part/computer/toybox/toybox = null - var/mob/living/silicon/ai/occupant = null - - - // Legacy variables - // camera networking - overview (???) - var/mapping = 0 - var/last_pic = 1.0 - - // Purely graphical effect - var/icon/kb = null - - // These are necessary in order to consolidate all computer types into one - var/datum/wires/wires = null - var/powernet = null - - // Used internally - var/datum/file/program/program = null // the active program (null if defaulting to os) - var/datum/file/program/os = null // the base code of the machine (os or hardcoded program) - - // If you want the computer to have a UPS, add a battery during construction. This is useful for things like - // the comms computer, solar trackers, etc, that should function when all else is off. - // Laptops will require batteries and have no mains power. - - var/obj/item/weapon/cell/battery = null // uninterruptible power supply aka battery - - - verb/ResetComputer() - set name = "Reset Computer" - set category = "Object" - set src in view(1) - - if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) - usr << "\red You can't do that." - return - - if(!Adjacent(usr)) - usr << "You can't reach it." - return - - Reset() - - New(var/L, var/built = 0) - ..() - spawn(2) - power_change() - - if(show_keyboard) - var/kb_state = "kb[rand(1,15)]" - kb = image('icons/obj/computer3.dmi',icon_state=kb_state) - overlays += kb - - if(!built) - if(!circuit || !istype(circuit)) - circuit = new(src) - if(circuit.OS) - os = circuit.OS - circuit.OS.computer = src - else - os = null - - // separated into its own function because blech - spawn_parts() - - if(default_prog) // Add the default software if applicable - var/datum/file/program/P = new default_prog - if(hdd) - hdd.addfile(P,1) - program = P - if(!os) - os = P - else if(floppy) - floppy.inserted = new(floppy) - floppy.files = floppy.inserted.files - floppy.addfile(P) - program = P - else - circuit.OS = P - circuit.OS.computer = src - os = circuit.OS - circuit.name = "Circuitboard ([P])" - - - if(hdd) // Spawn files - for(var/typekey in spawn_files) - hdd.addfile(new typekey,1) - - update_icon() - - - proc/update_spawn_files() - for(var/typekey in spawn_files) - hdd.addfile(new typekey,1) - - proc/spawn_parts() - for(var/typekey in spawn_parts) - - if(ispath(typekey,/obj/item/part/computer/storage/removable)) - if(floppy) continue - floppy = new typekey(src) - floppy.init(src) - continue - if(ispath(typekey,/obj/item/part/computer/storage/hdd)) - if(hdd) continue - hdd = new typekey(src) - hdd.init(src) - continue - - if(ispath(typekey,/obj/item/part/computer/networking/cameras)) - if(camnet) continue - camnet = new typekey(src) - camnet.init(src) - continue - if(ispath(typekey,/obj/item/part/computer/networking/radio)) - if(radio) continue - radio = new typekey(src) - radio.init(src) - continue - if(ispath(typekey,/obj/item/part/computer/networking)) - if(net) continue - net = new typekey(src) - net.init(src) - continue - - if(ispath(typekey,/obj/item/part/computer/cardslot)) - if(cardslot) continue - cardslot = new typekey(src) - cardslot.init(src) - continue - if(ispath(typekey,/obj/item/part/computer/ai_holder)) - if(cradle) continue - cradle = new typekey(src) - cradle.init(src) - if(ispath(typekey,/obj/item/part/computer/toybox)) - if(toybox) continue - toybox = new typekey(src) - toybox.init(src) - continue - - if(ispath(typekey,/obj/item/weapon/cell)) - if(battery) continue - battery = new typekey(src) - continue - - proc/Reset(var/error = 0) - for(var/mob/living/M in range(1)) - M << browse(null,"window=\ref[src]") - if(program) - program.Reset() - program = null - req_access = os.req_access - update_icon() - - // todo does this do enough - - - meteorhit(var/obj/O as obj) - for(var/x in verbs) - verbs -= x - set_broken() - return - - - emp_act(severity) - if(prob(20/severity)) set_broken() - ..() - - - ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if (prob(25)) - qdel(src) - return - if (prob(50)) - for(var/x in verbs) - verbs -= x - set_broken() - if(3.0) - if (prob(25)) - for(var/x in verbs) - verbs -= x - set_broken() - else - return - - - blob_act() - if (prob(75)) - set_broken() - density = 0 - - /* - Computers have the capability to use a battery backup. - Note that auto_use_power's return value is strictly whether - or not it is successfully powered. - - This allows laptops, and also allows you to create computers that - remain active when: - - * the APC is destroy'd, emag'd, malf'd, emp'd, ninja'd etc - * the computer was built in an unpowered zone - * the station power is out, cables are cut, etc - - By default, most computers will NOT spawn with a battery backup, and - SHOULD not. Players can take apart a computer to insert the battery - if they want to ensure, for example, the AI upload remains when the - power is cut off. - - Make sure to use use_power() a bunch in peripherals code - */ - auto_use_power() - if(!powered(power_channel)) - if(battery && battery.charge > 0) - if(use_power == 1) - battery.use(idle_power_usage) - else - battery.use(active_power_usage) - return 1 - return 0 - if(src.use_power == 1) - use_power(idle_power_usage,power_channel) - else if(src.use_power >= 2) - use_power(active_power_usage,power_channel) - return 1 - - use_power(var/amount, var/chan = -1) - if(chan == -1) - chan = power_channel - - var/area/A = get_area(loc) - if(istype(A) && A.powered(chan)) - A.use_power(amount, chan) - else if(battery && battery.charge > 0) - battery.use(amount) - - power_change() - if( !powered(power_channel) && (!battery || battery.charge <= 0) ) - stat |= NOPOWER - else - stat &= ~NOPOWER - - process() - auto_use_power() - power_change() - update_icon() - if(stat & (NOPOWER|BROKEN)) - return - - if(program) - program.process() - return - - if(os) - program = os - os.process() - return - - - proc/set_broken() - icon_state = "computer_b" - stat |= BROKEN - crit_fail = 1 - if(program) - program.error = BUSTED_ASS_COMPUTER - if(os) - os.error = BUSTED_ASS_COMPUTER - - attackby(I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && allow_disassemble) - disassemble(user) - return - - /* - +++++++++++ - |IMPORTANT| If you add a peripheral, put it in this list - +++++++++++ -------------------------------------------- - */ - var/list/peripherals = list(hdd,floppy,radio,net,cardslot,cradle) //camnet, toybox removed - - var/list/p_list = list() - for(var/obj/item/part/computer/C in peripherals) - if(!isnull(C) && C.allow_attackby(I,user)) - p_list += C - if(p_list.len) - var/obj/item/part/computer/P = null - if(p_list.len == 1) - P = p_list[1] - else - P = input(user,"Which component?") as null|anything in p_list - - if(P) - P.attackby(I,user) - return - ..() - - attack_hand(var/mob/user as mob) - if(stat) - Reset() - return - - // I don't want to deal with computers that you can't walk up to and use - // there is still cardauth anyway - //if(!allowed(user)) - // return - - if(program) - if(program.computer != src) // floppy disk may have been removed, etc - Reset() - attack_hand(user) - return - if(program.error) - Crash(program.error) - return - user.set_machine(src) - program.attack_hand(user) // will normally translate to program/interact() - return - - if(os) - program = os - user.set_machine(src) - os.attack_hand(user) - return - - user << "\The [src] won't boot!" - - attack_ai(var/mob/user as mob) // copypasta because server racks lose attack_hand() - if(stat) - Reset() - return - - if(program) - if(program.computer != src) // floppy disk may have been removed, etc - Reset() - attack_ai(user) - return - if(program.error) - Crash(program.error) - return - user.set_machine(src) - program.attack_hand(user) // will normally translate to program/interact() - return - - if(os) - program = os - user.set_machine(src) - os.attack_hand(user) - return - - user << "\The [src] won't boot!" - - interact() - if(stat) - Reset() - return - if(!allowed(usr) || !usr in view(1)) - usr.unset_machine() - return - - if(program) - program.interact() - return - - if(os) - program = os - os.interact() - return - - update_icon() - if(legacy_icon) - icon_state = initial(icon_state) - // Broken - if(stat & BROKEN) - icon_state += "b" - - // Powered - else if(stat & NOPOWER) - icon_state = initial(icon_state) - icon_state += "0" - return - if(stat) - overlays.Cut() - return - if(program) - overlays = list(program.overlay) - if(show_keyboard) - overlays += kb - name = "[program.name] [initial(name)]" - else if(os) - overlays = list(os.overlay) - if(show_keyboard) - overlays += kb - name = initial(name) - else - var/global/image/generic = image('icons/obj/computer3.dmi',icon_state="osod") // orange screen of death - overlays = list(generic) - if(show_keyboard) - overlays += kb - name = initial(name) + " (orange screen of death)" - - //Returns percentage of battery charge remaining. Returns -1 if no battery is installed. - proc/check_battery_status() - if (battery) - var/obj/item/weapon/cell/B = battery - return round(B.charge / (B.maxcharge / 100)) - else - return -1 - - - -/obj/machinery/computer3/wall_comp - name = "terminal" - icon = 'icons/obj/computer3.dmi' - icon_state = "wallframe" - density = 0 - pixel_y = -3 - show_keyboard = 0 diff --git a/code/game/machinery/computer3/computer3_notes.dm b/code/game/machinery/computer3/computer3_notes.dm deleted file mode 100644 index c27410e6375..00000000000 --- a/code/game/machinery/computer3/computer3_notes.dm +++ /dev/null @@ -1,34 +0,0 @@ -/* - 1. Do NOT confuse Computer.Crash(errorcode) with byond CRASH(message) - 2 Do NOT talk about fight club. - 3 If this if your first night here, you have to crash the computer. - 4 Where am I? - 5 Someone help me, please... - 6. Be sure to use computer.use_power() appropriately. Laptops should run out of battery occasionally. - 7 Everyone fights, no-one quits. If you don't do your job, I'll crash you myself. - 6 Don't allow more than 42 angels to dance on the head of a pin. - 5. Once a computer has spawned, they are just like the rest, except when they aren't. - 4 Get me four glasses of apple juice. - 3. Components are only added or removed when disassembled and rebuilt. However, they may be EMP'd. - 2 Only you can prevent friendly fire. - 1 Do not talk about fight club. - 2. If a component subtype needs to be handled separately (removable drives, radio networks), declare it separately. - 3 Television rules the nation - 4. interactable() does all the sanity checks, adds fingerprints, sets machines, initializes popup, and makes a damn fine pot of coffee. - 5 Love conquers all. - 6 If at all possible, do a barrel roll. - 7. Don't forget to use the network verify function to make sure you still have access to remote machines. - - - - - TODO: - * "Nothing left to call the shuttle" check - * Communications terminal printing - move it to a printer of some sort? Make a printer peripheral--but then which ones print the comms? - * Remove the partially transparent border on program screens, as it clashes with some frames - * Chop the corners on program screens now that screen sizes are standard - * ntos: - * Needs a text editor/viewer - * Needs file copy and file move - I think I know how I'm gonna do it - * Needs a peripheral view (eject disks and cards, network actions, ???) -*/ \ No newline at end of file diff --git a/code/game/machinery/computer3/computers/HolodeckControl.dm b/code/game/machinery/computer3/computers/HolodeckControl.dm deleted file mode 100644 index 9e4532604b7..00000000000 --- a/code/game/machinery/computer3/computers/HolodeckControl.dm +++ /dev/null @@ -1,254 +0,0 @@ -/obj/machinery/computer3/HolodeckControl - default_prog = /datum/file/program/holodeck - - -// Todo: I personally would like to add a second holodeck in the theater for making appropriate playgrounds. -// perhaps a holodeck association keyfile? -// One more thing while I'm here -// C3 allows multiple computers to run this program, but it was designed on the assumption that only one would, ever -// I am not going to add or remove anything right now, I'm just porting it - - -/datum/file/program/holodeck - name = "Holodeck Control Console" - desc = "Used to control a nearby holodeck." - active_state = "holocontrol" - var/area/linkedholodeck = null - var/area/target = null - var/active = 0 - var/list/holographic_items = list() - var/damaged = 0 - var/last_change = 0 - var/emagged = 0 - - - interact() - if(!interactable()) - return - var/dat = "

Current Loaded Programs

" - dat += "((Empty Court)
)
" - dat += "((Boxing Court)
)
" - dat += "((Basketball Court)
)
" - dat += "((Thunderdome Court)
)
" - dat += "((Beach)
)
" -// dat += "((Shutdown System)
)
" - - dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
" - - if(emagged) - dat += "(Begin Atmospheric Burn Simulation)
" - dat += "Ensure the holodeck is empty before testing.
" - dat += "
" - dat += "(Begin Wildlife Simulation)
" - dat += "Ensure the holodeck is empty before testing.
" - dat += "
" - if(issilicon(usr)) - dat += "(Re-Enable Safety Protocols?)
" - dat += "Safety Protocols are DISABLED
" - else - if(issilicon(usr)) - dat += "(Override Safety Protocols?)
" - dat += "
" - dat += "Safety Protocols are ENABLED
" - - popup.set_content(dat) - popup.open() - return - - - Topic(var/href, var/list/href_list) - if(!interactable() || ..(href,href_list)) - return - - if("emptycourt" in href_list) - target = locate(/area/holodeck/source_emptycourt) - if(target) - loadProgram(target) - - else if("boxingcourt" in href_list) - target = locate(/area/holodeck/source_boxingcourt) - if(target) - loadProgram(target) - - else if("basketball" in href_list) - target = locate(/area/holodeck/source_basketball) - if(target) - loadProgram(target) - - else if("thunderdomecourt" in href_list) - target = locate(/area/holodeck/source_thunderdomecourt) - if(target) - loadProgram(target) - - else if("beach" in href_list) - target = locate(/area/holodeck/source_beach) - if(target) - loadProgram(target) - - else if("turnoff" in href_list) - target = locate(/area/holodeck/source_plating) - if(target) - loadProgram(target) - - else if("burntest" in href_list) - if(!emagged) return - target = locate(/area/holodeck/source_burntest) - if(target) - loadProgram(target) - - else if("wildlifecarp" in href_list) - if(!emagged) return - target = locate(/area/holodeck/source_wildlife) - if(target) - loadProgram(target) - - else if("AIoverride" in href_list) - if(!issilicon(usr)) return - emagged = !emagged - if(emagged) - message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") - log_game("[key_name(usr)] overrided the holodeck's safeties") - else - message_admins("[key_name_admin(usr)] restored the holodeck's safeties") - log_game("[key_name(usr)] restored the holodeck's safeties") - - interact() - return - - Reset() - emergencyShutdown() - - process() - if(active) - if(!checkInteg(linkedholodeck)) - damaged = 1 - target = locate(/area/holodeck/source_plating) - if(target) - loadProgram(target) - active = 0 - for(var/mob/M in range(10,src)) - M.show_message("The holodeck overloads!") - - - for(var/turf/T in linkedholodeck) - if(prob(30)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, T) - s.start() - T.ex_act(3) - T.hotspot_expose(1000,500,1) - - - for(var/item in holographic_items) - if(!(get_turf(item) in linkedholodeck)) - derez(item, 0) - - - - proc/derez(var/obj/obj , var/silent = 1) - holographic_items.Remove(obj) - - if(obj == null) - return - - if(isobj(obj)) - var/mob/M = obj.loc - if(ismob(M)) - M.remove_from_mob(obj) - M.update_icons() //so their overlays update - - if(!silent) - var/obj/oldobj = obj - obj.visible_message("The [oldobj.name] fades away!") - qdel(obj) - - proc/checkInteg(var/area/A) - for(var/turf/T in A) - if(istype(T, /turf/space)) - return 0 - - return 1 - - proc/togglePower(var/toggleOn = 0) - - if(toggleOn) - var/area/targetsource = locate(/area/holodeck/source_emptycourt) - holographic_items = 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 - else - for(var/item in holographic_items) - derez(item) - var/area/targetsource = locate(/area/holodeck/source_plating) - targetsource.copy_contents_to(linkedholodeck , 1) - active = 0 - - - proc/loadProgram(var/area/A) - - 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 projetion apparatus.") - last_change = world.time - return - - last_change = world.time - active = 1 - - for(var/item in holographic_items) - derez(item) - - for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck) - qdel(B) - - for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck) - qdel(C) - - holographic_items = A.copy_contents_to(linkedholodeck , 1) - - if(emagged) - for(var/obj/item/weapon/holo/esword/H in linkedholodeck) - H.damtype = BRUTE - - 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) - if(L.name=="Holocarp Spawn") - new /mob/living/simple_animal/hostile/carp(L.loc) - - - proc/emergencyShutdown() - //Get rid of any items - for(var/item in holographic_items) - derez(item) - //Turn it back to the regular non-holographic room - target = locate(/area/holodeck/source_plating) - if(target) - loadProgram(target) - - var/area/targetsource = locate(/area/holodeck/source_plating) - targetsource.copy_contents_to(linkedholodeck , 1) - active = 0 - diff --git a/code/game/machinery/computer3/computers/Operating.dm b/code/game/machinery/computer3/computers/Operating.dm deleted file mode 100644 index 0f989780d71..00000000000 --- a/code/game/machinery/computer3/computers/Operating.dm +++ /dev/null @@ -1,47 +0,0 @@ -/obj/machinery/computer3/operating - default_prog = /datum/file/program/op_monitor - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/prox) - icon_state = "frame-med" - -/datum/file/program/op_monitor - name = "operating table monitor" - desc = "Monitors patient status during surgery." - active_state = "operating" - var/mob/living/carbon/human/patient = null - var/obj/machinery/optable/table = null - - -/datum/file/program/op_monitor/interact() - if(!interactable()) - return - if(!computer.net) - computer.Crash(MISSING_PERIPHERAL) - return - table = computer.net.connect_to(/obj/machinery/optable,table) - - var/dat = "" - if(table) - dat += "Patient information:
" - if(src.table && (src.table.check_victim())) - src.patient = src.table.victim - dat += {"Patient Status: [patient.stat ? "Non-Responsive" : "Stable"]
- Blood Type: [patient.b_type]
-
- Health: [round(patient.health)]
- Brute Damage: [round(patient.getBruteLoss())]
- Toxins Damage: [round(patient.getToxLoss())]
- Fire Damage: [round(patient.getFireLoss())]
- Suffocation Damage: [round(patient.getOxyLoss())]
- "} - else - src.patient = null - dat += "No patient detected" - else - dat += "Operating table not found." - - popup.set_content(dat) - popup.open() -/datum/file/program/op_monitor/Topic() - if(!interactable()) - return - ..() \ No newline at end of file diff --git a/code/game/machinery/computer3/computers/arcade.dm b/code/game/machinery/computer3/computers/arcade.dm deleted file mode 100644 index 746551079b5..00000000000 --- a/code/game/machinery/computer3/computers/arcade.dm +++ /dev/null @@ -1,180 +0,0 @@ -/obj/machinery/computer3/arcade - default_prog = /datum/file/program/arcade - spawn_parts = list(/obj/item/part/computer/toybox) //NO HDD - the game is loaded on the circuitboard's OS slot - -/obj/item/part/computer/toybox - var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2, - /obj/item/toy/blink = 2, - /obj/item/clothing/under/syndicate/tacticool = 2, - /obj/item/toy/sword = 2, - /obj/item/toy/gun = 2, - /obj/item/toy/crossbow = 2, - /obj/item/clothing/suit/syndicatefake = 2, - /obj/item/weapon/storage/fancy/crayons = 2, - /obj/item/toy/spinningtoy = 2, - /obj/item/toy/prize/ripley = 1, - /obj/item/toy/prize/fireripley = 1, - /obj/item/toy/prize/deathripley = 1, - /obj/item/toy/prize/gygax = 1, - /obj/item/toy/prize/durand = 1, - /obj/item/toy/prize/honk = 1, - /obj/item/toy/prize/marauder = 1, - /obj/item/toy/prize/seraph = 1, - /obj/item/toy/prize/mauler = 1, - /obj/item/toy/prize/odysseus = 1, - /obj/item/toy/prize/phazon = 1 - ) - proc/dispense() - if(computer && !computer.stat) - var/prizeselect = pickweight(prizes) - new prizeselect(computer.loc) - if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun - new /obj/item/toy/ammo/gun(computer.loc) - else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit - new /obj/item/clothing/head/syndicatefake(computer.loc) - feedback_inc("arcade_win_normal") - computer.use_power(500) - - -/datum/file/program/arcade - desc = "The best arcade game ever produced by Nanotrasen's short-lived entertainment divison." - //headcanon: they also ported E.T. for the atari 2600, superman 64, and basically every other movie tie-in game ever - - active_state = "generic" - - var/turtle = 0 - var/enemy_name = "Space Villian" - var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc - var/player_hp = 30 //Player health/attack points - var/player_mp = 10 - var/enemy_hp = 45 //Enemy health/attack points - var/enemy_mp = 20 - var/gameover = 0 - var/blocked = 0 //Player cannot attack/heal while set - -/datum/file/program/arcade/New() - ..() - var/name_action - var/name_part1 - var/name_part2 - - name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "ERP ") - - name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ") - name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn") - - enemy_name = replacetext(name_part1, "the ", "") + name_part2 - name = (name_action + name_part1 + name_part2) - - -/datum/file/program/arcade/interact() - if(!interactable()) - return - var/dat// = topic_link(src,"close","Close") - dat = "

[enemy_name]

" - - dat += "

[temp]

" - dat += "
Health: [player_hp] | Magic: [player_mp] | Enemy Health: [enemy_hp]
" - - if (gameover) - dat += "
[topic_link(src,"newgame","New Game")]" - else - dat += "
[topic_link(src,"attack","Attack")] | [topic_link(src,"heal","Heal")] | [topic_link(src,"charge","Recharge Power")]" - - dat += "
" - - popup.set_content(dat) - popup.open() - -/datum/file/program/arcade/Topic(href, list/href_list) - if(!interactable() || ..(href,href_list)) - return - if (!blocked && !gameover) - if ("attack" in href_list) - blocked = 1 - var/attackamt = rand(2,6) - temp = "You attack for [attackamt] damage!" - computer.updateUsrDialog() - if(turtle > 0) - turtle-- - - sleep(10) - enemy_hp -= attackamt - arcade_action() - - else if ("heal" in href_list) - blocked = 1 - var/pointamt = rand(1,3) - var/healamt = rand(6,8) - temp = "You use [pointamt] magic to heal for [healamt] damage!" - computer.updateUsrDialog() - turtle++ - - sleep(10) - player_mp -= pointamt - player_hp += healamt - blocked = 1 - computer.updateUsrDialog() - arcade_action() - - else if ("charge" in href_list) - blocked = 1 - var/chargeamt = rand(4,7) - temp = "You regain [chargeamt] points" - player_mp += chargeamt - if(turtle > 0) - turtle-- - - computer.updateUsrDialog() - sleep(10) - arcade_action() - - if ("newgame" in href_list) //Reset everything - temp = "New Round" - player_hp = 30 - player_mp = 10 - enemy_hp = 45 - enemy_mp = 20 - gameover = 0 - turtle = 0 - computer.updateUsrDialog() - - -/datum/file/program/arcade/proc/arcade_action() - if ((enemy_mp <= 0) || (enemy_hp <= 0)) - if(!gameover) - gameover = 1 - temp = "[enemy_name] has fallen! Rejoice!" - if(computer.toybox) - computer.toybox.dispense() - - else if ((enemy_mp <= 5) && (prob(70))) - var/stealamt = rand(2,3) - temp = "[enemy_name] steals [stealamt] of your power!" - player_mp -= stealamt - - if (player_mp <= 0) - gameover = 1 - sleep(10) - temp = "You have been drained! GAME OVER" - feedback_inc("arcade_loss_mana_normal") - - else if ((enemy_hp <= 10) && (enemy_mp > 4)) - temp = "[enemy_name] heals for 4 health!" - enemy_hp += 4 - enemy_mp -= 4 - - else - var/attackamt = rand(3,6) - temp = "[enemy_name] attacks for [attackamt] damage!" - player_hp -= attackamt - - if ((player_mp <= 0) || (player_hp <= 0)) - gameover = 1 - temp = "You have been crushed! GAME OVER" - feedback_inc("arcade_loss_hp_normal") - - if(interactable()) - computer.updateUsrDialog() - blocked = 0 - return \ No newline at end of file diff --git a/code/game/machinery/computer3/computers/atmos_alert.dm b/code/game/machinery/computer3/computers/atmos_alert.dm deleted file mode 100644 index 00d6f87438a..00000000000 --- a/code/game/machinery/computer3/computers/atmos_alert.dm +++ /dev/null @@ -1,99 +0,0 @@ -/obj/machinery/computer3/atmos_alert - default_prog = /datum/file/program/atmos_alert - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio) - icon_state = "frame-eng" - -/datum/file/program/atmos_alert - name = "atmospheric alert monitor" - desc = "Recieves alerts over the radio." - active_state = "alert:2" - refresh = 1 - - execute(var/datum/file/program/source) - ..(source) - - if(!computer.radio) - computer.Crash(MISSING_PERIPHERAL) - - computer.radio.set_frequency(1437,RADIO_ATMOSIA) - - // This will be called as long as the program is running on the parent computer - // and the computer has the radio peripheral - receive_signal(datum/signal/signal) - if(!signal || signal.encryption) return - - var/zone = signal.data["zone"] - var/severity = signal.data["alert"] - if(!zone || !severity) return - - minor_air_alarms -= zone - priority_air_alarms -= zone - if(severity=="severe") - priority_air_alarms += zone - else if (severity=="minor") - minor_air_alarms += zone - update_icon() - return - - - interact() - if(!interactable()) - return - if(!computer.radio) - computer.Crash(MISSING_PERIPHERAL) - - popup.set_content(return_text()) - popup.open() - - - update_icon() - ..() - if(priority_air_alarms.len > 0) - overlay.icon_state = "alert:2" - else if(minor_air_alarms.len > 0) - overlay.icon_state = "alert:1" - else - overlay.icon_state = "alert:0" - - if(computer) - computer.update_icon() - - - proc/return_text() - var/priority_text = "

Priority Alerts:

" - var/minor_text = "

Minor Alerts:

" - - if(priority_air_alarms.len) - for(var/zone in priority_air_alarms) - priority_text += "[format_text(zone)] [topic_link(src,"priority_clear=[ckey(zone)]","X")]
" - else - priority_text += "No priority alerts detected.
" - - if(minor_air_alarms.len) - for(var/zone in minor_air_alarms) - minor_text += "[format_text(zone)] [topic_link(src,"minor_clear=[ckey(zone)]","X")]
" - else - minor_text += "No minor alerts detected.
" - - return "[priority_text]

[minor_text]
[topic_link(src,"close","Close")]" - - - Topic(var/href, var/list/href_list) - if(!interactable() || ..(href,href_list)) - return - - if("priority_clear" in href_list) - var/removing_zone = href_list["priority_clear"] - for(var/zone in priority_air_alarms) - if(ckey(zone) == removing_zone) - usr << "\green Priority Alert for area [zone] cleared." - priority_air_alarms -= zone - - if("minor_clear" in href_list) - var/removing_zone = href_list["minor_clear"] - for(var/zone in minor_air_alarms) - if(ckey(zone) == removing_zone) - usr << "\green Minor Alert for area [zone] cleared." - minor_air_alarms -= zone - - computer.updateUsrDialog() diff --git a/code/game/machinery/computer3/computers/camera.dm b/code/game/machinery/computer3/computers/camera.dm.back similarity index 100% rename from code/game/machinery/computer3/computers/camera.dm rename to code/game/machinery/computer3/computers/camera.dm.back diff --git a/code/game/machinery/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm deleted file mode 100644 index 3633252a46f..00000000000 --- a/code/game/machinery/computer3/computers/card.dm +++ /dev/null @@ -1,347 +0,0 @@ -/obj/machinery/computer3/card - default_prog = /datum/file/program/card_comp - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot/dual) -/obj/machinery/computer3/card/hop - default_prog = /datum/file/program/card_comp - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot/dual) - spawn_files = list(/datum/file/program/arcade, /datum/file/program/security, /datum/file/camnet_key/mining, /datum/file/camnet_key/entertainment,/datum/file/camnet_key/prison) - - -/obj/machinery/computer3/card/centcom - default_prog = /datum/file/program/card_comp/centcom - -/datum/file/program/card_comp - name = "identification card console" - desc = "Used to modify magnetic strip ID cards." - image = 'icons/ntos/cardcomp.png' - active_state = "id" - - var/obj/item/weapon/card/id/reader = null - var/obj/item/weapon/card/id/writer = null - - var/mode = 0 - var/auth = 0 - var/printing = 0 - - proc/list_jobs() - return get_all_jobs() + "Custom" - - // creates the block with the script in it - // cache the result since it's almost constant but not quite - // the list of jobs won't change after all... - proc/scriptblock() - var/global/dat = null - var/counter = 0 - var jobs_all = "" - jobs_all += "" - - jobs_all += ""//Captain in special because he is head of heads ~Intercross21 - jobs_all += "" - jobs_all += "" - - counter = 0 - jobs_all += ""//Red - for(var/job in security_positions) - counter++ - if(counter >= 6) - jobs_all += "" - counter = 0 - jobs_all += "" - - counter = 0 - jobs_all += ""//Orange - for(var/job in engineering_positions) - counter++ - if(counter >= 6) - jobs_all += "" - counter = 0 - jobs_all += "" - - counter = 0 - jobs_all += ""//Green - for(var/job in medical_positions) - counter++ - if(counter >= 6) - jobs_all += "" - counter = 0 - jobs_all += "" - - counter = 0 - jobs_all += ""//Purple - for(var/job in science_positions) - counter++ - if(counter >= 6) - jobs_all += "" - counter = 0 - jobs_all += "" - - counter = 0 - jobs_all += ""//Grey - for(var/job in civilian_positions) - counter++ - if(counter >= 6) - jobs_all += "" - counter = 0 - jobs_all += "" - - dat = {""} - return dat - - // creates the list of access rights on the card - proc/accessblock() - var/accesses = "
Access
" - accesses += "
Command
SpecialCaptainCustom
Security
[replacetext(job, " ", " ")]
Engineering
[replacetext(job, " ", " ")]
Medical
[replacetext(job, " ", " ")]
Science
[replacetext(job, " ", " ")]
Civilian
[replacetext(job, " ", " ")]
" - accesses += "" - for(var/i = 1; i <= 7; i++) - accesses += "" - accesses += "" - for(var/i = 1; i <= 7; i++) - accesses += "" - accesses += "
[get_region_accesses_name(i)]:
" - for(var/A in get_region_accesses(i)) - if(A in writer.access) - accesses += topic_link(src,"access=[A]","[replacetext(get_access_desc(A), " ", " ")]") + " " - else - accesses += topic_link(src,"access=[A]",replacetext(get_access_desc(A), " ", " ")) + " " - accesses += "
" - accesses += "
" - return accesses - - proc/card_modify_menu() - //assume peripherals and cards, do checks for them in interact - - // Header - var/dat = "

" - dat += topic_link(src,"remove=writer","Remove [writer.name]") + " || " - dat += topic_link(src,"remove=reader","Remove [reader.name]") + "
" - dat += topic_link(src,"mode=1","Access Crew Manifest") + " || " - dat += topic_link(src,"logout","Log Out") + "
" - dat += "
" + scriptblock() - - // form for renaming the ID - dat += "
" - dat += "" - dat += "registered_name: " - dat += "" - dat += "
" - - // form for changing assignment, taken care of by scriptblock() mostly - var/assign_temp = writer.assignment - if(!assign_temp || assign_temp == "") assign_temp = "Unassigned" - dat += "Assignment: [assign_temp] change" - - // list of access rights - dat += accessblock() - - return dat - - proc/login_menu() - //assume peripherals and cards, do checks for them in interact - var/dat = "
Please insert the cards into the slots
" - - if(istype(writer)) - dat += "Target: [topic_link(src,"remove=writer",writer.name)]
" - else - dat += "Target: [topic_link(src,"insert=writer","--------")]
" - - if(istype(reader)) - dat += "Confirm Identity: [topic_link(src,"remove=reader",reader.name)]
" - else - dat += "Confirm Identity: [topic_link(src,"insert=reader","--------")]
" - dat += "[topic_link(src,"auth","{Log in}")]

" - dat += topic_link(src,"mode=1","Access Crew Manifest") - return dat - - proc/show_manifest() - // assume linked_db since called by interact() - var/crew = "" - var/list/L = list() - for (var/datum/data/record/t in data_core.general) - var/R = t.fields["name"] + " - " + t.fields["rank"] - L += R - for(var/R in sortList(L)) - crew += "[R]
" - return "Crew Manifest:
Please use security record computer to modify entries.

[crew][topic_link(src,"print","Print")]

[topic_link(src,"mode=0","Access ID modification console.")]
" - - // These are here partly in order to be overwritten by the centcom card computer code - proc/authenticate() - if(access_change_ids in reader.access) - return 1 - if(istype(usr,/mob/living/silicon/ai)) - return 1 - return 0 - - proc/set_default_access(var/jobname) - var/datum/job/jobdatum - for(var/jobtype in typesof(/datum/job)) - var/datum/job/J = new jobtype - if(ckey(J.title) == ckey(jobname)) - jobdatum = J - break - if(jobdatum) - writer.access = jobdatum.get_access() // ( istype(src,/obj/machinery/computer/card/centcom) ? get_centcom_access(t1) - - - interact() - if(!interactable()) return - - if(!computer.cardslot || !computer.cardslot.dualslot) - computer.Crash(MISSING_PERIPHERAL) - return - - reader = computer.cardslot.reader - writer = computer.cardslot.writer - - var/dat - - switch(mode) - if(0) - if( !istype(writer) || !istype(reader) ) - auth = 0 - if( !auth ) - dat = login_menu() - else - dat = card_modify_menu() - if(1) - dat = show_manifest() - - - popup.width = 940 - popup.height = 520 - popup.set_content(dat) - popup.open() - return - - - Topic(href, list/href_list) - if(!interactable() || !computer.cardslot || ..(href,href_list)) - return - // todo distance/disability checks - - if("mode" in href_list) - mode = text2num(href_list["mode"]) - if(mode != 0 && mode != 1) - mode = 0 - - auth = 0 // always log out if switching modes just in case - - if("remove" in href_list) - var/which = href_list["remove"] - if(which == "writer") - computer.cardslot.remove(2) - else - computer.cardslot.remove(1) - auth = 0 - - if("insert" in href_list) - var/obj/item/weapon/card/card = usr.get_active_hand() - if(!istype(card)) return - - var/which = href_list["insert"] - if(which == "writer") - computer.cardslot.insert(card,2) - else - computer.cardslot.insert(card,1) - - if("print" in href_list) - if (printing) - return - - printing = 1 - sleep(50) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc ) - P.info = "Crew Manifest:
" - var/list/L = list() - for (var/datum/data/record/t in data_core.general) - var/R = t.fields["name"] + " - " + t.fields["rank"] - L += R - for(var/R in sortList(L)) - P.info += "[R]
" - P.name = "paper- 'Crew Manifest'" - printing = 0 - - if("auth" in href_list) - auth = 0 - if(istype(reader) && istype(writer) && authenticate()) - auth = 1 - - if("logout" in href_list) - auth = 0 - - // Actual ID changing - - if("access" in href_list) - if(auth) - var/access_type = text2num(href_list["access"]) - writer.access ^= list(access_type) //logical xor: remove if present, add if not - - if("assign" in href_list) - if(auth) - var/t1 = href_list["assign"] - if(t1 == "Custom") - var/temp_t = sanitize(input("Enter a custom job assignment.","Assignment")) - if(temp_t) - t1 = temp_t - set_default_access(t1) - - writer.assignment = t1 - writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])") - - if("reg" in href_list) - if(auth) - writer.registered_name = href_list["reg"] - writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])") - - computer.updateUsrDialog() - return - - - - - - -/datum/file/program/card_comp/centcom - name = "CentCom identification console" - drm = 1 - - list_jobs() - return get_all_centcom_jobs() + "Custom" - - accessblock() - var/accesses = "
Central Command:
" - for(var/A in get_all_centcom_access()) - if(A in writer.access) - accesses += topic_link(src,"access=[A]","[replacetext(get_centcom_access_desc(A), " ", " ")]") + " " - else - accesses += topic_link(src,"access=[A]",replacetext(get_centcom_access_desc(A), " ", " ")) + " " - return accesses - - authenticate() - if(access_cent_captain in reader.access) - return 1 - return 0 \ No newline at end of file diff --git a/code/game/machinery/computer3/computers/communications.dm b/code/game/machinery/computer3/computers/communications.dm deleted file mode 100644 index f00b595c6c2..00000000000 --- a/code/game/machinery/computer3/computers/communications.dm +++ /dev/null @@ -1,393 +0,0 @@ -/obj/machinery/computer3/communications - default_prog = /datum/file/program/communications - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace) - -/obj/machinery/computer3/communications/captain - default_prog = /datum/file/program/communications - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/cardslot/dual) - spawn_files = list(/datum/file/program/card_comp, /datum/file/program/security, /datum/file/program/crew, /datum/file/program/arcade, - /datum/file/camnet_key, /datum/file/camnet_key/entertainment, /datum/file/camnet_key/singulo) - - -/datum/file/program/communications - var/const/STATE_DEFAULT = 1 - var/const/STATE_CALLSHUTTLE = 2 - var/const/STATE_CANCELSHUTTLE = 3 - var/const/STATE_MESSAGELIST = 4 - var/const/STATE_VIEWMESSAGE = 5 - var/const/STATE_DELMESSAGE = 6 - var/const/STATE_STATUSDISPLAY = 7 - var/const/STATE_ALERT_LEVEL = 8 - var/const/STATE_CONFIRM_LEVEL = 9 - - -/datum/file/program/communications - name = "Centcom communications relay" - desc = "Used to connect to Centcom." - active_state = "comm" - req_access = list(access_heads) - - var/prints_intercept = 1 - var/authenticated = 0 - var/list/messagetitle = list() - var/list/messagetext = list() - var/currmsg = 0 - var/aicurrmsg = 0 - var/state = STATE_DEFAULT - var/aistate = STATE_DEFAULT - var/message_cooldown = 0 - var/centcomm_message_cooldown = 0 - var/tmp_alertlevel = 0 - - var/status_display_freq = "1435" - var/stat_msg1 - var/stat_msg2 - - var/datum/announcement/priority/crew_announcement = new - - New() - ..() - crew_announcement.newscast = 1 - - Reset() - ..() - authenticated = 0 - state = STATE_DEFAULT - aistate = STATE_DEFAULT - - - Topic(var/href, var/list/href_list) - if(!interactable() || !computer.radio || ..(href,href_list) ) - return - if (computer.z > 1) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" - return - - if("main" in href_list) - state = STATE_DEFAULT - if("login" in href_list) - var/mob/M = usr - var/obj/item/I = M.get_active_hand() - if(I) - I = I.GetID() - if(istype(I,/obj/item/weapon/card/id) && check_access(I)) - authenticated = 1 - if(access_captain in I.GetAccess()) - authenticated = 2 - crew_announcement.announcer = GetNameAndAssignmentFromId(I) - if(istype(I,/obj/item/weapon/card/emag)) - authenticated = 2 - computer.emagged = 1 - if("logout" in href_list) - authenticated = 0 - crew_announcement.announcer = "" - - if("swipeidseclevel" in href_list) - var/mob/M = usr - var/obj/item/I = M.get_active_hand() - I = I.GetID() - - if (istype(I,/obj/item/weapon/card/id)) - if(access_captain in I.GetAccess()) - var/old_level = security_level - if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN - if(tmp_alertlevel < SEC_LEVEL_GREEN) tmp_alertlevel = SEC_LEVEL_GREEN - if(tmp_alertlevel > SEC_LEVEL_BLUE) tmp_alertlevel = SEC_LEVEL_BLUE //Cannot engage delta with this - set_security_level(tmp_alertlevel) - if(security_level != old_level) - //Only notify the admins if an actual change happened - log_game("[key_name(usr)] has changed the security level to [get_security_level()].") - message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") - switch(security_level) - if(SEC_LEVEL_GREEN) - feedback_inc("alert_comms_green",1) - if(SEC_LEVEL_BLUE) - feedback_inc("alert_comms_blue",1) - tmp_alertlevel = 0 - else: - usr << "You are not authorized to do this." - tmp_alertlevel = 0 - state = STATE_DEFAULT - else - usr << "You need to swipe your ID." - if("announce" in href_list) - if(authenticated==2) - if(message_cooldown) - usr << "Please allow at least one minute to pass between announcements" - return - var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") - if(!input || !interactable()) - return - crew_announcement.Announce(input) - message_cooldown = 1 - spawn(600)//One minute cooldown - message_cooldown = 0 - - if("callshuttle" in href_list) - state = STATE_DEFAULT - if(authenticated) - state = STATE_CALLSHUTTLE - if("callshuttle2" in href_list) - if(!computer.radio.subspace) - return - if(authenticated) - call_shuttle_proc(usr) - if(emergency_shuttle.online()) - post_status("shuttle") - state = STATE_DEFAULT - if("cancelshuttle" in href_list) - state = STATE_DEFAULT - if(authenticated) - state = STATE_CANCELSHUTTLE - if("messagelist" in href_list) - currmsg = 0 - state = STATE_MESSAGELIST - if("viewmessage" in href_list) - state = STATE_VIEWMESSAGE - if (!currmsg) - if(href_list["message-num"]) - currmsg = text2num(href_list["message-num"]) - else - state = STATE_MESSAGELIST - if("delmessage" in href_list) - state = (currmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST - if("delmessage2" in href_list) - if(authenticated) - if(currmsg) - var/title = messagetitle[currmsg] - var/text = messagetext[currmsg] - messagetitle.Remove(title) - messagetext.Remove(text) - if(currmsg == aicurrmsg) - aicurrmsg = 0 - currmsg = 0 - state = STATE_MESSAGELIST - else - state = STATE_VIEWMESSAGE - if("status" in href_list) - state = STATE_STATUSDISPLAY - - // Status display stuff - if("setstat" in href_list) - switch(href_list["statdisp"]) - if("message") - post_status("message", stat_msg1, stat_msg2) - if("alert") - post_status("alert", href_list["alert"]) - else - post_status(href_list["statdisp"]) - - if("setmsg1" in href_list) - stat_msg1 = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", stat_msg1) as text|null, 40), 40) - computer.updateDialog() - if("setmsg2" in href_list) - stat_msg2 = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", stat_msg2) as text|null, 40), 40) - computer.updateDialog() - - // OMG CENTCOMM LETTERHEAD - if("MessageCentcomm" in href_list) - if(!computer.radio.subspace) - return - if(authenticated==2) - if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." - 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.", "To abort, send an empty message.", "")) - if(!input || !interactable()) - return - Centcomm_announce(input, usr) - usr << "Message transmitted." - log_say("[key_name(usr)] has made a Centcomm announcement: [input]") - centcomm_message_cooldown = 1 - spawn(600)//10 minute cooldown - centcomm_message_cooldown = 0 - - - // OMG SYNDICATE ...LETTERHEAD - if("MessageSyndicate" in href_list) - if((authenticated==2) && (computer.emagged)) - if(centcomm_message_cooldown) - 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.", "To abort, send an empty message.", "")) - if(!input || !interactable()) - return - Syndicate_announce(input, usr) - usr << "Message transmitted." - log_say("[key_name(usr)] has made an illegal announcement: [input]") - centcomm_message_cooldown = 1 - spawn(600)//10 minute cooldown - centcomm_message_cooldown = 0 - - if("RestoreBackup" in href_list) - usr << "Backup routing data restored!" - computer.emagged = 0 - computer.updateDialog() - - - - // AI interface - if("ai-main" in href_list) - aicurrmsg = 0 - aistate = STATE_DEFAULT - if("ai-callshuttle" in href_list) - aistate = STATE_CALLSHUTTLE - if("ai-callshuttle2" in href_list) - if(!computer.radio.subspace) - return - call_shuttle_proc(usr) - aistate = STATE_DEFAULT - if("ai-messagelist" in href_list) - aicurrmsg = 0 - aistate = STATE_MESSAGELIST - if("ai-viewmessage" in href_list) - aistate = STATE_VIEWMESSAGE - if (!aicurrmsg) - if(href_list["message-num"]) - aicurrmsg = text2num(href_list["message-num"]) - else - aistate = STATE_MESSAGELIST - if("ai-delmessage" in href_list) - aistate = (aicurrmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST - if("ai-delmessage2" in href_list) - if(aicurrmsg) - var/title = messagetitle[aicurrmsg] - var/text = messagetext[aicurrmsg] - messagetitle.Remove(title) - messagetext.Remove(text) - if(currmsg == aicurrmsg) - currmsg = 0 - aicurrmsg = 0 - aistate = STATE_MESSAGELIST - if("ai-status" in href_list) - aistate = STATE_STATUSDISPLAY - - if("securitylevel" in href_list) - tmp_alertlevel = text2num( href_list["newalertlevel"] ) - if(!tmp_alertlevel) tmp_alertlevel = 0 - state = STATE_CONFIRM_LEVEL - - if("changeseclevel" in href_list) - state = STATE_ALERT_LEVEL - - computer.updateUsrDialog() - - - - proc/main_menu() - var/dat = "" - if (computer.radio.subspace) - if(emergency_shuttle.online() && emergency_shuttle.location()) - var/timeleft = emergency_shuttle.estimate_arrival_time() - dat += "Emergency shuttle\n
\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]
" - refresh = 1 - else - refresh = 0 - if (authenticated) - dat += "
\[ Log Out \]" - if (authenticated==2) - dat += "
\[ Make An Announcement \]" - if(computer.emagged == 0) - dat += "
\[ Send an emergency message to Centcomm \]" - else - dat += "
\[ Send an emergency message to \[UNKNOWN\] \]" - dat += "
\[ Restore Backup Routing Data \]" - - dat += "
\[ Change alert level \]" - if(emergency_shuttle.location()) - if (emergency_shuttle.online()) - dat += "
\[ Cancel Shuttle Call \]" - else - dat += "
\[ Call Emergency Shuttle \]" - - dat += "
\[ Set Status Display \]" - else - dat += "
\[ Log In \]" - dat += "
\[ Message List \]" - return dat - - proc/confirm_menu(var/prompt,var/yes_option) - return "Are you sure you want to [prompt]? \[ [topic_link(src,yes_option,"OK")] | [topic_link(src,"main","Cancel")] \]" - - interact() - if(!interactable()) - return - if(!computer.radio) - computer.Crash(MISSING_PERIPHERAL) - return - - var/dat = "" - switch(state) - if(STATE_DEFAULT) - dat = main_menu() - if(STATE_CALLSHUTTLE) - dat = confirm_menu("call the shuttle","callshuttle2") - if(STATE_CANCELSHUTTLE) - dat = confirm_menu("cancel the shuttle","cancelshuttle2") - if(STATE_MESSAGELIST) - dat += "Messages:" - for(var/i = 1; i<=messagetitle.len; i++) - dat += "
[messagetitle[i]]" - if(STATE_VIEWMESSAGE) - if (currmsg) - dat += "[messagetitle[currmsg]]

[messagetext[currmsg]]" - if (authenticated) - dat += "

\[ Delete \]" - else - state = STATE_MESSAGELIST - interact() - return - if(STATE_DELMESSAGE) - if (currmsg) - dat += "Are you sure you want to delete this message? \[ OK | Cancel \]" - else - state = STATE_MESSAGELIST - interact() - return - if(STATE_STATUSDISPLAY) - dat += "\[ Back \]
" - dat += "Set Status Displays
" - dat += "\[ Clear \]
" - dat += "\[ Station Time \]" - dat += "\[ Shuttle ETA \]
" - dat += "\[ Message \]" - dat += "
" - dat += "\[ Alert: None |" - dat += " Red Alert |" - dat += " Lockdown |" - dat += " Biohazard \]

" - if(STATE_ALERT_LEVEL) - dat += "Current alert level: [get_security_level()]
" - if(security_level == SEC_LEVEL_DELTA) - dat += "The self-destruct mechanism is active. Find a way to deactivate the mechanism to lower the alert level or evacuate." - else - dat += "Blue
" - dat += "Green" - if(STATE_CONFIRM_LEVEL) - dat += "Current alert level: [get_security_level()]
" - dat += "Confirm the change to: [num2seclevel(tmp_alertlevel)]
" - dat += "Swipe ID to confirm change.
" - - popup.set_content(dat) - popup.open() - - - proc/post_status(var/command, var/data1, var/data2) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435) - - if(!frequency) return - - var/datum/signal/status_signal = new - status_signal.source = src - status_signal.transmission_method = 1 - status_signal.data["command"] = command - - switch(command) - if("message") - status_signal.data["msg1"] = data1 - status_signal.data["msg2"] = data2 - if("alert") - status_signal.data["picture_state"] = data1 - - frequency.post_signal(src, status_signal) diff --git a/code/game/machinery/computer3/computers/crew.dm b/code/game/machinery/computer3/computers/crew.dm deleted file mode 100644 index 836500a3440..00000000000 --- a/code/game/machinery/computer3/computers/crew.dm +++ /dev/null @@ -1,75 +0,0 @@ -/obj/machinery/computer3/crew - default_prog = /datum/file/program/crew - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio) - icon_state = "frame-med" - -/datum/file/program/crew - name = "Crew Monitoring Console" - desc = "Used to monitor active health sensors built into most of the crew's uniforms." - active_state = "crew" - var/list/tracked = list( ) - - interact(mob/user) - if(!interactable()) - return - - scan() - var/t = "Crew Monitoring
" - t += "
Refresh " - t += "Close
" - t += "" - var/list/logs = list() - for(var/obj/item/clothing/under/C in src.tracked) - var/log = "" - var/turf/pos = get_turf(C) - if((C) && (C.has_sensor) && (pos) && (pos.z == computer.z) && C.sensor_mode) - if(istype(C.loc, /mob/living/carbon/human)) - - var/mob/living/carbon/human/H = C.loc - - var/dam1 = round(H.getOxyLoss(),1) - var/dam2 = round(H.getToxLoss(),1) - var/dam3 = round(H.getFireLoss(),1) - var/dam4 = round(H.getBruteLoss(),1) - - var/life_status = "[H.stat > 1 ? "Deceased" : "Living"]" - var/damage_report = "([dam1]/[dam2]/[dam3]/[dam4])" - - log += "" - - switch(C.sensor_mode) - if(1) - log += "" - if(2) - log += "" - if(3) - var/area/player_area = get_area(H) - log += "" - logs += log - logs = sortList(logs) - for(var/log in logs) - t += log - t += "
NameVitalsPosition
[H.get_authentification_name()] ([H.get_assignment()])[life_status]Not Available
[life_status] [damage_report]Not Available
[life_status] [damage_report][sanitize(player_area.name)] ([pos.x], [pos.y])
" - t += "
" - - popup.set_content(t) - popup.open() - - - proc/scan() - for(var/obj/item/clothing/under/C in world) - if((C.has_sensor) && (istype(C.loc, /mob/living/carbon/human))) - tracked |= C - return 1 - - Topic(href, list/href_list) - if(!interactable() || !computer.cardslot || ..(href,href_list)) - return - if( href_list["close"] ) - usr << browse(null, "window=crewcomp") - usr.unset_machine() - return - if(href_list["update"]) - interact() - //src.updateUsrDialog() - return diff --git a/code/game/machinery/computer3/computers/customs.dm b/code/game/machinery/computer3/computers/customs.dm deleted file mode 100644 index bca73055b8f..00000000000 --- a/code/game/machinery/computer3/computers/customs.dm +++ /dev/null @@ -1,3 +0,0 @@ -/obj/machinery/computer3/customs - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace,/obj/item/part/computer/networking/cameras) - spawn_files = list(/datum/file/program/arcade,/datum/file/program/security,/datum/file/camnet_key/entertainment,/datum/file/program/crew) \ No newline at end of file diff --git a/code/game/machinery/computer3/computers/law.dm b/code/game/machinery/computer3/computers/law.dm deleted file mode 100644 index 409552cc79a..00000000000 --- a/code/game/machinery/computer3/computers/law.dm +++ /dev/null @@ -1,84 +0,0 @@ - - -/obj/machinery/computer3/aiupload - name = "AI Upload" - desc = "Used to upload laws to the AI." - icon_state = "frame-rnd" - circuit = "/obj/item/part/board/circuit/aiupload" - var/mob/living/silicon/ai/current = null - var/opened = 0 - - - verb/AccessInternals() - set category = "Object" - set name = "Access Computer's Internals" - set src in oview(1) - if(!Adjacent(usr) || usr.restrained() || usr.lying || usr.stat || istype(usr, /mob/living/silicon) || !istype(usr, /mob/living)) - return - - opened = !opened - if(opened) - usr << "\blue The access panel is now open." - else - usr << "\blue The access panel is now closed." - return - - - attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob) - if (user.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" - return - if(istype(module, /obj/item/weapon/aiModule)) - module.install(src) - else - return ..() - - - attack_hand(var/mob/user as mob) - if(src.stat & NOPOWER) - usr << "The upload computer has no power!" - return - if(src.stat & BROKEN) - usr << "The upload computer is broken!" - return - - src.current = select_active_ai(user) - - if (!src.current) - usr << "No active AIs detected." - else - usr << "[src.current.name] selected for law changes." - return - - - -/obj/machinery/computer3/borgupload - name = "Cyborg Upload" - desc = "Used to upload laws to Cyborgs." - icon_state = "frame-rnd" - circuit = "/obj/item/part/board/circuit/borgupload" - var/mob/living/silicon/robot/current = null - - - attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob) - if(istype(module, /obj/item/weapon/aiModule)) - module.install(src) - else - return ..() - - - attack_hand(var/mob/user as mob) - if(src.stat & NOPOWER) - usr << "The upload computer has no power!" - return - if(src.stat & BROKEN) - usr << "The upload computer is broken!" - return - - src.current = freeborg() - - if (!src.current) - usr << "No free cyborgs detected." - else - usr << "[src.current.name] selected for law changes." - return diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm deleted file mode 100644 index 0533f7bc0ff..00000000000 --- a/code/game/machinery/computer3/computers/medical.dm +++ /dev/null @@ -1,531 +0,0 @@ -/* - I hate to make this a todo, but I cannot possibly complete all of computer3 - if I have to rearchitecture datacores and everything else that uses them right now. - - In the future the datacore should probably be a server, perhaps on station, perhaps on centcom, - with data records as files probably. It's not difficult unless you're trying to do a million - impossible things before breakfast. -*/ - -/obj/machinery/computer3/med_data - default_prog = /datum/file/program/med_data - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio) - - -/obj/machinery/computer3/laptop/medical - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio) - spawn_files = list(/datum/file/program/arcade,/datum/file/program/crew,/datum/file/program/med_data) - -/datum/file/program/med_data - name = "Medical Records" - desc = "This can be used to check medical records." - active_state = "medcomp" - req_one_access = list(access_medical, access_forensics_lockers) - - var/obj/item/weapon/card/id/scan = null - var/obj/item/weapon/card/id/scan2 = null - var/authenticated = null - var/rank = null - var/screen = null - var/datum/data/record/active1 = null - var/datum/data/record/active2 = null - var/a_id = null - var/temp = null - var/printing = null - - - proc/authenticate() - if(access_medical in scan.access) - return 1 - if(istype(usr,/mob/living/silicon/ai)) - return 1 - return 0 - - interact() - if(!computer.cardslot) - computer.Crash(MISSING_PERIPHERAL) - return - usr.set_machine(src) - scan = computer.cardslot.reader - if(!interactable()) - return - if (computer.z > 6) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" - return - var/dat - - if (temp) - dat = text("[src.temp]

Clear Screen") - else - dat = text("Confirm Identity (R): []
", src, (scan ? text("[]", scan.name) : "----------")) - if (computer.cardslot.dualslot) - dat += text("Check Identity (W): []
", src, (scan2 ? text("[]", scan2.name) : "----------")) - if(scan2 && !scan) - dat += text("
Insert card into reader slot to log in.

") - - if (src.authenticated) - switch(src.screen) - if(1.0) - dat += {" -Search Records -
List Records -
-
Virus Database -
Medbot Tracking -
-
Record Maintenance -
{Log Out}
-"} - if(2.0) - dat += "Record List:
" - if(!isnull(data_core.general)) - for(var/datum/data/record/R in sortRecord(data_core.general)) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) - //Foreach goto(132) - dat += text("
Back", src) - if(3.0) - dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) - if(4.0) - dat += "
Medical Record

" - if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) - var/icon/front = active1.fields["photo_front"] - var/icon/side = active1.fields["photo_side"] - usr << browse_rsc(front, "front.png") - usr << browse_rsc(side, "side.png") - - dat += "
Name: [active1.fields["name"]] \ - ID: [active1.fields["id"]]
\n \ - Sex: [active1.fields["sex"]]
\n \ - Age: [active1.fields["age"]]
\n \ - Fingerprint: [active1.fields["fingerprint"]]
\n \ - Physical Status: [active1.fields["p_stat"]]
\n \ - Mental Status: [active1.fields["m_stat"]]
\ - Photo:
" - else - dat += "General Record Lost!
" - if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) - dat += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src, src.active2.fields["b_type"], src, src.active2.fields["b_dna"], src, src.active2.fields["mi_dis"], src, src.active2.fields["mi_dis_d"], src, src.active2.fields["ma_dis"], src, src.active2.fields["ma_dis_d"], src, src.active2.fields["alg"], src, src.active2.fields["alg_d"], src, src.active2.fields["cdi"], src, src.active2.fields["cdi_d"], src, decode(src.active2.fields["notes"])) - var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) - dat += text("[]
Delete Entry

", src.active2.fields[text("com_[]", counter)], src, counter) - counter++ - dat += text("Add Entry

", src) - dat += text("Delete Record (Medical Only)

", src) - else - dat += "Medical Record Lost!
" - dat += text("New Record

") - dat += text("\nPrint Record
\nBack
", src, src) - if(5.0) - dat += "
Virus Database
" - /* Advanced diseases is weak! Feeble! Glory to virus2! - for(var/Dt in typesof(/datum/disease/)) - var/datum/disease/Dis = new Dt(0) - if(istype(Dis, /datum/disease/advance)) - continue // TODO (tm): Add advance diseases to the virus database which no one uses. - if(!Dis.desc) - continue - dat += "
[Dis.name]" - */ - for (var/ID in virusDB) - var/datum/data/record/v = virusDB[ID] - dat += "
[v.fields["name"]]" - - dat += "
Back" - if(6.0) - dat += "
Medical Robot Monitor
" - dat += "Back" - dat += "
Medical Robots:" - var/bdat = null - 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) - if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up - bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"]
" - if((!isnull(M.reagent_glass)) && M.use_beaker) - bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\]
" - else - bdat += "Using Internal Synthesizer.
" - if(!bdat) - dat += "
None detected
" - else - dat += "
[bdat]" - - else - else - dat += text("{Log In}", src) - popup.width = 600 - popup.height = 400 - popup.set_content(dat) - popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state)) - popup.open() - return - - Topic(href, href_list) - if(!interactable() || !computer.cardslot || ..(href,href_list)) - return - if (!( data_core.general.Find(src.active1) )) - src.active1 = null - if (!( data_core.medical.Find(src.active2) )) - src.active2 = null - - if (href_list["temp"]) - src.temp = null - - if (href_list["cardr"]) - if (scan) - if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand()) - computer.cardslot.remove(1) - else - scan.loc = get_turf(src) - scan = null - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - computer.cardslot.insert(I, 1) - scan = I - - if (href_list["cardw"]) - if (scan2) - if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand()) - computer.cardslot.remove(2) - else - scan2.loc = get_turf(src) - scan2 = null - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - computer.cardslot.insert(I, 2) - scan2 = I - - else if (href_list["logout"]) - src.authenticated = null - src.screen = null - src.active1 = null - src.active2 = null - - else if (href_list["login"]) - - if (istype(usr, /mob/living/silicon/ai)) - src.active1 = null - src.active2 = null - src.authenticated = usr.name - src.rank = "AI" - src.screen = 1 - - else if (istype(usr, /mob/living/silicon/robot)) - src.active1 = null - src.active2 = null - src.authenticated = usr.name - var/mob/living/silicon/robot/R = usr - src.rank = "[R.modtype] [R.braintype]" - src.screen = 1 - - else if (istype(src.scan, /obj/item/weapon/card/id)) - src.active1 = null - src.active2 = null - - if (src.check_access(src.scan)) - src.authenticated = src.scan.registered_name - src.rank = src.scan.assignment - src.screen = 1 - - if (src.authenticated) - - if(href_list["screen"]) - src.screen = text2num(href_list["screen"]) - if(src.screen < 1) - src.screen = 1 - - src.active1 = null - src.active2 = null - - if(href_list["vir"]) - var/datum/data/record/v = locate(href_list["vir"]) - src.temp = "
GNAv2 based virus lifeform V-[v.fields["id"]]
" - src.temp += "
Name: [v.fields["name"]]" - src.temp += "
Antigen: [v.fields["antigen"]]" - src.temp += "
Spread: [v.fields["spread type"]] " - src.temp += "
Details:
[v.fields["description"]]" - - if (href_list["del_all"]) - src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) - - if (href_list["del_all2"]) - for(var/datum/data/record/R in data_core.medical) - //R = null - qdel(R) - //Foreach goto(494) - src.temp = "All records deleted." - - if (href_list["field"]) - var/a1 = src.active1 - var/a2 = src.active2 - switch(href_list["field"]) - if("fingerprint") - if (istype(src.active1, /datum/data/record)) - var/t1 = sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) - return - src.active1.fields["fingerprint"] = t1 - if("sex") - if (istype(src.active1, /datum/data/record)) - if (src.active1.fields["sex"] == "Male") - src.active1.fields["sex"] = "Female" - else - src.active1.fields["sex"] = "Male" - if("age") - if (istype(src.active1, /datum/data/record)) - var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) - return - src.active1.fields["age"] = t1 - if("mi_dis") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["mi_dis"] = t1 - if("mi_dis_d") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["mi_dis_d"] = t1 - if("ma_dis") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["ma_dis"] = t1 - if("ma_dis_d") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["ma_dis_d"] = t1 - if("alg") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["alg"] = t1 - if("alg_d") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["alg_d"] = t1 - if("cdi") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["cdi"] = t1 - if("cdi_d") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["cdi_d"] = t1 - if("notes") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message, extra = 0) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["notes"] = t1 - if("p_stat") - if (istype(src.active1, /datum/data/record)) - src.temp = text("Physical Condition:
\n\t*Deceased*
\n\t*SSD*
\n\tActive
\n\tPhysically Unfit
\n\tDisabled
", src, src, src, src, src) - if("m_stat") - if (istype(src.active1, /datum/data/record)) - src.temp = text("Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
", src, src, src, src) - if("b_type") - if (istype(src.active2, /datum/data/record)) - src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) - if("b_dna") - if (istype(src.active2, /datum/data/record)) - var/t1 = sanitize(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - src.active2.fields["b_dna"] = t1 - if("vir_name") - var/datum/data/record/v = locate(href_list["edit_vir"]) - if (v) - var/t1 = sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) - return - v.fields["name"] = t1 - if("vir_desc") - var/datum/data/record/v = locate(href_list["edit_vir"]) - if (v) - var/t1 = sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) - return - v.fields["description"] = t1 - else - - if (href_list["p_stat"]) - if (src.active1) - switch(href_list["p_stat"]) - if("deceased") - src.active1.fields["p_stat"] = "*Deceased*" - if("ssd") - src.active1.fields["p_stat"] = "*SSD*" - if("active") - src.active1.fields["p_stat"] = "Active" - if("unfit") - src.active1.fields["p_stat"] = "Physically Unfit" - if("disabled") - src.active1.fields["p_stat"] = "Disabled" - if(PDA_Manifest.len) - PDA_Manifest.Cut() - - if (href_list["m_stat"]) - if (src.active1) - switch(href_list["m_stat"]) - if("insane") - src.active1.fields["m_stat"] = "*Insane*" - if("unstable") - src.active1.fields["m_stat"] = "*Unstable*" - if("watch") - src.active1.fields["m_stat"] = "*Watch*" - if("stable") - src.active1.fields["m_stat"] = "Stable" - - - if (href_list["b_type"]) - if (src.active2) - switch(href_list["b_type"]) - if("an") - src.active2.fields["b_type"] = "A-" - if("bn") - src.active2.fields["b_type"] = "B-" - if("abn") - src.active2.fields["b_type"] = "AB-" - if("on") - src.active2.fields["b_type"] = "O-" - if("ap") - src.active2.fields["b_type"] = "A+" - if("bp") - src.active2.fields["b_type"] = "B+" - if("abp") - src.active2.fields["b_type"] = "AB+" - if("op") - src.active2.fields["b_type"] = "O+" - - - if (href_list["del_r"]) - if (src.active2) - src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
", src, src) - - if (href_list["del_r2"]) - if (src.active2) - //src.active2 = null - qdel(src.active2) - - if (href_list["d_rec"]) - var/datum/data/record/R = locate(href_list["d_rec"]) - var/datum/data/record/M = locate(href_list["d_rec"]) - if (!( data_core.general.Find(R) )) - src.temp = "Record Not Found!" - return - for(var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - else - //Foreach continue //goto(2540) - src.active1 = R - src.active2 = M - src.screen = 4 - - if (href_list["new"]) - if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) ))) - var/datum/data/record/R = new /datum/data/record( ) - R.fields["name"] = src.active1.fields["name"] - R.fields["id"] = src.active1.fields["id"] - R.name = text("Medical Record #[]", R.fields["id"]) - R.fields["b_type"] = "Unknown" - R.fields["b_dna"] = "Unknown" - R.fields["mi_dis"] = "None" - R.fields["mi_dis_d"] = "No minor disabilities have been declared." - R.fields["ma_dis"] = "None" - R.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - R.fields["alg"] = "None" - R.fields["alg_d"] = "No allergies have been detected in this patient." - R.fields["cdi"] = "None" - R.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - R.fields["notes"] = "No notes." - data_core.medical += R - src.active2 = R - src.screen = 4 - - if (href_list["add_c"]) - if (!( istype(src.active2, /datum/data/record) )) - return - var/a2 = src.active2 - var/t1 = sanitize(input("Add Comment:", "Med. records", null, null) as message) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) - return - var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) - counter++ - src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]") - - if (href_list["del_c"]) - if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) - src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" - - if (href_list["search"]) - var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text - if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!interactable()) && (!istype(usr, /mob/living/silicon))))) - return - src.active1 = null - src.active2 = null - t1 = lowertext(t1) - for(var/datum/data/record/R in data_core.medical) - if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))) - src.active2 = R - else - //Foreach continue //goto(3229) - if (!( src.active2 )) - src.temp = text("Could not locate record [].", t1) - else - for(var/datum/data/record/E in data_core.general) - if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) - src.active1 = E - else - //Foreach continue //goto(3334) - src.screen = 4 - - if (href_list["print_p"]) - if (!( src.printing )) - src.printing = 1 - var/datum/data/record/record1 = null - var/datum/data/record/record2 = null - if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) - record1 = active1 - if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) - record2 = active2 - sleep(50) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc ) - P.info = "
Medical Record

" - if (record1) - P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"]) - P.name = text("Medical Record ([])", record1.fields["name"]) - else - P.info += "General Record Lost!
" - P.name = "Medical Record" - if (record2) - P.info += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", record2.fields["b_type"], record2.fields["b_dna"], record2.fields["mi_dis"], record2.fields["mi_dis_d"], record2.fields["ma_dis"], record2.fields["ma_dis_d"], record2.fields["alg"], record2.fields["alg_d"], record2.fields["cdi"], record2.fields["cdi_d"], decode(record2.fields["notes"])) - var/counter = 1 - while(record2.fields[text("com_[]", counter)]) - P.info += text("[]
", record2.fields[text("com_[]", counter)]) - counter++ - else - P.info += "Medical Record Lost!
" - P.info += "" - src.printing = null - - interact() - return \ No newline at end of file diff --git a/code/game/machinery/computer3/computers/power.dm b/code/game/machinery/computer3/computers/power.dm deleted file mode 100644 index 6e27da05688..00000000000 --- a/code/game/machinery/computer3/computers/power.dm +++ /dev/null @@ -1,48 +0,0 @@ -/obj/machinery/computer3/powermonitor - default_prog = /datum/file/program/powermon - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/cable) - icon_state = "frame-eng" - -/datum/file/program/powermon - name = "power monitoring console" - desc = "It monitors APC status." - active_state = "power" - - proc/format(var/obj/machinery/power/apc/A) - var/static/list/S = list(" Off","AOff"," On", " AOn") - var/static/list/chg = list("N","C","F") - return "[copytext(add_tspace("\The [A.area]", 30), 1, 30)] [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] \ - [add_lspace(A.lastused_total, 6)] [A.cell ? "[add_lspace(round(A.cell.percent()), 3)]% [chg[A.charging+1]]" : " N/C"]
" - - interact() - if(!interactable()) - return - if(!computer.net) - computer.Crash(MISSING_PERIPHERAL) - return - var/list/L = computer.net.get_machines(/obj/machinery/power/apc) - var/t = "" - t += "Refresh

" - if(!L || !L.len) - t += "No connection" - else - var/datum/powernet/powernet = computer.net.connect_to(/datum/powernet,null) - if(powernet) - t += "
Total power: [powernet.avail] W
Total load: [num2text(powernet.viewload,10)] W
" - else - t += "
Power statistics unavailable
" - t += "" - - if(L.len > 0) - t += "Area Eqp./Lgt./Env. Load Cell
" - for(var/obj/machinery/power/apc/A in L) - t += src.format(A) - t += "
" - - popup.set_content(t) - popup.open() - - Topic(var/href, var/list/href_list) - if(!interactable() || ..(href,href_list)) - return - interact() diff --git a/code/game/machinery/computer3/computers/prisoner.dm b/code/game/machinery/computer3/computers/prisoner.dm deleted file mode 100644 index 49f1940d754..00000000000 --- a/code/game/machinery/computer3/computers/prisoner.dm +++ /dev/null @@ -1,104 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/obj/machinery/computer3/prisoner - default_prog = /datum/file/program/prisoner - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio) - icon_state = "frame-sec" - -/datum/file/program/prisoner - name = "Prisoner Management Console" - active_state = "explosive" - req_access = list(access_armory) - - var/id = 0.0 - var/temp = null - var/status = 0 - var/timeleft = 60 - var/stop = 0.0 - var/screen = 0 // 0 - No Access Denied, 1 - Access allowed - - - interact() - if(!interactable()) - return - var/dat - dat += "Prisoner Implant Manager System
" - if(screen == 0) - dat += "
Unlock Console" - else if(screen == 1) - dat += "
Chemical Implants
" - var/turf/Tr = null - for(var/obj/item/weapon/implant/chem/C in world) - Tr = get_turf(C) - if((Tr) && (Tr.z != computer.z)) continue//Out of range - if(!C.implanted) continue - dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: " - dat += "((1))" - dat += "((5))" - dat += "((10))
" - dat += "********************************
" - dat += "
Tracking Implants
" - for(var/obj/item/weapon/implant/tracking/T in world) - Tr = get_turf(T) - if((Tr) && (Tr.z != computer.z)) continue//Out of range - if(!T.implanted) continue - var/loc_display = "Unknown" - var/mob/living/carbon/M = T.imp_in - if(M.z in config.station_levels && !istype(M.loc, /turf/space)) - var/turf/mob_loc = get_turf(M) - loc_display = mob_loc.loc - if(T.malfunction) - loc_display = pick(teleportlocs) - dat += "ID: [T.id] | Location: [loc_display]
" - dat += "(Send Message
) |
" - dat += "********************************
" - dat += "
Lock Console" - - popup.width = 400 - popup.height = 500 - popup.set_content(dat) - popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state)) - popup.open() - return - - - process() - if(!..()) - interact() - return - - - Topic(href, href_list) - if(!interactable() || ..(href,href_list)) - return - - if(href_list["inject1"]) - var/obj/item/weapon/implant/I = locate(href_list["inject1"]) - if(istype(I)) - I.activate(1) - - else if(href_list["inject5"]) - var/obj/item/weapon/implant/I = locate(href_list["inject5"]) - if(istype(I)) - I.activate(5) - - else if(href_list["inject10"]) - var/obj/item/weapon/implant/I = locate(href_list["inject10"]) - if(istype(I)) - I.activate(10) - - else if(href_list["lock"]) - screen = !screen - - else if(href_list["warn"]) - var/warning = sanitize(input(usr,"Message:","Enter your message here!","")) - if(!warning) return - var/obj/item/weapon/implant/I = locate(href_list["warn"]) - if( istype(I) && I.imp_in) - var/mob/living/carbon/R = I.imp_in - log_say("PrisonComputer3 message: [key_name(usr)]->[key_name(R)] : [warning]") - R << "\green You hear a voice in your head saying: '[warning]'" - - interact() - return - - diff --git a/code/game/machinery/computer3/computers/robot.dm b/code/game/machinery/computer3/computers/robot.dm deleted file mode 100644 index 3083a986c78..00000000000 --- a/code/game/machinery/computer3/computers/robot.dm +++ /dev/null @@ -1,211 +0,0 @@ -/obj/machinery/computer3/robotics - default_prog = /datum/file/program/borg_control - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio) - icon_state = "frame-rnd" - -/datum/file/program/borg_control - name = "Cyborg Control" - desc = "Used to remotely lockdown or detonate linked Cyborgs." - active_state = "robot" - var/id = 0.0 - var/temp = null - var/status = 0 - var/timeleft = 60 - var/stop = 0.0 - var/screen = 0 // 0 - Main Menu, 1 - Cyborg Status, 2 - Kill 'em All! -- In text - req_access = list(access_robotics) - - proc/start_sequence() - do - if(src.stop) - src.stop = 0 - return - src.timeleft-- - sleep(10) - while(src.timeleft) - - for(var/mob/living/silicon/robot/R in mob_list) - if(!R.scrambledcodes) - R.self_destruct() - return - - - interact() - if(!interactable() || computer.z > 6) - return - var/dat - if (src.temp) - dat = "[src.temp]

Clear Screen" - else - if(screen == 0) - //dat += "

Cyborg Control Console


" - dat += "1. Cyborg Status
" - dat += "2. Emergency Full Destruct
" - if(screen == 1) - for(var/mob/living/silicon/robot/R in mob_list) - if(istype(usr, /mob/living/silicon/ai)) - if (R.connected_ai != usr) - continue - if(istype(usr, /mob/living/silicon/robot)) - if (R != usr) - continue - if(R.scrambledcodes) - continue - - dat += "[R.name] |" - if(R.stat) - dat += " Not Responding |" - else if (!R.canmove) - dat += " Locked Down |" - else - dat += " Operating Normally |" - if (!R.canmove) - else if(R.cell) - dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |" - else - dat += " No Cell Installed |" - if(R.module) - dat += " Module Installed ([R.module.name]) |" - else - dat += " No Module Installed |" - if(R.connected_ai) - dat += " Slaved to [R.connected_ai.name] |" - else - dat += " Independent from AI |" - if (istype(usr, /mob/living/silicon)) - if(issilicon(usr) && is_special_character(usr) && !R.emagged) - dat += "(Hack) " - dat += "([R.canmove ? "Lockdown" : "Release"]) " - dat += "(Destroy)" - dat += "
" - dat += "(Return to Main Menu)
" - if(screen == 2) - if(!src.status) - dat += {"
Emergency Robot Self-Destruct
\nStatus: Off
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
- \nStart Sequence
- \n
- \nClose"} - else - dat = {"Emergency Robot Self-Destruct
\nStatus: Activated
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
\nStop Sequence
- \n
- \nClose"} - dat += "(Return to Main Menu)
" - - popup.set_content(dat) - popup.open() - return - - Topic(var/href, var/list/href_list) - if(!interactable() || ..(href,href_list)) - return - - if ("killall" in href_list) - src.temp = {"Destroy Robots?
-
\[Swipe ID to initiate destruction sequence\]
- Cancel"} - - if ("do_killall" in href_list) - var/obj/item/weapon/card/id/I = usr.get_active_hand() - if (istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/pda = I - I = pda.id - if (istype(I)) - if(src.check_access(I)) - if (!status) - message_admins("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!") - log_game("\blue [key_name(usr)] has initiated the global cyborg killswitch!") - src.status = 1 - src.start_sequence() - src.temp = null - - else - usr << "\red Access Denied." - - if ("stop" in href_list) - src.temp = {" - Stop Robot Destruction Sequence?
-
Yes
- No"} - - if ("stop2" in href_list) - src.stop = 1 - src.temp = null - src.status = 0 - - if ("reset" in href_list) - src.timeleft = 60 - - if ("temp" in href_list) - src.temp = null - if ("screen" in href_list) - switch(href_list["screen"]) - if("0") - screen = 0 - if("1") - screen = 1 - if("2") - screen = 2 - if ("killbot" in href_list) - if(computer.allowed(usr)) - var/mob/living/silicon/robot/R = locate(href_list["killbot"]) - if(R) - var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort") - if(choice == "Confirm") - if(R && istype(R)) - if(R.mind && R.mind.special_role && R.emagged) - R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered." - R.ResetSecurityCodes() - - else - message_admins("[key_name_admin(usr)] detonated [key_name(R.name)]!") - log_game("[key_name_admin(usr)] detonated [key_name(R.name)]!") - if(R.connected_ai) - R.connected_ai << "

ALERT - Cyborg kill-switch activated: [R.name]
" - R.self_destruct() - else - usr << "\red Access Denied." - - if ("stopbot" in href_list) - if(computer.allowed(usr)) - var/mob/living/silicon/robot/R = locate(href_list["stopbot"]) - if(R && istype(R)) // Extra sancheck because of input var references - var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort") - if(choice == "Confirm") - if(R && istype(R)) - message_admins("[key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!") - log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R.name)]!") - R.canmove = !R.canmove - if (R.lockcharge) - R.lockcharge = !R.lockcharge - R << "Your lockdown has been lifted!" - else - R.lockcharge = !R.lockcharge - R << "You have been locked down!" - - else - usr << "\red Access Denied." - - if ("magbot" in href_list) - if(computer.allowed(usr)) - var/mob/living/silicon/robot/R = locate(href_list["magbot"]) - if(R) - var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort") - if(choice == "Confirm") - if(R && istype(R)) -// message_admins("\blue [key_name_admin(usr)] emagged [R.name] using robotic console!") - log_game("[key_name(usr)] emagged [R.name] using robotic console!") - R.emagged = 1 - if(R.mind.special_role) - R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes - - interact() - return - - - diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm deleted file mode 100644 index 8a866586fd3..00000000000 --- a/code/game/machinery/computer3/computers/security.dm +++ /dev/null @@ -1,611 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/obj/machinery/computer3/secure_data - default_prog = /datum/file/program/secure_data - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio) - icon_state = "frame-sec" - -/obj/machinery/computer3/laptop/secure_data - default_prog = /datum/file/program/secure_data - spawn_parts = list(/obj/item/part/computer/storage/hdd/big,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio) - icon_state = "laptop" - - -/datum/file/program/secure_data - name = "Security Records" - desc = "Used to view and edit personnel's security records" - active_state = "security" - image = 'icons/ntos/records.png' - - req_one_access = list(access_security, access_forensics_lockers) - - var/obj/item/weapon/card/id/scan = null - var/obj/item/weapon/card/id/scan2 = null - var/authenticated = null - var/rank = null - var/screen = null - var/datum/data/record/active1 = null - var/datum/data/record/active2 = null - var/a_id = null - var/temp = null - var/printing = null - var/can_change_id = 0 - var/list/Perp - var/tempname = null - //Sorting Variables - var/sortBy = "name" - var/order = 1 // -1 = Descending - 1 = Ascending - - - - proc/authenticate() - if(access_security in scan.access || access_forensics_lockers in scan.access ) - return 1 - if(istype(usr,/mob/living/silicon/ai)) - return 1 - return 0 - - interact() - if(!computer.cardslot) - computer.Crash(MISSING_PERIPHERAL) - return - usr.set_machine(src) - scan = computer.cardslot.reader - - if (computer.cardslot.dualslot) - scan2 = computer.cardslot.writer - - if(!interactable()) - return - - if (computer.z > 6) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" - return - var/dat - - if (temp) - dat = text("[]

Clear Screen", temp, src) - else - dat = text("Confirm Identity (R): []
", src, (scan ? text("[]", scan.name) : "----------")) - if (computer.cardslot.dualslot) - dat += text("Check Identity (W): []
", src, (scan2 ? text("[]", scan2.name) : "----------")) - if(scan2 && !scan) - dat += text("
Insert card into reader slot to log in.

") - if (authenticated) - switch(screen) - if(1.0) - dat += {" -

"} - dat += text("Search Records
", src) - dat += text("New Record
", src) - dat += {" -

- - - - -
Records:
- - - - - - - - "} - if(!isnull(data_core.general)) - for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order)) - var/crimstat = "" - for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) - crimstat = E.fields["criminal"] - var/background - switch(crimstat) - if("*Arrest*") - background = "'background-color:#DC143C;'" - if("Incarcerated") - background = "'background-color:#CD853F;'" - if("Parolled") - background = "'background-color:#CD853F;'" - if("Released") - background = "'background-color:#3BB9FF;'" - if("None") - background = "'background-color:#00FF00;'" - if("") - background = "'background-color:#00FF7F;'" - crimstat = "No Record." - dat += text("", background, src, R, R.fields["name"]) - dat += text("", R.fields["id"]) - dat += text("", R.fields["rank"]) - dat += text("", R.fields["fingerprint"]) - dat += text("", crimstat) - dat += "
NameIDRankFingerprintsCriminal Status
[][][][][]

" - dat += text("Record Maintenance

", src) - dat += text("{Log Out}",src) - if(2.0) - dat += "Records Maintenance
" - dat += "
Delete All Records

Back" - if(3.0) - dat += "
Security Record

" - if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) - var/icon/front = active1.fields["photo_front"] - var/icon/side = active1.fields["photo_side"] - usr << browse_rsc(front, "front.png") - usr << browse_rsc(side, "side.png") - dat += text(" \ -
\ - Name: [active1.fields["name"]]
\ - ID: [active1.fields["id"]]
\n \ - Sex: [active1.fields["sex"]]
\n \ - Age: [active1.fields["age"]]
\n \ - Rank: [active1.fields["rank"]]
\n \ - Fingerprint: [active1.fields["fingerprint"]]
\n \ - Physical Status: [active1.fields["p_stat"]]
\n \ - Mental Status: [active1.fields["m_stat"]]
Photo:
\ -
") - else - dat += "General Record Lost!
" - if ((istype(active2, /datum/data/record) && data_core.security.Find(active2))) - dat += text("
\n
Security Data

\nCriminal Status: []
\n
\nMinor Crimes: []
\nDetails: []
\n
\nMajor Crimes: []
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src, active2.fields["criminal"], src, active2.fields["mi_crim"], src, active2.fields["mi_crim_d"], src, active2.fields["ma_crim"], src, active2.fields["ma_crim_d"], src, decode(active2.fields["notes"])) - var/counter = 1 - while(active2.fields[text("com_[]", counter)]) - dat += text("[]
Delete Entry

", active2.fields[text("com_[]", counter)], src, counter) - counter++ - dat += text("Add Entry

", src) - dat += text("Delete Record (Security Only)

", src) - else - dat += "Security Record Lost!
" - dat += text("New Security Record

", src) - dat += text("\nDelete Record (ALL)

\nPrint Record
\nBack
", src, src, src) - if(4.0) - if(!Perp.len) - dat += text("ERROR. String could not be located.

Back", src) - else - dat += {" - - "} - dat += text("", tempname) - dat += {" - -
Search Results for '[]':
- - - - - - - - "} - for(var/i=1, i<=Perp.len, i += 2) - var/crimstat = "" - var/datum/data/record/R = Perp[i] - if(istype(Perp[i+1],/datum/data/record/)) - var/datum/data/record/E = Perp[i+1] - crimstat = E.fields["criminal"] - var/background - switch(crimstat) - if("*Arrest*") - background = "'background-color:#DC143C;'" - if("Incarcerated") - background = "'background-color:#CD853F;'" - if("Parolled") - background = "'background-color:#CD853F;'" - if("Released") - background = "'background-color:#3BB9FF;'" - if("None") - background = "'background-color:#00FF7F;'" - if("") - background = "'background-color:#FFFFFF;'" - crimstat = "No Record." - dat += text("", background, src, R, R.fields["name"]) - dat += text("", R.fields["id"]) - dat += text("", R.fields["rank"]) - dat += text("", R.fields["fingerprint"]) - dat += text("", crimstat) - dat += "
NameIDRankFingerprintsCriminal Status
[][][][][]

" - dat += text("
Return to index.", src) - else - else - dat += text("{Log In}", src) - popup.width = 600 - popup.height = 400 - popup.set_content(dat) - popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state)) - popup.open() - return - -/*Revised /N -I can't be bothered to look more of the actual code outside of switch but that probably needs revising too. -What a mess.*/ - Topic(href, href_list) - if(!interactable() || !computer.cardslot || ..(href,href_list)) - return - if (!( data_core.general.Find(active1) )) - active1 = null - if (!( data_core.security.Find(active2) )) - active2 = null - switch(href_list["choice"]) -// SORTING! - if("Sorting") - // Reverse the order if clicked twice - if(sortBy == href_list["sort"]) - if(order == 1) - order = -1 - else - order = 1 - else - // New sorting order! - sortBy = href_list["sort"] - order = initial(order) -//BASIC FUNCTIONS - if("Clear Screen") - temp = null - - if ("Return") - screen = 1 - active1 = null - active2 = null - - if("Confirm Identity R") - if (scan) - if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand()) - computer.cardslot.remove(1) - else - scan.loc = get_turf(src) - scan = null - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - computer.cardslot.insert(I, 1) - scan = I - - if("Confirm Identity W") - if (scan2) - if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand()) - computer.cardslot.remove(2) - else - scan2.loc = get_turf(src) - scan2 = null - else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - computer.cardslot.insert(I, 2) - scan2 = I - - if("Log Out") - authenticated = null - screen = null - active1 = null - active2 = null - - if("Log In") - if (istype(usr, /mob/living/silicon/ai)) - src.active1 = null - src.active2 = null - src.authenticated = usr.name - src.rank = "AI" - src.screen = 1 - else if (istype(usr, /mob/living/silicon/robot)) - src.active1 = null - src.active2 = null - src.authenticated = usr.name - var/mob/living/silicon/robot/R = usr - src.rank = "[R.modtype] [R.braintype]" - src.screen = 1 - else if (istype(scan, /obj/item/weapon/card/id)) - active1 = null - active2 = null - if(authenticate()) - authenticated = scan.registered_name - rank = scan.assignment - screen = 1 -//RECORD FUNCTIONS - if("Search Records") - var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text - if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !interactable())) - return - Perp = new/list() - t1 = lowertext(t1) - var/list/components = text2list(t1, " ") - if(components.len > 5) - return //Lets not let them search too greedily. - for(var/datum/data/record/R in data_core.general) - var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"] - for(var/i = 1, i<=components.len, i++) - if(findtext(temptext,components[i])) - var/prelist = new/list(2) - prelist[1] = R - Perp += prelist - for(var/i = 1, i<=Perp.len, i+=2) - for(var/datum/data/record/E in data_core.security) - var/datum/data/record/R = Perp[i] - if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) - Perp[i+1] = E - tempname = t1 - screen = 4 - - if("Record Maintenance") - screen = 2 - active1 = null - active2 = null - - if ("Browse Record") - var/datum/data/record/R = locate(href_list["d_rec"]) - var/S = locate(href_list["d_rec"]) - if (!( data_core.general.Find(R) )) - temp = "Record Not Found!" - else - for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - S = E - active1 = R - active2 = S - screen = 3 - -/* if ("Search Fingerprints") - var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text - if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!interactable()) && (!istype(usr, /mob/living/silicon)))) - return - active1 = null - active2 = null - t1 = lowertext(t1) - for(var/datum/data/record/R in data_core.general) - if (lowertext(R.fields["fingerprint"]) == t1) - active1 = R - if (!( active1 )) - temp = text("Could not locate record [].", t1) - else - for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"])) - active2 = E - screen = 3 */ - - if ("Print Record") - if (!( printing )) - printing = 1 - var/datum/data/record/record1 = null - var/datum/data/record/record2 = null - if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) - record1 = active1 - if ((istype(active2, /datum/data/record) && data_core.security.Find(active2))) - record2 = active2 - sleep(50) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc ) - P.info = "
Security Record

" - if (record1) - P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"]) - P.name = text("Security Record ([])", record1.fields["name"]) - else - P.info += "General Record Lost!
" - P.name = "Security Record" - if (record2) - P.info += text("
\n
Security Data

\nCriminal Status: []
\n
\nMinor Crimes: []
\nDetails: []
\n
\nMajor Crimes: []
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", record2.fields["criminal"], record2.fields["mi_crim"], record2.fields["mi_crim_d"], record2.fields["ma_crim"], record2.fields["ma_crim_d"], decode(record2.fields["notes"])) - var/counter = 1 - while(record2.fields[text("com_[]", counter)]) - P.info += text("[]
", record2.fields[text("com_[]", counter)]) - counter++ - else - P.info += "Security Record Lost!
" - P.info += "" - printing = null - computer.updateUsrDialog() -//RECORD DELETE - if ("Delete All Records") - temp = "" - temp += "Are you sure you wish to delete all Security records?
" - temp += "Yes
" - temp += "No" - - if ("Purge All Records") - for(var/datum/data/record/R in data_core.security) - qdel(R) - temp = "All Security records deleted." - - if ("Add Entry") - if (!( istype(active2, /datum/data/record) )) - return - var/a2 = active2 - var/t1 = sanitize(input("Add Comment:", "Secure. records", null, null) as message) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) - return - var/counter = 1 - while(active2.fields[text("com_[]", counter)]) - counter++ - active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]") - - if ("Delete Record (ALL)") - if (active1) - temp = "
Are you sure you wish to delete the record (ALL)?
" - temp += "Yes
" - temp += "No" - - if ("Delete Record (Security)") - if (active2) - temp = "
Are you sure you wish to delete the record (Security Portion Only)?
" - temp += "Yes
" - temp += "No" - - if ("Delete Entry") - if ((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) - active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" -//RECORD CREATE - if ("New Record (Security)") - if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) ))) - active2 = CreateSecurityRecord(active1.fields["name"], active1.fields["id"]) - screen = 3 - - if ("New Record (General)") - active1 = CreateGeneralRecord() - active2 = null - -//FIELD FUNCTIONS - if ("Edit Field") - var/a1 = active1 - var/a2 = active2 - switch(href_list["field"]) - if("name") - if (istype(active1, /datum/data/record)) - var/t1 = sanitizeName(input("Please input name:", "Secure. records", active1.fields["name"], null) as text) - if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon)))) || active1 != a1) - return - active1.fields["name"] = t1 - if("id") - if (istype(active2, /datum/data/record)) - var/t1 = sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) - return - active1.fields["id"] = t1 - if("fingerprint") - if (istype(active1, /datum/data/record)) - var/t1 = sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) - return - active1.fields["fingerprint"] = t1 - if("sex") - if (istype(active1, /datum/data/record)) - if (active1.fields["sex"] == "Male") - active1.fields["sex"] = "Female" - else - active1.fields["sex"] = "Male" - if("age") - if (istype(active1, /datum/data/record)) - var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) - return - active1.fields["age"] = t1 - if("mi_crim") - if (istype(active2, /datum/data/record)) - var/t1 = sanitize(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) - return - active2.fields["mi_crim"] = t1 - if("mi_crim_d") - if (istype(active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) - return - active2.fields["mi_crim_d"] = t1 - if("ma_crim") - if (istype(active2, /datum/data/record)) - var/t1 = sanitize(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) - return - active2.fields["ma_crim"] = t1 - if("ma_crim_d") - if (istype(active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) - return - active2.fields["ma_crim_d"] = t1 - if("notes") - if (istype(active2, /datum/data/record)) - var/t1 = sanitize(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message, extra = 0) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) - return - active2.fields["notes"] = t1 - if("criminal") - if (istype(active2, /datum/data/record)) - temp = "
Criminal Status:
" - temp += "" - if("rank") - var/list/L = list( "Head of Personnel", "Captain", "AI" ) - //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N - if ((istype(active1, /datum/data/record) && L.Find(rank))) - temp = "
Rank:
" - temp += "
    " - for(var/rank in joblist) - temp += "
  • [rank]
  • " - temp += "
" - else - alert(usr, "You do not have the required rank to do this!") - if("species") - if (istype(active1, /datum/data/record)) - var/t1 = sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) - return - active1.fields["species"] = t1 - -//TEMPORARY MENU FUNCTIONS - else//To properly clear as per clear screen. - temp=null - switch(href_list["choice"]) - if ("Change Rank") - if (active1) - active1.fields["rank"] = href_list["rank"] - if(href_list["rank"] in joblist) - active1.fields["real_rank"] = href_list["real_rank"] - - if ("Change Criminal Status") - if (active2) - for(var/mob/living/carbon/human/H in player_list) - BITSET(H.hud_updateflag, WANTED_HUD) - switch(href_list["criminal2"]) - if("none") - active2.fields["criminal"] = "None" - if("arrest") - active2.fields["criminal"] = "*Arrest*" - if("incarcerated") - active2.fields["criminal"] = "Incarcerated" - if("parolled") - active2.fields["criminal"] = "Parolled" - if("released") - active2.fields["criminal"] = "Released" - - if ("Delete Record (Security) Execute") - if (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"])) - qdel(R) - else - qdel(active1) - if (active2) - qdel(active2) - else - temp = "This function does not appear to be working at the moment. Our apologies." - - //computer.updateUsrDialog() - interact() - return - -/obj/machinery/computer3/secure_data/emp_act(severity) - if(stat & (BROKEN|NOPOWER)) - ..(severity) - return - - for(var/datum/data/record/R in data_core.security) - if(prob(10/severity)) - switch(rand(1,6)) - if(1) - R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]" - if(2) - R.fields["sex"] = pick("Male", "Female") - if(3) - R.fields["age"] = rand(5, 85) - if(4) - R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released") - if(5) - R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") - if(PDA_Manifest.len) - PDA_Manifest.Cut() - if(6) - R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") - continue - - else if(prob(1)) - qdel(R) - continue - - ..(severity) - -/obj/machinery/computer3/secure_data/detective_computer - icon = 'icons/obj/computer.dmi' - icon_state = "messyfiles" diff --git a/code/game/machinery/computer3/computers/welcome.dm b/code/game/machinery/computer3/computers/welcome.dm deleted file mode 100644 index 11695ce5322..00000000000 --- a/code/game/machinery/computer3/computers/welcome.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/machinery/computer3/laptop/vended - default_prog = /datum/file/program/welcome - - -/datum/file/program/welcome - name = "Welcome Screen" - desc = "First time boot splash screen" - active_state = "osod" - image = 'icons/ntos/program.png' - - - interact() - usr.set_machine(src) - if(!interactable()) - return - var/dat = "" - dat += "
Welcome to NTOS
" - dat += "
Thank you for choosing NTOS, your gateway to the future of mobile computing technology, sponsored by Nanotrasen (R)

" - dat += "Getting started with NTOS:
" - dat += "To leave a current program, click the X button in the top right corner of the window. This will return you to the NTOS desktop. \ - From the desktop, you can open the hard drive, usually located in the top left corner to access all the programs installed on your computer. \ - When you rented your laptop, you were supplied with programs that your Nanotrasen Issued ID has given you access to use. \ - In the event of a serious error, the right click menu will give you the ability to reset your computer. To open and close your laptop, alt-click your device.\ - If you have any questions or technical issues, please contact your local computer technical experts at your local Central Command." - popup.set_content(dat) - popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state)) - popup.open() - return - - Topic(href, href_list) - if(!interactable() || ..(href,href_list)) - return - interact() - return \ No newline at end of file diff --git a/code/game/machinery/computer3/file.dm b/code/game/machinery/computer3/file.dm deleted file mode 100644 index 1cbb363894a..00000000000 --- a/code/game/machinery/computer3/file.dm +++ /dev/null @@ -1,165 +0,0 @@ -// I am deciding that for sayustation's purposes directories are right out, -// we can't even get backpacks to work right with recursion, and that -// actually fucking matters. Metadata too, that can be added if ever needed. - -/* - Files are datums that can be stored in digital storage devices -*/ - -/datum/file - var/name = "File" - var/extension = "dat" - var/volume = 10 // in KB - var/image = 'icons/ntos/file.png' // determines the icon to use, found in icons/ntos - var/obj/machinery/computer3/computer // the parent computer, if fixed - var/obj/item/part/computer/storage/device // the device that is containing this file - var/hidden_file = 0 // Prevents file from showing up on NTOS program list. - var/drm = 0 // Copy protection, called by copy() and move() - var/readonly = 0 // Edit protection, called by edit(), which is just a failcheck proc - - proc/execute(var/datum/file/source) - return - - // - // Copy file to device. - // If you overwrite this function, use the return value to make sure it succeeded - // - proc/copy(var/obj/item/part/computer/storage/dest) - if(!computer || computer.crit_fail) return null - if(drm) - if(!computer.emagged) - return null - var/datum/file/F = new type() - if(!dest.addfile(F)) - return null // todo: arf here even though the player can't do a damn thing due to concurrency - return F - - // - // Move file to device - // Returns null on failure even though the existing file doesn't go away - // - proc/move(var/obj/item/part/computer/storage/dest) - if(!computer || computer.crit_fail) return null - if(drm) - if(!computer.emagged) - return null - var/obj/item/part/computer/storage/current = device - if(!dest.addfile(src)) - return null - current.removefile(src) - return src - - // - // Determines if the file is editable. This does not use the DRM flag, - // but instead the readonly flag. - // - - proc/edit() - if(!computer || computer.crit_fail) - return 0 - if(readonly && !computer.emagged) - return 0 // - return 1 - -/* - Centcom root authorization certificate - - Non-destructive, officially sanctioned. - Has the same effect on computers as an emag. -*/ -/datum/file/centcom_auth - name = "Centcom Root Access Token" - extension = "auth" - volume = 100 - copy() - return null - -/* - A file that contains information -*/ - -/datum/file/data - - var/content = "content goes here" - var/file_increment = 1 - var/binary = 0 // determines if the file can't be opened by editor - - // Set the content to a specific amount, increase filesize appropriately. - proc/set_content(var/text) - content = text - if(file_increment > 1) - volume = round(file_increment * length(text)) - - copy(var/obj/O) - var/datum/file/data/D = ..(O) - if(D) - D.content = content - D.readonly = readonly - - New() - if(content) - if(file_increment > 1) - volume = round(file_increment * length(content)) - -/* - A generic file that contains text -*/ - -/datum/file/data/text - name = "Text File" - extension = "txt" - image = 'icons/ntos/file.png' - content = "" - file_increment = 0.002 // 0.002 kilobytes per character (1024 characters per KB) - -/datum/file/data/text/ClownProphecy - name = "Clown Prophecy" - content = "HONKhHONKeHONKlHONKpHONKHONmKHONKeHONKHONKpHONKlHONKeHONKaHONKsHONKe" - - -/* - A file that contains research -*/ - -/datum/file/data/research - name = "Untitled Research" - binary = 1 - content = "Untitled Tier X Research" - var/datum/tech/stored // the actual tech contents - volume = 1440 - -/* - A file that contains genetic information -*/ - -/datum/file/data/genome - name = "Genetic Buffer" - binary = 1 - var/real_name = "Poop" - - -/datum/file/data/genome/SE - name = "Structural Enzymes" - -/datum/file/data/genome/UE - name = "Unique Enzymes" - -/* -the way genome computers now work, a subtype is the wrong way to do this; -it will no longer be picked up. You can change this later if you need to. -for now put it on a disk - -/datum/file/data/genome/UE/GodEmperorOfMankind - name = "G.E.M.K." - content = "066000033000000000AF00330660FF4DB002690" - label = "God Emperor of Mankind" -*/ -/datum/file/data/genome/UI - name = "Unique Identifier" - -/datum/file/data/genome/UI/UE - name = "Unique Identifier + Unique Enzymes" - -/datum/file/data/genome/cloning - name = "Cloning Data" - var/datum/data/record/record diff --git a/code/game/machinery/computer3/laptop.dm b/code/game/machinery/computer3/laptop.dm deleted file mode 100644 index 75acc037632..00000000000 --- a/code/game/machinery/computer3/laptop.dm +++ /dev/null @@ -1,189 +0,0 @@ -/* - Computer3 portable computer. - - Battery powered only; it does not use the APC network at all. - - When picked up, becomes an inert item. This item can be put in a recharger, - or set down and re-opened into the original machine. While closed, the computer - has the MAINT stat flag. If you want to ignore this, you will have to bitmask it out. - - The unused(?) alt+click will toggle laptops open and closed. If we find a better - answer for this in the future, by all means use it. I just don't want it limited - to the verb, which is SIGNIFICANTLY less accessible than shutting a laptop. - Ctrl-click would work for closing the machine, since it's anchored, but not for - opening it back up again. And obviously, I don't want to override shift-click. - There's no double-click because that's used in regular click events. Alt-click is the - only obvious one left. -*/ - - -/obj/item/device/laptop - name = "Laptop Computer" - desc = "A clamshell portable computer. It is closed." - icon = 'icons/obj/computer3.dmi' - icon_state = "laptop-closed" - item_state = "laptop-inhand" - pixel_x = 2 - pixel_y = -3 - w_class = 3 - - var/obj/machinery/computer3/laptop/stored_computer = null - - verb/open_computer() - set name = "Open Laptop" - set category = "Object" - set src in view(1) - - if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living) || !ishuman(usr)) - usr << "\red You can't do that." - return - - if(!Adjacent(usr)) - usr << "You can't reach it." - return - - if(!istype(loc,/turf)) - usr << "[src] is too bulky! You'll have to set it down." - return - - if(!stored_computer) - if(contents.len) - for(var/obj/O in contents) - O.loc = loc - usr << "\The [src] crumbles to pieces." - spawn(5) - qdel(src) - return - - stored_computer.loc = loc - stored_computer.stat &= ~MAINT - stored_computer.update_icon() - loc = stored_computer - usr << "You open \the [src]." - - - AltClick() - open_computer() - -//Quickfix until Snapshot works out how he wants to redo power. ~Z -/obj/item/device/laptop/verb/eject_id() - set category = "Object" - set name = "Eject ID Card" - set src in oview(1) - - if(stored_computer) - stored_computer.eject_id() -/obj/machinery/computer3/laptop/verb/eject_id() - set category = "Object" - set name = "Eject ID Card" - set src in oview(1) - var/obj/item/part/computer/cardslot/C = locate() in src.contents - - if(!C) - usr << "There is no card port on the laptop." - return - - var/obj/item/weapon/card/id/card - if(C.reader) - card = C.reader - else if(C.writer) - card = C.writer - else - usr << "There is nothing to remove from the laptop card port." - return - - usr << "You remove [card] from the laptop." - C.remove(4) - - -/obj/machinery/computer3/laptop - name = "Laptop Computer" - desc = "A clamshell portable computer. It is open." - - icon_state = "laptop" - density = 0 - pixel_x = 2 - pixel_y = -3 - show_keyboard = 0 - active_power_usage = 200 // Stationary consoles we use on station have 300, laptops are probably slightly more power efficient - idle_power_usage = 100 - - var/obj/item/device/laptop/portable = null - - New(var/L, var/built = 0) - if(!built && !battery) - battery = new /obj/item/weapon/cell(src) - battery.maxcharge = 500 - battery.charge = 500 - ..(L,built) - - verb/close_computer() - set name = "Close Laptop" - set category = "Object" - set src in view(1) - - if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living) || !ishuman(usr)) - usr << "\red You can't do that." - return - - if(!Adjacent(usr)) - usr << "You can't reach it." - return - - close_laptop(usr) - - proc/close_laptop(mob/user = null) - if(istype(loc,/obj/item/device/laptop)) - testing("Close closed computer") - return - if(!istype(loc,/turf)) - testing("Odd computer location: [loc] - close laptop") - return - - if(stat&BROKEN) - if(user) - user << "\The [src] is broken! You can't quite get it closed." - return - - if(!portable) - portable=new - portable.stored_computer = src - - portable.loc = loc - loc = portable - stat |= MAINT - if(user) - user << "You close \the [src]." - - auto_use_power() - if(stat&MAINT) - return - if(use_power && istype(battery) && battery.charge > 0) - if(use_power == 1) - battery.use(idle_power_usage*CELLRATE) //idle and active_power_usage are in WATTS. battery.use() expects CHARGE. - else - battery.use(active_power_usage*CELLRATE) - return 1 - return 0 - - use_power(var/amount, var/chan = -1) - if(battery && battery.charge > 0) - battery.use(amount*CELLRATE) - - power_change() - if( !battery || battery.charge <= 0 ) - stat |= NOPOWER - else - stat &= ~NOPOWER - - Destroy() - if(istype(loc,/obj/item/device/laptop)) - var/obj/O = loc - spawn(5) - if(O) - qdel(O) - ..() - - - AltClick() - close_computer() diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm deleted file mode 100644 index ac3e7e172cf..00000000000 --- a/code/game/machinery/computer3/lapvend.dm +++ /dev/null @@ -1,418 +0,0 @@ -/obj/machinery/lapvend - name = "Laptop Vendor" - desc = "A generic vending machine." - icon = 'icons/obj/vending.dmi' - icon_state = "robotics" - layer = 2.9 - anchored = 1 - density = 1 - var/datum/browser/popup = null - var/obj/machinery/computer3/laptop/vended/newlap = null - var/obj/item/device/laptop/relap = null - var/vendmode = 0 - - - var/cardreader = 0 - var/floppy = 0 - var/radionet = 0 - var/camera = 0 - var/network = 0 - var/power = 0 - - -/obj/machinery/lapvend/New() - ..() - spawn(4) - power_change() - return - return - - -/obj/machinery/lapvend/blob_act() - if (prob(50)) - spawn(0) - qdel(src) - return - - return - - -/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) - var/obj/item/weapon/card/id/I = W.GetID() - - if(vendmode == 1 && I) - scan_id(I, W) - vendmode = 0 - if(vendmode == 3 && I) - if(reimburse_id(I, W)) - vendmode = 0 - if(vendmode == 0) - if(istype(W, /obj/item/device/laptop)) - var/obj/item/device/laptop/L = W - relap = L - calc_reimburse(L) - usr.drop_item() - L.loc = src - vendmode = 3 - usr << "You slot your [L.name] into \The [src.name]" - else - ..() - - -/obj/machinery/lapvend/attack_hand(mob/user as mob) - user.set_machine(src) - var/vendorname = (src.name) //import the machine's name - var/dat = "
[vendorname]


" //display the name, and added a horizontal rule - if(vendmode == 0) - dat += "
Please choose your laptop customization options

" - dat += "
Your comptuer will automatically be loaded with any programs you can use after the transaction is complete." - dat += "
Some programs will require additional components to be installed!


" - dat += "
HDD (Required) : Added

" - dat += "
Card Reader : Single (50) | Dual (125)
" - dat += "
Floppy Drive: Add (50)
" - dat += "
Radio Network card Add (50)
" - dat += "
Camera Card Add (100)
" - dat += "
Network card Area (75) Adjacent (50)Powernet (25)
" - dat += "
Power source upgrade
Extended (175) Unreal (250)" - - if(vendmode == 0 || vendmode == 1) - dat += "

Cart

" - dat += "Total: [total()]
" - if(cardreader == 1) - dat += "Card Reader: (single) (50)
" - else if (cardreader == 2) - dat += "Card Reader: (double) (125)
" - else - dat += "Card Reader: None
" - if(floppy == 0) - dat += "Floppy Drive: None
" - else - dat += "Floppy Drive: Added (50)
" - if(radionet == 1) - dat += "Radio Card: Added (50)
" - else - dat += "Radio Card: None
" - if(camera == 1) - dat += "Camera Card: Added (100)
" - else - dat += "Camera Card: None
" - if(network == 1) - dat += "Network card: Area (75)
" - else if(network == 2) - dat += "Network card: Adjacent (50)
" - else if(network == 3) - dat += "Network card: Powernet (25)
" - else - dat += "Network card: None" - if (power == 0) - dat += "Power source: Regular" - else if (power == 1) - dat += "Power source: Extended (175)
" - else - dat += "Power source: Unreal (250)
" - - if(vendmode == 0) - dat += "
Vend Laptop" - - if(vendmode == 1) - dat += "Please swipe your card and enter your PIN to complete the transaction" - - if(vendmode == 3) - dat += "Please swipe your card and enter your PIN to be finish returning your computer
" - dat += "Cancel" - - - - - popup = new(user, "lapvend", name, 450, 500) - popup.set_content(dat) - popup.open() - return - - -/obj/machinery/lapvend/Topic(href, href_list) - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) - usr.set_machine(src) - switch(href_list["choice"]) - if("single_add") - cardreader = 1 - if ("dual_add") - cardreader = 2 - if ("floppy_add") - floppy = 1 - if ("radio_add") - radionet = 1 - if ("camnet_add") - camera = 1 - if ("area_add") - network = 1 - if ("prox_add") - network = 2 - if ("cable_add") - network = 3 - if ("high_add") - power = 1 - if ("super_add") - power = 2 - - if ("single_rem" || "dual_rem") - cardreader = 0 - if ("floppy_rem") - floppy = 0 - if ("radio_rem") - radionet = 0 - if ("camnet_rem") - camera = 0 - if ("area_rem" || "prox_rem" || "cable_rem") - network = 0 - if ("high_rem" || "super_rem") - power = 0 - - if("vend") - vendmode = 1 - - if("cancel") - if(relap) - relap.loc = src.loc - relap = null - vendmode = 0 - - src.updateUsrDialog() - return - - -/obj/machinery/lapvend/proc/vend() - if(cardreader > 0) - if(cardreader == 1) - newlap.spawn_parts += (/obj/item/part/computer/cardslot) - else - newlap.spawn_parts += (/obj/item/part/computer/cardslot/dual) - if(floppy == 1) - newlap.spawn_parts += (/obj/item/part/computer/storage/removable) - if(radionet == 1) - newlap.spawn_parts += (/obj/item/part/computer/networking/radio) - if(camera == 1) - newlap.spawn_parts += (/obj/item/part/computer/networking/cameras) - if (network == 1) - newlap.spawn_parts += (/obj/item/part/computer/networking/area) - if (network == 2) - newlap.spawn_parts += (/obj/item/part/computer/networking/prox) - if (network == 3) - newlap.spawn_parts += (/obj/item/part/computer/networking/cable) - if (power == 1) - newlap.battery.maxcharge = 1000 - newlap.battery.charge = 1000 - if (power == 2) - newlap.battery.maxcharge = 1750 - newlap.battery.charge = 1750 - - newlap.spawn_parts() - -/obj/machinery/lapvend/proc/scan_id(var/obj/item/weapon/card/id/C, var/obj/item/I) - visible_message("\The [usr] swipes \the [I] through \the [src].") - var/datum/money_account/CH = get_account(C.associated_account_number) - if(!CH) - usr << "\icon[src]No valid account number is associated with this card." - return - if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - if(vendor_account) - var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - transfer_and_vend(D, C) - else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." - else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." - else - transfer_and_vend(CH, C) - - -// Transfers money and vends the laptop. -/obj/machinery/lapvend/proc/transfer_and_vend(var/datum/money_account/D, var/obj/item/weapon/card/C) - var/transaction_amount = total() - if(transaction_amount <= D.money) - - //transfer the money - D.money -= transaction_amount - vendor_account.money += transaction_amount - //Transaction logs - var/datum/transaction/T = new() - T.target_name = "[vendor_account.owner_name] (via [src.name])" - T.purpose = "Purchase of Laptop" - if(transaction_amount > 0) - T.amount = "([transaction_amount])" - else - T.amount = "[transaction_amount]" - T.source_terminal = src.name - T.date = current_date_string - T.time = worldtime2text() - D.transaction_log.Add(T) - // - T = new() - T.target_name = D.owner_name - T.purpose = "Purchase of Laptop" - T.amount = "[transaction_amount]" - T.source_terminal = src.name - T.date = current_date_string - T.time = worldtime2text() - vendor_account.transaction_log.Add(T) - - newlap = new /obj/machinery/computer3/laptop/vended(src.loc) - - choose_progs(C) - vend() - popup.close() - newlap.close_laptop() - newlap = null - cardreader = 0 - floppy = 0 - radionet = 0 - camera = 0 - network = 0 - power = 0 - else - usr << "\icon[src]You don't have that much money!" - -/obj/machinery/lapvend/proc/total() - var/total = 0 - - if(cardreader == 1) - total += 50 - if(cardreader == 2) - total += 125 - if(floppy == 1) - total += 50 - if(radionet == 1) - total += 50 - if(camera == 1) - total += 100 - if(network == 1) - total += 75 - if(network == 2) - total += 50 - if(network == 3) - total += 25 - if(power == 1) - total += 175 - if(power == 2) - total += 250 - - return total - -/obj/machinery/lapvend/proc/choose_progs(var/obj/item/weapon/card/id/C) - if(access_security in C.access) - newlap.spawn_files += (/datum/file/program/secure_data) - newlap.spawn_files += (/datum/file/camnet_key) - newlap.spawn_files += (/datum/file/program/security) - if(access_armory in C.access) - newlap.spawn_files += (/datum/file/program/prisoner) - if(access_atmospherics in C.access) - newlap.spawn_files += (/datum/file/program/atmos_alert) - if(access_change_ids in C.access) - newlap.spawn_files += (/datum/file/program/card_comp) - if(access_heads in C.access) - newlap.spawn_files += (/datum/file/program/communications) - if((access_medical in C.access) || (access_forensics_lockers in C.access)) //Gives detective the medical records program, but not the crew monitoring one. - newlap.spawn_files += (/datum/file/program/med_data) - if (access_medical in C.access) - newlap.spawn_files += (/datum/file/program/crew) - if(access_engine in C.access) - newlap.spawn_files += (/datum/file/program/powermon) - if(access_research in C.access) - newlap.spawn_files += (/datum/file/camnet_key/research) - newlap.spawn_files += (/datum/file/camnet_key/bombrange) - newlap.spawn_files += (/datum/file/camnet_key/xeno) - if(access_rd in C.access) - newlap.spawn_files += (/datum/file/program/borg_control) - if(access_cent_specops in C.access) - newlap.spawn_files += (/datum/file/camnet_key/creed) - newlap.spawn_files += (/datum/file/program/arcade) - newlap.spawn_files += (/datum/file/camnet_key/entertainment) - //Atlantis: Each laptop gets "invisible" program/security - REQUIRED for camnetkeys to work. - newlap.spawn_files += (/datum/file/program/security/hidden) - newlap.update_spawn_files() - -/obj/machinery/lapvend/proc/calc_reimburse(var/obj/item/device/laptop/L) - if(istype(L.stored_computer.cardslot,/obj/item/part/computer/cardslot)) - cardreader = 1 - if(istype(L.stored_computer.cardslot,/obj/item/part/computer/cardslot/dual)) - cardreader = 2 - if(istype(L.stored_computer.floppy,/obj/item/part/computer/storage/removable)) - floppy = 1 - if(istype(L.stored_computer.radio,/obj/item/part/computer/networking/radio)) - radionet = 1 - if(istype(L.stored_computer.camnet,/obj/item/part/computer/networking/cameras)) - camera = 1 - if(istype(L.stored_computer.net,/obj/item/part/computer/networking/area)) - network = 1 - if(istype(L.stored_computer.net,/obj/item/part/computer/networking/prox)) - network = 2 - if(istype(L.stored_computer.net,/obj/item/part/computer/networking/cable)) - network = 3 - if(istype(L.stored_computer.battery, /obj/item/weapon/cell/high)) - power = 1 - if(istype(L.stored_computer.battery, /obj/item/weapon/cell/super)) - power = 2 - - - -/obj/machinery/lapvend/proc/reimburse_id(var/obj/item/weapon/card/id/C, var/obj/item/I) - visible_message("\The [usr] swipes \the [I] through \the [src].") - var/datum/money_account/CH = get_account(C.associated_account_number) - if(!CH) - usr << "\icon[src]No valid account number is associated with this card." - return 0 - if(CH.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) - if(vendor_account) - var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - transfer_and_reimburse(D) - return 1 - else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." - return 0 - else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." - return 0 - else - transfer_and_reimburse(CH) - return 1 - -/obj/machinery/lapvend/proc/transfer_and_reimburse(var/datum/money_account/D) - var/transaction_amount = total() - //transfer the money - D.money += transaction_amount - vendor_account.money -= transaction_amount - - //Transaction logs - var/datum/transaction/T = new() - T.target_name = "[vendor_account.owner_name] (via [src.name])" - T.purpose = "Return purchase of Laptop" - if(transaction_amount > 0) - T.amount = "([transaction_amount])" - else - T.amount = "[transaction_amount]" - T.source_terminal = src.name - T.date = current_date_string - T.time = worldtime2text() - D.transaction_log.Add(T) - // - T = new() - T.target_name = D.owner_name - T.purpose = "Return purchase of Laptop" - T.amount = "[transaction_amount]" - T.source_terminal = src.name - T.date = current_date_string - T.time = worldtime2text() - vendor_account.transaction_log.Add(T) - - qdel(relap) - vendmode = 0 - cardreader = 0 - floppy = 0 - radionet = 0 - camera = 0 - network = 0 - power = 0 diff --git a/code/game/machinery/computer3/networking.dm b/code/game/machinery/computer3/networking.dm deleted file mode 100644 index 66d25dda5ae..00000000000 --- a/code/game/machinery/computer3/networking.dm +++ /dev/null @@ -1,238 +0,0 @@ -/obj/item/part/computer/networking - name = "Computer networking component" - - /* - This is the public-facing proc used by NETUP. - It does additional checking before and after calling get_machines() - - */ - proc/connect_to(var/typekey,var/atom/previous) - if(!computer || computer.stat) - return null - - if(istype(previous,typekey) && verify_machine(previous)) - return previous - - var/result = get_machines(typekey) - - if(!result) - return null - - if(islist(result)) - var/list/R = result - if(R.len == 0) - return null - else if(R.len == 1) - return R[1] - else - var/list/atomlist = computer.format_atomlist(R) - result = input("Select:","Multiple destination machines located",atomlist[1]) as null|anything in atomlist - return atomlist[result] - - if(isobj(result)) - return result - - return null // ? - - /* - This one is used to determine the candidate machines. - It may return an object, a list of objects, or null. - - Overwite this on any networking component. - */ - proc/get_machines(var/typekey) - return list() - - /* - This is used to verify that an existing machine is within the network. - Calling NETUP() with an object argument will run this check, and if - the object is still accessible, it will be used. Otherwise, another - search will be run. - - Overwrite this on any networking component. - */ - proc/verify_machine(var/obj/previous) - return 0 - -/* - Provides radio/signaler functionality, and also - network-connects to anything on the same z-level - which is tuned to the same frequency. -*/ -/obj/item/part/computer/networking/radio - name = "Wireless networking component" - desc = "Radio module for computers" - - var/datum/radio_frequency/radio_connection = null - var/frequency = PUB_FREQ - var/filter = null - var/range = null - var/subspace = 0 - - init() - ..() - spawn(5) - radio_connection = radio_controller.add_object(src, src.frequency, src.filter) - - proc/set_frequency(new_frequency) - if(radio_controller) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, filter) - else - frequency = new_frequency - spawn(rand(5,10)) - set_frequency(new_frequency) - - receive_signal(var/datum/signal/signal) - if(!signal || !computer || (computer.stat&~MAINT)) // closed laptops use maint, allow it - return - if(computer.program) - computer.program.receive_signal(signal) - - proc/post_signal(var/datum/signal/signal) - if(!computer || (computer.stat&~MAINT) || !computer.program) return - if(!radio_connection) return - - radio_connection.post_signal(src,signal,filter,range) - - get_machines(var/typekey) - if(!radio_connection || !radio_connection.frequency) - return list() - var/list/result = list() - var/turf/T = get_turf(loc) - var/z_level = T.z - for(var/obj/O in radio_connection.devices) - if(istype(O,typekey)) - T = get_turf(O) - if(istype(O) && (subspace || (O.z == z_level))) // radio does not work across z-levels - result |= O - return result - - verify_machine(var/obj/previous) - if(!previous) return 0 - if(subspace) - return ( radio_connection && (previous in radio_connection.devices) ) - else - var/turf/T = get_turf(loc) - var/turf/O = get_turf(previous) - if(!T || !O) - return 0 - return ( radio_connection && (previous in radio_connection.devices) && (T.z == O.z)) - -/* - Subspace networking: Communicates off-station. Allows centcom communications. -*/ -/obj/item/part/computer/networking/radio/subspace - name = "subspace networking terminal" - desc = "Communicates long distances and through spatial anomalies." - subspace = 1 - -/* - APC (/area) networking -*/ - -/obj/item/part/computer/networking/area - name = "short-wave networking terminal" - desc = "Connects to nearby computers through the area power network" - - get_machines(var/typekey) - var/area/A = get_area(loc) - if(!istype(A) || A == /area) - return list() - if(typekey == null) - typekey = /obj/machinery - var/list/machines = list() - for(var/obj/O in A.contents) - if(istype(O,typekey)) - machines |= O - return machines - verify_machine(var/obj/previous) - if(!previous) return 0 - var/area/A = get_area(src) - if( A && A == get_area(previous) ) - return 1 - return 0 - -/* - Proximity networking: Connects to machines or computers adjacent to this device -*/ -/obj/item/part/computer/networking/prox - name = "proximity networking terminal" - desc = "Connects a computer to adjacent machines" - - get_machines(var/typekey) - var/turf/T = get_turf(loc) - if(!istype(T)) - return list() - if(typekey == null) - typekey = /obj/machinery - var/list/machines = list() - for(var/obj/O in T) - if(istype(O,typekey)) - machines += O - for(var/d in cardinal) - var/turf/T2 = get_step(T,d) - for(var/obj/O in T2) - if(istype(O,typekey)) - machines += O - return machines - - verify_machine(var/obj/previous) - if(!previous) - return 0 - if(get_dist(get_turf(previous),get_turf(loc)) == 1) - return 1 - return 0 -/* - Cable networking: Not currently used -*/ - -/obj/item/part/computer/networking/cable - name = "cable networking terminal" - desc = "Connects to other machines on the same cable network." - - get_machines(var/typekey) -// if(istype(computer,/obj/machinery/computer/laptop)) // laptops move, this could get breaky -// return list() - var/turf/T = get_turf(loc) - var/datum/powernet/P = null - for(var/obj/structure/cable/C in T) - if(C.d1 == 0) - P = C.powernet - break - if(!P) - return list() - if(!typekey) - typekey = /obj/machinery - else if(typekey == /datum/powernet) - return list(P) - var/list/candidates = list() - for(var/atom/A in P.nodes) - if(istype(A,typekey)) - candidates += A - else if(istype(A,/obj/machinery/power/terminal)) - var/obj/machinery/power/terminal/PT = A - if(istype(PT.master,typekey)) - candidates += PT.master - return candidates - - verify_machine(var/obj/previous) - if(!previous) - return 0 - var/turf/T = get_turf(loc) - var/datum/powernet/P = null - for(var/obj/structure/cable/C in T) - if(C.d1 == 0) - P = C.powernet - break - if(istype(previous,/datum/powernet)) - if(previous == P) - return 1 - return 0 - T = get_turf(previous.loc) - for(var/obj/structure/cable/C in T) - if(C.d1 == 0 && (C.powernet == P)) - return 1 - return 0 - diff --git a/code/game/machinery/computer3/program.dm b/code/game/machinery/computer3/program.dm deleted file mode 100644 index 0667fe2f730..00000000000 --- a/code/game/machinery/computer3/program.dm +++ /dev/null @@ -1,404 +0,0 @@ - -/* -Programs are a file that can be executed -*/ - -/datum/file/program - name = "Untitled" - extension = "prog" - image = 'icons/ntos/program.png' - var/desc = "An unidentifiable program." - - var/image/overlay = null // Icon to be put on top of the computer frame. - - var/active_state = "generic" // the icon_state that the computer goes to when the program is active - - drm = 0 // prevents a program from being copied - var/refresh = 0 // if true, computer does screen updates during process(). - var/error = 0 // set by background programs so an error pops up when used - - var/human_controls = 0 // if true, non-human animals cannot interact with this program (monkeys, xenos, etc) - var/ai_allowed = 1 // if true, silicon mobs (AI/cyborg) are allowed to use this program. - - var/datum/browser/popup = null - - // ID access: Note that computer3 does not normally check your ID. - // By default this is only really used for inserted cards. - var/list/req_access = list() // requires all of these UNLESS below succeeds - var/list/req_one_access = list() // requires one of these - - -/datum/file/program/New() - ..() - if(!active_state) - active_state = "generic" - overlay = image('icons/obj/computer3.dmi',icon_state = active_state) - - -/datum/file/program/proc/decode(text) - //adds line breaks - text = replacetext(text, "\n","
") - return text - - - -/datum/file/program/execute(var/datum/file/source) - if(computer && !computer.stat) - computer.program = src - computer.req_access = req_access - computer.req_one_access = req_one_access - update_icon() - computer.update_icon() - if(usr) - usr << browse(null, "window=\ref[computer]") - computer.attack_hand(usr) - - ..() - -/* - Standard Topic() for links -*/ - -/datum/file/program/Topic(href, href_list) - return - -/* - The computer object will transfer all empty-hand calls to the program (this includes AIs, Cyborgs, and Monkies) -*/ -/datum/file/program/proc/interact() - return - -/* - Standard receive_signal() -*/ - -/datum/file/program/proc/receive_signal(var/datum/signal/signal) - return -/* - The computer object will transfer all attackby() calls to the program - If the item is a valid interactable object, return 1. Else, return 0. - This helps identify what to use to actually hit the computer with, and - what can be used to interact with it. - - Screwdrivers will, by default, never call program/attackby(). That's used - for deconstruction instead. -*/ - - -/datum/file/program/proc/attackby(O as obj, user as mob) - return - -/* - Try not to overwrite this proc, I'd prefer we stayed - with interact() as the main proc -*/ -/datum/file/program/proc/attack_hand(mob/user as mob) - usr = user - interact() - -/* - Called when the computer is rebooted or the program exits/restarts. - Be sure not to save any work. Do NOT start the program again. - If it is the os, the computer will run it again automatically. - - Also, we are deleting the browser window on the chance that this is happening - when the computer is damaged or disassembled, causing us to lose our computer. - The popup window's title is a reference to the computer, making it unique, so - it could introduce bugs in that case. -*/ -/datum/file/program/proc/Reset() - error = 0 - update_icon() - if(popup) - popup.close() - qdel(popup) - return - -/* - The computer object will transfer process() calls to the program. -*/ -/datum/file/program/proc/process() - if(refresh && computer && !computer.stat) - computer.updateDialog() - update_icon() - -/datum/file/program/proc/update_icon() - return - -/datum/file/program/proc/check_access(obj/item/I) - if( (!istype(req_access) || !req_access.len) && (!istype(req_one_access) || !req_one_access.len) ) //no requirements - return 1 - - if(!I) - return 0 - - var/list/iAccess = I.GetAccess() - if(!iAccess || !iAccess.len) - return 0 - - var/list/temp = req_one_access & iAccess - if(temp.len) // a required access in item access list - return 1 - temp = req_access - iAccess - if(temp.len) // a required access not in item access list - return 0 - return 1 - - -/* - Because this does sanity checks I have added the code to make a popup here. - It also does sanity checks there that should prevent some edge case madness. -*/ -/datum/file/program/proc/interactable(var/mob/user = usr) - if(computer && computer.interactable(user)) - if(!popup) - popup = new(user, "\ref[computer]", name, nref=src) - popup.set_title_image(usr.browse_rsc_icon(overlay.icon, overlay.icon_state)) - popup.set_title_buttons(topic_link(src,"quit","")) - if(popup.user != user) - popup.user = user - popup.set_title_image(usr.browse_rsc_icon(overlay.icon, overlay.icon_state)) - popup.set_title(name) - return 1 - return 0 - - -/datum/file/program/proc/fake_link(var/text) - return "[text]" - -/* - Meant for text (not icons) - - lists all installed drives and their files - - I am NOT adding a computer sanity check here, - because why the flying fuck would you get to this - proc before having run it at least once? - If you cause runtimes with this function - may the shame of all ages come upon you. -*/ -/datum/file/program/proc/list_all_files_by_drive(var/typekey,var/linkop = "runfile") - var/dat = "" - if(!typekey) typekey = /datum/file - if(computer.hdd) - dat += "

[computer.hdd]

" - for(var/datum/file/F in computer.hdd.files) - if(istype(F,typekey)) - dat += topic_link(src,"[linkop]=\ref[F]",F.name) + "
" - if(computer.hdd.files.len == 0) - dat += "No files
" - dat += "
" - - if(computer.floppy) - if(!computer.floppy.inserted) - dat += "

[computer.floppy] - Eject



" - else - dat += "

[computer.floppy] - [topic_link(src,"eject_disk","Eject")]

" - for(var/datum/file/F in computer.floppy.inserted.files) - dat += topic_link(src,"[linkop]=\ref[F]",F.name) + "
" - if(computer.floppy.inserted.files.len == 0) - dat += "No files
" - dat += "
" - - if(computer.cardslot && istype(computer.cardslot.reader,/obj/item/weapon/card/data)) - dat += "

[computer.cardslot.reader] - [topic_link(src,"eject_card=reader","Eject")]

" - var/obj/item/weapon/card/data/D = computer.cardslot.reader - for(var/datum/file/F in D.files) - dat += topic_link(src,"[linkop]=\ref[F]",F.name) + "
" - if(D.files.len == 0) - dat += "No files
" - return dat - -// You don't NEED to use this version of topic() for this, you can do it yourself if you prefer -// If you do, do the interactable() check first, please, I don't want to repeat it here. It's not hard. -/datum/file/program/Topic(var/href,var/list/href_list) - if(!computer) - return 0 - - // - // usage: eject_disk - // only functions if there is a removable drive - // - if("eject_disk" in href_list) - if(computer.floppy) - computer.floppy.eject_disk() - return 1 - // - // usage: eject_card | eject_card=reader | eject_card=writer - // only functions if there is a cardslot - // - if("eject_card" in href_list) - if(computer.cardslot) - if(computer.cardslot.dualslot && href_list["eject_card"] == "writer") - computer.cardslot.remove(computer.cardslot.writer) - else - computer.cardslot.remove(computer.cardslot.reader) - return 1 - // - // usage: runfile=\ref[file] - // executes the file - // - if("runfile" in href_list) - var/datum/file/F = locate(href_list["runfile"]) - if(istype(F) && F.computer == computer) - F.execute(src) - return 1 - - if("close" in href_list) - usr.unset_machine() - popup.close() - return 1 - // - // usage: quit - // unloads the program, returning control to the OS - // - if("quit" in href_list) - computer.program = null - usr << browse(null,"window=\ref[computer]") // ntos will need to resize the window - computer.update_icon() - computer.updateDialog() - return 1 - return 0 - - -/datum/file/program/RD - name = "R&D Manager" - image = 'icons/ntos/research.png' - desc = "A software suit for generic research and development machinery interaction. Comes pre-packaged with extensive cryptographic databanks for secure connections with external devices." - active_state = "rdcomp" - volume = 11000 - -/datum/file/program/RDserv - name = "R&D Server" - image = 'icons/ntos/server.png' - active_state = "rdcomp" - volume = 9000 - -/datum/file/program/SuitSensors - name = "Crew Monitoring" - image = 'icons/ntos/monitoring.png' - active_state = "crew" - volume = 3400 - -/datum/file/program/Genetics - name = "Genetics Suite" - image = 'icons/ntos/genetics.png' - desc = "A sophisticated software suite containing read-only genetics hardware specifications and a highly compressed genome databank." - active_state = "dna" - volume = 8000 - -/datum/file/program/Cloning - name = "Cloning Platform" - image = 'icons/ntos/cloning.png' - desc = "A software platform for accessing external cloning apparatus." - active_state = "dna" - volume = 7000 - -/datum/file/program/TCOMmonitor - name = "TComm Monitor" - image = 'icons/ntos/tcomms.png' - active_state = "comm_monitor" - volume = 5500 - -/datum/file/program/TCOMlogs - name = "TComm Log View" - image = 'icons/ntos/tcomms.png' - active_state = "comm_logs" - volume = 5230 - -/datum/file/program/TCOMtraffic - name = "TComm Traffic" - image = 'icons/ntos/tcomms.png' - active_state = "generic" - volume = 8080 - -/datum/file/program/securitycam - name = "Sec-Cam Viewport" - image = 'icons/ntos/camera.png' - drm = 1 - active_state = "cameras" - volume = 2190 - -/datum/file/program/securityrecords - name = "Security Records" - image = 'icons/ntos/records.png' - drm = 1 - active_state = "security" - volume = 2520 - -/datum/file/program/medicalrecords - name = "Medical Records" - image = 'icons/ntos/medical.png' - drm = 1 - active_state = "medcomp" - volume = 5000 - -/datum/file/program/SMSmonitor - name = "Messaging Monitor" - image = 'icons/ntos/pda.png' - active_state = "comm_monitor" - volume = 3070 - -/datum/file/program/OperationMonitor - name = "OR Monitor" - image = 'icons/ntos/operating.png' - active_state = "operating" - volume = 4750 - -/datum/file/program/PodLaunch - name = "Pod Launch" - active_state = "computer_generic" - volume = 520 - -/datum/file/program/powermon - name = "Power Grid" - image = 'icons/ntos/power.png' - active_state = "power" - volume = 7200 - -/datum/file/program/prisoner - name = "Prisoner Control" - image = 'icons/ntos/prison.png' - drm = 1 - active_state = "power" - volume = 5000 - -/datum/file/program/borg_control - name = "Cyborg Maint" - image = 'icons/ntos/borgcontrol.png' - active_state = "robot" - volume = 9050 - -/datum/file/program/AIupload - name = "AI Upload" - image = 'icons/ntos/aiupload.png' - active_state = "command" - volume = 5000 - -/datum/file/program/Cyborgupload - name = "Cyborg Upload" - image = 'icons/ntos/borgupload.png' - active_state = "command" - volume = 5000 - -/datum/file/program/Exosuit - name = "Exosuit Monitor" - image = 'icons/ntos/exocontrol.png' - active_state = "mecha" - volume = 7000 - -/datum/file/program/EmergencyShuttle - name = "Shuttle Console" - active_state = "shuttle" - volume = 10000 - -/datum/file/program/Stationalert - name = "Alert Monitor" - image = 'icons/ntos/alerts.png' - active_state = "computer_generic" - volume = 10150 - - - - - - diff --git a/code/game/machinery/computer3/program_disks.dm b/code/game/machinery/computer3/program_disks.dm deleted file mode 100644 index e9a649499b1..00000000000 --- a/code/game/machinery/computer3/program_disks.dm +++ /dev/null @@ -1,51 +0,0 @@ - - -/obj/item/weapon/disk/file/arcade - name = "Arcade game grab pack" - desc = "A program install disk." - icon = 'icons/obj/stock_parts.dmi' - icon_state = "datadisk_arcade" - spawn_files = list(/datum/file/program/arcade,/datum/file/program/arcade,/datum/file/program/arcade,/datum/file/program/arcade) - -/*/obj/item/weapon/disk/file/aifixer - name = "AI System Integrity Restorer" - desc = "A program install disk." - icon = 'icons/obj/stock_parts.dmi' - icon_state = "datadisk_arcade" - spawn_files = list(/datum/file/program/aifixer)*/ - -/obj/item/weapon/disk/file/atmos_alert - name = "Atmospheric Alert Notifier" - desc = "A program install disk." - icon = 'icons/obj/stock_parts.dmi' - icon_state = "datadisk_arcade" - spawn_files = list(/datum/file/program/atmos_alert) - -/obj/item/weapon/disk/file/cameras - name = "Camera Viewer" - desc = "A program install disk." - icon = 'icons/obj/stock_parts.dmi' - icon_state = "datadisk_arcade" - spawn_files = list(/datum/file/program/security) - -/obj/item/weapon/disk/file/cameras/syndicate - name = "Camera Viewer" - desc = "A program install disk. A crude skull has been drawn on it and there is a list of items:\nFloppy Drive\nCamera Card\nNetwork Card: Adjacent\nPosition laptop nearby camera, enjoy." - icon = 'icons/obj/stock_parts.dmi' - icon_state = "datadisk_arcade" - spawn_files = list(/datum/file/program/security/syndicate) - -/obj/item/weapon/disk/file/card - name = "ID Card Modifier" - desc = "A program install disk." - icon = 'icons/obj/stock_parts.dmi' - icon_state = "datadisk_arcade" - spawn_files = list(/datum/file/program/card_comp) -/* -/obj/item/weapon/disk/file/genetics - name = "Genetics & Cloning" - desc = "A program install disk." - icon = 'icons/obj/stock_parts.dmi' - icon_state = "datadisk_arcade" - spawn_files = list(/datum/file/program/cloning,/datum/file/program/dnascanner) -*/ diff --git a/code/game/machinery/computer3/server.dm b/code/game/machinery/computer3/server.dm deleted file mode 100644 index 9e32918feae..00000000000 --- a/code/game/machinery/computer3/server.dm +++ /dev/null @@ -1,32 +0,0 @@ -/* - Todo: - I can probably get away with a global list on servers that contains database sort of stuff - (replacing the datacore probably) - with the justification that they loadbalance and duplicate data across each other. As long as - one server-type computer exists, the station will still have access to datacore-type info. - - I can doubtless use this for station alerts as well, which is good, because I was sort of - wondering how the hell I was going to port that. - - Also todo: Server computers should maybe generate heat the way the R&D server does? - At least the rack computer probably should. -*/ - -/obj/machinery/computer3/server - name = "server" - icon = 'icons/obj/computer3.dmi' - icon_state = "serverframe" - show_keyboard = 0 - -/obj/machinery/computer3/server/rack - name = "server rack" - icon_state = "rackframe" - - spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/radio/subspace) - - update_icon() - //overlays.Cut() - return - - attack_hand() // Racks have no screen, only AI can use them - return diff --git a/code/game/machinery/computer3/storage.dm b/code/game/machinery/computer3/storage.dm deleted file mode 100644 index acf9a76288f..00000000000 --- a/code/game/machinery/computer3/storage.dm +++ /dev/null @@ -1,184 +0,0 @@ -/* - Computer devices that can store programs, files, etc. -*/ - -/obj/item/part/computer/storage - name = "Storage Device" - desc = "A device used for storing and retrieving digital information." - - // storage capacity, kb - var/volume = 0 - var/max_volume = 64 // should be enough for anyone - - var/driveletter = null // drive letter according to the computer - - var/list/files = list() // a list of files in the memory (ALL files) - var/removeable = 0 // determinse if the storage device is a removable hard drive (ie floppy) - - - var/writeprotect = 0 // determines if the drive forbids writing. - // note that write-protect is hardware and does not respect emagging. - - var/list/spawnfiles = list()// For mappers, special drives, and data disks - - New() - ..() - if(islist(spawnfiles)) - if(removeable && spawnfiles.len) - var/obj/item/part/computer/storage/removable/R = src - R.inserted = new(src) - if(writeprotect) - R.inserted.writeprotect = 1 - for(var/typekey in spawnfiles) - addfile(new typekey(),1) - - // Add a file to the hard drive, returns 0 if failed - // forced is used when spawning files on a write-protect drive - proc/addfile(var/datum/file/F,var/forced = 0) - if(!F || crit_fail || (F in files)) - return 1 - if(writeprotect && !forced) - return 0 - if(volume + F.volume > max_volume) - if(!forced) - return 0 - max_volume = volume + F.volume - - files.Add(F) - volume += F.volume - F.computer = computer - F.device = src - return 1 - proc/removefile(var/datum/file/F,var/forced = 0) - if(!F || !(F in files)) - return 1 - if(writeprotect && !forced) - return 0 - - files -= F - volume -= F.volume - if(F.device == src) - F.device = null - F.computer = null - return 1 - - init(var/obj/machinery/computer/target) - computer = target - for(var/datum/file/F in files) - F.computer = computer - -/* - Standard hard drives for computers. Used in computer construction -*/ - -/obj/item/part/computer/storage/hdd - name = "Hard Drive" - max_volume = 25000 - icon_state = "hdd1" - - -/obj/item/part/computer/storage/hdd/big - name = "Big Hard Drive" - max_volume = 50000 - icon_state = "hdd2" - -/obj/item/part/computer/storage/hdd/gigantic - name = "Gigantic Hard Drive" - max_volume = 75000 - icon_state = "hdd3" - -/* - Removeable hard drives for portable storage -*/ - -/obj/item/part/computer/storage/removable - name = "Disk Drive" - max_volume = 3000 - removeable = 1 - - attackby_types = list(/obj/item/weapon/disk/file, /obj/item/weapon/pen) - var/obj/item/weapon/disk/file/inserted = null - - proc/eject_disk(var/forced = 0) - if(!forced) - return - files = list() - inserted.loc = computer.loc - if(usr) - if(!usr.get_active_hand()) - usr.put_in_active_hand(inserted) - else if(forced && !usr.get_inactive_hand()) - usr.put_in_inactive_hand(inserted) - for(var/datum/file/F in inserted.files) - F.computer = null - inserted = null - - - attackby(obj/O as obj, mob/user as mob) - if(inserted && istype(O,/obj/item/weapon/pen)) - usr << "You use [O] to carefully pry [inserted] out of [src]." - eject_disk(forced = 1) - return - - if(istype(O,/obj/item/weapon/disk/file)) - if(inserted) - usr << "There's already a disk in [src]!" - return - - usr << "You insert [O] into [src]." - usr.drop_item() - O.loc = src - inserted = O - writeprotect = inserted.writeprotect - - files = inserted.files - for(var/datum/file/F in inserted.files) - F.computer = computer - - return - - ..() - - addfile(var/datum/file/F) - if(!F || !inserted) - return 0 - - if(F in inserted.files) - return 1 - - if(inserted.volume + F.volume > inserted.max_volume) - return 0 - - inserted.files.Add(F) - F.computer = computer - F.device = inserted - return 1 - -/* - Removable hard drive presents... - removeable disk! -*/ - -/obj/item/weapon/disk/file - //parent_type = /obj/item/part/computer/storage // todon't: do this - name = "Data Disk" - desc = "A device that can be inserted and removed into computers easily as a form of portable data storage. This one stores 1 Megabyte" - var/list/files - var/list/spawn_files = list() - var/writeprotect = 0 - var/volume = 0 - var/max_volume = 1028 - - - New() - ..() - icon_state = "datadisk[rand(0,6)]" - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) - files = list() - if(istype(spawn_files)) - for(var/typekey in spawn_files) - var/datum/file/F = new typekey() - F.device = src - files += F - volume += F.volume diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 56c2493ba0f..665f74d926d 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -27,9 +27,6 @@ /obj/machinery/constructable_frame/machine_frame attackby(obj/item/P as obj, mob/user as mob) - if(P.crit_fail) - user << "\red This part is faulty, you cannot add this to the machine!" - return switch(state) if(1) if(istype(P, /obj/item/stack/cable_coil)) @@ -47,7 +44,7 @@ else if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user << "\blue You dismantle the frame" + user << "You dismantle the frame" new /obj/item/stack/material/steel(src.loc, 5) qdel(src) if(2) @@ -55,7 +52,7 @@ var/obj/item/weapon/circuitboard/B = P if(B.board_type == "machine") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You add the circuit board to the frame." + user << "You add the circuit board to the frame." circuit = P user.drop_item() P.loc = src @@ -73,11 +70,11 @@ update_desc() user << desc else - user << "\red This frame does not accept circuit boards of this type!" + user << "This frame does not accept circuit boards of this type!" else if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." + user << "You remove the cables." state = 1 icon_state = "box_0" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) @@ -90,9 +87,9 @@ circuit.loc = src.loc circuit = null if(components.len == 0) - user << "\blue You remove the circuit board." + user << "You remove the circuit board." else - user << "\blue You remove the circuit board and other components." + user << "You remove the circuit board and other components." for(var/obj/item/weapon/W in components) W.loc = src.loc desc = initial(desc) @@ -156,4 +153,4 @@ break user << desc if(P && P.loc != src && !istype(P, /obj/item/stack/cable_coil)) - user << "\red You cannot add that component to the machine!" + user << "You cannot add that component to the machine!" diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 3fdba530b32..62ec0bbca9c 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -2,8 +2,8 @@ /obj/machinery/atmospherics/unary/cryo_cell name = "cryo cell" - icon = 'icons/obj/cryogenics.dmi' - icon_state = "pod0" + icon = 'icons/obj/cryogenics.dmi' // map only + icon_state = "pod_preview" density = 1 anchored = 1.0 layer = 2.8 @@ -22,6 +22,8 @@ /obj/machinery/atmospherics/unary/cryo_cell/New() ..() + icon = 'icons/obj/cryogenics_split.dmi' + update_icon() initialize_directions = dir /obj/machinery/atmospherics/unary/cryo_cell/Destroy() @@ -171,7 +173,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) if(istype(G, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "\red A beaker is already loaded into the machine." + user << "A beaker is already loaded into the machine." return beaker = G @@ -237,12 +239,28 @@ /obj/machinery/atmospherics/unary/cryo_cell/update_icon() overlays.Cut() icon_state = "pod[on]" + var/image/I + + I = image(icon, "pod[on]_top") + I.layer = 5 // this needs to be fairly high so it displays over most things, but it needs to be under lighting (at 10) + I.pixel_z = 32 + overlays += I + if(occupant) var/image/pickle = image(occupant.icon, occupant.icon_state) pickle.overlays = occupant.overlays - pickle.pixel_y = 20 + pickle.pixel_z = 18 + pickle.layer = 5 overlays += pickle - overlays += "lid[on]" + + I = image(icon, "lid[on]") + I.layer = 5 + overlays += I + + I = image(icon, "lid[on]_top") + I.layer = 5 + I.pixel_z = 32 + overlays += I /obj/machinery/atmospherics/unary/cryo_cell/proc/process_occupant() if(air_contents.total_moles < 10) @@ -315,19 +333,19 @@ return /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob) if (stat & (NOPOWER|BROKEN)) - usr << "\red The cryo cell is not functioning." + usr << "The cryo cell is not functioning." return if (!istype(M)) - usr << "\red The cryo cell cannot handle such a lifeform!" + usr << "The cryo cell cannot handle such a lifeform!" return if (occupant) - usr << "\red The cryo cell is already occupied!" + usr << "The cryo cell is already occupied!" return if (M.abiotic()) - usr << "\red Subject may not have abiotic items on." + usr << "Subject may not have abiotic items on." return if(!node) - usr << "\red The cell is not correctly connected to its pipe network!" + usr << "The cell is not correctly connected to its pipe network!" return if (M.client) M.client.perspective = EYE_PERSPECTIVE @@ -336,7 +354,7 @@ M.loc = src M.ExtinguishMob() if(M.health > -100 && (M.health < 0 || M.sleeping)) - M << "\blue You feel a cold liquid surround you. Your skin starts to freeze up." + M << "You feel a cold liquid surround you. Your skin starts to freeze up." occupant = M current_heat_capacity = HEAT_CAPACITY_HUMAN update_use_power(2) @@ -352,7 +370,7 @@ if(usr == occupant)//If the user is inside the tube... if (usr.stat == 2)//and he's not dead.... return - usr << "\blue Release sequence activated. This will take two minutes." + usr << "Release sequence activated. This will take two minutes." sleep(1200) if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index f75d128fe9a..1d5ce8d272e 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -14,7 +14,7 @@ desc = "An interface between crew and the cryogenic storage oversight systems." icon = 'icons/obj/Cryogenic2.dmi' icon_state = "cellconsole" - circuit = "/obj/item/weapon/circuitboard/cryopodcontrol" + circuit = /obj/item/weapon/circuitboard/cryopodcontrol density = 0 interact_offline = 1 var/mode = null @@ -33,7 +33,7 @@ desc = "An interface between crew and the robotic storage systems" icon = 'icons/obj/robot_storage.dmi' icon_state = "console" - circuit = "/obj/item/weapon/circuitboard/robotstoragecontrol" + circuit = /obj/item/weapon/circuitboard/robotstoragecontrol storage_type = "cyborgs" storage_name = "Robotic Storage Control" @@ -110,7 +110,7 @@ visible_message("The console beeps happily as it disgorges \the [I].", 3) - I.loc = get_turf(src) + I.forceMove(get_turf(src)) frozen_items -= I else if(href_list["allitems"]) @@ -123,7 +123,7 @@ visible_message("The console beeps happily as it disgorges the desired objects.", 3) for(var/obj/item/I in frozen_items) - I.loc = get_turf(src) + I.forceMove(get_turf(src)) frozen_items -= I src.updateUsrDialog() @@ -132,12 +132,12 @@ /obj/item/weapon/circuitboard/cryopodcontrol name = "Circuit board (Cryogenic Oversight Console)" build_path = "/obj/machinery/computer/cryopod" - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) /obj/item/weapon/circuitboard/robotstoragecontrol name = "Circuit board (Robotic Storage Console)" build_path = "/obj/machinery/computer/cryopod/robot" - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) //Decorative structures to go alongside cryopods. /obj/structure/cryofeed @@ -147,20 +147,7 @@ icon = 'icons/obj/Cryogenic2.dmi' icon_state = "cryo_rear" anchored = 1 - - var/orient_right = null //Flips the sprite. - -/obj/structure/cryofeed/right - orient_right = 1 - icon_state = "cryo_rear-r" - -/obj/structure/cryofeed/New() - - if(orient_right) - icon_state = "cryo_rear-r" - else - icon_state = "cryo_rear" - ..() + dir = WEST //Cryopods themselves. /obj/machinery/cryopod @@ -170,6 +157,7 @@ icon_state = "body_scanner_0" density = 1 anchored = 1 + dir = WEST var/base_icon_state = "body_scanner_0" var/occupied_icon_state = "body_scanner_1" @@ -180,7 +168,6 @@ var/disallow_occupant_types = list() var/mob/occupant = null // Person waiting to be despawned. - var/orient_right = null // Flips the sprite. var/time_till_despawn = 9000 // 15 minutes-ish safe period before being despawned. var/time_entered = 0 // Used to keep track of the safe period. var/obj/item/device/radio/intercom/announce // @@ -204,10 +191,6 @@ /obj/item/weapon/storage/internal ) -/obj/machinery/cryopod/right - orient_right = 1 - icon_state = "body_scanner_0-r" - /obj/machinery/cryopod/robot name = "robotic storage unit" desc = "A storage unit for robots." @@ -221,23 +204,13 @@ allow_occupant_types = list(/mob/living/silicon/robot) disallow_occupant_types = list(/mob/living/silicon/robot/drone) -/obj/machinery/cryopod/robot/right - orient_right = 1 - icon_state = "pod_0-r" - /obj/machinery/cryopod/New() announce = new /obj/item/device/radio/intercom(src) - - if(orient_right) - icon_state = "[base_icon_state]-r" - else - icon_state = base_icon_state - ..() /obj/machinery/cryopod/Destroy() if(occupant) - occupant.loc = loc + occupant.forceMove(loc) occupant.resting = 1 ..() @@ -298,7 +271,7 @@ 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 + O.forceMove(R) qdel(I) qdel(R.module) @@ -310,13 +283,13 @@ //Drop all items into the pod. for(var/obj/item/W in occupant) occupant.drop_from_inventory(W) - W.loc = src + W.forceMove(src) 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 + O.forceMove(src) //Delete all items not on the preservation list. var/list/items = src.contents.Copy() @@ -326,9 +299,10 @@ for(var/obj/item/W in items) var/preserve = null - if (istype(W, /obj/item/device/mmi)) + // Snowflaaaake. + if(istype(W, /obj/item/device/mmi)) var/obj/item/device/mmi/brain = W - if (brain.brainmob && brain.brainmob.client && brain.brainmob.key) + if(brain.brainmob && brain.brainmob.client && brain.brainmob.key) preserve = 1 else continue @@ -345,7 +319,7 @@ control_computer.frozen_items += W W.loc = null else - W.loc = src.loc + W.forceMove(src.loc) //Update any existing objectives involving this mob. for(var/datum/objective/O in all_objectives) @@ -383,10 +357,7 @@ if ((G.fields["name"] == occupant.real_name)) qdel(G) - if(orient_right) - icon_state = "[base_icon_state]-r" - else - icon_state = base_icon_state + icon_state = base_icon_state //TODO: Check objectives/mode, update new targets if this mob is the target, spawn new antags? @@ -438,16 +409,13 @@ if(do_after(user, 20)) if(!M || !G || !G:affecting) return - M.loc = src + M.forceMove(src) if(M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src - if(orient_right) - icon_state = "[occupied_icon_state]-r" - else - icon_state = occupied_icon_state + icon_state = occupied_icon_state M << "[on_enter_occupant_message]" M << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." @@ -511,10 +479,7 @@ user << "You stop [L == user ? "climbing into" : "putting [L] into"] \the [name]." return - if(orient_right) - icon_state = "[occupied_icon_state]-r" - else - icon_state = occupied_icon_state + icon_state = occupied_icon_state L << "\blue You feel cool air surround you. You go numb as your senses turn inward." L << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." @@ -538,10 +503,7 @@ if(usr.stat != 0) return - if(orient_right) - icon_state = "[base_icon_state]-r" - else - icon_state = base_icon_state + icon_state = base_icon_state //Eject any items that aren't meant to be in the pod. var/list/items = src.contents @@ -549,7 +511,7 @@ if(announce) items -= announce for(var/obj/item/W in items) - W.loc = get_turf(src) + W.forceMove(get_turf(src)) src.go_out() add_fingerprint(usr) @@ -588,13 +550,10 @@ usr.stop_pulling() usr.client.perspective = EYE_PERSPECTIVE usr.client.eye = src - usr.loc = src + usr.forceMove(src) set_occupant(usr) - if(orient_right) - icon_state = "[occupied_icon_state]-r" - else - icon_state = occupied_icon_state + icon_state = occupied_icon_state usr << "[on_enter_occupant_message]" usr << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." @@ -614,13 +573,10 @@ occupant.client.eye = src.occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = get_turf(src) + occupant.forceMove(get_turf(src)) set_occupant(null) - if(orient_right) - icon_state = "[base_icon_state]-r" - else - icon_state = base_icon_state + icon_state = base_icon_state return @@ -629,8 +585,3 @@ name = initial(name) if(occupant) name = "[name] ([occupant])" - - -//Attacks/effects. -/obj/machinery/cryopod/blob_act() - return //Sorta gamey, but we don't really want these to be destroyed. diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index fcb66fef095..0140a33fe37 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -64,7 +64,7 @@ for reference: var/health = 100 var/maxhealth = 100 var/material/material - + /obj/structure/barricade/New(var/newloc, var/material_name) ..(newloc) if(!material_name) @@ -77,7 +77,7 @@ for reference: desc = "This space is blocked off by a barricade made of [material.display_name]." color = material.icon_colour maxhealth = material.integrity - health = maxhealth + health = maxhealth /obj/structure/barricade/get_material() return material @@ -99,6 +99,7 @@ for reference: return return else + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) switch(W.damtype) if("fire") src.health -= W.force * 1 @@ -111,6 +112,7 @@ for reference: qdel(src) return ..() + /obj/structure/barricade/proc/dismantle() material.place_dismantled_product(get_turf(src)) qdel(src) @@ -129,18 +131,6 @@ for reference: dismantle() return -/obj/structure/barricade/meteorhit() - visible_message("\The [src] is smashed apart!") - dismantle() - return - -/obj/structure/barricade/blob_act() - src.health -= 25 - if (src.health <= 0) - visible_message("The blob eats through \the [src]!") - qdel(src) - return - /obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. if(air_group || (height==0)) return 1 @@ -190,39 +180,20 @@ for reference: var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() - visible_message("\red BZZzZZzZZzZT") + visible_message("BZZzZZzZZzZT") return return - else if (istype(W, /obj/item/weapon/card/emag)) - if (src.emagged == 0) - src.emagged = 1 - src.req_access.Cut() - src.req_one_access.Cut() - user << "You break the ID authentication lock on \the [src]." - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, src) - s.start() - visible_message("\red BZZzZZzZZzZT") - return - else if (src.emagged == 1) - src.emagged = 2 - user << "You short out the anchoring mechanism on \the [src]." - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, src) - s.start() - visible_message("\red BZZzZZzZZzZT") - return else if (istype(W, /obj/item/weapon/wrench)) if (src.health < src.maxhealth) src.health = src.maxhealth src.emagged = 0 src.req_access = list(access_security) - visible_message("\red [user] repairs \the [src]!") + visible_message("[user] repairs \the [src]!") return else if (src.emagged > 0) src.emagged = 0 src.req_access = list(access_security) - visible_message("\red [user] repairs \the [src]!") + visible_message("[user] repairs \the [src]!") return return else @@ -254,16 +225,6 @@ for reference: anchored = !anchored icon_state = "barrier[src.locked]" - meteorhit() - src.explode() - return - - blob_act() - src.health -= 25 - if (src.health <= 0) - src.explode() - return - CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. if(air_group || (height==0)) return 1 @@ -274,7 +235,7 @@ for reference: proc/explode() - visible_message("\red [src] blows apart!") + visible_message("[src] blows apart!") var/turf/Tsec = get_turf(src) /* var/obj/item/stack/rods/ =*/ @@ -286,4 +247,25 @@ for reference: explosion(src.loc,-1,-1,0) if(src) - qdel(src) \ No newline at end of file + qdel(src) + + +/obj/machinery/deployable/barrier/emag_act(var/remaining_charges, var/mob/user) + if (src.emagged == 0) + src.emagged = 1 + src.req_access.Cut() + src.req_one_access.Cut() + user << "You break the ID authentication lock on \the [src]." + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + visible_message("BZZzZZzZZzZT") + return 1 + else if (src.emagged == 1) + src.emagged = 2 + user << "You short out the anchoring mechanism on \the [src]." + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + visible_message("BZZzZZzZZzZT") + return 1 diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index c92a005cefc..b51d72ccd8e 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -24,11 +24,14 @@ user << "Error, no route to host." /obj/machinery/button/remote/attackby(obj/item/weapon/W, mob/user as mob) - if (istype(W, /obj/item/weapon/card/emag)) + return src.attack_hand(user) + +/obj/machinery/button/remote/emag_act(var/remaining_charges, var/mob/user) + if(req_access.len || req_one_access.len) req_access = list() req_one_access = list() playsound(src.loc, "sparks", 100, 1) - return src.attack_hand(user) + return 1 /obj/machinery/button/remote/attack_hand(mob/user as mob) if(..()) @@ -66,6 +69,14 @@ /* Airlock remote control */ + +// Bitmasks for door switches. +#define OPEN 0x1 +#define IDSCAN 0x2 +#define BOLTS 0x4 +#define SHOCK 0x8 +#define SAFE 0x10 + /obj/machinery/button/remote/airlock name = "remote door-control" desc = "It controls doors, remotely." @@ -110,6 +121,12 @@ if(specialfunctions & SAFE) D.set_safeties(1) +#undef OPEN +#undef IDSCAN +#undef BOLTS +#undef SHOCK +#undef SAFE + /* Blast door remote control */ diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 04040f7527b..a1c85801566 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -39,6 +39,9 @@ var/open_sound_unpowered = 'sound/machines/airlock_creaking.ogg' hashatch = 1 + var/_wifi_id + var/datum/wifi/receiver/button/door/wifi_receiver + /obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage) if(stat & (BROKEN|NOPOWER)) if(damage >= 10) @@ -375,7 +378,7 @@ About the new airlock wires panel: * An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. * one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) -* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be \red open, but bolts-raising will not work. Cutting these wires may electrocute the user. +* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. * one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. * two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. * one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. @@ -399,7 +402,7 @@ About the new airlock wires panel: else /*if(src.justzap)*/ return else if(user.hallucination > 50 && prob(10) && src.operating == 0) - user << "\red You feel a powerful shock course through your body!" + user << "You feel a powerful shock course through your body!" user.halloss += 10 user.stunned += 10 return @@ -541,10 +544,12 @@ About the new airlock wires panel: return 0 /obj/machinery/door/airlock/update_icon() + set_light(0) if(overlays) overlays.Cut() if(density) if(locked && lights && src.arePowerSystemsOn()) icon_state = "door_locked" + set_light(1.5, 0.5, COLOR_RED_LIGHT) else icon_state = "door_closed" if(p_open || welded) @@ -610,7 +615,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/door/airlock/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/machinery/door/airlock/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] data["main_power_loss"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) @@ -630,7 +635,7 @@ About the new airlock wires panel: ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "door_control.tmpl", "Door Controls", 450, 350) + ui = new(user, src, ui_key, "door_control.tmpl", "Door Controls", 450, 350, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -722,13 +727,10 @@ About the new airlock wires panel: return /obj/machinery/door/airlock/CanUseTopic(var/mob/user) - if(!user.isSilicon()) - return STATUS_CLOSE - if(operating < 0) //emagged user << "Unable to interface: Internal error." return STATUS_CLOSE - if(!src.canAIControl()) + if(issilicon(user) && !src.canAIControl()) if(src.canAIHack(user)) src.hack(user) else @@ -740,7 +742,7 @@ About the new airlock wires panel: return ..() -/obj/machinery/door/airlock/Topic(href, href_list, var/nowindow = 0) +/obj/machinery/door/airlock/Topic(href, href_list) if(..()) return 1 @@ -849,7 +851,7 @@ About the new airlock wires panel: playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40)) - user << "\blue You removed the airlock electronics!" + user << "You removed the airlock electronics!" var/obj/structure/door_assembly/da = new assembly_type(src.loc) if (istype(da, /obj/structure/door_assembly/multi_tile)) @@ -978,6 +980,9 @@ About the new airlock wires panel: /obj/machinery/door/blocks_airlock() return 0 +/obj/structure/window/blocks_airlock() + return 0 + /obj/machinery/mech_sensor/blocks_airlock() return 0 @@ -987,6 +992,9 @@ About the new airlock wires panel: /atom/movable/proc/airlock_crush(var/crush_damage) return 0 +/obj/structure/window/airlock_crush(var/crush_damage) + ex_act(2)//Smashin windows + /obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) . = ..() health -= crush_damage @@ -1055,12 +1063,8 @@ About the new airlock wires panel: playsound(src.loc, open_sound_powered, 100, 1) else playsound(src.loc, open_sound_unpowered, 100, 1) - for(var/turf/turf in locs) - var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) - if(killthis) - killthis.ex_act(2)//Smashin windows + ..() - return /obj/machinery/door/airlock/proc/lock(var/forced=0) if(locked) @@ -1113,6 +1117,9 @@ About the new airlock wires panel: else name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" + //get the dir from the assembly + set_dir(assembly.dir) + //wires var/turf/T = get_turf(newloc) if(T && (T.z in config.admin_levels)) @@ -1128,12 +1135,14 @@ About the new airlock wires panel: if(A.closeOtherId == src.closeOtherId && A != src) src.closeOther = A break + ..() /obj/machinery/door/airlock/Destroy() - if(wires) - qdel(wires) - wires = null - ..() + qdel(wires) + wires = null + qdel(wifi_receiver) + wifi_receiver = null + return ..() // Most doors will never be deconstructed over the course of a round, // so as an optimization defer the creation of electronics until @@ -1170,11 +1179,13 @@ About the new airlock wires panel: update_icon() /obj/machinery/door/airlock/proc/prison_open() - if (bracer) + if(bracer) return - src.unlock() - src.open() - src.lock() + + if(arePowerSystemsOn()) + src.unlock() + src.open() + src.lock() return #undef AIRLOCK_CRUSH_DIVISOR diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 053b776736e..bb4b29b88a6 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -130,11 +130,15 @@ obj/machinery/door/airlock/proc/set_frequency(new_frequency) obj/machinery/door/airlock/initialize() + ..() if(frequency) set_frequency(frequency) - update_icon() + //wireless connection + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) + update_icon() obj/machinery/door/airlock/New() ..() @@ -261,7 +265,7 @@ obj/machinery/access_button/attackby(obj/item/I as obj, mob/user as mob) obj/machinery/access_button/attack_hand(mob/user) add_fingerprint(usr) if(!allowed(user)) - user << "\red Access Denied" + user << "Access Denied" else if(radio_connection) var/datum/signal/signal = new @@ -300,4 +304,4 @@ obj/machinery/access_button/airlock_interior obj/machinery/access_button/airlock_exterior frequency = 1379 - command = "cycle_exterior" \ No newline at end of file + command = "cycle_exterior" diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 78b8808d286..e69f750a5fa 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -42,7 +42,7 @@ t1 += "
" - var/list/accesses = get_all_accesses() + var/list/accesses = get_all_station_access() for (var/acc in accesses) var/aname = get_access_desc(acc) @@ -114,5 +114,5 @@ /obj/item/weapon/airlock_electronics/secure name = "secure airlock electronics" desc = "designed to be somewhat more resistant to hacking than standard electronics." - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) secure = 1 diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index a9dfcde0768..22c7da36546 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -28,6 +28,19 @@ //turning this off prevents awkward zone geometry in places like medbay lobby, for example. block_air_zones = 0 + var/_wifi_id + var/datum/wifi/receiver/button/door/wifi_receiver + +/obj/machinery/door/blast/initialize() + ..() + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) + +/obj/machinery/door/airlock/Destroy() + qdel(wifi_receiver) + wifi_receiver = null + return ..() + // Proc: Bumped() // Parameters: 1 (AM - Atom that tried to walk through this object) // Description: If we are open returns zero, otherwise returns result of parent function. @@ -71,7 +84,7 @@ src.density = 1 update_nearby_tiles() src.update_icon() - src.set_opacity(initial(opacity)) + src.set_opacity(1) sleep(15) src.operating = 0 @@ -160,6 +173,12 @@ obj/machinery/door/blast/regular icon_state_closing = "pdoorc1" icon_state = "pdoor1" maxhealth = 600 + block_air_zones = 1 + +obj/machinery/door/blast/regular/open + icon_state = "pdoor0" + density = 0 + opacity = 0 // SUBTYPE: Shutters // Nicer looking, and also weaker, shutters. Found in kitchen and similar areas. @@ -168,4 +187,4 @@ obj/machinery/door/blast/regular icon_state_opening = "shutterc0" icon_state_closed = "shutter1" icon_state_closing = "shutterc1" - icon_state = "shutter1" \ No newline at end of file + icon_state = "shutter1" diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0b508787a51..68b5e0de827 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -150,7 +150,7 @@ var/mob/M = AM if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam. M.last_bumped = world.time - if(!M.restrained() && !M.small) + if(!M.restrained() && (!issmall(M) || ishuman(M))) bumpopen(M) return @@ -214,22 +214,16 @@ else do_animate("deny") return -/obj/machinery/door/meteorhit(obj/M as obj) - src.open() - return - /obj/machinery/door/bullet_act(var/obj/item/projectile/Proj) ..() - //Tasers and the like should not damage doors. Nor should TOX, OXY, CLONE, etc damage types - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return + var/damage = Proj.get_structure_damage() // Emitter Blasts - these will eventually completely destroy the door, given enough time. - if (Proj.damage > 90) + if (damage > 90) destroy_hits-- if (destroy_hits <= 0) - visible_message(span("danger","\The [src.name] disintegrates!")) + visible_message("\The [src.name] disintegrates!") switch (Proj.damage_type) if(BRUTE) new /obj/item/stack/material/steel(src.loc, 2) @@ -238,16 +232,16 @@ new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes! qdel(src) - if(Proj.damage) + if(damage) //cap projectile damage so that there's still a minimum number of hits required to break the door - take_damage(min(Proj.damage, 100)) + take_damage(min(damage, 100)) /obj/machinery/door/hitby(AM as mob|obj, var/speed=5) ..() - visible_message(span("danger","[src.name] was hit by [AM].")) + visible_message("[src.name] was hit by [AM].") var/tforce = 0 if(ismob(AM)) tforce = 15 * (speed/5) @@ -335,12 +329,13 @@ //psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them. if(src.density && istype(I, /obj/item/weapon) && user.a_intent == I_HURT && !istype(I, /obj/item/weapon/card)) var/obj/item/weapon/W = I + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(W.damtype == BRUTE || W.damtype == BURN) user.do_attack_animation(src) if(W.force < min_force) - user.visible_message(span("danger","\The [user] hits \the [src] with \the [W] with no visible effect." )) + user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.") else - user.visible_message(span("danger","\The [user] forcefully strikes \the [src] with \the [W]!" )) + user.visible_message("\The [user] forcefully strikes \the [src] with \the [W]!") playsound(src.loc, hitsound, 100, 1) take_damage(W.force) return @@ -349,13 +344,6 @@ if(src.operating) return - if(src.density && (operable() && istype(I, /obj/item/weapon/card/emag))) - do_animate("spark") - sleep(6) - open() - operating = -1 - return 1 - if(src.allowed(user) && operable()) if(src.density) open() @@ -367,6 +355,14 @@ do_animate("deny") return +/obj/machinery/door/emag_act(var/remaining_charges) + if(density && operable()) + do_animate("spark") + sleep(6) + open() + operating = -1 + return 1 + /obj/machinery/door/proc/take_damage(var/damage) var/initialhealth = src.health src.health = max(0, src.health - damage) @@ -401,12 +397,6 @@ return -/obj/machinery/door/blob_act() - if(prob(40)) - qdel(src) - return - - /obj/machinery/door/emp_act(severity) if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) ) spawn(0) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index f143958658f..82381013812 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -1,6 +1,3 @@ -/var/const/OPEN = 1 -/var/const/CLOSED = 2 - #define FIREDOOR_MAX_PRESSURE_DIFF 25 // kPa #define FIREDOOR_MAX_TEMP 50 // °C #define FIREDOOR_MIN_TEMP 0 @@ -120,10 +117,7 @@ continue var/celsius = convert_k2c(tile_info[index][1]) var/pressure = tile_info[index][2] - if(dir_alerts[index] & (FIREDOOR_ALERT_HOT|FIREDOOR_ALERT_COLD)) - o += "" - else - o += "" + o += "" o += "[celsius]°C " o += "" o += "[pressure]kPa" @@ -167,9 +161,8 @@ var/answer = alert(user, "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density ? "\nNote that by doing so, you acknowledge any damages from opening this\n[src.name] as being your own fault, and you will be held accountable under the law." : ""]",\ "\The [src]", "Yes, [density ? "open" : "close"]", "No") if(answer == "No") - return - */ - if(user.stat || user.stunned || user.weakened || user.paralysis || (!user.canmove && !user.isSilicon()) || (get_dist(src, user) > 1 && !isAI(user))) + return*/ + if(user.incapacitated() || (get_dist(src, user) > 1 && !issilicon(user))) user << "Sorry, you must remain able bodied and close to \the [src] in order to use it." return if(density && (stat & (BROKEN|NOPOWER))) //can still close without power @@ -189,7 +182,7 @@ if(alarmed) // Accountability! users_to_open |= user.name - needs_to_close = !user.isSilicon() + needs_to_close = !issilicon(user) spawn() open() else @@ -203,7 +196,7 @@ if(A.fire || A.air_doors_activated) alarmed = 1 if(alarmed) - nextstate = CLOSED + nextstate = FIREDOOR_CLOSED close() /obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob) @@ -344,11 +337,11 @@ if(operating || !nextstate) return switch(nextstate) - if(OPEN) + if(FIREDOOR_OPEN) nextstate = null open() - if(CLOSED) + if(FIREDOOR_CLOSED) nextstate = null close() return @@ -387,6 +380,9 @@ /obj/machinery/door/firedoor/update_icon() overlays.Cut() + set_light(0) + var/do_set_light = 0 + if(density) icon_state = "door_closed" if(hatch_open) @@ -395,12 +391,14 @@ overlays += "welded" if(pdiff_alert) overlays += "palert" + do_set_light = 1 if(dir_alerts) for(var/d=1;d<=4;d++) var/cdir = cardinal[d] for(var/i=1;i<=ALERT_STATES.len;i++) if(dir_alerts[d] & (1<<(i-1))) overlays += new/icon(icon,"alert_[ALERT_STATES[i]]", dir=cdir) + do_set_light = 1 if (hashatch) hatch_image.color = hatch_colour//This line is unnecessary, but is here for configuring colours ingame. Should be removed when finished if (hatchstate) @@ -412,7 +410,9 @@ icon_state = "door_open" if(blocked) overlays += "welded_open" - return + + if(do_set_light) + set_light(1.5, 0.5, COLOR_SUN) //These are playing merry hell on ZAS. Sorry fellas :( diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index a9896e8b310..bd95273759a 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -6,13 +6,20 @@ /obj/machinery/door/airlock/multi_tile/New() ..() - switch(dir) - if(EAST, WEST) - bound_width = width * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = width * world.icon_size + SetBounds() + +/obj/machinery/door/airlock/multi_tile/Move() + . = ..() + SetBounds() + + +/obj/machinery/door/airlock/multi_tile/proc/SetBounds() + if(dir in list(EAST, WEST)) + bound_width = width * world.icon_size + bound_height = world.icon_size + else + bound_width = world.icon_size + bound_height = width * world.icon_size /obj/machinery/door/airlock/multi_tile/glass name = "Glass Airlock" @@ -38,4 +45,4 @@ overlays += hatch_image else spawn(10)//If overlays aren't initialised, wait a second and try again - setup_hatch() \ No newline at end of file + setup_hatch() diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm index dce2ab37bda..c87ab1ad35c 100644 --- a/code/game/machinery/doors/unpowered.dm +++ b/code/game/machinery/doors/unpowered.dm @@ -1,26 +1,25 @@ -/obj/machinery/door/unpowered - autoclose = 0 - var/locked = 0 - - - Bumped(atom/AM) - if(src.locked) - return - ..() - return - - - attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)) return - if(src.locked) return - ..() - return - - - -/obj/machinery/door/unpowered/shuttle - icon = 'icons/turf/shuttle.dmi' - name = "door" - icon_state = "door1" - opacity = 1 - density = 1 \ No newline at end of file +/obj/machinery/door/unpowered + autoclose = 0 + var/locked = 0 + +/obj/machinery/door/unpowered/Bumped(atom/AM) + if(src.locked) + return + ..() + return + +/obj/machinery/door/unpowered/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/weapon/melee/energy/blade)) return + if(src.locked) return + ..() + return + +/obj/machinery/door/unpowered/emag_act() + return -1 + +/obj/machinery/door/unpowered/shuttle + icon = 'icons/turf/shuttle.dmi' + name = "door" + icon_state = "door1" + opacity = 1 + density = 1 diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 99bdb423679..eb0a6f9491e 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -76,7 +76,7 @@ return if (src.operating) return - if (src.density && src.allowed(AM)) + if (src.density && (!issmall(AM) || ishuman(AM)) && src.allowed(AM)) open() if(src.check_access(null)) sleep(50) @@ -157,11 +157,19 @@ var/mob/living/carbon/human/H = user if(H.species.can_shred(H)) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - visible_message("\red [user] smashes against the [src.name].", 1) + visible_message("[user] smashes against the [src.name].", 1) take_damage(25) return return src.attackby(user, user) +/obj/machinery/door/window/emag_act(var/remaining_charges, var/mob/user) + if (density && operable()) + operating = -1 + flick("[src.base_state]spark", src) + sleep(6) + open() + return 1 + /obj/machinery/door/window/attackby(obj/item/weapon/I as obj, mob/user as mob) //If it's in the process of opening/closing, ignore the click @@ -169,18 +177,14 @@ return //Emags and ninja swords? You may pass. - if (src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade))) - src.operating = -1 - if(istype(I, /obj/item/weapon/melee/energy/blade)) + if (istype(I, /obj/item/weapon/melee/energy/blade)) + if(emag_act(10, user)) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, "sparks", 50, 1) playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - visible_message("\blue The glass door was sliced open by [user]!") - flick("[src.base_state]spark", src) - sleep(6) - open() + visible_message("The glass door was sliced open by [user]!") return 1 //If it's emagged, crowbar can pry electronics out. @@ -188,7 +192,7 @@ playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the windoor.", "You start to remove electronics from the windoor.") if (do_after(user,40)) - user << "\blue You removed the windoor electronics!" + user << "You removed the windoor electronics!" var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc) if (istype(src, /obj/machinery/door/window/brigdoor)) @@ -224,9 +228,10 @@ //If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway) if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card)) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/aforce = I.force playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - visible_message("\red [src] was hit by [I].") + visible_message("[src] was hit by [I].") if(I.damtype == BRUTE || I.damtype == BURN) take_damage(aforce) return diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index ec9f4e7accc..6661468f59e 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -37,7 +37,7 @@ var/list/doppler_arrays = list() var/message = "Explosive disturbance detected - Epicenter at: grid ([x0],[y0]). Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range]. Temporal displacement of tachyons: [took]seconds." for(var/mob/O in hearers(src, null)) - O.show_message("[src] states coldly, \"[message]\"",2) + O.show_message("[src] states coldly, \"[message]\"",2) /obj/machinery/doppler_array/power_change() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 1a47ae81fdb..bea0c443a74 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -14,6 +14,9 @@ anchored = 1 use_power = 1 idle_power_usage = 2 + flags = PROXMOVE + var/_wifi_id + var/datum/wifi/receiver/button/flasher/wifi_receiver /obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored name = "portable flasher" @@ -24,11 +27,16 @@ base_state = "pflash" density = 1 -/* -/obj/machinery/flasher/New() - sleep(4) //<--- What the fuck are you doing? D= - src.sd_SetLuminosity(2) -*/ +/obj/machinery/flasher/initialize() + ..() + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) + +/obj/machinery/flasher/Destroy() + qdel(wifi_receiver) + wifi_receiver = null + return ..() + /obj/machinery/flasher/power_change() ..() if ( !(stat & NOPOWER) ) @@ -44,9 +52,9 @@ add_fingerprint(user) src.disable = !src.disable if (src.disable) - user.visible_message("\red [user] has disconnected the [src]'s flashbulb!", "\red You disconnect the [src]'s flashbulb!") + user.visible_message("[user] has disconnected the [src]'s flashbulb!", "You disconnect the [src]'s flashbulb!") if (!src.disable) - user.visible_message("\red [user] has connected the [src]'s flashbulb!", "\red You connect the [src]'s flashbulb!") + user.visible_message("[user] has connected the [src]'s flashbulb!", "You connect the [src]'s flashbulb!") //Let the AI trigger them directly. /obj/machinery/flasher/attack_ai() @@ -71,25 +79,22 @@ if (get_dist(src, O) > src.range) continue + var/flash_time = strength if (istype(O, /mob/living/carbon/human)) var/mob/living/carbon/human/H = O if(!H.eyecheck() <= 0) continue - - if (istype(O, /mob/living/carbon/alien))//So aliens don't get flashed (they have no external eyes)/N - continue - - O.Weaken(strength) - if (istype(O, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = O + flash_time *= H.species.flash_mod var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] - if (E && (E.damage > E.min_bruised_damage && prob(E.damage + 50))) + if(!E) + return + if(E.is_bruised() && prob(E.damage + 50)) flick("e_flash", O:flash) E.damage += rand(1, 5) else if(!O.blinded) flick("flash", O:flash) - + O.Weaken(flash_time) /obj/machinery/flasher/emp_act(severity) if(stat & (BROKEN|NOPOWER)) @@ -114,11 +119,11 @@ src.anchored = !src.anchored if (!src.anchored) - user.show_message(text("\red [src] can now be moved.")) + user.show_message(text("[src] can now be moved.")) src.overlays.Cut() else if (src.anchored) - user.show_message(text("\red [src] is now secured.")) + user.show_message(text("[src] is now secured.")) src.overlays += "[base_state]-s" /obj/machinery/button/flasher @@ -145,4 +150,4 @@ icon_state = "launcherbtt" active = 0 - return \ No newline at end of file + return diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index f72c231f958..e31a19b265b 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -85,6 +85,8 @@ cell.update_icon() src.cell = null + on = 0 + set_light(0) user << "You remove the power cell" update_icon() return diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm new file mode 100644 index 00000000000..7298b62abf9 --- /dev/null +++ b/code/game/machinery/floor_light.dm @@ -0,0 +1,157 @@ +var/list/floor_light_cache = list() + +/obj/machinery/floor_light + name = "floor light" + icon = 'icons/obj/machines/floor_light.dmi' + icon_state = "base" + desc = "A backlit floor panel." + layer = TURF_LAYER+0.001 + anchored = 0 + use_power = 2 + idle_power_usage = 2 + active_power_usage = 20 + power_channel = LIGHT + matter = list(DEFAULT_WALL_MATERIAL = 2500, "glass" = 2750) + + var/on + var/damaged + var/default_light_range = 4 + var/default_light_power = 2 + var/default_light_colour = "#FFFFFF" + +/obj/machinery/floor_light/prebuilt + anchored = 1 + +/obj/machinery/floor_light/attackby(var/obj/item/W, var/mob/user) + if(istype(W, /obj/item/weapon/screwdriver)) + anchored = !anchored + visible_message("\The [user] has [anchored ? "attached" : "detached"] \the [src].") + else if(istype(W, /obj/item/weapon/weldingtool) && (damaged || (stat & BROKEN))) + var/obj/item/weapon/weldingtool/WT = W + if(!WT.remove_fuel(0, user)) + user << "\The [src] must be on to complete this task." + return + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + if(!do_after(user, 20)) + return + if(!src || !WT.isOn()) + return + visible_message("\The [user] has repaired \the [src].") + stat &= ~BROKEN + damaged = null + update_brightness() + else if(W.force && user.a_intent == "hurt") + attack_hand(user) + return + +/obj/machinery/floor_light/attack_hand(var/mob/user) + + if(user.a_intent == I_HURT && !issmall(user)) + if(!isnull(damaged) && !(stat & BROKEN)) + visible_message("\The [user] smashes \the [src]!") + playsound(src, "shatter", 70, 1) + stat |= BROKEN + else + visible_message("\The [user] attacks \the [src]!") + playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + if(isnull(damaged)) damaged = 0 + update_brightness() + return + else + + if(!anchored) + user << "\The [src] must be screwed down first." + return + + if(stat & BROKEN) + user << "\The [src] is too damaged to be functional." + return + + if(stat & NOPOWER) + user << "\The [src] is unpowered." + return + + on = !on + if(on) use_power = 2 + visible_message("\The [user] turns \the [src] [on ? "on" : "off"].") + update_brightness() + return + +/obj/machinery/floor_light/process() + ..() + var/need_update + if((!anchored || broken()) && on) + use_power = 0 + on = 0 + need_update = 1 + else if(use_power && !on) + use_power = 0 + need_update = 1 + if(need_update) + update_brightness() + +/obj/machinery/floor_light/proc/update_brightness() + if(on && use_power == 2) + if(light_range != default_light_range || light_power != default_light_power || light_color != default_light_colour) + set_light(default_light_range, default_light_power, default_light_colour) + else + use_power = 0 + if(light_range || light_power) + set_light(0) + + active_power_usage = ((light_range + light_power) * 10) + update_icon() + +/obj/machinery/floor_light/update_icon() + overlays.Cut() + if(use_power && !broken()) + if(isnull(damaged)) + var/cache_key = "floorlight-[default_light_colour]" + if(!floor_light_cache[cache_key]) + var/image/I = image("on") + I.color = default_light_colour + I.layer = layer+0.001 + floor_light_cache[cache_key] = I + overlays |= floor_light_cache[cache_key] + else + if(damaged == 0) //Needs init. + damaged = rand(1,4) + var/cache_key = "floorlight-broken[damaged]-[default_light_colour]" + if(!floor_light_cache[cache_key]) + var/image/I = image("flicker[damaged]") + I.color = default_light_colour + I.layer = layer+0.001 + floor_light_cache[cache_key] = I + overlays |= floor_light_cache[cache_key] + +/obj/machinery/floor_light/proc/broken() + return (stat & (BROKEN|NOPOWER)) + +/obj/machinery/floor_light/ex_act(severity) + switch(severity) + if(1) + qdel(src) + if(2) + if (prob(50)) + qdel(src) + else if(prob(20)) + stat |= BROKEN + else + if(isnull(damaged)) + damaged = 0 + if(3) + if (prob(5)) + qdel(src) + else if(isnull(damaged)) + damaged = 0 + return + +/obj/machinery/floor_light/Destroy() + var/area/A = get_area(src) + if(A) + on = 0 + ..() + +/obj/machinery/floor_light/cultify() + default_light_colour = "#FF0000" + update_brightness() \ No newline at end of file diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index b23cd67b4f4..70a49a74b35 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -10,7 +10,7 @@ var/list/mode = list("dismantle"=0,"laying"=0,"collect"=0) /obj/machinery/floorlayer/New() - T = new/obj/item/stack/tile/steel(src) + T = new/obj/item/stack/tile/floor(src) ..() /obj/machinery/floorlayer/Move(new_turf,M_Dir) @@ -84,9 +84,9 @@ var/turf/simulated/floor/T = new_turf if(!T.is_plating()) if(!T.broken && !T.burnt) - new T.floor_type(T) + new T.flooring.build_type() T.make_plating() - return !new_turf.intact + return T.is_plating() return 0 /obj/machinery/floorlayer/proc/TakeNewStack() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 28bb2be7bcc..d7c037839d8 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -113,6 +113,12 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ master.show_message(rendered, 2) return +/obj/machinery/hologram/holopad/show_message(msg, type, alt, alt_type) + for(var/mob/living/silicon/ai/master in masters) + var/rendered = "Holopad received, [msg]" + master.show_message(rendered, type) + return + /obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) var/obj/effect/overlay/hologram = new(T)//Spawn a blank effect at the location. hologram.icon = A.holo_icon @@ -140,22 +146,15 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/process() for (var/mob/living/silicon/ai/master in masters) - var/active_ai = (master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + var/active_ai = (master && !master.incapacitated() && master.client && master.eyeobj)//If there is an AI with an eye attached, it's not incapacitated, and it has a client if((stat & NOPOWER) || !active_ai) clear_holo(master) continue - if((HOLOPAD_MODE == RANGE_BASED && (get_dist(master.eyeobj, src) > holo_range))) + if(!(masters[master] in view(src))) clear_holo(master) continue - if(HOLOPAD_MODE == AREA_BASED) - var/area/holo_area = get_area(src) - var/area/eye_area = get_area(master.eyeobj) - if(eye_area != holo_area) - clear_holo(master) - continue - use_power(power_per_hologram) return 1 @@ -163,8 +162,21 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(masters[user]) step_to(masters[user], user.eyeobj) // So it turns. var/obj/effect/overlay/H = masters[user] - H.loc = get_turf(user.eyeobj) + H.forceMove(get_turf(user.eyeobj)) masters[user] = H + + if(!(H in view(src))) + clear_holo(user) + return 0 + + if((HOLOPAD_MODE == RANGE_BASED && (get_dist(user.eyeobj, src) > holo_range))) + clear_holo(user) + + if(HOLOPAD_MODE == AREA_BASED) + var/area/holo_area = get_area(src) + var/area/hologram_area = get_area(H) + if(hologram_area != holo_area) + clear_holo(user) return 1 /* @@ -190,14 +202,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ qdel(src) return -/obj/machinery/hologram/blob_act() - qdel(src) - return - -/obj/machinery/hologram/meteorhit() - qdel(src) - return - /obj/machinery/hologram/holopad/Destroy() for (var/mob/living/silicon/ai/master in masters) clear_holo(master) diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 63198710227..69f12726342 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -12,6 +12,18 @@ var/lit = 0 var/id = null var/on_icon = "sign_on" + var/_wifi_id + var/datum/wifi/receiver/button/holosign/wifi_receiver + +/obj/machinery/holosign/initialize() + ..() + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) + +/obj/machinery/holosign/Destroy() + qdel(wifi_receiver) + wifi_receiver = null + return ..() /obj/machinery/holosign/proc/toggle() if (stat & (BROKEN|NOPOWER)) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index f6bbdf3a80a..70527609282 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -4,11 +4,32 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "igniter1" var/id = null - var/on = 1.0 - anchored = 1.0 + var/on = 0 + anchored = 1 use_power = 1 idle_power_usage = 2 active_power_usage = 4 + var/_wifi_id + var/datum/wifi/receiver/button/igniter/wifi_receiver + +/obj/machinery/igniter/New() + ..() + update_icon() + +/obj/machinery/igniter/initialize() + ..() + update_icon() + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) + +/obj/machinery/igniter/update_icon() + ..() + icon_state = "igniter[on]" + +/obj/machinery/igniter/Destroy() + qdel(wifi_receiver) + wifi_receiver = null + return ..() /obj/machinery/igniter/attack_ai(mob/user as mob) return src.attack_hand(user) @@ -17,29 +38,25 @@ if(..()) return add_fingerprint(user) - - use_power(50) - src.on = !( src.on ) - src.icon_state = text("igniter[]", src.on) + ignite() return /obj/machinery/igniter/process() //ugh why is this even in process()? - if (src.on && !(stat & NOPOWER) ) + if (on && powered() ) var/turf/location = src.loc if (isturf(location)) location.hotspot_expose(1000,500,1) return 1 -/obj/machinery/igniter/New() - ..() - icon_state = "igniter[on]" - /obj/machinery/igniter/power_change() ..() - if(!( stat & NOPOWER) ) - icon_state = "igniter[src.on]" - else - icon_state = "igniter0" + update_icon() + +/obj/machinery/igniter/proc/ignite() + use_power(50) + on = !on + update_icon() + // Wall mounted remote-control igniter. @@ -56,50 +73,59 @@ use_power = 1 idle_power_usage = 2 active_power_usage = 4 + var/_wifi_id + var/datum/wifi/receiver/button/sparker/wifi_receiver - -/obj/machinery/sparker/New() +/obj/machinery/sparker/initialize() ..() + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) + +/obj/machinery/sparker/Destroy() + qdel(wifi_receiver) + wifi_receiver = null + return ..() + +/obj/machinery/sparker/update_icon() + ..() + if(disable) + icon_state = "migniter-d" + else if(powered()) + icon_state = "migniter" +// src.sd_SetLuminosity(2) + else + icon_state = "migniter-p" +// src.sd_SetLuminosity(0) /obj/machinery/sparker/power_change() ..() - if ( !(stat & NOPOWER) && disable == 0 ) - - icon_state = "[base_state]" -// src.sd_SetLuminosity(2) - else - icon_state = "[base_state]-p" -// src.sd_SetLuminosity(0) + update_icon() /obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/screwdriver)) add_fingerprint(user) - src.disable = !src.disable - if (src.disable) - user.visible_message("\red [user] has disabled the [src]!", "\red You disable the connection to the [src].") - icon_state = "[base_state]-d" - if (!src.disable) - user.visible_message("\red [user] has reconnected the [src]!", "\red You fix the connection to the [src].") - if(src.powered()) - icon_state = "[base_state]" - else - icon_state = "[base_state]-p" + disable = !disable + if(disable) + user.visible_message("[user] has disabled the [src]!", "You disable the connection to the [src].") + else if(!disable) + user.visible_message("[user] has reconnected the [src]!", "You fix the connection to the [src].") + update_icon() /obj/machinery/sparker/attack_ai() - if (src.anchored) - return src.ignite() + if (anchored) + return ignite() else return /obj/machinery/sparker/proc/ignite() - if (!(powered())) + if (!powered()) return - if ((src.disable) || (src.last_spark && world.time < src.last_spark + 50)) + if (disable || (last_spark && world.time < last_spark + 50)) return - flick("[base_state]-spark", src) + flick("migniter-spark", src) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() @@ -132,15 +158,13 @@ icon_state = "launcheract" for(var/obj/machinery/sparker/M in machines) - if (M.id == src.id) + if (M.id == id) spawn( 0 ) M.ignite() for(var/obj/machinery/igniter/M in machines) - if(M.id == src.id) - use_power(50) - M.on = !( M.on ) - M.icon_state = text("igniter[]", M.on) + if(M.id == id) + M.ignite() sleep(50) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 370a442a3d9..fd975a129a8 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -108,7 +108,7 @@ if(NOCLONE in T.mutations) return - if(T.species && T.species.flags & NO_BLOOD) + if(T.species.flags & NO_BLOOD) return // If the human is losing too much blood, beep. @@ -192,4 +192,4 @@ /obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(height && istype(mover) && mover.checkpass(PASSTABLE)) //allow bullets, beams, thrown objects, mice, drones, and the like through. return 1 - return ..() \ No newline at end of file + return ..() diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 363edf64f53..74b366439c3 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -177,17 +177,16 @@ datum/track/New(var/title_name, var/audio) power_change() update_icon() return - if(istype(W, /obj/item/weapon/card/emag)) - if(!emagged) - emagged = 1 - StopPlaying() - visible_message("\the [src] makes a fizzling sound.") - log_and_message_admins("emagged \the [src]") - update_icon() - return - return ..() +/obj/machinery/media/jukebox/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + emagged = 1 + StopPlaying() + visible_message("\The [src] makes a fizzling sound.") + update_icon() + return 1 + /obj/machinery/media/jukebox/proc/StopPlaying() var/area/main_area = get_area(src) // Always kill the current sound diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 29994c17efb..939f7d307dd 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -84,16 +84,12 @@ ..() usr << "The safety guard is [emagged ? "disabled" : "enabled"]." +/obj/machinery/gibber/emag_act(var/remaining_charges, var/mob/user) + emagged = !emagged + user << "You [emagged ? "disable" : "enable"] the gibber safety guard." + return 1 + /obj/machinery/gibber/attackby(var/obj/item/W, var/mob/user) - - if(istype(W,/obj/item/weapon/card)) - if(!allowed(user) && !istype(W,/obj/item/weapon/card/emag)) - user << "Access denied." - return - emagged = !emagged - user << "You [emagged ? "disable" : "enable"] the gibber safety guard." - return - var/obj/item/weapon/grab/G = W if(!istype(G)) @@ -143,10 +139,10 @@ user << "Subject may not have abiotic items on." return - user.visible_message("\red [user] starts to put [victim] into the gibber!") + user.visible_message("[user] starts to put [victim] into the gibber!") src.add_fingerprint(user) if(do_after(user, 30) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && !occupant) - user.visible_message("\red [user] stuffs [victim] into the gibber!") + user.visible_message("[user] stuffs [victim] into the gibber!") if(victim.client) victim.client.perspective = EYE_PERSPECTIVE victim.client.eye = src @@ -208,7 +204,7 @@ slab_type = H.species.meat_type // Small mobs don't give as much nutrition. - if(src.occupant.small) + if(issmall(src.occupant)) slab_nutrition *= 0.5 slab_nutrition /= slab_count diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 782e9c4cde1..25c1e334563 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -56,69 +56,69 @@ if(src.broken > 0) if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver user.visible_message( \ - "\blue [user] starts to fix part of the microwave.", \ - "\blue You start to fix part of the microwave." \ + "\The [user] starts to fix part of the microwave.", \ + "You start to fix part of the microwave." \ ) if (do_after(user,20)) user.visible_message( \ - "\blue [user] fixes part of the microwave.", \ - "\blue You have fixed part of the microwave." \ + "\The [user] fixes part of the microwave.", \ + "You have fixed part of the microwave." \ ) src.broken = 1 // Fix it a bit else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench user.visible_message( \ - "\blue [user] starts to fix part of the microwave.", \ - "\blue You start to fix part of the microwave." \ + "\The [user] starts to fix part of the microwave.", \ + "You start to fix part of the microwave." \ ) if (do_after(user,20)) user.visible_message( \ - "\blue [user] fixes the microwave.", \ - "\blue You have fixed the microwave." \ + "\The [user] fixes the microwave.", \ + "You have fixed the microwave." \ ) src.icon_state = "mw" src.broken = 0 // Fix it! src.dirty = 0 // just to be sure src.flags = OPENCONTAINER else - user << "\red It's broken!" + user << "It's broken!" return 1 else if(src.dirty==100) // The microwave is all dirty so can't be used! if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner)) // If they're trying to clean it then let them user.visible_message( \ - "\blue [user] starts to clean the microwave.", \ - "\blue You start to clean the microwave." \ + "\The [user] starts to clean the microwave.", \ + "You start to clean the microwave." \ ) if (do_after(user,20)) user.visible_message( \ - "\blue [user] has cleaned the microwave.", \ - "\blue You have cleaned the microwave." \ + "\The [user] has cleaned the microwave.", \ + "You have cleaned the microwave." \ ) src.dirty = 0 // It's clean! src.broken = 0 // just to be sure src.icon_state = "mw" src.flags = OPENCONTAINER else //Otherwise bad luck!! - user << "\red It's dirty!" + user << "It's dirty!" return 1 else if(is_type_in_list(O,acceptable_items)) if (contents.len>=max_n_of_items) - user << "\red This [src] is full of ingredients, you cannot put more." + user << "This [src] is full of ingredients, you cannot put more." return 1 if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it var/obj/item/stack/S = O new O.type (src) S.use(1) user.visible_message( \ - "\blue [user] has added one of [O] to \the [src].", \ - "\blue You add one of [O] to \the [src].") + "\The [user] has added one of [O] to \the [src].", \ + "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() O.loc = src user.visible_message( \ - "\blue [user] has added \the [O] to \the [src].", \ - "\blue You add \the [O] to \the [src].") + "\The [user] has added \the [O] to \the [src].", \ + "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) || \ @@ -128,15 +128,29 @@ return 1 for (var/datum/reagent/R in O.reagents.reagent_list) if (!(R.id in acceptable_reagents)) - user << "\red Your [O] contains components unsuitable for cookery." + user << "Your [O] contains components unsuitable for cookery." return 1 return else if(istype(O,/obj/item/weapon/grab)) var/obj/item/weapon/grab/G = O - user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]." + user << "This is ridiculous. You can not fit \the [G.affecting] in this [src]." return 1 + else if(istype(O,/obj/item/weapon/crowbar)) + user.visible_message( \ + "\The [user] begins [src.anchored ? "securing" : "unsecuring"] the microwave.", \ + "You attempt to [src.anchored ? "secure" : "unsecure"] the microwave." + ) + if (do_after(user,20)) + user.visible_message( \ + "\The [user] [src.anchored ? "secures" : "unsecures"] the microwave.", \ + "You [src.anchored ? "secure" : "unsecure"] the microwave." + ) + src.anchored = !src.anchored + else + user << "You decide not to do that." else - user << "\red You have no idea what you can cook with this [O]." + + user << "You have no idea what you can cook with this [O]." ..() src.updateUsrDialog() @@ -295,7 +309,7 @@ return 0 /obj/machinery/microwave/proc/start() - src.visible_message("\blue The microwave turns on.", "\blue You hear a microwave.") + src.visible_message("The microwave turns on.", "You hear a microwave.") src.operating = 1 src.icon_state = "mw1" src.updateUsrDialog() @@ -317,7 +331,7 @@ if (src.reagents.total_volume) src.dirty++ src.reagents.clear_reagents() - usr << "\blue You dispose of the microwave contents." + usr << "You dispose of the microwave contents." src.updateUsrDialog() /obj/machinery/microwave/proc/muck_start() @@ -326,7 +340,7 @@ /obj/machinery/microwave/proc/muck_finish() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - src.visible_message("\red The microwave gets covered in muck!") + src.visible_message("The microwave gets covered in muck!") src.dirty = 100 // Make it dirty so it can't be used util cleaned src.flags = null //So you can't add condiments src.icon_state = "mwbloody" // Make it look dirty too @@ -338,7 +352,7 @@ s.set_up(2, 1, src) s.start() src.icon_state = "mwb" // Make it look all busted up and shit - src.visible_message("\red The microwave breaks!") //Let them know they're stupid + src.visible_message("The microwave breaks!") //Let them know they're stupid src.broken = 2 // Make it broken so it can't be used util fixed src.flags = null //So you can't add condiments src.operating = 0 // Turn it off again aferwards diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 173f13fc426..b1b2cf27f35 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -35,7 +35,8 @@ /obj/machinery/smartfridge/Destroy() qdel(wires) - ..() + wires = null + return ..() /obj/machinery/smartfridge/proc/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/)) @@ -236,14 +237,12 @@ user << "\The [src] smartly refuses [O]." return 1 -/obj/machinery/smartfridge/secure/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/weapon/card/emag)) +/obj/machinery/smartfridge/secure/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) emagged = 1 locked = -1 user << "You short out the product lock on [src]." - return - - ..() + return 1 /obj/machinery/smartfridge/attack_ai(mob/user as mob) attack_hand(user) @@ -339,7 +338,7 @@ return 0 spawn(0) throw_item.throw_at(target,16,3,src) - src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") + src.visible_message("[src] launches [throw_item.name] at [target.name]!") return 1 /************************ diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 872249ce5f3..fce21304301 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -96,6 +96,8 @@ Class Procs: /obj/machinery name = "machinery" icon = 'icons/obj/stationobjs.dmi' + w_class = 10 + var/stat = 0 var/emagged = 0 var/use_power = 1 @@ -132,7 +134,7 @@ Class Procs: if(contents) // The same for contents. for(var/atom/A in contents) qdel(A) - ..() + return ..() /obj/machinery/process()//If you dont use process or power why are you here if(!(use_power || idle_power_usage || active_power_usage)) @@ -171,10 +173,6 @@ Class Procs: else return -/obj/machinery/blob_act() - if(prob(50)) - qdel(src) - //sets the use_power var and then forces an area power update /obj/machinery/proc/update_use_power(var/new_use_power) use_power = new_use_power @@ -188,6 +186,9 @@ Class Procs: use_power(active_power_usage,power_channel, 1) return 1 +/proc/is_operable(var/obj/machinery/M, var/mob/user) + return istype(M) && M.operable() + /obj/machinery/proc/operable(var/additional_flags = 0) return !inoperable(additional_flags) @@ -228,7 +229,7 @@ Class Procs: return 1 if ( ! (istype(usr, /mob/living/carbon/human) || \ istype(usr, /mob/living/silicon))) - usr << "\red You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return 1 /* //distance checks are made by atom/proc/DblClick @@ -238,10 +239,10 @@ Class Procs: if (ishuman(user)) var/mob/living/carbon/human/H = user if(H.getBrainLoss() >= 60) - visible_message("\red [H] stares cluelessly at [src] and drools.") + visible_message("[H] stares cluelessly at [src] and drools.") return 1 else if(prob(H.getBrainLoss())) - user << "\red You momentarily forget how to use [src]." + user << "You momentarily forget how to use [src]." return 1 src.add_fingerprint(user) @@ -357,8 +358,6 @@ Class Procs: M.state = 2 M.icon_state = "box_1" for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 I.loc = loc qdel(src) return 1 \ No newline at end of file diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 501d7a0b758..ca044a5a481 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -32,7 +32,7 @@ New() ..() var/turf/T = loc - hide(T.intact) + hide(!T.is_plating()) center = T spawn(10) // must wait for map loading to finish diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index b67bc179868..7b2775d9547 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -14,7 +14,18 @@ var/code = 1.0 var/id = 1.0 var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess. + var/_wifi_id + var/datum/wifi/receiver/button/mass_driver/wifi_receiver +/obj/machinery/mass_driver/initialize() + ..() + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) + +/obj/machinery/mass_driver/Destroy() + qdel(wifi_receiver) + wifi_receiver = null + return ..() /obj/machinery/mass_driver/proc/drive(amount) if(stat & (BROKEN|NOPOWER)) @@ -27,7 +38,7 @@ O_limit++ if(O_limit >= 20) for(var/mob/M in hearers(src, null)) - M << "\blue The mass driver lets out a screech, it mustn't be able to handle any more items." + M << "The mass driver lets out a screech, it mustn't be able to handle any more items." break use_power(500) spawn( 0 ) @@ -39,4 +50,4 @@ if(stat & (BROKEN|NOPOWER)) return drive() - ..(severity) \ No newline at end of file + ..(severity) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index c9228000e25..443a7049341 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -29,14 +29,14 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do set_codes() var/turf/T = loc - hide(T.intact) - + hide(!T.is_plating()) + // add beacon to MULE bot beacon list if(freq == 1400) if(!navbeacons) navbeacons = new() navbeacons += src - + spawn(5) // must wait for map loading to finish if(radio_controller) @@ -111,7 +111,7 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do attackby(var/obj/item/I, var/mob/user) var/turf/T = loc - if(T.intact) + if(!T.is_plating()) return // prevent intraction when T-scanner revealed if(istype(I, /obj/item/weapon/screwdriver)) @@ -127,7 +127,7 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do src.locked = !src.locked user << "Controls are now [src.locked ? "locked." : "unlocked."]" else - user << "\red Access denied." + user << "Access denied." updateDialog() else user << "You must open the cover first!" @@ -145,7 +145,7 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do interact(var/mob/user, var/ai = 0) var/turf/T = loc - if(T.intact) + if(!T.is_plating()) return // prevent intraction when T-scanner revealed if(!open && !ai) // can't alter controls if not open, unless you're an AI diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index ff974fbe19d..88af4fb76ca 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -123,7 +123,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster name = "newscaster" - desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!" + desc = "A standard newsfeed handler for use on commercial space stations. All the news you absolutely have no use for, in one place!" icon = 'icons/obj/terminals.dmi' icon_state = "newscaster_normal" var/isbroken = 0 //1 if someone banged it with something heavy @@ -277,7 +277,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="
Feed Security functions:
" dat+="
[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue" dat+="
Censor Feed Stories" - dat+="
Mark Feed Channel with Nanotrasen D-Notice" + dat+="
Mark Feed Channel with [company_name] D-Notice" dat+="

The newscaster recognises you as: [src.scanned_user]" if(1) dat+= "Station Feed Channels
" @@ -358,7 +358,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(9) dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author]\]
" if(src.viewing_channel.censored) - dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
" + dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a [company_name] D-Notice.
" dat+="No further feed story additions are allowed while the D-Notice is in effect.

" else if( isemptylist(src.viewing_channel.messages) ) @@ -378,7 +378,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="

Refresh" dat+="
Back" if(10) - dat+="Nanotrasen Feed Censorship Tool
" + dat+="[company_name] Feed Censorship Tool
" dat+="NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
" dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.
" dat+="
Select Feed channel to get Stories from:
" @@ -389,7 +389,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" dat+="
Cancel" if(11) - dat+="Nanotrasen D-Notice Handler
" + dat+="[company_name] D-Notice Handler
" dat+="A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's" dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed" dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.
" @@ -416,8 +416,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \]
" dat+="Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
" if(src.viewing_channel.censored) - dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
" - dat+="No further feed story additions are allowed while the D-Notice is in effect.


" + dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a [company_name] D-Notice.
" + dat+="No further feed story additions are allowed while the D-Notice is in effect.

" else if( isemptylist(src.viewing_channel.messages) ) dat+="No feed messages found in channel...
" @@ -622,7 +622,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co src.screen = 15 else if(news_network.wanted_issue.is_admin_message) - alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok") + alert("The wanted issue has been distributed by a [company_name] higherup. You cannot edit it.","Ok") return news_network.wanted_issue.author = src.channel_name news_network.wanted_issue.body = src.msg @@ -635,7 +635,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else if(href_list["cancel_wanted"]) if(news_network.wanted_issue.is_admin_message) - alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok") + alert("The wanted issue has been distributed by a [company_name] higherup. You cannot take it down.","Ok") return var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel") if(choice=="Confirm") @@ -651,7 +651,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else if(href_list["censor_channel_author"]) var/datum/feed_channel/FC = locate(href_list["censor_channel_author"]) if(FC.is_admin_channel) - alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") + alert("This channel was created by a [company_name] Officer. You cannot censor it.","Ok") return if(FC.author != "\[REDACTED\]") FC.backup_author = FC.author @@ -664,7 +664,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else if(href_list["censor_channel_story_author"]) var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"]) if(MSG.is_admin_message) - alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok") + alert("This message was created by a [company_name] Officer. You cannot censor its author.","Ok") return if(MSG.author != "\[REDACTED\]") MSG.backup_author = MSG.author @@ -677,7 +677,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else if(href_list["censor_channel_story_body"]) var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"]) if(MSG.is_admin_message) - alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok") + alert("This channel was created by a [company_name] Officer. You cannot censor it.","Ok") return if(MSG.body != "\[REDACTED\]") MSG.backup_body = MSG.body @@ -703,7 +703,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else if(href_list["toggle_d_notice"]) var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"]) if(FC.is_admin_channel) - alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok") + alert("This channel was created by a [company_name] Officer. You cannot place a D-Notice upon it.","Ok") return FC.censored = !FC.censored FC.update() @@ -747,6 +747,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co O.show_message("[user.name] further abuses the shattered [src.name].") else if(istype(I, /obj/item/weapon) ) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/obj/item/weapon/W = I if(W.force <15) for (var/mob/O in hearers(5, src.loc)) @@ -764,7 +765,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co O.show_message("[user.name] forcefully slams the [src.name] with the [I.name]!" ) playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) else - user << "This does nothing." + user << "This does nothing." src.update_icon() /obj/machinery/newscaster/attack_ai(mob/user as mob) @@ -806,7 +807,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/item/weapon/newspaper name = "newspaper" - desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations." + desc = "An issue of The Griffon, the newspaper circulating aboard most stations." icon = 'icons/obj/bureaucracy.dmi' icon_state = "newspaper" w_class = 2 //Let's make it fit in trashbags! @@ -827,7 +828,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) switch(screen) if(0) //Cover dat+="
The Griffon
" - dat+="
Nanotrasen-standard newspaper, for use on Nanotrasen© Space Facilities

" + dat+="
[company_name]-standard newspaper, for use on [company_name]© Space Facilities

" if(isemptylist(src.news_content)) if(src.important_message) dat+="Contents:
    **Important Security Announcement** \[page [src.pages+2]\]
" diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 2fb1c721d3b..a16a47560a9 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -6,85 +6,69 @@ var/bomb_set icon = 'icons/obj/stationobjs.dmi' icon_state = "nuclearbomb0" density = 1 - var/deployable = 0.0 - var/extended = 0.0 + var/deployable = 0 + var/extended = 0 var/lighthack = 0 - var/opened = 0.0 - var/timeleft = 60.0 - var/timing = 0.0 + var/timeleft = 120 + var/timing = 0 var/r_code = "ADMIN" var/code = "" - var/yes_code = 0.0 - var/safety = 1.0 + var/yes_code = 0 + var/safety = 1 var/obj/item/weapon/disk/nuclear/auth = null - var/list/wires = list() - var/light_wire - var/safety_wire - var/timing_wire - var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, - // 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. + var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. + var/lastentered use_power = 0 - - + unacidable = 1 + var/previous_level = "" + var/datum/wires/nuclearbomb/wires = null /obj/machinery/nuclearbomb/New() ..() r_code = "[rand(10000, 99999.0)]"//Creates a random code upon object spawn. + wires = new/datum/wires/nuclearbomb(src) - src.wires["Red"] = 0 - src.wires["Blue"] = 0 - src.wires["Green"] = 0 - src.wires["Marigold"] = 0 - src.wires["Fuschia"] = 0 - src.wires["Black"] = 0 - src.wires["Pearl"] = 0 - var/list/w = list("Red","Blue","Green","Marigold","Black","Fuschia","Pearl") - src.light_wire = pick(w) - w -= src.light_wire - src.timing_wire = pick(w) - w -= src.timing_wire - src.safety_wire = pick(w) - w -= src.safety_wire +/obj/machinery/nuclearbomb/Destroy() + qdel(wires) + wires = null + return ..() /obj/machinery/nuclearbomb/process() if (src.timing) - bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed. - src.timeleft-- - if (src.timeleft <= 0) - explode() - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) + src.timeleft = max(timeleft - 2, 0) // 2 seconds per process() + if (timeleft <= 0) + spawn + explode() + nanomanager.update_uis(src) return -/obj/machinery/nuclearbomb/attackby(obj/item/weapon/O as obj, mob/user as mob) - +/obj/machinery/nuclearbomb/attackby(obj/item/weapon/O as obj, mob/user as mob, params) if (istype(O, /obj/item/weapon/screwdriver)) src.add_fingerprint(user) if (src.auth) - if (src.opened == 0) - src.opened = 1 + if (panel_open == 0) + panel_open = 1 overlays += image(icon, "npanel_open") user << "You unscrew the control panel of [src]." - + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) else - src.opened = 0 + panel_open = 0 overlays -= image(icon, "npanel_open") user << "You screw the control panel of [src] back on." + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) else - if (src.opened == 0) - user << "The [src] emits a buzzing noise, the panel staying locked in." - if (src.opened == 1) - src.opened = 0 + if (panel_open == 0) + user << "\The [src] emits a buzzing noise, the panel staying locked in." + if (panel_open == 1) + panel_open = 0 overlays -= image(icon, "npanel_open") - user << "You screw the control panel of [src] back on." + user << "You screw the control panel of \the [src] back on." + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) flick("nuclearbombc", src) + return - return - if (istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/device/multitool)) - if (src.opened == 1) - nukehack_win(user) - return + if (panel_open && (istype(O, /obj/item/device/multitool) || istype(O, /obj/item/weapon/wirecutters))) + return attack_hand(user) if (src.extended) if (istype(O, /obj/item/weapon/disk/nuclear)) @@ -92,17 +76,16 @@ var/bomb_set O.loc = src src.auth = O src.add_fingerprint(user) - return + return attack_hand(user) if (src.anchored) switch(removal_stage) if(0) if(istype(O,/obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = O if(!WT.isOn()) return if (WT.get_fuel() < 5) // uses up 5 fuel. - user << "\red You need more fuel to complete this task." + user << "You need more fuel to complete this task." return user.visible_message("[user] starts cutting loose the anchoring bolt covers on [src].", "You start cutting loose the anchoring bolt covers with [O]...") @@ -129,7 +112,7 @@ var/bomb_set var/obj/item/weapon/weldingtool/WT = O if(!WT.isOn()) return if (WT.get_fuel() < 5) // uses up 5 fuel. - user << "\red You need more fuel to complete this task." + user << "You need more fuel to complete this task." return user.visible_message("[user] starts cutting apart the anchoring system sealant on [src].", "You start cutting apart the anchoring system's sealant with [O]...") @@ -164,225 +147,197 @@ var/bomb_set return ..() -/obj/machinery/nuclearbomb/attack_hand(mob/user as mob) - if (src.extended) - if (!ishuman(user)) - usr << "\red You don't have the dexterity to do this!" - return 1 +/obj/machinery/nuclearbomb/attack_ghost(mob/user as mob) + attack_hand(user) - if (!ishuman(user)) - usr << "\red You don't have the dexterity to do this!" - return 1 - user.set_machine(src) - var/dat = text("Nuclear Fission Explosive
\nAuth. Disk: []
", src, (src.auth ? "++++++++++" : "----------")) - if (src.auth) - if (src.yes_code) - dat += text("\nStatus: []-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src, src, src, src.timeleft, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src) - else - dat += text("\nStatus: Auth. S2-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\n[] Safety: Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off")) +/obj/machinery/nuclearbomb/attack_hand(mob/user as mob) + if (extended) + if (panel_open) + wires.Interact(user) else - if (src.timing) - dat += text("\nStatus: Set-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off")) - else - dat += text("\nStatus: Auth. S1-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off")) - var/message = "AUTH" - if (src.auth) - message = text("[]", src.code) - if (src.yes_code) - message = "*****" - dat += text("
\n>[]
\n1-2-3
\n4-5-6
\n7-8-9
\nR-0-E
\n
", message, src, src, src, src, src, src, src, src, src, src, src, src) - user << browse(dat, "window=nuclearbomb;size=300x400") - onclose(user, "nuclearbomb") - else if (src.deployable) + ui_interact(user) + else if (deployable) if(removal_stage < 5) src.anchored = 1 - visible_message("\red With a steely snap, bolts slide out of [src] and anchor it to the flooring!") + visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring!") else - visible_message("\red \The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") + visible_message("\The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") + extended = 1 if(!src.lighthack) flick("nuclearbombc", src) - src.icon_state = "nuclearbomb1" - src.extended = 1 + update_icon() return -obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) - var/dat as text - dat += "Nuclear Fission Explosive
\nNuclear Device Wires:
" - for(var/wire in src.wires) - dat += text("[wire] Wire: [src.wires[wire] ? "Mend" : "Cut"] Pulse
") - dat += text("
The device is [src.timing ? "shaking!" : "still"]
") - dat += text("The device is [src.safety ? "quiet" : "whirring"].
") - dat += text("The lights are [src.lighthack ? "static" : "functional"].
") - user << browse("Bomb Defusion[dat]","window=nukebomb_hack") - onclose(user, "nukebomb_hack") +/obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + data["hacking"] = 0 + data["auth"] = is_auth(user) + if (is_auth(user)) + if (yes_code) + data["authstatus"] = timing ? "Functional/Set" : "Functional" + else + data["authstatus"] = "Auth. S2" + else + if (timing) + data["authstatus"] = "Set" + else + data["authstatus"] = "Auth. S1" + data["safe"] = safety ? "Safe" : "Engaged" + data["time"] = timeleft + data["timer"] = timing + data["safety"] = safety + data["anchored"] = anchored + data["yescode"] = yes_code + data["message"] = "AUTH" + if (is_auth(user)) + data["message"] = code + if (yes_code) + data["message"] = "*****" -/obj/machinery/nuclearbomb/verb/make_deployable() + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "nuclear_bomb.tmpl", "Nuke Control Panel", 300, 510) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/nuclearbomb/verb/toggle_deployable() set category = "Object" - set name = "Make Deployable" + set name = "Toggle Deployable" set src in oview(1) - if (!usr.canmove || usr.stat || usr.restrained()) + if(usr.incapacitated()) return - if (!ishuman(usr)) - usr << "\red You don't have the dexterity to do this!" - return 1 if (src.deployable) - usr << "\red You close several panels to make [src] undeployable." + usr << "You close several panels to make [src] undeployable." src.deployable = 0 else - usr << "\red You adjust some panels to make [src] deployable." + usr << "You adjust some panels to make [src] deployable." src.deployable = 1 return +/obj/machinery/nuclearbomb/proc/is_auth(var/mob/user) + if(auth) + return 1 + if(user.can_admin_interact()) + return 1 + return 0 /obj/machinery/nuclearbomb/Topic(href, href_list) - ..() - if (!usr.canmove || usr.stat || usr.restrained()) - return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) - usr.set_machine(src) - if(href_list["act"]) - var/temp_wire = href_list["wire"] - if(href_list["act"] == "pulse") - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - else - if(src.wires[temp_wire]) - usr << "You can't pulse a cut wire." - else - if(src.light_wire == temp_wire) - src.lighthack = !src.lighthack - spawn(100) src.lighthack = !src.lighthack - if(src.timing_wire == temp_wire) - if(src.timing) - explode() - if(src.safety_wire == temp_wire) - src.safety = !src.safety - spawn(100) src.safety = !src.safety - if(src.safety == 1) - visible_message("\blue The [src] quiets down.") - if(!src.lighthack) - if (src.icon_state == "nuclearbomb2") - src.icon_state = "nuclearbomb1" - else - visible_message("\blue The [src] emits a quiet whirling noise!") - if(href_list["act"] == "wire") - if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) - usr << "You need wirecutters!" - else - wires[temp_wire] = !wires[temp_wire] - if(src.safety_wire == temp_wire) - if(src.timing) - explode() - if(src.timing_wire == temp_wire) - if(!src.lighthack) - if (src.icon_state == "nuclearbomb2") - src.icon_state = "nuclearbomb1" - src.timing = 0 - bomb_set = 0 - if(src.light_wire == temp_wire) - src.lighthack = !src.lighthack + if(..()) + return 1 - if (href_list["auth"]) - if (src.auth) - src.auth.loc = src.loc - src.yes_code = 0 - src.auth = null + if (href_list["auth"]) + if (auth) + auth.loc = loc + yes_code = 0 + auth = null + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/disk/nuclear)) + usr.drop_item() + I.loc = src + auth = I + if (is_auth(usr)) + if (href_list["type"]) + if (href_list["type"] == "E") + if (code == r_code) + yes_code = 1 + code = null + else + code = "ERROR" else - var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/disk/nuclear)) - usr.drop_item() - I.loc = src - src.auth = I - if (src.auth) - if (href_list["type"]) - if (href_list["type"] == "E") - if (src.code == src.r_code) - src.yes_code = 1 - src.code = null - else - src.code = "ERROR" + if (href_list["type"] == "R") + yes_code = 0 + code = null else - if (href_list["type"] == "R") - src.yes_code = 0 - src.code = null + lastentered = text("[]", href_list["type"]) + if (text2num(lastentered) == null) + var/turf/LOC = get_turf(usr) + message_admins("[key_name_admin(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]! ([LOC ? "JMP" : "null"])", 0) + log_admin("EXPLOIT: [key_name(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered]!") else - src.code += text("[]", href_list["type"]) - if (length(src.code) > 5) - src.code = "ERROR" - if (src.yes_code) - if (href_list["time"]) - var/time = text2num(href_list["time"]) - src.timeleft += time - src.timeleft = min(max(round(src.timeleft), 60), 600) - if (href_list["timer"]) - if (src.timing == -1.0) - return - if (src.safety) - usr << "\red The safety is still on." - return - src.timing = !( src.timing ) - if (src.timing) - if(!src.lighthack) - src.icon_state = "nuclearbomb2" - if(!src.safety) - bomb_set = 1//There can still be issues with this reseting when there are multiple bombs. Not a big deal tho for Nuke/N - else - bomb_set = 0 + code += lastentered + if (length(code) > 5) + code = "ERROR" + if (yes_code) + if (href_list["time"]) + var/time = text2num(href_list["time"]) + timeleft += time + timeleft = Clamp(timeleft, 120, 600) + if (href_list["timer"]) + if (timing == -1) + nanomanager.update_uis(src) + return + if (!anchored) + usr << "\The [src] needs to be anchored." + nanomanager.update_uis(src) + return + if (safety) + usr << "The safety is still on." + nanomanager.update_uis(src) + return + if (wires.IsIndexCut(NUCLEARBOMB_WIRE_TIMING)) + usr << "Nothing happens, something might be wrong with the wiring." + nanomanager.update_uis(src) + return + + if (!timing && !safety) + timing = 1 + log_and_message_admins("engaged a nuclear bomb") + bomb_set++ //There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke/N + update_icon() + else + secure_device() + if (href_list["safety"]) + if (wires.IsIndexCut(NUCLEARBOMB_WIRE_SAFETY)) + usr << "Nothing happens, something might be wrong with the wiring." + nanomanager.update_uis(src) + return + safety = !safety + if(safety) + secure_device() + if (href_list["anchor"]) + if(removal_stage == 5) + anchored = 0 + visible_message("\The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") + nanomanager.update_uis(src) + return + + if(!isinspace()) + anchored = !anchored + if(anchored) + visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring.") else - bomb_set = 0 - if(!src.lighthack) - src.icon_state = "nuclearbomb1" - if (href_list["safety"]) - src.safety = !( src.safety ) - if(safety) - src.timing = 0 - bomb_set = 0 - if (href_list["anchor"]) + secure_device() + visible_message("The anchoring bolts slide back into the depths of [src].") + else + usr << "There is nothing to anchor to!" - if(removal_stage == 5) - src.anchored = 0 - visible_message("\red \The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") - return + nanomanager.update_uis(src) - src.anchored = !( src.anchored ) - if(src.anchored) - visible_message("\red With a steely snap, bolts slide out of [src] and anchor it to the flooring.") - else - visible_message("\red The anchoring bolts slide back into the depths of [src].") - - src.add_fingerprint(usr) - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) - else - usr << browse(null, "window=nuclearbomb") +/obj/machinery/nuclearbomb/proc/secure_device() + if(timing <= 0) return - return + bomb_set-- + timing = 0 + timeleft = Clamp(timeleft, 120, 600) + update_icon() /obj/machinery/nuclearbomb/ex_act(severity) return -/obj/machinery/nuclearbomb/blob_act() - if (src.timing == -1.0) - return - else - return ..() - return - - #define NUKERANGE 80 /obj/machinery/nuclearbomb/proc/explode() if (src.safety) - src.timing = 0 + timing = 0 return - src.timing = -1.0 + src.timing = -1 src.yes_code = 0 src.safety = 1 - if(!src.lighthack) - src.icon_state = "nuclearbomb3" + update_icon() playsound(src,'sound/machines/Alarm.ogg',100,0,5) if (ticker && ticker.mode) ticker.mode.explosion_in_progress = 1 @@ -405,27 +360,63 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) ticker.station_explosion_cinematic(off_station,null) if(ticker.mode) ticker.mode.explosion_in_progress = 0 - world << "The station was destoyed by the nuclear blast!" + if(off_station == 1) + world << "A nuclear device was set off, but the explosion was out of reach of the station!" + else if(off_station == 2) + world << "A nuclear device was set off, but the device was not on the station!" + else + world << "The station was destoyed by the nuclear blast!" ticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. //kinda shit but I couldn't get permission to do what I wanted to do. if(!ticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is - world << "Resetting in 30 seconds!" - - feedback_set_details("end_error","nuke - unhandled ending") - - if(blackbox) - blackbox.save_all_data_to_sql() - sleep(300) - log_game("Rebooting due to nuclear detonation") - world.Reboot() + universe_has_ended = 1 return return -/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]).") - log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).") +/obj/machinery/nuclearbomb/update_icon() + if(lighthack) + icon_state = "nuclearbomb0" + return + + else if(timing == -1) + icon_state = "nuclearbomb3" + else if(timing) + icon_state = "nuclearbomb2" + else if(extended) + icon_state = "nuclearbomb1" + else + icon_state = "nuclearbomb0" +/* +if(!N.lighthack) + if (N.icon_state == "nuclearbomb2") + N.icon_state = "nuclearbomb1" + */ + +//====The nuclear authentication disc==== +/obj/item/weapon/disk/nuclear + name = "nuclear authentication disk" + desc = "Better keep this safe." + icon = 'icons/obj/items.dmi' + icon_state = "nucleardisk" + item_state = "card-id" + w_class = 1.0 + +/obj/item/weapon/disk/nuclear/New() ..() + nuke_disks |= src + +/obj/item/weapon/disk/nuclear/Destroy() + nuke_disks -= src + if(!nuke_disks.len) + var/turf/T = pick_area_turf(/area/maintenance, list(/proc/is_station_turf, /proc/not_turf_contains_dense_objects)) + if(T) + var/obj/D = new /obj/item/weapon/disk/nuclear(T) + log_and_message_admins("[src], the last authentication disk, has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).", location = T) + else + log_and_message_admins("[src], the last authentication disk, has been destroyed. Failed to respawn disc!") + return ..() + +/obj/item/weapon/disk/nuclear/touch_map_edge() + qdel(src) diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index cb80bd20afc..2b3679dda51 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -61,7 +61,7 @@ sense = 0 colour = rgb(130,130,130) - if("/turf/simulated/floor/engine") + if("/turf/simulated/floor/reinforced") colour = rgb(128,128,128) if("/turf/simulated/wall") @@ -208,7 +208,7 @@ colour = rgb(10,10,10) sense = 0 - if("/turf/simulated/floor", "/turf/simulated/floor/engine") + if("/turf/simulated/floor/tiled", "/turf/simulated/floor/reinforced") var/datum/gas_mixture/environment = T.return_air() var/turf_total = environment.total_moles var/t1 = turf_total / MOLES_CELLSTANDARD * 175 diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index c6d257c5cb1..3a08a681d26 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -447,11 +447,11 @@ Buildable meters for(var/obj/machinery/atmospherics/M in src.loc) if((M.initialize_directions & pipe_dir) && M.check_connect_types_construction(M,src)) // matches at least one direction on either type of pipe & same connection type - user << "\red There is already a pipe of the same type at this location." + user << "There is already a pipe of the same type at this location." return 1 // no conflicts found - var/pipefailtext = "\red There's nothing to connect this pipe section to!" //(with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + var/pipefailtext = "There's nothing to connect this pipe section to!" //(with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" //TODO: Move all of this stuff into the various pipe constructors. switch(pipe_type) @@ -461,7 +461,7 @@ Buildable meters P.set_dir(src.dir) P.initialize_directions = pipe_dir var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() if (deleted(P)) usr << pipefailtext @@ -480,7 +480,7 @@ Buildable meters P.set_dir(src.dir) P.initialize_directions = pipe_dir var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() if (deleted(P)) usr << pipefailtext @@ -499,7 +499,7 @@ Buildable meters P.set_dir(src.dir) P.initialize_directions = pipe_dir var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() if (deleted(P)) usr << pipefailtext @@ -518,7 +518,7 @@ Buildable meters P.set_dir(src.dir) P.initialize_directions = pipe_dir var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() if (deleted(P)) usr << pipefailtext @@ -536,8 +536,6 @@ Buildable meters P.set_dir(src.dir) P.initialize_directions = pipe_dir //this var it's used to know if the pipe is bent or not P.initialize_directions_he = pipe_dir - //var/turf/T = P.loc - //P.level = T.intact ? 2 : 1 P.initialize() if (deleted(P)) usr << pipefailtext @@ -557,7 +555,7 @@ Buildable meters if (pipename) C.name = pipename var/turf/T = C.loc - C.level = T.intact ? 2 : 1 + C.level = !T.is_plating() ? 2 : 1 C.initialize() C.build_network() if (C.node) @@ -572,7 +570,7 @@ Buildable meters M.initialize_directions = pipe_dir //M.New() var/turf/T = M.loc - M.level = T.intact ? 2 : 1 + M.level = !T.is_plating() ? 2 : 1 M.initialize() if (deleted(M)) usr << pipefailtext @@ -595,7 +593,7 @@ Buildable meters M.initialize_directions = pipe_dir //M.New() var/turf/T = M.loc - M.level = T.intact ? 2 : 1 + M.level = !T.is_plating() ? 2 : 1 M.initialize() if (!M) usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" @@ -618,7 +616,7 @@ Buildable meters M.initialize_directions = pipe_dir //M.New() var/turf/T = M.loc - M.level = T.intact ? 2 : 1 + M.level = !T.is_plating() ? 2 : 1 M.initialize() if (!M) usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" @@ -641,7 +639,7 @@ Buildable meters M.initialize_directions = pipe_dir //M.New() var/turf/T = M.loc - M.level = T.intact ? 2 : 1 + M.level = !T.is_plating() ? 2 : 1 M.initialize() if (deleted(M)) usr << pipefailtext @@ -668,7 +666,7 @@ Buildable meters M.connect_types = src.connect_types //M.New() var/turf/T = M.loc - M.level = T.intact ? 2 : 1 + M.level = !T.is_plating() ? 2 : 1 M.initialize() if (!M) usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" @@ -695,7 +693,7 @@ Buildable meters M.connect_types = src.connect_types //M.New() var/turf/T = M.loc - M.level = T.intact ? 2 : 1 + M.level = !T.is_plating() ? 2 : 1 M.initialize() if (!M) usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" @@ -719,8 +717,6 @@ Buildable meters P.set_dir(src.dir) P.initialize_directions = src.get_pdir() P.initialize_directions_he = src.get_hdir() - //var/turf/T = P.loc - //P.level = T.intact ? 2 : 1 P.initialize() if (deleted(P)) usr << pipefailtext //"There's nothing to connect this pipe to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" @@ -740,7 +736,7 @@ Buildable meters if (pipename) V.name = pipename var/turf/T = V.loc - V.level = T.intact ? 2 : 1 + V.level = !T.is_plating() ? 2 : 1 V.initialize() V.build_network() if (V.node) @@ -755,7 +751,7 @@ Buildable meters if (pipename) V.name = pipename var/turf/T = V.loc - V.level = T.intact ? 2 : 1 + V.level = !T.is_plating() ? 2 : 1 V.initialize() V.build_network() if (V.node1) @@ -774,7 +770,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -791,7 +787,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -811,7 +807,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -831,7 +827,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -851,7 +847,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -871,7 +867,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -891,7 +887,7 @@ Buildable meters if (pipename) S.name = pipename var/turf/T = S.loc - S.level = T.intact ? 2 : 1 + S.level = !T.is_plating() ? 2 : 1 S.initialize() S.build_network() if (S.node) @@ -903,7 +899,7 @@ Buildable meters P.set_dir(src.dir) P.initialize_directions = pipe_dir var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() if (deleted(P)) usr << pipefailtext @@ -923,7 +919,7 @@ Buildable meters if (pipename) V.name = pipename var/turf/T = V.loc - V.level = T.intact ? 2 : 1 + V.level = !T.is_plating() ? 2 : 1 V.initialize() V.build_network() if (V.node1) @@ -943,7 +939,7 @@ Buildable meters if (pipename) V.name = pipename var/turf/T = V.loc - V.level = T.intact ? 2 : 1 + V.level = !T.is_plating() ? 2 : 1 V.initialize() V.build_network() if (V.node1) @@ -993,7 +989,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -1010,7 +1006,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -1027,7 +1023,7 @@ Buildable meters if (pipename) C.name = pipename var/turf/T = C.loc - C.level = T.intact ? 2 : 1 + C.level = !T.is_plating() ? 2 : 1 C.initialize() C.build_network() if (C.node) @@ -1041,7 +1037,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -1057,7 +1053,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -1073,7 +1069,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -1089,7 +1085,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -1105,7 +1101,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -1121,7 +1117,7 @@ Buildable meters if (pipename) P.name = pipename var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if (P.node1) @@ -1134,20 +1130,20 @@ Buildable meters if(PIPE_OMNI_MIXER) var/obj/machinery/atmospherics/omni/mixer/P = new(loc) var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() if(PIPE_OMNI_FILTER) var/obj/machinery/atmospherics/omni/filter/P = new(loc) var/turf/T = P.loc - P.level = T.intact ? 2 : 1 + P.level = !T.is_plating() ? 2 : 1 P.initialize() P.build_network() playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user.visible_message( \ "[user] fastens the [src].", \ - "\blue You have fastened the [src].", \ + "You have fastened the [src].", \ "You hear ratchet.") qdel(src) // remove the pipe item @@ -1172,11 +1168,11 @@ Buildable meters if (!istype(W, /obj/item/weapon/wrench)) return ..() if(!locate(/obj/machinery/atmospherics/pipe, src.loc)) - user << "\red You need to fasten it to a pipe" + user << "You need to fasten it to a pipe" return 1 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" + user << "You have fastened the meter to the pipe" qdel(src) //not sure why these are necessary #undef PIPE_SIMPLE_STRAIGHT diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index eb0ec519620..692b97aac1f 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -101,18 +101,18 @@ /obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob) src.add_fingerprint(usr) if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) - usr << "\blue You put [W] back to [src]." + usr << "You put [W] back to [src]." user.drop_item() qdel(W) return else if (istype(W, /obj/item/weapon/wrench)) if (unwrenched==0) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src] from the floor..." + user << "You begin to unfasten \the [src] from the floor..." if (do_after(user, 40)) user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src]. Now it can be pulled somewhere else.", \ + "[user] unfastens \the [src].", \ + "You have unfastened \the [src]. Now it can be pulled somewhere else.", \ "You hear ratchet.") src.anchored = 0 src.stat |= MAINT @@ -121,11 +121,11 @@ usr << browse(null, "window=pipedispenser") else /*if (unwrenched==1)*/ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to fasten \the [src] to the floor..." + user << "You begin to fasten \the [src] to the floor..." if (do_after(user, 20)) user.visible_message( \ - "[user] fastens \the [src].", \ - "\blue You have fastened \the [src]. Now it can dispense pipes.", \ + "[user] fastens \the [src].", \ + "You have fastened \the [src]. Now it can dispense pipes.", \ "You hear ratchet.") src.anchored = 1 src.stat &= ~MAINT diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index ca164d7d0c5..0de61b4685f 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -110,10 +110,8 @@ 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 + T.make_plating(!(T.broken || T.burnt)) + return new_turf.is_plating() /obj/machinery/pipelayer/proc/layPipe(var/turf/w_turf,var/M_Dir,var/old_dir) if(!on || !(M_Dir in list(1, 2, 4, 8)) || M_Dir==old_dir) diff --git a/code/game/machinery/portable_tag_turret.dm b/code/game/machinery/portable_tag_turret.dm deleted file mode 100644 index f3939e89dcd..00000000000 --- a/code/game/machinery/portable_tag_turret.dm +++ /dev/null @@ -1,124 +0,0 @@ -#define TURRET_PRIORITY_TARGET 2 -#define TURRET_SECONDARY_TARGET 1 -#define TURRET_NOT_TARGET 0 - -/obj/machinery/porta_turret/tag - // Reasonable defaults, in case someone manually spawns us - var/lasercolor = "r" //Something to do with lasertag turrets, blame Sieve for not adding a comment. - installation = /obj/item/weapon/gun/energy/lasertag/red - -/obj/machinery/porta_turret/tag/red - -/obj/machinery/porta_turret/tag/blue - lasercolor = "b" - installation = /obj/item/weapon/gun/energy/lasertag/blue - -/obj/machinery/porta_turret/tag/New() - ..() - icon_state = "[lasercolor]grey_target_prism" - -/obj/machinery/porta_turret/tag/weapon_setup(var/obj/item/weapon/gun/energy/E) - switch(E.type) - if(/obj/item/weapon/gun/energy/lasertag/blue) - eprojectile = /obj/item/weapon/gun/energy/lasertag/blue - lasercolor = "b" - req_access = list(access_maint_tunnels, access_theatre) - check_arrest = 0 - check_records = 0 - check_weapons = 1 - check_access = 0 - check_anomalies = 0 - shot_delay = 30 - - if(/obj/item/weapon/gun/energy/lasertag/red) - eprojectile = /obj/item/weapon/gun/energy/lasertag/red - lasercolor = "r" - req_access = list(access_maint_tunnels, access_theatre) - check_arrest = 0 - check_records = 0 - check_weapons = 1 - check_access = 0 - check_anomalies = 0 - shot_delay = 30 - iconholder = 1 - -/obj/machinery/porta_turret/tag/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] - data["access"] = !isLocked(user) - data["locked"] = locked - data["enabled"] = enabled - data["is_lethal"] = 0 - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/obj/machinery/porta_turret/tag/update_icon() - if(!anchored) - icon_state = "turretCover" - return - if(stat & BROKEN) - icon_state = "[lasercolor]destroyed_target_prism" - else - if(powered()) - if(enabled) - if(iconholder) - //lasers have a orange icon - icon_state = "[lasercolor]orange_target_prism" - else - //almost everything has a blue icon - icon_state = "[lasercolor]target_prism" - else - icon_state = "[lasercolor]grey_target_prism" - else - icon_state = "[lasercolor]grey_target_prism" - -/obj/machinery/porta_turret/tag/bullet_act(obj/item/projectile/Proj) - ..() - - if(lasercolor == "b" && disabled == 0) - if(istype(Proj, /obj/item/weapon/gun/energy/lasertag/red)) - disabled = 1 - qdel(Proj) - sleep(100) - disabled = 0 - if(lasercolor == "r" && disabled == 0) - if(istype(Proj, /obj/item/weapon/gun/energy/lasertag/blue)) - disabled = 1 - qdel(Proj) - sleep(100) - disabled = 0 - -/obj/machinery/porta_turret/tag/assess_living(var/mob/living/L) - if(!L) - return TURRET_NOT_TARGET - - if(L.lying) - return TURRET_NOT_TARGET - - var/target_suit - var/target_weapon - 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(target_suit)//Lasertag turrets target the opposing team, how great is that? -Sieve - if((istype(L.r_hand, target_weapon)) || (istype(L.l_hand, target_weapon))) - return TURRET_PRIORITY_TARGET - - if(istype(L, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = L - if(istype(H.wear_suit, target_suit)) - return TURRET_PRIORITY_TARGET - if(istype(H.belt, target_weapon)) - return TURRET_SECONDARY_TARGET - - return TURRET_NOT_TARGET \ No newline at end of file diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index d517091a1f0..cd267c59376 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -3,6 +3,10 @@ This code is slightly more documented than normal, as requested by XSI on IRC. */ +#define TURRET_PRIORITY_TARGET 2 +#define TURRET_SECONDARY_TARGET 1 +#define TURRET_NOT_TARGET 0 + /obj/machinery/porta_turret name = "turret" icon = 'icons/obj/turrets.dmi' @@ -170,11 +174,11 @@ var/list/turret_icons icon_state = "turretCover" /obj/machinery/porta_turret/proc/isLocked(mob/user) - if(ailock && user.isSilicon()) + if(ailock && issilicon(user)) user << "There seems to be a firewall preventing you from accessing this device." return 1 - if(locked && !user.isSilicon()) + if(locked && !issilicon(user)) user << "Access denied." return 1 @@ -236,7 +240,7 @@ var/list/turret_icons return ..() -/obj/machinery/porta_turret/Topic(href, href_list, var/nowindow = 0) +/obj/machinery/porta_turret/Topic(href, href_list) if(..()) return 1 @@ -292,18 +296,6 @@ var/list/turret_icons user << "You remove the turret but did not manage to salvage anything." 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 - //the turret shoot much, much faster. - user << "You short out [src]'s threat assessment circuits." - visible_message("[src] hums oddly...") - emagged = 1 - iconholder = 1 - controllock = 1 - enabled = 0 //turns off the turret temporarily - sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit - enabled = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here - else if((istype(I, /obj/item/weapon/wrench))) if(enabled || raised) user << "You cannot unsecure an active turret!" @@ -346,7 +338,7 @@ var/list/turret_icons else //if the turret was attacked with the intention of harming it: - user.changeNext_move(NEXT_MOVE_DELAY) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) take_damage(I.force * 0.5) if(I.force * 0.5 > 1) //if the force of impact dealt at least 1 damage, the turret gets pissed off if(!attacked && !emagged) @@ -356,6 +348,20 @@ var/list/turret_icons attacked = 0 ..() +/obj/machinery/porta_turret/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + //Emagging the turret makes it go bonkers and stun everyone. It also makes + //the turret shoot much, much faster. + user << "You short out [src]'s threat assessment circuits." + visible_message("[src] hums oddly...") + emagged = 1 + iconholder = 1 + controllock = 1 + enabled = 0 //turns off the turret temporarily + sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit + enabled = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here + return 1 + /obj/machinery/porta_turret/proc/take_damage(var/force) if(!raised && !raising) force = force / 8 @@ -369,7 +375,9 @@ var/list/turret_icons die() //the death process :( /obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj) - if(Proj.damage_type == HALLOSS) + var/damage = Proj.get_structure_damage() + + if(!damage) return if(enabled) @@ -381,8 +389,7 @@ var/list/turret_icons ..() - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - take_damage(Proj.damage) + take_damage(damage) /obj/machinery/porta_turret/emp_act(severity) if(enabled) @@ -424,8 +431,6 @@ var/list/turret_icons /obj/machinery/porta_turret/process() //the main machinery process - set background = BACKGROUND_ENABLED - if(stat & (NOPOWER|BROKEN)) //if the turret has no power or is broken, make the turret pop down if it hasn't already popDown() @@ -439,14 +444,8 @@ var/list/turret_icons var/list/targets = list() //list of primary targets var/list/secondarytargets = list() //targets that are least important - for(var/obj/mecha/ME in view(7,src)) - assess_and_assign(ME.occupant, targets, secondarytargets) - - for(var/obj/vehicle/train/T in view(7,src)) - assess_and_assign(T.load, targets, secondarytargets) - - for(var/mob/living/C in view(7,src)) //loops through all living lifeforms in view - assess_and_assign(C, targets, secondarytargets) + for(var/mob/M in mobs_in_view(world.view, src)) + assess_and_assign(M, targets, secondarytargets) if(!tryToShootAt(targets)) if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets @@ -626,7 +625,7 @@ var/list/turret_icons //Turrets aim for the center of mass by default. //If the target is grabbing someone then the turret smartly aims for extremities var/def_zone = get_exposed_defense_zone(target) - + //Shooting Code: A.launch(target, def_zone) /datum/turret_checks @@ -747,11 +746,7 @@ var/list/turret_icons installation = I.type //installation becomes I.type gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge user << "You add [I] to the turret." - - if(istype(installation, /obj/item/weapon/gun/energy/lasertag/blue) || istype(installation, /obj/item/weapon/gun/energy/lasertag/red)) - target_type = /obj/machinery/porta_turret/tag - else - target_type = /obj/machinery/porta_turret + target_type = /obj/machinery/porta_turret build_step = 4 qdel(I) //delete the gun :( @@ -868,3 +863,8 @@ var/list/turret_icons /atom/movable/porta_turret_cover icon = 'icons/obj/turrets.dmi' + + +#undef TURRET_PRIORITY_TARGET +#undef TURRET_SECONDARY_TARGET +#undef TURRET_NOT_TARGET diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 7112da87376..3b2330b113c 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -11,7 +11,7 @@ obj/machinery/recharger var/charging_efficiency = 0.85 //Entropy. The charge put into the cell is multiplied by this var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell) + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/laptop, /obj/item/weapon/cell, /obj/item/modular_computer/) var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -56,26 +56,38 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) if(allowed) if(charging) - user << "\red \A [charging] is already charging here." + user << "\A [charging] is already charging here." return // Checks to make sure he's not in space doing it, and that the area got proper power. if(!powered()) - user << "\red The [name] blinks red as you try to insert the item!" + user << "The [name] blinks red as you try to insert the item!" return if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow)) user << "Your gun's recharge port was removed to make room for a miniaturized reactor." return if (istype(G, /obj/item/weapon/gun/energy/staff)) return - if(istype(G, /obj/item/device/laptop)) - var/obj/item/device/laptop/L = G - if(!L.stored_computer.battery) + if(istype(G, /obj/item/laptop)) + var/obj/item/laptop/L = G + if(!L.stored_computer.cpu.battery_module) user << "There's no battery in it!" return + if(istype(G, /obj/item/modular_computer)) + var/obj/item/modular_computer/C = G + if(!C.battery_module) + user << "This device does not have a battery installed." + return user.drop_item() G.loc = src charging = G update_icon() + else if(portable && istype(G, /obj/item/weapon/wrench)) + if(charging) + user << "Remove [charging] first!" + return + anchored = !anchored + user << "You [anchored ? "attached" : "detached"] the recharger." + playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) obj/machinery/recharger/attack_hand(mob/user as mob) if(istype(user,/mob/living/silicon)) @@ -125,11 +137,22 @@ obj/machinery/recharger/process() update_use_power(1) return - if(istype(charging, /obj/item/device/laptop)) - var/obj/item/device/laptop/L = charging - if(!L.stored_computer.battery.fully_charged()) + if(istype(charging, /obj/item/laptop)) + var/obj/item/laptop/L = charging + if(!L.stored_computer.cpu.battery_module.battery.fully_charged()) icon_state = icon_state_charging - L.stored_computer.battery.give(active_power_usage*CELLRATE*charging_efficiency) + L.stored_computer.cpu.battery_module.battery.give(active_power_usage*CELLRATE) + update_use_power(2) + else + icon_state = icon_state_charged + update_use_power(1) + return + + if(istype(charging, /obj/item/modular_computer)) + var/obj/item/modular_computer/C = charging + if(!C.battery_module.battery.fully_charged()) + icon_state = icon_state_charging + C.battery_module.battery.give(active_power_usage*CELLRATE) update_use_power(2) else icon_state = icon_state_charged diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 098808fc401..47d0b1008d7 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -88,7 +88,7 @@ //Processes the occupant, drawing from the internal power cell if needed. /obj/machinery/recharge_station/proc/process_occupant() - if(istype(occupant, /mob/living/silicon/robot)) + if(isrobot(occupant)) var/mob/living/silicon/robot/R = occupant if(R.module) @@ -103,6 +103,12 @@ R.adjustBruteLoss(-weld_rate) if(wire_rate && R.getFireLoss() && cell.checked_use(wire_power_use * wire_rate * CELLRATE)) R.adjustFireLoss(-wire_rate) + else if(ishuman(occupant)) + var/mob/living/carbon/human/H = occupant + if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450) + H.nutrition = min(H.nutrition+10, 450) + cell.use(7000/450*10) + /obj/machinery/recharge_station/examine(mob/user) ..(user) @@ -200,25 +206,30 @@ /obj/machinery/recharge_station/Bumped(var/mob/living/silicon/robot/R) go_in(R) -/obj/machinery/recharge_station/proc/go_in(var/mob/living/silicon/robot/R) - if(!istype(R)) - return +/obj/machinery/recharge_station/proc/go_in(var/mob/M) if(occupant) return - - // TODO : Change to incapacitated() on merge. - if(R.stat || R.lying || R.resting || R.buckled) - return - if(!R.cell) + if(!hascell(M)) return - add_fingerprint(R) - R.reset_view(src) - R.forceMove(src) - occupant = R + add_fingerprint(M) + M.reset_view(src) + M.forceMove(src) + occupant = M update_icon() return 1 +/obj/machinery/recharge_station/proc/hascell(var/mob/M) + if(isrobot(M)) + var/mob/living/silicon/robot/R = M + if(R.cell) + return 1 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!isnull(H.internal_organs_by_name["cell"])) + return 1 + return 0 + /obj/machinery/recharge_station/proc/go_out() if(!occupant) return @@ -233,8 +244,7 @@ set name = "Eject Recharger" set src in oview(1) - // TODO : Change to incapacitated() on merge. - if(usr.stat || usr.lying || usr.resting || usr.buckled) + if(usr.incapacitated()) return go_out() @@ -246,4 +256,6 @@ set name = "Enter Recharger" set src in oview(1) + if(!usr.incapacitated()) + return go_in(usr) diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm index 90773dd5f9e..54faef41f8e 100644 --- a/code/game/machinery/records_scanner.dm +++ b/code/game/machinery/records_scanner.dm @@ -69,8 +69,8 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) Black Marks:
"} for(var/A in marks) - text += "\red[A]
" - user << "\blue You feel a sting as the scanner extracts some of your blood." + text += "[A]
" + user << "You feel a sting as the scanner extracts some of your blood." var/turf/T = get_step(src,outputdir) var/obj/item/weapon/paper/print = new(T) print.name = "[mname] Report" diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index b4832440ddb..b07159f9614 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -1,6 +1,24 @@ /******************** Requests Console ********************/ /** Originally written by errorage, updated by: Carn, needs more work though. I just added some security fixes */ +// #TODO-MERGE: RC alerts to PDA aaand forms for RCs + +//Request Console Department Types +#define RC_ASSIST 1 //Request Assistance +#define RC_SUPPLY 2 //Request Supplies +#define RC_INFO 4 //Relay Info + +//Request Console Screens +#define RCS_MAINMENU 0 // Main menu +#define RCS_RQASSIST 1 // Request supplies +#define RCS_RQSUPPLY 2 // Request assistance +#define RCS_SENDINFO 3 // Relay information +#define RCS_SENTPASS 4 // Message sent successfully +#define RCS_SENTFAIL 5 // Message sent unsuccessfully +#define RCS_VIEWMSGS 6 // View messages +#define RCS_MESSAUTH 7 // Authentication before sending +#define RCS_ANNOUNCE 8 // Send announcement + var/req_console_assistance = list() var/req_console_supplies = list() var/req_console_information = list() @@ -13,34 +31,13 @@ var/list/obj/machinery/requests_console/allConsoles = list() icon = 'icons/obj/terminals.dmi' icon_state = "req_comp0" var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department - var/list/messages = list() //List of all messages - var/departmentType = 0 - // 0 = none (not listed, can only repeplied to) - // 1 = assistance - // 2 = supplies - // 3 = info - // 4 = ass + sup //Erro goddamn you just HAD to shorten "assistance" down to "ass" - // 5 = ass + info - // 6 = sup + info - // 7 = ass + sup + info + var/list/message_log = list() //List of all messages + var/departmentType = 0 //Bitflag. Zero is reply-only. Map currently uses raw numbers instead of defines. var/newmessagepriority = 0 // 0 = no new message // 1 = normal priority // 2 = high priority - // 3 = extreme priority - not implemented, will probably require some hacking... everything needs to have a hidden feature in this game. - var/screen = 0 - // 0 = main menu, - // 1 = req. assistance, - // 2 = req. supplies - // 3 = relay information - // 4 = write msg - not used - // 5 = choose priority - not used - // 6 = sent successfully - // 7 = sent unsuccessfully - // 8 = view messages - // 9 = authentication before sending - // 10 = send announcement - //11 = Form Database + var/screen = RCS_MAINMENU var/silent = 0 // set to 1 for it not to beep all the time // var/hackState = 0 // 0 = not hacked @@ -53,7 +50,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() var/msgVerified = "" //Will contain the name of the person who varified it var/msgStamped = "" //If a message is stamped, this will contain the stamp name var/message = ""; - var/dpt = ""; //the department which will be receiving the message + var/recipient = ""; //the department which will be receiving the message var/priority = -1 ; //Priority of the message being sent light_range = 0 //Form intregration @@ -74,7 +71,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() icon_state = "req_comp_off" else if(icon_state == "req_comp_off") - icon_state = "req_comp0" + icon_state = "req_comp[newmessagepriority]" /obj/machinery/requests_console/New() ..() @@ -84,200 +81,62 @@ var/list/obj/machinery/requests_console/allConsoles = list() name = "[department] Requests Console" allConsoles += src - //req_console_departments += department - 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 + if (departmentType & RC_ASSIST) + req_console_assistance |= department + if (departmentType & RC_SUPPLY) + req_console_supplies |= department + if (departmentType & RC_INFO) + req_console_information |= department + + set_light(1) /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) + var/lastDeptRC = 1 + for (var/obj/machinery/requests_console/Console in allConsoles) + if (Console.department == department) + lastDeptRC = 0 + break + if(lastDeptRC) + if (departmentType & RC_ASSIST) req_console_assistance -= department + if (departmentType & RC_SUPPLY) req_console_supplies -= department + if (departmentType & RC_INFO) req_console_information -= department ..() /obj/machinery/requests_console/attack_hand(user as mob) if(..(user)) return - var/dat - dat = text("Requests Console

[department] Requests Console

") - if(!open) - switch(screen) - if(1) //req. assistance - dat += text("Which department do you need assistance from?

") - for(var/dpt in req_console_assistance) - if (dpt != department) - dat += text("[dpt] (Message or ") - dat += text("High Priority") -// if (hackState == 1) -// dat += text(" or EXTREME)") - dat += text(")
") - dat += text("
Back
") + ui_interact(user) - if(2) //req. supplies - dat += text("Which department do you need supplies from?

") - for(var/dpt in req_console_supplies) - if (dpt != department) - dat += text("[dpt] (Message or ") - dat += text("High Priority") -// if (hackState == 1) -// dat += text(" or EXTREME)") - dat += text(")
") - dat += text("
Back
") +/obj/machinery/requests_console/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] - if(3) //relay information - dat += text("Which department would you like to send information to?

") - for(var/dpt in req_console_information) - if (dpt != department) - dat += text("[dpt] (Message or ") - dat += text("High Priority") -// if (hackState == 1) -// dat += text(" or EXTREME)") - dat += text(")
") - dat += text("
Back
") + data["department"] = department + data["screen"] = screen + data["message_log"] = message_log + data["newmessagepriority"] = newmessagepriority + data["silent"] = silent + data["announcementConsole"] = announcementConsole - if(6) //sent successfully - dat += text("Message sent

") - dat += text("Continue
") + data["assist_dept"] = req_console_assistance + data["supply_dept"] = req_console_supplies + data["info_dept"] = req_console_information - if(7) //unsuccessful; not sent - dat += text("An error occurred.

") - dat += text("Continue
") + data["message"] = message + data["recipient"] = recipient + data["priortiy"] = priority + data["msgStamped"] = msgStamped + data["msgVerified"] = msgVerified + data["announceAuth"] = announceAuth - if(8) //view messages - for (var/obj/machinery/requests_console/Console in allConsoles) - if (Console.department == department) - Console.newmessagepriority = 0 - Console.icon_state = "req_comp0" - Console.set_light(1) - newmessagepriority = 0 - icon_state = "req_comp0" - for(var/msg in messages) - dat += text("[msg]
") - dat += text("Back to main menu
") - - if(9) //authentication before sending - dat += text("Message Authentication

") - dat += text("Message for [dpt]: [message]

") - dat += text("You may authenticate your message now by scanning your ID or your stamp

") - dat += text("Validated by: [msgVerified]
"); - dat += text("Stamped by: [msgStamped]
"); - dat += text("Send
"); - dat += text("
Back
") - - if(10) //send announcement - dat += text("Station wide announcement

") - if(announceAuth) - dat += text("Authentication accepted

") - else - dat += text("Swipe your card to authenticate yourself.

") - dat += text("Message: [message] Write

") - if (announceAuth && message) - dat += text("Announce
"); - dat += text("
Back
") - - if(11) //form database - dat += text("NanoTrasen Corporate Forms

") - establish_db_connection(dbcon) - if(!dbcon.IsConnected()) - dat += text("ERROR: Unable to contact external database. Please contact your system administrator for assistance.") - log_game("SQL database connection failed. Attempted to fetch form information.") - else - dat += {""} - - //For reference: - //Command forms, 01xx series - //Security forms, 02xx series - //Medical forms, 03xx series - //Engineer forms, 04xx series - //Science forms, 05xx series - //Supply forms, 06xx series - //General forms, 10xx series - - var/DBQuery/query = dbcon.NewQuery(SQLquery) - query.Execute() - while(query.NextRow()) - var/id = query.item[1] - var/name = query.item[2] - var/department = query.item[3] - dat += "" - dat += "
NCF IDForm NameDept.Print?
NCF-[id][name][department]Print?
" - dat += text("
Reset Search") - dat += text("
Back
") - - else //main menu - screen = 0 - reset_announce() - if (newmessagepriority == 1) - dat += text("There are new messages
") - if (newmessagepriority == 2) - dat += text("NEW PRIORITY MESSAGES
") - dat += text("View Messages

") - - dat += text("Request Assistance
") - dat += text("Request Supplies
") - dat += text("Relay Anonymous Information
") - dat += text("NanoTrasen Corporate Form Database

") - if(announcementConsole) - dat += text("Send station-wide announcement

") - if (silent) - dat += text("Speaker OFF") - else - dat += text("Speaker ON") - if(paperstock) - dat += text("
[paperstock] papers in stock.") - else - dat += text("
No paper in stock.") - if(lid) - dat += text("
Paper container lid OPEN.") - else - dat += text("
Paper container lid CLOSE.") - - dat += "

PDAs to notify:
" - - if (alert_pdas && alert_pdas.len) - for (var/obj/item/device/pda/pda in alert_pdas) - dat += "[alert_pdas[pda]] - Unlink
" - - dat += "
Add PDA to Notify" - - user << browse("[dat]", "window=request_console") - onclose(user, "req_console") - return + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "request_console.tmpl", "[department] Request Console", 520, 410) + ui.set_initial_data(data) + ui.open() /obj/machinery/requests_console/Topic(href, href_list) if(..()) return @@ -285,205 +144,63 @@ var/list/obj/machinery/requests_console/allConsoles = list() add_fingerprint(usr) if(reject_bad_text(href_list["write"])) - dpt = ckey(href_list["write"]) //write contains the string of the receiving department's name + recipient = href_list["write"] //write contains the string of the receiving department's name var/new_message = sanitize(input("Write your message:", "Awaiting Input", "")) if(new_message) message = new_message - screen = 9 + screen = RCS_MESSAUTH switch(href_list["priority"]) + if("1") priority = 1 if("2") priority = 2 - else priority = -1 + else priority = 0 else - dpt = ""; - msgVerified = "" - msgStamped = "" - screen = 0 - priority = -1 + reset_message(1) if(href_list["writeAnnouncement"]) var/new_message = sanitize(input("Write your message:", "Awaiting Input", "")) if(new_message) message = new_message - switch(href_list["priority"]) - if("2") priority = 2 - else priority = -1 else - reset_announce() - screen = 0 + reset_message(1) if(href_list["sendAnnouncement"]) if(!announcementConsole) return announcement.Announce(message, msg_sanitized = 1) - reset_announce() - screen = 0 + reset_message(1) if( href_list["department"] && message ) var/log_msg = message - var/sending = message - sending += "
" - if (msgVerified) - sending += msgVerified - sending += "
" - if (msgStamped) - sending += msgStamped - sending += "
" - screen = 7 //if it's successful, this will get overrwritten (7 = unsufccessfull, 6 = successfull) - if (sending) - var/pass = 0 - for (var/obj/machinery/message_server/MS in world) - if(!MS.active) continue - MS.send_rc_message(href_list["department"],department,log_msg,msgStamped,msgVerified,priority) - pass = 1 - - if(pass) - - for (var/obj/machinery/requests_console/Console in allConsoles) - if (ckey(Console.department) == ckey(href_list["department"])) - - switch(priority) - if("2") //High priority - if(Console.newmessagepriority < 2) - Console.newmessagepriority = 2 - Console.icon_state = "req_comp2" - if(!Console.silent) - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(5, Console.loc)) - O.show_message(text("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [department]'")) - Console.messages += "High Priority message from [department]
[sending]" - - Console.do_pda_alerts("Priority alert received from [department]!") - - // if("3") //Not implemanted, but will be //Removed as it doesn't look like anybody intends on implimenting it ~Carn - // if(Console.newmessagepriority < 3) - // Console.newmessagepriority = 3 - // Console.icon_state = "req_comp3" - // if(!Console.silent) - // playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - // for (var/mob/O in hearers(7, Console.loc)) - // O.show_message(text("\icon[Console] *The Requests Console yells: 'EXTREME PRIORITY alert in [department]'")) - // Console.messages += "Extreme Priority message from [ckey(department)]
[message]" - - else // Normal priority - if(Console.newmessagepriority < 1) - Console.newmessagepriority = 1 - Console.icon_state = "req_comp1" - if(!Console.silent) - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(4, Console.loc)) - O.show_message(text("\icon[Console] *The Requests Console beeps: 'Message from [department]'")) - Console.messages += "Message from [department]
[message]" - - Console.do_pda_alerts("Message received from [department].") - - screen = 6 - Console.set_light(2) - messages += "Message sent to [dpt]
[message]" - else - for (var/mob/O in hearers(4, src.loc)) - O.show_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'")) - - if(href_list["sort"]) - var/sortdep = sanitizeSQL(href_list["sort"]) - SQLquery = " Select id, name, department FROM ss13_forms WHERE department LIKE '%[sortdep]%' ORDER BY id" - screen = 11 - - if(href_list["print"]) - var/printid = sanitizeSQL(href_list["print"]) - establish_db_connection(dbcon) - - if(!dbcon.IsConnected()) - alert("Connection to the database lost. Aborting.") - if(!printid) - alert("Invalid query. Try again.") - var/DBQuery/query = dbcon.NewQuery("SELECT id, name, data FROM ss13_forms WHERE id=[printid]") - query.Execute() - - while(query.NextRow()) - var/id = query.item[1] - var/name = query.item[2] - var/data = query.item[3] - var/obj/item/weapon/paper/C = new(src.loc) - - //Let's start the BB >> HTML conversion! - - data = html_encode(data) - data = replacetext(data, "\n", "
") - - C.info += data - C.info = C.parsepencode(C.info) - C.updateinfolinks() - C.name = "NFC-[id] - [name]" - paperstock-- - - if(href_list["whatis"]) - var/whatisid = sanitizeSQL(href_list["whatis"]) - establish_db_connection(dbcon) - if(!dbcon.IsConnected()) - alert("Connection to the database lost. Aborting.") - if(!whatisid) - alert("Invalid query. Try again.") - var/DBQuery/query = dbcon.NewQuery("SELECT id, name, department, info FROM ss13_forms WHERE id=[whatisid]") - query.Execute() - var/dat = "
NanoTrasen Corporate Form
" - while(query.NextRow()) - var/id = query.item[1] - var/name = query.item[2] - var/department = query.item[3] - var/info = query.item[4] - - dat += "NCF-[id]

" - dat += "[name]
" - dat += "[department] Department
" - dat += "[info]" - dat += "
" - usr << browse(dat, "window=Information;size=560x240") - - switch( href_list["setLid"] ) - if(null) //skip - if("1") lid = 1 - else lid = 0 + var/pass = 0 + screen = RCS_SENTFAIL + for (var/obj/machinery/message_server/MS in world) + if(!MS.active) continue + MS.send_rc_message(ckey(href_list["department"]),department,log_msg,msgStamped,msgVerified,priority) + pass = 1 + if(pass) + screen = RCS_SENTPASS + message_log += "Message sent to [recipient]
[message]" + else + audible_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4) //Handle screen switching - switch(text2num(href_list["setScreen"])) - if(null) //skip - if(1) //req. assistance - screen = 1 - if(2) //req. supplies - screen = 2 - if(3) //relay information - screen = 3 -// if(4) //write message -// screen = 4 - if(5) //choose priority - screen = 5 - if(6) //sent successfully - screen = 6 - if(7) //unsuccessfull; not sent - screen = 7 - if(8) //view messages - screen = 8 - if(9) //authentication - screen = 9 - if(10) //send announcement - if(!announcementConsole) return - screen = 10 - if(11) //form database - SQLquery = "SELECT id, name, department FROM ss13_forms ORDER BY id" - screen = 11 - else //main menu - dpt = "" - msgVerified = "" - msgStamped = "" - message = "" - priority = -1 - screen = 0 + if(href_list["setScreen"]) + var/tempScreen = text2num(href_list["setScreen"]) + if(tempScreen == RCS_ANNOUNCE && !announcementConsole) + return + if(tempScreen == RCS_VIEWMSGS) + for (var/obj/machinery/requests_console/Console in allConsoles) + if (Console.department == department) + Console.newmessagepriority = 0 + Console.icon_state = "req_comp0" + Console.set_light(1) + if(tempScreen == RCS_MAINMENU) + reset_message() + screen = tempScreen //Handle silencing the console - switch( href_list["setSilent"] ) - if(null) //skip - if("1") silent = 1 - else silent = 0 + if(href_list["toggleSilent"]) + silent = !silent if(href_list["linkpda"]) var/obj/item/device/pda/pda = usr.get_active_hand() @@ -508,7 +225,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() updateUsrDialog() return - //err... hacking code, which has no reason for existing... but anyway... it's supposed to unlock priority 3 messanging on that console (EXTREME priority...) the code for that actually exists. + //err... hacking code, which has no reason for existing... but anyway... it was once supposed to unlock priority 3 messanging on that console (EXTREME priority...), but the code for that was removed. /obj/machinery/requests_console/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob) /* if (istype(O, /obj/item/weapon/crowbar)) @@ -533,21 +250,23 @@ var/list/obj/machinery/requests_console/allConsoles = list() user << "You can't do much with that."*/ if (istype(O, /obj/item/weapon/card/id)) - if(screen == 9) + if(inoperable(MAINT)) return + if(screen == RCS_MESSAUTH) var/obj/item/weapon/card/id/T = O msgVerified = text("Verified by [T.registered_name] ([T.assignment])") updateUsrDialog() - if(screen == 10) + if(screen == RCS_ANNOUNCE) var/obj/item/weapon/card/id/ID = O if (access_RC_announce in ID.GetAccess()) announceAuth = 1 announcement.announcer = ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name else - reset_announce() - user << "\red You are not authorized to send announcements." + reset_message() + user << "You are not authorized to send announcements." updateUsrDialog() if (istype(O, /obj/item/weapon/stamp)) - if(screen == 9) + if(inoperable(MAINT)) return + if(screen == RCS_MESSAUTH) var/obj/item/weapon/stamp/T = O msgStamped = text("Stamped with the [T.name]") updateUsrDialog() @@ -623,21 +342,13 @@ var/list/obj/machinery/requests_console/allConsoles = list() return -/obj/machinery/requests_console/proc/reset_announce() - announceAuth = 0 +/obj/machinery/requests_console/proc/reset_message(var/mainmenu = 0) message = "" + recipient = "" + priority = 0 + msgVerified = "" + msgStamped = "" + announceAuth = 0 announcement.announcer = "" - -/obj/machinery/requests_console/proc/do_pda_alerts(var/message) - if (!message) - message = "New message received." - - if (!alert_pdas || !alert_pdas.len) - return - - for (var/obj/item/device/pda/pda in alert_pdas) - if (pda.toff || pda.message_silent) - continue - - message = "[message] View it at [src.name]." - pda.new_info(pda.message_silent, pda.ttone, "\icon[pda] [message]") + if(mainmenu) + screen = RCS_MAINMENU diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 4c44bcd4eeb..0ae1d2ceea1 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -71,47 +71,47 @@ Please wait until completion...

if (!src.operating) var/part_type = text2num(href_list["make"]) - var/build_type = "" + var/build_type = null var/build_time = 200 var/build_cost = 25000 switch (part_type) if (1) - build_type = "/obj/item/robot_parts/l_arm" + build_type = /obj/item/robot_parts/l_arm build_time = 200 build_cost = 25000 if (2) - build_type = "/obj/item/robot_parts/r_arm" + build_type = /obj/item/robot_parts/r_arm build_time = 200 build_cost = 25000 if (3) - build_type = "/obj/item/robot_parts/l_leg" + build_type = /obj/item/robot_parts/l_leg build_time = 200 build_cost = 25000 if (4) - build_type = "/obj/item/robot_parts/r_leg" + build_type = /obj/item/robot_parts/r_leg build_time = 200 build_cost = 25000 if (5) - build_type = "/obj/item/robot_parts/chest" + build_type = /obj/item/robot_parts/chest build_time = 350 build_cost = 50000 if (6) - build_type = "/obj/item/robot_parts/head" + build_type = /obj/item/robot_parts/head build_time = 350 build_cost = 50000 if (7) - build_type = "/obj/item/robot_parts/robot_suit" + build_type = /obj/item/robot_parts/robot_suit build_time = 600 build_cost = 75000 - var/building = text2path(build_type) + var/building = build_type if (!isnull(building)) if (src.metal_amount >= build_cost) src.operating = 1 diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index f1c3cf59115..ad88ce7feae 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -60,14 +60,14 @@ C.loc = src C.add_fingerprint(usr) - user.visible_message("\blue [user] inserts a power cell into [src].", "\blue You insert the power cell into [src].") + user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") power_change() else user << "The hatch must be open to insert a power cell." return else if(istype(I, /obj/item/weapon/screwdriver)) panel_open = !panel_open - user.visible_message("\blue [user] [panel_open ? "opens" : "closes"] the hatch on the [src].", "\blue You [panel_open ? "open" : "close"] the hatch on the [src].") + user.visible_message("[user] [panel_open ? "opens" : "closes"] the hatch on the [src].", "You [panel_open ? "open" : "close"] the hatch on the [src].") update_icon() if(!panel_open && user.machine == src) user << browse(null, "window=spaceheater") @@ -105,7 +105,7 @@ onclose(user, "spaceheater") else on = !on - user.visible_message("\blue [user] switches [on ? "on" : "off"] the [src].","\blue You switch [on ? "on" : "off"] the [src].") + user.visible_message("[user] switches [on ? "on" : "off"] the [src].","You switch [on ? "on" : "off"] the [src].") update_icon() return @@ -126,7 +126,7 @@ if("cellremove") if(panel_open && cell && !usr.get_active_hand()) - usr.visible_message("\blue [usr] removes \the [cell] from \the [src].", "\blue You remove \the [cell] from \the [src].") + usr.visible_message("\The usr] removes \the [cell] from \the [src].", "You remove \the [cell] from \the [src].") cell.update_icon() usr.put_in_hands(cell) cell.add_fingerprint(usr) @@ -143,7 +143,7 @@ C.loc = src C.add_fingerprint(usr) power_change() - usr.visible_message("\blue [usr] inserts \the [C] into \the [src].", "\blue You insert \the [C] into \the [src].") + usr.visible_message("[usr] inserts \the [C] into \the [src].", "You insert \the [C] into \the [src].") updateDialog() else diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 2c72743bd2f..dd862a77543 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -49,7 +49,7 @@ /obj/machinery/status_display/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) - ..() + return ..() // 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 a1819c0c0c9..1835d6c9a13 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -116,7 +116,7 @@ if(!src.isbroken) dat+= "Suit storage unit" dat+= "U-Stor-It Suit Storage Unit, model DS1900
" - dat+= "Welcome to the Unit control panel.
" + dat+= "Welcome to the Unit control panel.

" dat+= text("Helmet storage compartment: []
",(src.HELMET ? HELMET.name : "
No helmet detected.") ) if(HELMET && src.isopen) dat+=text("Dispense helmet
",src) @@ -616,7 +616,7 @@ /obj/machinery/suit_cycler/Destroy() qdel(wires) wires = null - ..() + return ..() /obj/machinery/suit_cycler/engineering name = "Engineering suit cycler" @@ -691,7 +691,7 @@ user << "There is no room inside the cycler for [G.affecting.name]." return - visible_message("[user] starts putting [G.affecting.name] into the suit cycler.", 3) + visible_message("[user] starts putting [G.affecting.name] into the suit cycler.", 3) if(do_after(user, 20)) if(!G || !G.affecting) return @@ -715,24 +715,6 @@ src.updateUsrDialog() return - else if(istype(I,/obj/item/weapon/card/emag)) - - if(emagged) - user << "The cycler has already been subverted." - return - - var/obj/item/weapon/card/emag/E = I - src.updateUsrDialog() - E.uses-- - - //Clear the access reqs, disable the safeties, and open up all paintjobs. - user << "You run the sequencer across the interface, corrupting the operating protocols." - departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$") - emagged = 1 - safeties = 0 - req_access = list() - return - else if(istype(I,/obj/item/clothing/head/helmet/space) && !istype(I, /obj/item/clothing/head/helmet/space/rig)) if(locked) @@ -781,6 +763,20 @@ ..() +/obj/machinery/suit_cycler/emag_act(var/remaining_charges, var/mob/user) + if(emagged) + user << "The cycler has already been subverted." + return + + //Clear the access reqs, disable the safeties, and open up all paintjobs. + user << "You run the sequencer across the interface, corrupting the operating protocols." + departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$") + emagged = 1 + safeties = 0 + req_access = list() + src.updateUsrDialog() + return 1 + /obj/machinery/suit_cycler/attack_hand(mob/user as mob) add_fingerprint(user) @@ -822,7 +818,7 @@ dat += "\[select power level\] \[begin decontamination cycle\]

" dat += "

Customisation

" - dat += "Target product: [target_department], [target_species]." + dat += "Target product: [target_department], [target_species]." dat += "
\[apply customisation routine\]


" if(panel_open) @@ -933,11 +929,11 @@ occupant.take_organ_damage(0,radiation_level*2 + rand(1,3)) if(radiation_level > 1) occupant.take_organ_damage(0,radiation_level + rand(1,3)) - occupant.radiation += radiation_level*10 + occupant.apply_effect(radiation_level*10, IRRADIATE) /obj/machinery/suit_cycler/proc/finished_job() var/turf/T = get_turf(src) - T.visible_message("\icon[src] \blue The [src] pings loudly.") + T.visible_message("\icon[src]The [src] pings loudly.") icon_state = initial(icon_state) active = 0 src.updateUsrDialog() @@ -964,7 +960,7 @@ /obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob) if(locked || active) - user << "\red The cycler is locked." + user << "The cycler is locked." return if (!occupant) diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm new file mode 100644 index 00000000000..d2109ec5f19 --- /dev/null +++ b/code/game/machinery/supplybeacon.dm @@ -0,0 +1,119 @@ +// Used to deploy the bacon. +/obj/item/supply_beacon + name = "inactive supply beacon" + icon = 'icons/obj/supplybeacon.dmi' + desc = "An inactive, hacked supply beacon stamped with the Nyx Rapid Fabrication logo. Good for one (1) ballistic supply pod shipment." + icon_state = "beacon" + var/deploy_path = /obj/machinery/power/supply_beacon + var/deploy_time = 30 + +/obj/item/supply_beacon/supermatter + name = "inactive supermatter supply beacon" + deploy_path = /obj/machinery/power/supply_beacon/supermatter + +/obj/item/supply_beacon/attack_self(var/mob/user) + user.visible_message("\The [user] begins setting up \the [src].") + if(!do_after(user, deploy_time)) + return + var/obj/S = new deploy_path(get_turf(user)) + user.visible_message("\The [user] deploys \the [S].") + user.unEquip(src) + qdel(src) + +/obj/machinery/power/supply_beacon + name = "supply beacon" + desc = "A bulky moonshot supply beacon. Someone has been messing with the wiring." + icon = 'icons/obj/supplybeacon.dmi' + icon_state = "beacon" + + anchored = 0 + density = 1 + layer = MOB_LAYER - 0.1 + stat = 0 + + var/target_drop_time + var/drop_delay = 450 + var/expended + var/drop_type + +/obj/machinery/power/supply_beacon/New() + ..() + if(!drop_type) drop_type = pick(supply_drop_random_loot_types()) + +/obj/machinery/power/supply_beacon/supermatter + name = "supermatter supply beacon" + drop_type = "supermatter" + +/obj/machinery/power/supply_beacon/attackby(var/obj/item/weapon/W, var/mob/user) + if(!use_power && istype(W, /obj/item/weapon/wrench)) + if(!anchored && !connect_to_network()) + user << "This device must be placed over an exposed cable." + return + anchored = !anchored + user.visible_message("\The [user] [anchored ? "secures" : "unsecures"] \the [src].") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + return + return ..() + +/obj/machinery/power/supply_beacon/attack_hand(var/mob/user) + + if(expended) + use_power = 0 + user << "\The [src] has used up its charge." + return + + if(anchored) + return use_power ? deactivate(user) : activate(user) + else + user << "You need to secure the beacon with a wrench first!" + return + +/obj/machinery/power/supply_beacon/attack_ai(var/mob/user) + if(user.Adjacent(src)) + attack_hand(user) + +/obj/machinery/power/supply_beacon/proc/activate(var/mob/user) + if(expended) + return + if(surplus() < 500) + if(user) user << "The connected wire doesn't have enough current." + return + set_light(3, 3, "#00CCAA") + icon_state = "beacon_active" + use_power = 1 + if(user) user << "You activate the beacon. The supply drop will be dispatched soon." + +/obj/machinery/power/supply_beacon/proc/deactivate(var/mob/user, var/permanent) + if(permanent) + expended = 1 + icon_state = "beacon_depleted" + else + icon_state = "beacon" + set_light(0) + use_power = 0 + target_drop_time = null + if(user) user << "You deactivate the beacon." + +/obj/machinery/power/supply_beacon/Destroy() + if(use_power) + deactivate() + ..() + +/obj/machinery/power/supply_beacon/process() + if(expended) + return PROCESS_KILL + if(!use_power) + return + if(draw_power(500) < 500) + deactivate() + return + if(!target_drop_time) + target_drop_time = world.time + drop_delay + else if(world.time >= target_drop_time) + deactivate(permanent = 1) + var/drop_x = src.x-2 + var/drop_y = src.y-2 + var/drop_z = src.z + command_announcement.Announce("Nyx Rapid Fabrication priority supply request #[rand(1000,9999)]-[rand(100,999)] recieved. Shipment dispatched via ballistic supply pod for immediate delivery. Have a nice day.", "Thank You For Your Patronage") + spawn(rand(100,300)) + new /datum/random_map/droppod/supply(null, drop_x, drop_y, drop_z, supplied_drop = drop_type) // Splat. diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 57b9876f15e..6a61a082b98 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -526,7 +526,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish)) /* --- Some miscellaneous variables to format the string output --- */ - var/part_a = "" // goes in the actual output + var/part_a = "" // goes in the actual output var/freq_text = get_frequency_name(display_freq) // --- Some more pre-message formatting --- @@ -539,20 +539,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/obj/item/device/radio/headset/radio = new var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE + var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE var/part_c = "" - if (display_freq in ANTAG_FREQS) - part_a = "" - else if (display_freq==COMM_FREQ) - part_a = "" - else if (display_freq in DEPT_FREQS) - part_a = "" - - // --- This following recording is intended for research and feedback in the use of department radio channels --- - - var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]" - //var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]" //BR.messages_admin += blackbox_admin_msg if(istype(blackbox)) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index cdcd98bebaf..072c99322fe 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -1,8 +1,11 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 +/obj/machinery/computer/telecomms + icon_keyboard = "tech_key" + /obj/machinery/computer/telecomms/server name = "Telecommunications Server Monitor" - icon_state = "comm_logs" + icon_screen = "comm_logs" var/screen = 0 // the screen number: var/list/servers = list() // the servers located by the computer @@ -92,7 +95,7 @@ else if(C.input_type == "Execution Error") - dat += "
  • [C.name] \[X\]
    " + dat += "
  • [C.name] \[X\]
    " dat += "Output: \"[C.parameters["message"]]\"
    " dat += "

  • " @@ -135,7 +138,7 @@ if("scan") if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/server/T in range(25, src)) @@ -143,29 +146,29 @@ servers.Add(T) if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" screen = 0 if(href_list["delete"]) if(!src.allowed(usr) && !emagged) - usr << "\red ACCESS DENIED." + usr << "ACCESS DENIED." return if(SelectedServer) var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] - temp = "- DELETED ENTRY: [D.name] -" + temp = "- DELETED ENTRY: [D.name] -" SelectedServer.log_entries.Remove(D) qdel(D) else - temp = "- FAILED: NO SELECTED MACHINE -" + temp = "- FAILED: NO SELECTED MACHINE -" if(href_list["network"]) @@ -173,14 +176,14 @@ if(newnet && ((usr in range(1, src) || issilicon(usr)))) if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() return @@ -190,7 +193,7 @@ 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." + user << "The broken glass falls out." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/material/shard( src.loc ) var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A ) @@ -202,7 +205,7 @@ A.anchored = 1 qdel(src) else - user << "\blue You disconnect the monitor." + user << "You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A ) for (var/obj/C in src) @@ -212,9 +215,13 @@ 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 + +/obj/machinery/computer/telecomms/server/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols" + src.updateUsrDialog() + return 1 diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 15c627420f7..8b3da2a7566 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -164,8 +164,9 @@ dat += "
    " if(P) - if(P.buffer) - dat += "

    MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]" + var/obj/machinery/telecomms/device = P.get_buffer() + if(istype(device)) + dat += "

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

    MULTITOOL BUFFER:
    \[Add Machine\]" @@ -231,7 +232,7 @@ /obj/machinery/telecomms/processor/Options_Topic(href, href_list) if(href_list["process"]) - temp = "-% Processing mode changed. %-" + temp = "-% Processing mode changed. %-" src.process_mode = !src.process_mode */ @@ -249,18 +250,18 @@ if(href_list["receive"]) receiving = !receiving - temp = "-% Receiving mode changed. %-" + temp = "-% Receiving mode changed. %-" if(href_list["broadcast"]) broadcasting = !broadcasting - temp = "-% Broadcasting mode changed. %-" + 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." + 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." + temp = "-% [src] could not lock it's signal onto the station. Two broadcasters or receivers required." // BUS @@ -279,10 +280,10 @@ newfreq *= 10 // shift the decimal one place if(newfreq < 10000) change_frequency = newfreq - temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" + temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" else change_frequency = 0 - temp = "-% Frequency changing deactivated %-" + temp = "-% Frequency changing deactivated %-" /obj/machinery/telecomms/Topic(href, href_list) @@ -302,27 +303,27 @@ if("toggle") src.toggled = !src.toggled - temp = "-% [src] has been [src.toggled ? "activated" : "deactivated"]." + temp = "-% [src] has been [src.toggled ? "activated" : "deactivated"]." update_power() /* if("hide") src.hide = !hide - temp = "-% Shadow Link has been [src.hide ? "activated" : "deactivated"]." + 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]\" %-" + 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 %-" + temp = "-% Too many characters in new network tag %-" else for(var/obj/machinery/telecomms/T in links) @@ -330,7 +331,7 @@ network = newnet links = list() - temp = "-% New network tag assigned: \"[network]\" %-" + temp = "-% New network tag assigned: \"[network]\" %-" if("freq") @@ -340,21 +341,21 @@ 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\" %-" + 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] %-" + 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. %-" + temp = "-% Removed \ref[T] [T.name] from linked entities. %-" // Remove link entries from both T and src. @@ -365,28 +366,30 @@ if(href_list["link"]) if(P) - if(P.buffer && P.buffer != src) - if(!(src in P.buffer.links)) - P.buffer.links.Add(src) + var/obj/machinery/telecomms/device = P.get_buffer() + if(istype(device) && device != src) + if(!(src in device.links)) + device.links.Add(src) - if(!(P.buffer in src.links)) - src.links.Add(P.buffer) + if(!(device in src.links)) + src.links.Add(device) - temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" + temp = "-% Successfully linked with \ref[device] [device.name] %-" else - temp = "-% Unable to acquire buffer %-" + temp = "-% Unable to acquire buffer %-" if(href_list["buffer"]) - P.buffer = src - temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-" + P.set_buffer(src) + var/atom/buffer = P.get_buffer() + temp = "-% Successfully stored \ref[buffer] [buffer.name] in buffer %-" if(href_list["flush"]) - temp = "-% Buffer successfully flushed. %-" - P.buffer = null + temp = "-% Buffer successfully flushed. %-" + P.set_buffer(null) src.Options_Topic(href, href_list) diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index dcb555b7552..dae80c94073 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -56,11 +56,11 @@ id = "Receiver A" network = "tcommsat" autolinkers = list("receiverA") // link to relay - freq_listening = list(AI_FREQ, SCI_FREQ, MED_FREQ, SUP_FREQ, SRV_FREQ, COMM_FREQ, ENG_FREQ, SEC_FREQ) + freq_listening = list(AI_FREQ, SCI_FREQ, MED_FREQ, SUP_FREQ, SRV_FREQ, COMM_FREQ, ENG_FREQ, SEC_FREQ, ENT_FREQ) //Common and other radio frequencies for people to freely use New() - for(var/i = 1441, i < 1489, i += 2) + for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2) freq_listening |= i ..() @@ -87,7 +87,7 @@ autolinkers = list("processor2", "supply", "service", "unused") /obj/machinery/telecomms/bus/preset_two/New() - for(var/i = 1441, i < 1489, i += 2) + for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2) if(i == PUB_FREQ) continue freq_listening |= i @@ -102,13 +102,13 @@ /obj/machinery/telecomms/bus/preset_four id = "Bus 4" network = "tcommsat" - freq_listening = list(ENG_FREQ, AI_FREQ, PUB_FREQ) + freq_listening = list(ENG_FREQ, AI_FREQ, PUB_FREQ, ENT_FREQ) autolinkers = list("processor4", "engineering", "common") /obj/machinery/telecomms/bus/preset_cent id = "CentComm Bus" network = "tcommsat" - freq_listening = list(ERT_FREQ, DTH_FREQ) + freq_listening = list(ERT_FREQ, DTH_FREQ, ENT_FREQ) produces_heat = 0 autolinkers = list("processorCent", "centcomm") @@ -168,7 +168,7 @@ /obj/machinery/telecomms/server/presets/common id = "Common Server" - freq_listening = list(PUB_FREQ, AI_FREQ) // AI Private and Common + freq_listening = list(PUB_FREQ, AI_FREQ, ENT_FREQ) // AI Private and Common autolinkers = list("common") // "Unused" channels, AKA all others. @@ -178,7 +178,7 @@ autolinkers = list("unused") /obj/machinery/telecomms/server/presets/unused/New() - for(var/i = 1441, i < 1489, i += 2) + for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2) if(i == AI_FREQ || i == PUB_FREQ) continue freq_listening |= i diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index d1ac6df4c5a..8797e7af8ba 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -552,7 +552,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() log.parameters["intelligible"] = 1 else if(M.isMonkey()) race = "Monkey" - else if(M.isSilicon()) + else if(issilicon(M)) race = "Artificial Life" log.parameters["intelligible"] = 1 else if(isslime(M)) diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 10ebe3dabcb..24549bd8b71 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -9,7 +9,7 @@ /obj/machinery/computer/telecomms/monitor name = "Telecommunications Monitor" - icon_state = "comm_monitor" + icon_screen = "comm_monitor" var/screen = 0 // the screen number: var/list/machinelist = list() // the machines located by the computer @@ -92,7 +92,7 @@ if("probe") if(machinelist.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/T in range(25, src)) @@ -100,9 +100,9 @@ machinelist.Add(T) if(!machinelist.len) - temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" else - temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" + temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" screen = 0 @@ -112,13 +112,13 @@ 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 -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 machinelist = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() return @@ -128,7 +128,7 @@ 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." + user << "The broken glass falls out." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/material/shard( src.loc ) var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) @@ -140,7 +140,7 @@ A.anchored = 1 qdel(src) else - user << "\blue You disconnect the monitor." + user << "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) @@ -150,9 +150,13 @@ 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 + +/obj/machinery/computer/telecomms/monitor/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols" + src.updateUsrDialog() + return 1 diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 0471bd3bd3b..722814da0d7 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -6,7 +6,7 @@ /obj/machinery/computer/telecomms/traffic name = "Telecommunications Traffic Control" - icon_state = "computer_generic" + icon_screen = "generic" var/screen = 0 // the screen number: var/list/servers = list() // the servers located by the computer @@ -125,7 +125,7 @@ add_fingerprint(usr) usr.set_machine(src) if(!src.allowed(usr) && !emagged) - usr << "\red ACCESS DENIED." + usr << "ACCESS DENIED." return if(href_list["viewserver"]) @@ -147,7 +147,7 @@ if("scan") if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/server/T in range(25, src)) @@ -155,9 +155,9 @@ servers.Add(T) if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" screen = 0 @@ -194,14 +194,14 @@ if(newnet && ((usr in range(1, src)) || issilicon(usr))) if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() return @@ -211,7 +211,7 @@ 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." + user << "The broken glass falls out." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/material/shard( src.loc ) var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) @@ -223,7 +223,7 @@ A.anchored = 1 qdel(src) else - user << "\blue You disconnect the monitor." + user << "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) @@ -233,9 +233,13 @@ 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 + +/obj/machinery/computer/telecomms/traffic/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols" + src.updateUsrDialog() + return 1 diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index b1d45a4840c..d5d03749bee 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -1,18 +1,15 @@ /obj/machinery/computer/teleporter name = "Teleporter Control Console" desc = "Used to control a linked teleportation Hub and Station." - icon_state = "teleport" - circuit = "/obj/item/weapon/circuitboard/teleporter" + icon_keyboard = "teleport_key" + icon_screen = "teleport" + circuit = /obj/item/weapon/circuitboard/teleporter dir = 4 var/obj/item/locked = null var/id = null var/one_time_use = 0 //Used for one-time-use teleport cards (such as clown planet coordinates.) //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. -/* Ghosts can't use this */ -/obj/machinery/computer/teleporter/attack_ghost(user as mob) - return 1 - /obj/machinery/computer/teleporter/New() src.id = "[rand(1000, 9999)]" ..() @@ -62,7 +59,7 @@ if(C.data == "Clown Land") //whoops for(var/mob/O in hearers(src, null)) - O.show_message("\red Incoming bluespace portal detected, unable to lock in.", 2) + O.show_message("Incoming bluespace portal detected, unable to lock in.", 2) for(var/obj/machinery/teleport/hub/H in range(1)) var/amount = rand(2,5) @@ -71,7 +68,7 @@ // else for(var/mob/O in hearers(src, null)) - O.show_message("\blue Locked In", 2) + O.show_message("Locked In", 2) src.locked = L one_time_use = 1 @@ -132,7 +129,7 @@ src.locked = L[desc] for(var/mob/O in hearers(src, null)) - O.show_message("\blue Locked In", 2) + O.show_message("Locked In", 2) src.add_fingerprint(usr) return @@ -193,7 +190,7 @@ return if (!com.locked) for(var/mob/O in hearers(src, null)) - O.show_message("\red Failure: Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") + O.show_message("Failure: Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") return if (istype(M, /atom/movable)) if(prob(5) && !accurate) //oh dear a problem, put em in deep space @@ -211,7 +208,7 @@ accurate = 1 spawn(3000) accurate = 0 //Accurate teleporting for 5 minutes for(var/mob/B in hearers(src, null)) - B.show_message("\blue Test fire completed.") + B.show_message("Test fire completed.") return /* /proc/do_teleport(atom/movable/M as mob|obj, atom/destination, precision) @@ -220,12 +217,12 @@ 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)) - O.show_message(text("\red The [] bounces off of the portal!", M.name), 1) + O.show_message(text("The [] bounces off of the portal!", M.name), 1) return if (istype(M, /mob/living)) var/mob/living/MM = M if(MM.check_contents_for(/obj/item/weapon/disk/nuclear)) - MM << "\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through." + MM << "Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through." return var/disky = 0 for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite @@ -245,14 +242,14 @@ disky = 1 if (disky) for(var/mob/P in viewers(M, null)) - P.show_message(text("\red The [] bounces off of the portal!", M.name), 1) + P.show_message(text("The [] bounces off of the portal!", M.name), 1) return //Bags of Holding cause bluespace teleportation to go funky. --NeoFite if (istype(M, /mob/living)) var/mob/living/MM = M if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding)) - MM << "\red The Bluespace interface on your Bag of Holding interferes with the teleport!" + MM << "The Bluespace interface on your Bag of Holding interferes with the teleport!" precision = rand(1,100) if (istype(M, /obj/item/weapon/storage/backpack/holding)) precision = rand(1,100) @@ -339,7 +336,7 @@ update_use_power(2) com.update_use_power(2) for(var/mob/O in hearers(src, null)) - O.show_message("\blue Teleporter engaged!", 2) + O.show_message("Teleporter engaged!", 2) src.add_fingerprint(usr) src.engaged = 1 return @@ -354,7 +351,7 @@ com.update_use_power(1) update_use_power(1) for(var/mob/O in hearers(src, null)) - O.show_message("\blue Teleporter disengaged!", 2) + O.show_message("Teleporter disengaged!", 2) src.add_fingerprint(usr) src.engaged = 0 return @@ -370,7 +367,7 @@ if (com && !active) active = 1 for(var/mob/O in hearers(src, null)) - O.show_message("\blue Test firing!", 2) + O.show_message("Test firing!", 2) com.teleport() use_power(5000) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 9823037f500..967b7799ed0 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -64,11 +64,11 @@ return /obj/machinery/turretid/proc/isLocked(mob/user) - if(ailock && user.isSilicon()) + if(ailock && issilicon(user)) user << "There seems to be a firewall preventing you from accessing this device." return 1 - if(locked && !user.isSilicon()) + if(locked && !issilicon(user)) user << "Access denied." return 1 @@ -84,13 +84,6 @@ if(stat & BROKEN) return - if(!emagged && istype(W, /obj/item/weapon/card/emag)) - user << "You short out the turret controls' access analysis module." - emagged = 1 - locked = 0 - ailock = 0 - return - if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(src.allowed(usr)) if(emagged) @@ -101,6 +94,14 @@ return return ..() +/obj/machinery/turretid/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + user << "You short out the turret controls' access analysis module." + emagged = 1 + locked = 0 + ailock = 0 + return 1 + /obj/machinery/turretid/attack_ai(mob/user as mob) if(isLocked(user)) return @@ -138,7 +139,7 @@ ui.open() ui.set_auto_update(1) -/obj/machinery/turretid/Topic(href, href_list, var/nowindow = 0) +/obj/machinery/turretid/Topic(href, href_list) if(..()) return 1 @@ -191,13 +192,17 @@ ..() if(stat & NOPOWER) icon_state = "control_off" + set_light(0) else if (enabled) if (lethal) icon_state = "control_kill" + set_light(1.5, 1,"#990000") else icon_state = "control_stun" + set_light(1.5, 1,"#FF9900") else icon_state = "control_standby" + set_light(1.5, 1,"#003300") /obj/machinery/turretid/emp_act(severity) if(enabled) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm.back similarity index 96% rename from code/game/machinery/turrets.dm rename to code/game/machinery/turrets.dm.back index d4a327f054c..5d578e11ced 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm.back @@ -1,513 +1,513 @@ -/area/turret_protected - name = "Turret Protected Area" - var/list/turretTargets = list() - -/area/turret_protected/proc/subjectDied(target) - if( isliving(target) ) - if( !issilicon(target) ) - var/mob/living/L = target - if( L.stat ) - if( L in turretTargets ) - src.Exited(L) - - -/area/turret_protected/Entered(O) - ..() - if( iscarbon(O) ) - turretTargets |= O - else if( istype(O, /obj/mecha) ) - var/obj/mecha/Mech = O - if( Mech.occupant ) - turretTargets |= Mech - else if(istype(O,/mob/living/simple_animal)) - turretTargets |= O - return 1 - -/area/turret_protected/Exited(O) - if( ismob(O) && !issilicon(O) ) - turretTargets -= O - else if( istype(O, /obj/mecha) ) - turretTargets -= O - ..() - return 1 - - -/obj/machinery/turret - name = "turret" - icon = 'icons/obj/turrets.dmi' - icon_state = "grey_target_prism" - var/raised = 0 - var/enabled = 1 - anchored = 1 - layer = 3 - invisibility = INVISIBILITY_LEVEL_TWO - density = 1 - var/lasers = 0 - var/lasertype = 1 - // 1 = lasers - // 2 = cannons - // 3 = pulse - // 4 = change (HONK) - // 5 = bluetag - // 6 = redtag - var/health = 80 - var/maxhealth = 80 - var/auto_repair = 0 - var/obj/machinery/turretcover/cover = null - var/popping = 0 - var/wasvalid = 0 - var/lastfired = 0 - var/shot_delay = 30 //3 seconds between shots - var/datum/effect/effect/system/spark_spread/spark_system - use_power = 1 - idle_power_usage = 50 - active_power_usage = 300 -// var/list/targets - var/atom/movable/cur_target - var/targeting_active = 0 - var/area/turret_protected/protected_area - -/obj/machinery/turret/proc/take_damage(damage) - src.health -= damage - if(src.health<=0) - qdel(src) - return - -/obj/machinery/turret/attack_hand(var/mob/living/carbon/human/user) - - if(!istype(user)) - return ..() - - if(user.species.can_shred(user) && !(stat & BROKEN)) - playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1) - visible_message("\red [user] has slashed at [src]!") - src.take_damage(15) - return - -/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - take_damage(Proj.damage) - ..() - return - -/obj/machinery/turret/New() - maxhealth = health - spark_system = new /datum/effect/effect/system/spark_spread - spark_system.set_up(5, 0, src) - spark_system.attach(src) -// targets = new - ..() - return - -/obj/machinery/turret/proc/update_health() - if(src.health<=0) - qdel(src) - return - -/obj/machinery/turretcover - name = "pop-up turret cover" - icon = 'icons/obj/turrets.dmi' - icon_state = "turretCover" - anchored = 1 - layer = 3.5 - density = 0 - var/obj/machinery/turret/host = null - -/obj/machinery/turret/proc/isPopping() - return (popping!=0) - -/obj/machinery/turret/power_change() - ..() - if(stat & BROKEN) - icon_state = "grey_target_prism" - else - if( !(stat & NOPOWER) ) - if (src.enabled) - if (src.lasers) - icon_state = "orange_target_prism" - else - icon_state = "target_prism" - else - icon_state = "grey_target_prism" - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "grey_target_prism" - stat |= NOPOWER - -/obj/machinery/turret/proc/setState(var/enabled, var/lethal) - src.enabled = enabled - src.lasers = lethal - src.power_change() - - -/obj/machinery/turret/proc/get_protected_area() - var/area/turret_protected/TP = get_area(src) - if(istype(TP)) - return TP - return - -/obj/machinery/turret/proc/check_target(var/atom/movable/T as mob|obj) - if( T && T in protected_area.turretTargets ) - var/area/area_T = get_area(T) - if( !area_T || (area_T.type != protected_area.type) ) - protected_area.Exited(T) - return 0 //If the guy is somehow not in the turret's area (teleportation), get them out the damn list. --NEO - if( iscarbon(T) ) - var/mob/living/carbon/MC = T - if( !MC.stat ) - if( !MC.lying || lasers ) - return 1 - else if( istype(T, /obj/mecha) ) - var/obj/mecha/ME = T - if( ME.occupant ) - return 1 - else if(istype(T,/mob/living/simple_animal)) - var/mob/living/simple_animal/A = T - if( !A.stat ) - if(lasers) - return 1 - return 0 - -/obj/machinery/turret/proc/get_new_target() - var/list/new_targets = new - var/new_target - for(var/mob/living/carbon/M in protected_area.turretTargets) - if(!M.stat) - if(!M.lying || lasers) - new_targets += M - for(var/obj/mecha/M in protected_area.turretTargets) - if(M.occupant) - new_targets += M - for(var/mob/living/simple_animal/M in protected_area.turretTargets) - if(!M.stat) - new_targets += M - if(new_targets.len) - new_target = pick(new_targets) - return new_target - - -/obj/machinery/turret/process() - if(stat & (NOPOWER|BROKEN)) - return - if(src.cover==null) - src.cover = new /obj/machinery/turretcover(src.loc) - src.cover.host = src - protected_area = get_protected_area() - if(!enabled || !protected_area || protected_area.turretTargets.len<=0) - if(!isDown() && !isPopping()) - popDown() - return - if(!check_target(cur_target)) //if current target fails target check - cur_target = get_new_target() //get new target - - if(cur_target) //if it's found, proceed -// world << "[cur_target]" - if(!isPopping()) - if(isDown()) - popUp() - use_power = 2 - else - spawn() - if(!targeting_active) - targeting_active = 1 - target() - targeting_active = 0 - - if(prob(15)) - if(prob(50)) - playsound(src.loc, 'sound/effects/turret/move1.wav', 60, 1) - else - playsound(src.loc, 'sound/effects/turret/move2.wav', 60, 1) - else if(!isPopping())//else, pop down - if(!isDown()) - popDown() - use_power = 1 - - // Auto repair requires massive amount of power, but slowly regenerates the turret's health. - // Currently only used by malfunction hardware, but may be used as admin-settable option too. - if(auto_repair) - if(health < maxhealth) - use_power(20000) - health = min(health + 1, maxhealth) - return - - -/obj/machinery/turret/proc/target() - while(src && enabled && !stat && check_target(cur_target)) - src.set_dir(get_dir(src, cur_target)) - shootAt(cur_target) - sleep(shot_delay) - return - -/obj/machinery/turret/proc/shootAt(var/atom/movable/target) - var/turf/T = get_turf(src) - var/turf/U = get_turf(target) - if (!T || !U) - return - var/obj/item/projectile/A - if (src.lasers) - switch(lasertype) - if(1) - A = new /obj/item/projectile/beam( loc ) - if(2) - A = new /obj/item/projectile/beam/heavylaser( loc ) - if(3) - A = new /obj/item/projectile/beam/pulse( loc ) - if(4) - A = new /obj/item/projectile/change( loc ) - if(5) - A = new /obj/item/projectile/beam/lastertag/blue( loc ) - if(6) - A = new /obj/item/projectile/beam/lastertag/red( loc ) - use_power(500) - else - A = new /obj/item/projectile/energy/electrode( loc ) - use_power(200) - - //Turrets aim for the center of mass by default. - //If the target is grabbing someone then the turret smartly aims for extremities - var/def_zone = get_exposed_defense_zone(target) - - A.launch(target, def_zone) - - return - - -/obj/machinery/turret/proc/isDown() - return (invisibility!=0) - -/obj/machinery/turret/proc/popUp() - if ((!isPopping()) || src.popping==-1) - invisibility = 0 - popping = 1 - playsound(src.loc, 'sound/effects/turret/open.wav', 60, 1) - if (src.cover!=null) - flick("popup", src.cover) - src.cover.icon_state = "openTurretCover" - spawn(10) - if (popping==1) popping = 0 - -/obj/machinery/turret/proc/popDown() - if ((!isPopping()) || src.popping==1) - popping = -1 - playsound(src.loc, 'sound/effects/turret/open.wav', 60, 1) - if (src.cover!=null) - flick("popdown", src.cover) - src.cover.icon_state = "turretCover" - spawn(10) - if (popping==-1) - invisibility = INVISIBILITY_LEVEL_TWO - popping = 0 - -/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - src.health -= Proj.damage - ..() - if(prob(45) && Proj.damage > 0) src.spark_system.start() - qdel (Proj) - if (src.health <= 0) - src.die() - return - -/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N - ..() - playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1) - src.spark_system.start() - src.health -= W.force * 0.5 - if (src.health <= 0) - src.die() - return - -/obj/machinery/turret/emp_act(severity) - switch(severity) - if(1) - enabled = 0 - lasers = 0 - power_change() - ..() - -/obj/machinery/turret/ex_act(severity) - if(severity < 3) - src.die() - -/obj/machinery/turret/proc/die() - src.health = 0 - src.density = 0 - src.stat |= BROKEN - src.icon_state = "destroyed_target_prism" - if (cover!=null) - qdel(cover) - sleep(3) - flick("explosion", src) - spawn(13) - qdel(src) - -/obj/machinery/turret/attack_generic(var/mob/user, var/damage, var/attack_message) - if(!damage) - return 0 - if(stat & BROKEN) - user << "That object is useless to you." - return 0 - user.do_attack_animation(src) - visible_message("[user] [attack_message] the [src]!") - user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") - src.health -= damage - if (src.health <= 0) - src.die() - return 1 - -/obj/structure/turret/gun_turret - name = "Gun Turret" - density = 1 - anchored = 1 - var/cooldown = 20 - var/projectiles = 100 - var/projectiles_per_shot = 2 - var/deviation = 0.3 - var/list/exclude = list() - var/atom/cur_target - var/scan_range = 7 - var/health = 40 - var/list/scan_for = list("human"=0,"cyborg"=0,"mecha"=0,"alien"=1) - var/on = 0 - icon = 'icons/obj/turrets.dmi' - icon_state = "gun_turret" - - proc/take_damage(damage) - src.health -= damage - if(src.health<=0) - qdel(src) - return - - - bullet_act(var/obj/item/projectile/Proj) - if(Proj.damage_type == HALLOSS) - return - take_damage(Proj.damage) - ..() - return - - - ex_act() - qdel(src) - return - - emp_act() - qdel(src) - return - - meteorhit() - qdel(src) - return - - attack_hand(mob/user as mob) - user.set_machine(src) - var/dat = {" - [src] Control - - Power: [on?"on":"off"]
    - Scan Range: - [scan_range] +
    - Scan for: "} - for(var/scan in scan_for) - dat += "" - - dat += {"Ammo: [max(0, projectiles)]
    - - "} - user << browse(dat, "window=turret") - onclose(user, "turret") - return - - attack_ai(mob/user as mob) - return attack_hand(user) - - Topic(href, href_list) - if(href_list["power"]) - src.on = !src.on - if(src.on) - spawn(50) - if(src) - src.process() - if(href_list["scan_range"]) - src.scan_range = between(1,src.scan_range+text2num(href_list["scan_range"]),8) - if(href_list["scan_for"]) - if(href_list["scan_for"] in scan_for) - scan_for[href_list["scan_for"]] = !scan_for[href_list["scan_for"]] - src.updateUsrDialog() - return - - - proc/validate_target(atom/target) - if(get_dist(target, src)>scan_range) - return 0 - if(istype(target, /mob)) - var/mob/M = target - if(!M.stat && !M.lying)//ninjas can't catch you if you're lying - return 1 - else if(istype(target, /obj/mecha)) - return 1 - return 0 - - - process() - spawn while(on) - if(projectiles<=0) - on = 0 - return - if(cur_target && !validate_target(cur_target)) - cur_target = null - if(!cur_target) - cur_target = get_target() - fire(cur_target) - sleep(cooldown) - return - - proc/get_target() - var/list/pos_targets = list() - var/target = null - if(scan_for["human"]) - for(var/mob/living/carbon/human/M in oview(scan_range,src)) - if(M.stat || M.lying || M in exclude) - continue - pos_targets += M - if(scan_for["cyborg"]) - for(var/mob/living/silicon/M in oview(scan_range,src)) - if(M.stat || M.lying || M in exclude) - continue - pos_targets += M - if(scan_for["mecha"]) - for(var/obj/mecha/M in oview(scan_range, src)) - if(M in exclude) - continue - pos_targets += M - if(scan_for["alien"]) - for(var/mob/living/carbon/alien/M in oview(scan_range,src)) - if(M.stat || M.lying || M in exclude) - continue - pos_targets += M - if(pos_targets.len) - target = pick(pos_targets) - return target - - - proc/fire(atom/target) - if(!target) - cur_target = null - return - src.set_dir(get_dir(src,target)) - spawn for(var/i=1 to min(projectiles, projectiles_per_shot)) - if(!src) break - var/turf/curloc = get_turf(src) - - playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1) - var/obj/item/projectile/A = new /obj/item/projectile(curloc) - src.projectiles-- - - var/def_zone = get_exposed_defense_zone(target) - - A.launch(target, def_zone) - sleep(2) - return +/area/turret_protected + name = "Turret Protected Area" + var/list/turretTargets = list() + +/area/turret_protected/proc/subjectDied(target) + if( isliving(target) ) + if( !issilicon(target) ) + var/mob/living/L = target + if( L.stat ) + if( L in turretTargets ) + src.Exited(L) + + +/area/turret_protected/Entered(O) + ..() + if( iscarbon(O) ) + turretTargets |= O + else if( istype(O, /obj/mecha) ) + var/obj/mecha/Mech = O + if( Mech.occupant ) + turretTargets |= Mech + else if(istype(O,/mob/living/simple_animal)) + turretTargets |= O + return 1 + +/area/turret_protected/Exited(O) + if( ismob(O) && !issilicon(O) ) + turretTargets -= O + else if( istype(O, /obj/mecha) ) + turretTargets -= O + ..() + return 1 + + +/obj/machinery/turret + name = "turret" + icon = 'icons/obj/turrets.dmi' + icon_state = "grey_target_prism" + var/raised = 0 + var/enabled = 1 + anchored = 1 + layer = 3 + invisibility = INVISIBILITY_LEVEL_TWO + density = 1 + var/lasers = 0 + var/lasertype = 1 + // 1 = lasers + // 2 = cannons + // 3 = pulse + // 4 = change (HONK) + // 5 = bluetag + // 6 = redtag + var/health = 80 + var/maxhealth = 80 + var/auto_repair = 0 + var/obj/machinery/turretcover/cover = null + var/popping = 0 + var/wasvalid = 0 + var/lastfired = 0 + var/shot_delay = 30 //3 seconds between shots + var/datum/effect/effect/system/spark_spread/spark_system + use_power = 1 + idle_power_usage = 50 + active_power_usage = 300 +// var/list/targets + var/atom/movable/cur_target + var/targeting_active = 0 + var/area/turret_protected/protected_area + +/obj/machinery/turret/proc/take_damage(damage) + src.health -= damage + if(src.health<=0) + qdel(src) + return + +/obj/machinery/turret/attack_hand(var/mob/living/carbon/human/user) + + if(!istype(user)) + return ..() + + if(user.species.can_shred(user) && !(stat & BROKEN)) + playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1) + visible_message("\red [user] has slashed at [src]!") + src.take_damage(15) + return + +/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj) + if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + return + take_damage(Proj.damage) + ..() + return + +/obj/machinery/turret/New() + maxhealth = health + spark_system = new /datum/effect/effect/system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) +// targets = new + ..() + return + +/obj/machinery/turret/proc/update_health() + if(src.health<=0) + qdel(src) + return + +/obj/machinery/turretcover + name = "pop-up turret cover" + icon = 'icons/obj/turrets.dmi' + icon_state = "turretCover" + anchored = 1 + layer = 3.5 + density = 0 + var/obj/machinery/turret/host = null + +/obj/machinery/turret/proc/isPopping() + return (popping!=0) + +/obj/machinery/turret/power_change() + ..() + if(stat & BROKEN) + icon_state = "grey_target_prism" + else + if( !(stat & NOPOWER) ) + if (src.enabled) + if (src.lasers) + icon_state = "orange_target_prism" + else + icon_state = "target_prism" + else + icon_state = "grey_target_prism" + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + src.icon_state = "grey_target_prism" + stat |= NOPOWER + +/obj/machinery/turret/proc/setState(var/enabled, var/lethal) + src.enabled = enabled + src.lasers = lethal + src.power_change() + + +/obj/machinery/turret/proc/get_protected_area() + var/area/turret_protected/TP = get_area(src) + if(istype(TP)) + return TP + return + +/obj/machinery/turret/proc/check_target(var/atom/movable/T as mob|obj) + if( T && T in protected_area.turretTargets ) + var/area/area_T = get_area(T) + if( !area_T || (area_T.type != protected_area.type) ) + protected_area.Exited(T) + return 0 //If the guy is somehow not in the turret's area (teleportation), get them out the damn list. --NEO + if( iscarbon(T) ) + var/mob/living/carbon/MC = T + if( !MC.stat ) + if( !MC.lying || lasers ) + return 1 + else if( istype(T, /obj/mecha) ) + var/obj/mecha/ME = T + if( ME.occupant ) + return 1 + else if(istype(T,/mob/living/simple_animal)) + var/mob/living/simple_animal/A = T + if( !A.stat ) + if(lasers) + return 1 + return 0 + +/obj/machinery/turret/proc/get_new_target() + var/list/new_targets = new + var/new_target + for(var/mob/living/carbon/M in protected_area.turretTargets) + if(!M.stat) + if(!M.lying || lasers) + new_targets += M + for(var/obj/mecha/M in protected_area.turretTargets) + if(M.occupant) + new_targets += M + for(var/mob/living/simple_animal/M in protected_area.turretTargets) + if(!M.stat) + new_targets += M + if(new_targets.len) + new_target = pick(new_targets) + return new_target + + +/obj/machinery/turret/process() + if(stat & (NOPOWER|BROKEN)) + return + if(src.cover==null) + src.cover = new /obj/machinery/turretcover(src.loc) + src.cover.host = src + protected_area = get_protected_area() + if(!enabled || !protected_area || protected_area.turretTargets.len<=0) + if(!isDown() && !isPopping()) + popDown() + return + if(!check_target(cur_target)) //if current target fails target check + cur_target = get_new_target() //get new target + + if(cur_target) //if it's found, proceed +// world << "[cur_target]" + if(!isPopping()) + if(isDown()) + popUp() + use_power = 2 + else + spawn() + if(!targeting_active) + targeting_active = 1 + target() + targeting_active = 0 + + if(prob(15)) + if(prob(50)) + playsound(src.loc, 'sound/effects/turret/move1.wav', 60, 1) + else + playsound(src.loc, 'sound/effects/turret/move2.wav', 60, 1) + else if(!isPopping())//else, pop down + if(!isDown()) + popDown() + use_power = 1 + + // Auto repair requires massive amount of power, but slowly regenerates the turret's health. + // Currently only used by malfunction hardware, but may be used as admin-settable option too. + if(auto_repair) + if(health < maxhealth) + use_power(20000) + health = min(health + 1, maxhealth) + return + + +/obj/machinery/turret/proc/target() + while(src && enabled && !stat && check_target(cur_target)) + src.set_dir(get_dir(src, cur_target)) + shootAt(cur_target) + sleep(shot_delay) + return + +/obj/machinery/turret/proc/shootAt(var/atom/movable/target) + var/turf/T = get_turf(src) + var/turf/U = get_turf(target) + if (!T || !U) + return + var/obj/item/projectile/A + if (src.lasers) + switch(lasertype) + if(1) + A = new /obj/item/projectile/beam( loc ) + if(2) + A = new /obj/item/projectile/beam/heavylaser( loc ) + if(3) + A = new /obj/item/projectile/beam/pulse( loc ) + if(4) + A = new /obj/item/projectile/change( loc ) + if(5) + A = new /obj/item/projectile/beam/lastertag/blue( loc ) + if(6) + A = new /obj/item/projectile/beam/lastertag/red( loc ) + use_power(500) + else + A = new /obj/item/projectile/energy/electrode( loc ) + use_power(200) + + //Turrets aim for the center of mass by default. + //If the target is grabbing someone then the turret smartly aims for extremities + var/def_zone = get_exposed_defense_zone(target) + + A.launch(target, def_zone) + + return + + +/obj/machinery/turret/proc/isDown() + return (invisibility!=0) + +/obj/machinery/turret/proc/popUp() + if ((!isPopping()) || src.popping==-1) + invisibility = 0 + popping = 1 + playsound(src.loc, 'sound/effects/turret/open.wav', 60, 1) + if (src.cover!=null) + flick("popup", src.cover) + src.cover.icon_state = "openTurretCover" + spawn(10) + if (popping==1) popping = 0 + +/obj/machinery/turret/proc/popDown() + if ((!isPopping()) || src.popping==1) + popping = -1 + playsound(src.loc, 'sound/effects/turret/open.wav', 60, 1) + if (src.cover!=null) + flick("popdown", src.cover) + src.cover.icon_state = "turretCover" + spawn(10) + if (popping==-1) + invisibility = INVISIBILITY_LEVEL_TWO + popping = 0 + +/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj) + if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + return + src.health -= Proj.damage + ..() + if(prob(45) && Proj.damage > 0) src.spark_system.start() + qdel (Proj) + if (src.health <= 0) + src.die() + return + +/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N + ..() + playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1) + src.spark_system.start() + src.health -= W.force * 0.5 + if (src.health <= 0) + src.die() + return + +/obj/machinery/turret/emp_act(severity) + switch(severity) + if(1) + enabled = 0 + lasers = 0 + power_change() + ..() + +/obj/machinery/turret/ex_act(severity) + if(severity < 3) + src.die() + +/obj/machinery/turret/proc/die() + src.health = 0 + src.density = 0 + src.stat |= BROKEN + src.icon_state = "destroyed_target_prism" + if (cover!=null) + qdel(cover) + sleep(3) + flick("explosion", src) + spawn(13) + qdel(src) + +/obj/machinery/turret/attack_generic(var/mob/user, var/damage, var/attack_message) + if(!damage) + return 0 + if(stat & BROKEN) + user << "That object is useless to you." + return 0 + user.do_attack_animation(src) + visible_message("[user] [attack_message] the [src]!") + user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") + src.health -= damage + if (src.health <= 0) + src.die() + return 1 + +/obj/structure/turret/gun_turret + name = "Gun Turret" + density = 1 + anchored = 1 + var/cooldown = 20 + var/projectiles = 100 + var/projectiles_per_shot = 2 + var/deviation = 0.3 + var/list/exclude = list() + var/atom/cur_target + var/scan_range = 7 + var/health = 40 + var/list/scan_for = list("human"=0,"cyborg"=0,"mecha"=0,"alien"=1) + var/on = 0 + icon = 'icons/obj/turrets.dmi' + icon_state = "gun_turret" + + proc/take_damage(damage) + src.health -= damage + if(src.health<=0) + qdel(src) + return + + + bullet_act(var/obj/item/projectile/Proj) + if(Proj.damage_type == HALLOSS) + return + take_damage(Proj.damage) + ..() + return + + + ex_act() + qdel(src) + return + + emp_act() + qdel(src) + return + + meteorhit() + qdel(src) + return + + attack_hand(mob/user as mob) + user.set_machine(src) + var/dat = {" + [src] Control + + Power: [on?"on":"off"]
    + Scan Range: - [scan_range] +
    + Scan for: "} + for(var/scan in scan_for) + dat += "" + + dat += {"Ammo: [max(0, projectiles)]
    + + "} + user << browse(dat, "window=turret") + onclose(user, "turret") + return + + attack_ai(mob/user as mob) + return attack_hand(user) + + Topic(href, href_list) + if(href_list["power"]) + src.on = !src.on + if(src.on) + spawn(50) + if(src) + src.process() + if(href_list["scan_range"]) + src.scan_range = between(1,src.scan_range+text2num(href_list["scan_range"]),8) + if(href_list["scan_for"]) + if(href_list["scan_for"] in scan_for) + scan_for[href_list["scan_for"]] = !scan_for[href_list["scan_for"]] + src.updateUsrDialog() + return + + + proc/validate_target(atom/target) + if(get_dist(target, src)>scan_range) + return 0 + if(istype(target, /mob)) + var/mob/M = target + if(!M.stat && !M.lying)//ninjas can't catch you if you're lying + return 1 + else if(istype(target, /obj/mecha)) + return 1 + return 0 + + + process() + spawn while(on) + if(projectiles<=0) + on = 0 + return + if(cur_target && !validate_target(cur_target)) + cur_target = null + if(!cur_target) + cur_target = get_target() + fire(cur_target) + sleep(cooldown) + return + + proc/get_target() + var/list/pos_targets = list() + var/target = null + if(scan_for["human"]) + for(var/mob/living/carbon/human/M in oview(scan_range,src)) + if(M.stat || M.lying || M in exclude) + continue + pos_targets += M + if(scan_for["cyborg"]) + for(var/mob/living/silicon/M in oview(scan_range,src)) + if(M.stat || M.lying || M in exclude) + continue + pos_targets += M + if(scan_for["mecha"]) + for(var/obj/mecha/M in oview(scan_range, src)) + if(M in exclude) + continue + pos_targets += M + if(scan_for["alien"]) + for(var/mob/living/carbon/alien/M in oview(scan_range,src)) + if(M.stat || M.lying || M in exclude) + continue + pos_targets += M + if(pos_targets.len) + target = pick(pos_targets) + return target + + + proc/fire(atom/target) + if(!target) + cur_target = null + return + src.set_dir(get_dir(src,target)) + spawn for(var/i=1 to min(projectiles, projectiles_per_shot)) + if(!src) break + var/turf/curloc = get_turf(src) + + playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1) + var/obj/item/projectile/A = new /obj/item/projectile(curloc) + src.projectiles-- + + var/def_zone = get_exposed_defense_zone(target) + + A.launch(target, def_zone) + sleep(2) + return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index c80fcbf76f1..18729bd0b0c 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -19,9 +19,8 @@ src.product_path = path if(!name) - var/atom/tmp = new path + var/atom/tmp = path src.product_name = initial(tmp.name) - qdel(tmp) else src.product_name = name @@ -148,7 +147,7 @@ wires = null qdel(coin) coin = null - ..() + return ..() /obj/machinery/vending/ex_act(severity) switch(severity) @@ -168,14 +167,11 @@ else return -/obj/machinery/vending/blob_act() - if (prob(50)) - spawn(0) - src.malfunction() - qdel(src) - return - - return +/obj/machinery/vending/emag_act(var/remaining_charges, var/mob/user) + if (!emagged) + src.emagged = 1 + user << "You short out the product lock on \the [src]" + return 1 /obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -207,10 +203,6 @@ 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 \the [src]" - return else if(istype(W, /obj/item/weapon/screwdriver)) src.panel_open = !src.panel_open user << "You [src.panel_open ? "open" : "close"] the maintenance panel." @@ -229,30 +221,29 @@ W.loc = src coin = W categories |= CAT_COIN - user << "\blue You insert \the [W] into \the [src]" + user << "You insert \the [W] into \the [src]." nanomanager.update_uis(src) return else if(istype(W, /obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + if(anchored) + user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") + else + user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") + if(do_after(user, 20)) if(!src) return - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - switch (anchored) - if (0) - anchored = 1 - 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("\The [user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") - anchored = 0 + user << "You [anchored? "un" : ""]secured \the [src]!" + anchored = !anchored return - else if(src.panel_open) + else for(var/datum/data/vending_product/R in product_records) if(istype(W, R.product_path)) stock(R, user) qdel(W) - - else + return ..() /** @@ -472,7 +463,7 @@ coin.loc = src.loc if(!usr.get_active_hand()) usr.put_in_hands(coin) - usr << "\blue You remove the [coin] from the [src]" + usr << "You remove the [coin] from the [src]" coin = null categories &= ~CAT_COIN @@ -525,15 +516,15 @@ if (R.category & CAT_COIN) if(!coin) - user << "\blue You need to insert a coin to get this item." + user << "You need to insert a coin to get this item." return if(coin.string_attached) if(prob(50)) - user << "\blue You successfully pull the coin out before \the [src] could swallow it." + user << "You successfully pull the coin out before \the [src] could swallow it." src.visible_message("\blue The [src] putters to life, coughing out its 'premium' item after a moment.") playsound(src.loc, 'sound/items/poster_being_created.ogg', 50, 1) else - user << "\red You weren't able to pull the coin out fast enough, the machine ate it, string and all." + user << "You weren't able to pull the coin out fast enough, the machine ate it, string and all." src.visible_message("\blue The [src] putters to life, coughing out its 'premium' item after a moment.") playsound(src.loc, 'sound/items/poster_being_created.ogg', 50, 1) qdel(coin) @@ -566,7 +557,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 << "You insert \the [src] in the product receptor." R.amount++ nanomanager.update_uis(src) @@ -600,7 +591,7 @@ return for(var/mob/O in hearers(src, null)) - O.show_message("\The [src] beeps, \"[message]\"",2) + O.show_message("\The [src] beeps, \"[message]\"",2) return /obj/machinery/vending/power_change() @@ -653,7 +644,7 @@ return 0 spawn(0) throw_item.throw_at(target, 16, 3, src) - src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") + src.visible_message("[src] launches [throw_item.name] at [target.name]!") return 1 /* @@ -694,11 +685,12 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5, - /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/cans/beer = 6, - /obj/item/weapon/reagent_containers/food/drinks/cans/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4, + /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 6, + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 8, - /obj/item/weapon/reagent_containers/food/drinks/cans/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15, + /obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 5, /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15, /obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 2, /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 2, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 9, /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 2,/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 2, @@ -791,8 +783,8 @@ icon_state = "cigs" products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/flame/lighter/random = 4) contraband = list(/obj/item/weapon/flame/lighter/zippo = 4) - premium = list(/obj/item/weapon/storage/fancy/cigar = 5) - prices = list(/obj/item/weapon/storage/fancy/cigarettes = 500,/obj/item/weapon/storage/box/matches = 2,/obj/item/weapon/flame/lighter/random = 2) + premium = list(/obj/item/weapon/storage/fancy/cigar = 5,/obj/item/weapon/storage/fancy/cigarettes/killthroat = 5 ) + prices = list(/obj/item/weapon/storage/fancy/cigarettes = 15,/obj/item/weapon/storage/box/matches = 1,/obj/item/weapon/flame/lighter/random = 2) /obj/machinery/vending/medical @@ -848,7 +840,7 @@ icon_state = "sec" icon_deny = "sec-deny" req_access = list(access_security) - products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5, + products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/weapon/grenade/chem_grenade/teargas = 4,/obj/item/device/flash = 5, /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6) contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2) @@ -923,8 +915,8 @@ desc = "A kitchen and restaurant equipment vendor." product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" - products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/material/kitchen/utensil/fork = 6,/obj/item/weapon/material/knife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2) - contraband = list(/obj/item/weapon/material/kitchen/utensil/spoon = 2,/obj/item/weapon/material/kitchen/utensil/knife = 2,/obj/item/weapon/material/kitchen/rollingpin = 2, /obj/item/weapon/material/knife/butch = 2) + products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/material/kitchen/utensil/fork = 6, /obj/item/weapon/material/kitchen/utensil/knife = 6, /obj/item/weapon/material/kitchen/utensil/spoon = 6, /obj/item/weapon/material/knife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2) + contraband = list(/obj/item/weapon/material/kitchen/rollingpin = 2, /obj/item/weapon/material/knife/butch = 2) /obj/machinery/vending/sovietsoda name = "BODA" @@ -985,3 +977,18 @@ /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5, /obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5) //everything after the power cell had no amounts, I improvised. -Sayu + +//FOR ACTORS GUILD - mainly props that cannot be spawned otherwise +/obj/machinery/vending/props + name = "prop dispenser" + desc = "All the props an actor could need. Probably." + icon_state = "Theater" + products = list(/obj/structure/flora/pottedplant = 2, /obj/item/device/flashlight/lamp = 2, /obj/item/device/flashlight/lamp/green = 2, /obj/item/weapon/reagent_containers/food/drinks/jar = 1, + /obj/item/weapon/nullrod = 1, /obj/item/toy/cultsword = 4, /obj/item/toy/katana = 2, /obj/item/weapon/phone = 3) + +//FOR ACTORS GUILD - Containers +/obj/machinery/vending/containers + name = "container dispenser" + desc = "A container that dispenses containers." + icon_state = "robotics" + products = list(/obj/structure/closet/crate/freezer = 2, /obj/structure/closet = 3, /obj/structure/closet/crate = 3) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index be0a0e6d3a5..a22482a4168 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -75,7 +75,7 @@ /obj/machinery/washing_machine/attackby(obj/item/weapon/W as obj, mob/user as mob) /*if(istype(W,/obj/item/weapon/screwdriver)) panel = !panel - user << "\blue you [panel ? "open" : "close"] the [src]'s maintenance panel"*/ + user << "You [panel ? "open" : "close"] the [src]'s maintenance panel"*/ if(istype(W,/obj/item/weapon/pen/crayon) || istype(W,/obj/item/weapon/stamp)) if( state in list( 1, 3, 6 ) ) if(!crayon) @@ -148,9 +148,9 @@ W.loc = src state = 3 else - user << "\blue You can't put the item in right now." + user << "You can't put the item in right now." else - user << "\blue The washing machine is full." + user << "The washing machine is full." else ..() update_icon() @@ -172,7 +172,7 @@ crayon = null state = 1 if(5) - user << "\red The [src] is busy." + user << "The [src] is busy." if(6) state = 7 if(7) @@ -187,4 +187,4 @@ state = 1 - update_icon() \ No newline at end of file + update_icon() diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 477b154b531..12c4628964c 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -99,7 +99,7 @@ target:attackby(src,src.occupant) else if(prob(5)) target:dismantle_wall(1) - src.occupant_message("\blue You smash through the wall.") + src.occupant_message("You smash through the wall.") src.visible_message("[src.name] smashes through the wall") playsound(src, 'sound/weapons/smash.ogg', 50, 1) melee_can_hit = 0 @@ -262,4 +262,4 @@ occupant_message("From the lies of the Antipath, Circuit preserve us.") am = null return - */ \ No newline at end of file + */ diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 635166c9994..6eee384d1d3 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -1,5 +1,5 @@ /obj/mecha/combat/durand - desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms." + desc = "An aging combat exosuit utilized by many corporations. Originally developed to combat hostile alien lifeforms." name = "Durand" icon_state = "durand" initial_icon = "durand" @@ -12,7 +12,7 @@ infra_luminosity = 8 force = 40 var/defence = 0 - var/defence_deflect = 35 + var/def_boost = 15 wreckage = /obj/effect/decal/mecha_wreckage/durand /* @@ -43,10 +43,10 @@ return defence = !defence if(defence) - deflect_chance = defence_deflect + deflect_chance += def_boost src.occupant_message("You enable [src] defence mode.") else - deflect_chance = initial(deflect_chance) + deflect_chance -= def_boost src.occupant_message("You disable [src] defence mode.") src.log_message("Toggled defence mode.") return diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index b47564e2b36..ae383d00c47 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -17,7 +17,7 @@ max_equip = 3 /obj/mecha/combat/gygax/dark - desc = "A lightweight exosuit used by NanoTrasen Heavy Asset Protection. A significantly upgraded Gygax security mech." + desc = "A lightweight exosuit used by Heavy Asset Protection. A significantly upgraded Gygax security mech." name = "Dark Gygax" icon_state = "darkgygax" initial_icon = "darkgygax" @@ -42,15 +42,8 @@ ME.attach(src) return -/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.charge = 30000 - cell.maxcharge = 30000 - +/obj/mecha/combat/gygax/dark/add_cell() + cell = new /obj/item/weapon/cell/hyper(src) /obj/mecha/combat/gygax/verb/overload() set category = "Exosuit Interface" @@ -72,7 +65,7 @@ src.log_message("Toggled leg actuators overload.") return -/obj/mecha/combat/gygax/dyndomove(direction) +/obj/mecha/combat/gygax/do_move(direction) if(!..()) return if(overload) health-- diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index bf23e579f3f..ffbd913b3d5 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -51,7 +51,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster(src) ME.attach(src) src.smoke_system.set_up(3, 0, src) src.smoke_system.attach(src) @@ -62,7 +62,7 @@ var/obj/item/mecha_parts/mecha_equipment/ME if(equipment.len)//Now to remove it and equip anew. for(ME in equipment) - equipment -= ME + ME.detach(src) qdel(ME) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) ME.attach(src) @@ -72,7 +72,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster(src) ME.attach(src) return @@ -136,7 +136,7 @@ if(get_charge() > 0) thrusters = !thrusters src.log_message("Toggled thrusters.") - src.occupant_message("Thrusters [thrusters?"en":"dis"]abled.") + src.occupant_message("Thrusters [thrusters?"en":"dis"]abled.") return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 36f3ea6f858..b55419d8619 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -1,4 +1,3 @@ -//TODO: Add critfail checks and reliability //DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE! //I'm annoyed I even have to tell you this! SPRITE FIRST, then commit. @@ -7,15 +6,12 @@ icon = 'icons/mecha/mecha_equipment.dmi' icon_state = "mecha_equip" force = 5 - origin_tech = "materials=2" - construction_time = 100 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000) + origin_tech = list(TECH_MATERIAL = 2) var/equip_cooldown = 0 var/equip_ready = 1 var/energy_drain = 0 var/obj/mecha/chassis = null var/range = MELEE //bitflags - reliability = 1000 var/salvageable = 1 var/required_type = /obj/mecha //may be either a type or a list of allowed types @@ -27,7 +23,6 @@ return 1 return 0 - /obj/item/mecha_parts/mecha_equipment/New() ..() return @@ -85,8 +80,6 @@ return 0 if(!equip_ready) return 0 - if(crit_fail) - return 0 if(energy_drain && !chassis.has_charge(energy_drain)) return 0 return 1 diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 695a3be4d2e..98a49af28a3 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -3,11 +3,9 @@ desc = "A sleeper. Mountable to an exosuit. (Can be attached to: Medical Exosuits)" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "sleeper_0" - origin_tech = "programming=2;biotech=3" + origin_tech = list(TECH_DATA = 2, TECH_BIO = 3) energy_drain = 20 range = MELEE - construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=10000) - reliability = 1000 equip_cooldown = 20 var/mob/living/carbon/occupant = null var/datum/global_iterator/pr_mech_sleeper @@ -334,10 +332,8 @@ 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 + T.make_plating(!(T.broken || T.burnt)) + return new_turf.is_plating() proc/layCable(var/turf/new_turf) if(equip_ready || !istype(new_turf) || !dismantleFloor(new_turf)) @@ -386,9 +382,7 @@ var/datum/global_iterator/mech_synth/synth range = MELEE|RANGED equip_cooldown = 10 - origin_tech = "materials=3;biotech=4;magnets=4;programming=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=3000,"glass"=2000) + origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) required_type = /obj/mecha/medical New() @@ -639,11 +633,9 @@ return stop() var/energy_drain = S.energy_drain*10 if(!S.processed_reagents.len || S.reagents.total_volume >= S.reagents.maximum_volume || !S.chassis.has_charge(energy_drain)) - S.occupant_message("Reagent processing stopped.") + S.occupant_message("Reagent processing stopped.") S.log_message("Reagent processing stopped.") return stop() - if(anyprob(S.reliability)) - S.critfail() var/amount = S.synth_speed / S.processed_reagents.len for(var/reagent in S.processed_reagents) S.reagents.add_reagent(reagent,amount) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 31e142db804..6a3decc5cf5 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -83,8 +83,8 @@ 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("\The [chassis] starts to drill \the [target]", "You hear a large drill.") + occupant_message("You start to drill \the [target]") var/T = chassis.loc var/C = target.loc //why are these backwards? we may never know -Pete if(do_after_cooldown(target)) @@ -92,26 +92,26 @@ if(istype(target, /turf/simulated/wall)) var/turf/simulated/wall/W = target if(W.reinf_material) - occupant_message("[target] is too durable to drill through.") + occupant_message("\The [target] is too durable to drill through.") else - log_message("Drilled through [target]") + log_message("Drilled through \the [target]") target.ex_act(2) else if(istype(target, /turf/simulated/mineral)) for(var/turf/simulated/mineral/M in range(chassis,1)) if(get_dir(chassis,M)&chassis.dir) M.GetDrilled() - log_message("Drilled through [target]") + log_message("Drilled through \the [target]") if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment) var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo if(ore_box) for(var/obj/item/weapon/ore/ore in range(chassis,1)) if(get_dir(chassis,ore)&chassis.dir) ore.Move(ore_box) - else if(istype(target, /turf/simulated/floor/plating/airless/asteroid)) - for(var/turf/simulated/floor/plating/airless/asteroid/M in range(chassis,1)) + else if(istype(target, /turf/simulated/floor/asteroid)) + for(var/turf/simulated/floor/asteroid/M in range(chassis,1)) if(get_dir(chassis,M)&chassis.dir) M.gets_dug() - log_message("Drilled through [target]") + log_message("Drilled through \the [target]") if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment) var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo if(ore_box) @@ -119,7 +119,7 @@ if(get_dir(chassis,ore)&chassis.dir) ore.Move(ore_box) else if(target.loc == C) - log_message("Drilled through [target]") + log_message("Drilled through \the [target]") target.ex_act(2) return 1 @@ -127,8 +127,7 @@ name = "diamond drill" desc = "This is an upgraded version of the drill that'll pierce the heavens! (Can be attached to: Combat and Engineering Exosuits)" icon_state = "mecha_diamond_drill" - origin_tech = "materials=4;engineering=3" - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"diamond"=6500) + origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) equip_cooldown = 20 force = 15 @@ -139,8 +138,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("\The [chassis] starts to drill \the [target]", "You hear a large drill.") + occupant_message("You start to drill \the [target]") var/T = chassis.loc var/C = target.loc //why are these backwards? we may never know -Pete if(do_after_cooldown(target)) @@ -148,30 +147,30 @@ if(istype(target, /turf/simulated/wall)) var/turf/simulated/wall/W = target if(!W.reinf_material || do_after_cooldown(target))//To slow down how fast mechs can drill through the station - log_message("Drilled through [target]") + log_message("Drilled through \the [target]") target.ex_act(3) else if(istype(target, /turf/simulated/mineral)) for(var/turf/simulated/mineral/M in range(chassis,1)) if(get_dir(chassis,M)&chassis.dir) M.GetDrilled() - log_message("Drilled through [target]") + log_message("Drilled through \the [target]") if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment) var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo if(ore_box) for(var/obj/item/weapon/ore/ore in range(chassis,1)) if(get_dir(chassis,ore)&chassis.dir) ore.Move(ore_box) - else if(istype(target,/turf/simulated/floor/plating/airless/asteroid)) - for(var/turf/simulated/floor/plating/airless/asteroid/M in range(target,1)) + else if(istype(target,/turf/simulated/floor/asteroid)) + for(var/turf/simulated/floor/asteroid/M in range(target,1)) M.gets_dug() - log_message("Drilled through [target]") + log_message("Drilled through \the [target]") if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment) var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo if(ore_box) for(var/obj/item/weapon/ore/ore in range(target,1)) ore.Move(ore_box) else if(target.loc == C) - log_message("Drilled through [target]") + log_message("Drilled through \the [target]") target.ex_act(2) return 1 @@ -251,12 +250,10 @@ name = "mounted RCD" desc = "An exosuit-mounted Rapid Construction Device. (Can be attached to: Any exosuit)" icon_state = "mecha_rcd" - origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4" + origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER = 4) equip_cooldown = 10 energy_drain = 250 range = MELEE|RANGED - construction_time = 1200 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000,"phoron"=25000,"silver"=20000,"gold"=20000) var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. var/disabled = 0 //malf @@ -287,7 +284,7 @@ if(do_after_cooldown(target)) if(disabled) return chassis.spark_system.start() - target:ChangeTurf(/turf/space) + target:ChangeTurf(get_base_turf_by_area(target)) playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) chassis.use_power(energy_drain) else if (istype(target, /obj/machinery/door/airlock)) @@ -300,7 +297,7 @@ playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) chassis.use_power(energy_drain) if(1) - if(istype(target, /turf/space)) + if(istype(target, /turf/space) || istype(target,get_base_turf_by_area(target))) occupant_message("Building Floor...") set_ready_state(0) if(do_after_cooldown(target)) @@ -356,7 +353,7 @@ name = "teleporter" desc = "An exosuit module that allows exosuits to teleport to any position in view." icon_state = "mecha_teleport" - origin_tech = "bluespace=10" + origin_tech = list(TECH_BLUESPACE = 10) equip_cooldown = 150 energy_drain = 1000 range = RANGED @@ -376,7 +373,7 @@ name = "wormhole generator" desc = "An exosuit module that allows generating of small quasi-stable wormholes." icon_state = "mecha_wholegen" - origin_tech = "bluespace=3" + origin_tech = list(TECH_BLUESPACE = 3) equip_cooldown = 50 energy_drain = 300 range = RANGED @@ -426,7 +423,7 @@ name = "gravitational catapult" desc = "An exosuit mounted Gravitational Catapult." icon_state = "mecha_teleport" - origin_tech = "bluespace=2;magnets=3" + origin_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3) equip_cooldown = 10 energy_drain = 100 range = MELEE|RANGED @@ -498,136 +495,103 @@ return -/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. +/obj/item/mecha_parts/mecha_equipment/armor_booster + name = "armor booster" + desc = "Powered armor-enhancing mech equipment." + icon_state = "mecha_abooster_proj" + equip_cooldown = 10 + energy_drain = 50 + range = 0 + var/deflect_coeff = 1 + var/damage_coeff = 1 + var/melee + + attach(obj/mecha/M as obj) + ..() + activate_boost() + return + + detach() + if(equip_ready) + deactivate_boost() + ..() + return + + get_equip_info() + if(!chassis) return + return "* [src.name]" + + proc/activate_boost() + if(!src.chassis) + return 0 + return 1 + + proc/deactivate_boost() + if(!src.chassis) + return 0 + return 1 + + set_ready_state(state) + if(state && !equip_ready) + activate_boost() + else if(equip_ready) + deactivate_boost() + ..() + + +/obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. name = "\improper CCW armor booster" desc = "Close-combat armor booster. Boosts exosuit armor against armed melee attacks. Requires energy to operate." icon_state = "mecha_abooster_ccw" - origin_tech = "materials=3" - equip_cooldown = 10 - energy_drain = 50 - range = 0 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"silver"=5000) - var/deflect_coeff = 1.15 - var/damage_coeff = 0.8 + origin_tech = list(TECH_MATERIAL = 3) + deflect_coeff = 1.15 + damage_coeff = 0.8 + melee = 1 - can_attach(obj/mecha/M as obj) + activate_boost() if(..()) - if(!M.proc_res["dynattackby"]) - return 1 - return 0 - - attach(obj/mecha/M as obj) - ..() - chassis.proc_res["dynattackby"] = src - return - - detach() - chassis.proc_res["dynattackby"] = null - ..() - return - - get_equip_info() - if(!chassis) return - return "* [src.name]" - - proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob) - if(!action_checks(user)) - return chassis.dynattackby(W,user) - chassis.log_message("Attacked by [W]. Attacker - [user]") - if(prob(chassis.deflect_chance*deflect_coeff)) - 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.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) - chassis.use_power(energy_drain) - do_after_cooldown() - return + chassis.m_deflect_coeff *= deflect_coeff + chassis.m_damage_coeff *= damage_coeff + chassis.mhit_power_use += energy_drain -/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + deactivate_boost() + if(..()) + chassis.m_deflect_coeff /= deflect_coeff + chassis.m_damage_coeff /= damage_coeff + chassis.mhit_power_use -= energy_drain + + +/obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster name = "\improper RW armor booster" desc = "Ranged-weaponry armor booster. Boosts exosuit armor against ranged attacks. Completely blocks taser shots, but requires energy to operate." icon_state = "mecha_abooster_proj" - origin_tech = "materials=4" - equip_cooldown = 10 - energy_drain = 50 - range = 0 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=5000) - var/deflect_coeff = 1.15 - var/damage_coeff = 0.8 + origin_tech = list(TECH_MATERIAL = 4) + deflect_coeff = 1.15 + damage_coeff = 0.8 + melee = 0 - can_attach(obj/mecha/M as obj) + activate_boost() if(..()) - if(!M.proc_res["dynbulletdamage"] && !M.proc_res["dynhitby"]) - return 1 - return 0 + chassis.r_deflect_coeff *= deflect_coeff + chassis.r_damage_coeff *= damage_coeff + chassis.rhit_power_use += energy_drain - attach(obj/mecha/M as obj) - ..() - chassis.proc_res["dynbulletdamage"] = src - chassis.proc_res["dynhitby"] = src - return - - detach() - chassis.proc_res["dynbulletdamage"] = null - chassis.proc_res["dynhitby"] = null - ..() - return - - get_equip_info() - if(!chassis) return - return "* [src.name]" - - proc/dynbulletdamage(var/obj/item/projectile/Proj) - if(!action_checks(src)) - return chassis.dynbulletdamage(Proj) - if(prob(chassis.deflect_chance*deflect_coeff)) - 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 - chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour) - chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - Proj.on_hit(chassis) - set_ready_state(0) - chassis.use_power(energy_drain) - do_after_cooldown() - return - - proc/dynhitby(atom/movable/A) - 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("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)) - var/mob/living/M = A - M.take_organ_damage(10) - else if(istype(A, /obj)) - var/obj/O = A - if(O.throwforce) - chassis.take_damage(round(O.throwforce*damage_coeff)) - chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - set_ready_state(0) - chassis.use_power(energy_drain) - do_after_cooldown() - return + deactivate_boost() + if(..()) + chassis.r_deflect_coeff /= deflect_coeff + chassis.r_damage_coeff /= damage_coeff + chassis.rhit_power_use -= energy_drain /obj/item/mecha_parts/mecha_equipment/repair_droid name = "repair droid" desc = "Automated repair droid. Scans exosuit for damage and repairs it. Can fix almost any type of external or internal damage." icon_state = "repair_droid" - origin_tech = "magnets=3;programming=3" + origin_tech = list(TECH_MAGNET = 3, TECH_DATA = 3) equip_cooldown = 20 energy_drain = 100 range = 0 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=1000,"silver"=2000,"glass"=5000) var/health_boost = 2 var/datum/global_iterator/pr_repair_droid var/icon/droid_overlay @@ -718,11 +682,10 @@ name = "energy relay" desc = "Wirelessly drains energy from any available power channel in area. The performance index is quite low." icon_state = "tesla" - origin_tech = "magnets=4;syndicate=2" + origin_tech = list(TECH_MAGNET = 4, TECH_ILLEGAL = 2) equip_cooldown = 10 energy_drain = 0 range = 0 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=2000,"silver"=3000,"glass"=2000) var/datum/global_iterator/pr_energy_relay var/coeff = 100 var/list/use_channels = list(EQUIP,ENVIRON,LIGHT) @@ -740,35 +703,13 @@ detach() pr_energy_relay.stop() -// chassis.proc_res["dynusepower"] = null - chassis.proc_res["dyngetcharge"] = null ..() return attach(obj/mecha/M) ..() - chassis.proc_res["dyngetcharge"] = src -// chassis.proc_res["dynusepower"] = src return - can_attach(obj/mecha/M) - if(..()) - if(!M.proc_res["dyngetcharge"])// && !M.proc_res["dynusepower"]) - return 1 - return 0 - - proc/dyngetcharge() - if(equip_ready) //disabled - return chassis.dyngetcharge() - var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) - var/charge = 0 - if(pow_chan) - charge = 1000 //making magic - else - return chassis.dyngetcharge() - return charge - proc/get_power_channel(var/area/A) var/pow_chan if(A) @@ -793,15 +734,6 @@ if(!chassis) return return "* [src.name] - [pr_energy_relay.active()?"Dea":"A"]ctivate" -/* proc/dynusepower(amount) - if(!equip_ready) //enabled - var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) - if(pow_chan) - A.master.use_power(amount*coeff, pow_chan) - return 1 - return chassis.dynusepower(amount)*/ - /datum/global_iterator/mecha_energy_relay process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER) @@ -835,11 +767,10 @@ name = "phoron generator" desc = "Generates power using solid phoron as fuel. Pollutes the environment." icon_state = "tesla" - origin_tech = "phorontech=2;powerstorage=2;engineering=1" + origin_tech = list(TECH_PHORON = 2, TECH_POWER = 2, TECH_ENGINEERING = 1) equip_cooldown = 10 energy_drain = 0 range = MELEE - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000) var/datum/global_iterator/pr_mech_generator var/coeff = 100 var/obj/item/stack/material/fuel @@ -847,7 +778,6 @@ var/fuel_per_cycle_idle = 100 var/fuel_per_cycle_active = 500 var/power_per_cycle = 20 - reliability = 1000 New() ..() @@ -954,10 +884,6 @@ EG.log_message("Deactivated - no fuel.") EG.set_ready_state(1) return 0 - if(anyprob(EG.reliability)) - EG.critfail() - stop() - return 0 var/cur_charge = EG.chassis.get_charge() if(isnull(cur_charge)) EG.set_ready_state(1) @@ -978,14 +904,12 @@ name = "\improper ExoNuclear reactor" desc = "Generates power using uranium. Pollutes the environment." icon_state = "tesla" - origin_tech = "powerstorage=3;engineering=3" - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000) + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3) max_fuel = 50000 fuel_per_cycle_idle = 10 fuel_per_cycle_active = 30 power_per_cycle = 50 var/rad_per_cycle = 0.3 - reliability = 1000 init() fuel = new /obj/item/stack/material/uranium(src) @@ -1005,7 +929,7 @@ if(istype(M,/mob/living/carbon/human)) M.apply_effect((EG.rad_per_cycle*3),IRRADIATE,0) else - M.radiation += EG.rad_per_cycle + M.apply_effect(EG.rad_per_cycle, IRRADIATE) return 1 @@ -1058,7 +982,7 @@ if(M.stat>1) return if(chassis.occupant.a_intent == I_HURT) chassis.occupant_message("You obliterate [target] with [src.name], leaving blood and guts everywhere.") - chassis.visible_message("[chassis] destroys [target] in an unholy fury.") + chassis.visible_message("[chassis] destroys [target] in an unholy fury.") if(chassis.occupant.a_intent == I_DISARM) chassis.occupant_message("You tear [target]'s limbs off with [src.name].") chassis.visible_message("[chassis] rips [target]'s arms off.") @@ -1075,11 +999,9 @@ name = "passenger compartment" desc = "A mountable passenger compartment for exo-suits. Rather cramped." icon_state = "mecha_abooster_ccw" - origin_tech = "engineering=1;biotech=1" + origin_tech = list(TECH_ENGINEERING = 1, TECH_BIO = 1) energy_drain = 10 range = MELEE - construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=5000) - reliability = 1000 equip_cooldown = 20 var/mob/living/carbon/occupant = null var/door_locked = 1 @@ -1165,7 +1087,6 @@ #define LOCKED 1 #define OCCUPIED 2 -#undefine /obj/mecha/proc/move_inside_passenger() set category = "Object" @@ -1218,3 +1139,6 @@ usr << "All of the passenger compartments are already occupied or locked!" if (0) usr << "\The [src] doesn't have a passenger compartment." + +#undef LOCKED +#undef OCCUPIED diff --git a/code/game/mecha/equipment/tools/unused_tools.dm b/code/game/mecha/equipment/tools/unused_tools.dm index 012d7979e1a..1b6d8c9e23d 100644 --- a/code/game/mecha/equipment/tools/unused_tools.dm +++ b/code/game/mecha/equipment/tools/unused_tools.dm @@ -85,8 +85,6 @@ return 0 if(energy_drain && !chassis.has_charge(energy_drain)) return 0 - if(crit_fail) - return 0 if(chassis.check_for_support()) return 0 return 1 diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index de4c60d1a3b..44789e26a28 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -1,7 +1,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon name = "mecha weapon" range = RANGED - origin_tech = "materials=3;combat=3" + origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3) var/projectile //Type of projectile fired. var/projectiles = 1 //Amount of projectiles loaded. var/projectiles_per_shot = 1 //Amount of projectiles fired per single shot. @@ -37,7 +37,7 @@ playsound(chassis, fire_sound, fire_volume, 1) projectiles-- var/P = new projectile(curloc) - Fire(P, target, aimloc) + Fire(P, target) if(fire_cooldown) sleep(fire_cooldown) if(auto_rearm) @@ -46,10 +46,10 @@ do_after_cooldown() return -/obj/item/mecha_parts/mecha_equipment/weapon/proc/Fire(atom/A, atom/target, turf/aimloc) +/obj/item/mecha_parts/mecha_equipment/weapon/proc/Fire(atom/A, atom/target) var/obj/item/projectile/P = A var/def_zone - if (chassis && istype(chassis.occupant, /mob/living/carbon/human)) + if(chassis && istype(chassis.occupant,/mob/living/carbon/human)) var/mob/living/carbon/human/H = chassis.occupant def_zone = H.zone_sel.selecting P.launch(target, def_zone) @@ -97,7 +97,7 @@ name = "eZ-13 mk2 heavy pulse rifle" icon_state = "mecha_pulse" energy_drain = 120 - origin_tech = "materials=3;combat=6;powerstorage=4" + origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 6, TECH_POWER = 4) projectile = /obj/item/projectile/beam/pulse/heavy fire_sound = 'sound/weapons/marauder.ogg' @@ -220,7 +220,7 @@ var/missile_speed = 2 var/missile_range = 30 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/Fire(atom/movable/AM, atom/target, turf/aimloc) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/Fire(atom/movable/AM, atom/target) AM.throw_at(target,missile_range, missile_speed, chassis) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive @@ -232,7 +232,7 @@ projectile_energy_cost = 1000 equip_cooldown = 60 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive/Fire(atom/movable/AM, atom/target, turf/aimloc) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive/Fire(atom/movable/AM, atom/target) var/obj/item/missile/M = AM M.primed = 1 ..() @@ -262,7 +262,7 @@ equip_cooldown = 60 var/det_time = 20 -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/Fire(atom/movable/AM, atom/target, turf/aimloc) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/Fire(atom/movable/AM, atom/target) ..() var/obj/item/weapon/grenade/flashbang/F = AM spawn(det_time) @@ -271,7 +271,6 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve name = "\improper SOP-6 grenade launcher" projectile = /obj/item/weapon/grenade/flashbang/clusterbang - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=6000,"uranium"=6000) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/get_equip_info()//Limited version of the clusterbang launcher that can't reload return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]\[[src.projectiles]\]" diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 615261bc5f9..cf50e695259 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -1,218 +1,98 @@ -/turf/simulated/floor/mech_bay_recharge_floor - name = "Mech Bay Recharge Station" +/obj/machinery/mech_recharger + name = "mech recharger" + desc = "A mech recharger, built into the floor." icon = 'icons/mecha/mech_bay.dmi' icon_state = "recharge_floor" - var/obj/machinery/mech_bay_recharge_port/recharge_port - var/obj/machinery/computer/mech_bay_power_console/recharge_console - var/obj/mecha/recharging_mecha = null + density = 0 + layer = TURF_LAYER + 0.1 -/turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha) - . = ..() - if(istype(mecha)) - mecha.occupant_message("Initializing power control devices.") - init_devices() - if(recharge_console && recharge_port) - recharging_mecha = mecha - recharge_console.mecha_in(mecha) - return - else if(!recharge_console) - mecha.occupant_message("Control console not found. Terminating.") - else if(!recharge_port) - mecha.occupant_message("Power port not found. Terminating.") - return + var/obj/mecha/charging = null + var/charge = 45 + var/repair = 0 -/turf/simulated/floor/mech_bay_recharge_floor/Exited(atom) - . = ..() - if(atom == recharging_mecha) - recharging_mecha = null - if(recharge_console) - recharge_console.mecha_out() - return - -/turf/simulated/floor/mech_bay_recharge_floor/proc/init_devices() - if(!recharge_console) - recharge_console = locate() in range(1,src) - if(!recharge_port) - recharge_port = locate() in get_step(src, WEST) - - if(recharge_console) - recharge_console.recharge_floor = src - if(recharge_port) - recharge_console.recharge_port = recharge_port - if(recharge_port) - recharge_port.recharge_floor = src - if(recharge_console) - recharge_port.recharge_console = recharge_console - return - -// temporary fix for broken icon until somebody gets around to make these player-buildable -/turf/simulated/floor/mech_bay_recharge_floor/attackby(obj/item/C as obj, mob/user as mob) +/obj/machinery/mech_recharger/New() ..() - if(floor_type) - icon_state = "recharge_floor" - else - icon_state = "support_lattice" + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/mech_recharger(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) -/obj/machinery/mech_bay_recharge_port - name = "Mech Bay Power Port" - density = 1 - anchored = 1 - icon = 'icons/mecha/mech_bay.dmi' - icon_state = "recharge_port" - var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor - var/obj/machinery/computer/mech_bay_power_console/recharge_console - var/datum/global_iterator/mech_bay_recharger/pr_recharger + RefreshParts() -/obj/machinery/mech_bay_recharge_port/New() +/obj/machinery/mech_recharger/Crossed(var/obj/mecha/M) + . = ..() + if(istype(M) && charging != M) + start_charging(M) + +/obj/machinery/mech_recharger/Uncrossed(var/obj/mecha/M) + . = ..() + if(M == charging) + stop_charging() + +/obj/machinery/mech_recharger/RefreshParts() ..() - pr_recharger = new /datum/global_iterator/mech_bay_recharger(null,0) - return + charge = 0 + repair = -5 + for(var/obj/item/weapon/stock_parts/P in component_parts) + if(istype(P, /obj/item/weapon/stock_parts/capacitor)) + charge += P.rating * 20 + if(istype(P, /obj/item/weapon/stock_parts/scanning_module)) + charge += P.rating * 5 + repair += P.rating + if(istype(P, /obj/item/weapon/stock_parts/manipulator)) + repair += P.rating * 2 -/obj/machinery/mech_bay_recharge_port/proc/start_charge(var/obj/mecha/recharging_mecha) - if(stat&(NOPOWER|BROKEN)) - recharging_mecha.occupant_message("Power port not responding. Terminating.") - return 0 - else - if(recharging_mecha.cell) - recharging_mecha.occupant_message("Now charging...") - pr_recharger.start(list(src,recharging_mecha)) - return 1 - else - return 0 - -/obj/machinery/mech_bay_recharge_port/proc/stop_charge() - if(recharge_console && !recharge_console.stat) - recharge_console.icon_state = initial(recharge_console.icon_state) - pr_recharger.stop() - return - -/obj/machinery/mech_bay_recharge_port/proc/active() - if(pr_recharger.active()) - return 1 - else - return 0 - -/obj/machinery/mech_bay_recharge_port/power_change() - if(powered()) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - stat |= NOPOWER - pr_recharger.stop() - return - -/obj/machinery/mech_bay_recharge_port/proc/set_voltage(new_voltage) - if(new_voltage && isnum(new_voltage)) - pr_recharger.max_charge = new_voltage - return 1 - else - return 0 - - -/datum/global_iterator/mech_bay_recharger - delay = 20 - var/max_charge = 45 - check_for_null = 0 //since port.stop_charge() must be called. The checks are made in process() - -/datum/global_iterator/mech_bay_recharger/process(var/obj/machinery/mech_bay_recharge_port/port, var/obj/mecha/mecha) - if(!port) - return 0 - if(mecha && mecha in port.recharge_floor) - if(!mecha.cell) - return - var/delta = min(max_charge, mecha.cell.maxcharge - mecha.cell.charge) - if(delta>0) - mecha.give_power(delta) - port.use_power(delta*150) - else - mecha.occupant_message("Fully charged.") - port.stop_charge() - else - port.stop_charge() - return - - -/obj/machinery/computer/mech_bay_power_console - name = "Mech Bay Power Control Console" - density = 1 - anchored = 1 - icon = 'icons/obj/computer.dmi' - icon_state = "recharge_comp" - light_color = "#a97faa" - circuit = "/obj/item/weapon/circuitboard/mech_bay_power_console" - var/autostart = 1 - var/voltage = 45 - var/turf/simulated/floor/mech_bay_recharge_floor/recharge_floor - var/obj/machinery/mech_bay_recharge_port/recharge_port - -/obj/machinery/computer/mech_bay_power_console/proc/mecha_in(var/obj/mecha/mecha) - if(stat&(NOPOWER|BROKEN)) - mecha.occupant_message("Control console not responding. Terminating...") +/obj/machinery/mech_recharger/process() + ..() + if(!charging) return - if(recharge_port && autostart) - var/answer = recharge_port.start_charge(mecha) - if(answer) - recharge_port.set_voltage(voltage) - src.icon_state = initial(src.icon_state)+"_on" - return - -/obj/machinery/computer/mech_bay_power_console/proc/mecha_out() - if(recharge_port) - recharge_port.stop_charge() - return - - -/obj/machinery/computer/mech_bay_power_console/power_change() - if(stat & BROKEN) - icon_state = initial(icon_state)+"_broken" - if(recharge_port) - recharge_port.stop_charge() - else if(powered()) - icon_state = initial(icon_state) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - icon_state = initial(icon_state)+"_nopower" - stat |= NOPOWER - if(recharge_port) - recharge_port.stop_charge() - -/obj/machinery/computer/mech_bay_power_console/set_broken() - icon_state = initial(icon_state)+"_broken" - stat |= BROKEN - if(recharge_port) - recharge_port.stop_charge() - -/obj/machinery/computer/mech_bay_power_console/attack_hand(mob/user as mob) - if(..()) + if(charging.loc != loc) // Could be qdel or teleport or something + stop_charging() return - if(!recharge_floor || !recharge_port) - var/turf/simulated/floor/mech_bay_recharge_floor/F = locate() in range(1,src) - if(F) - F.init_devices() - ui_interact(user) + var/done = 1 + if(charging.cell) + var/t = min(charge, charging.cell.maxcharge - charging.cell.charge) + if(t > 0) + charging.give_power(t) + use_power(t * 150) + done = 0 + else + charging.occupant_message("Fully charged.") + if(repair && charging.health < initial(charging.health)) + charging.health = min(charging.health + repair, initial(charging.health)) + if(charging.health == initial(charging.health)) + charging.occupant_message("Fully repaired.") -/obj/machinery/computer/mech_bay_power_console/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/list/data = list() - data["has_floor"] = recharge_floor - data["has_port"] = recharge_port - if(recharge_floor && recharge_floor.recharging_mecha && recharge_floor.recharging_mecha.cell) - data["has_mech"] = 1 - data["mecha_name"] = recharge_floor.recharging_mecha || "None" - data["mecha_charge"] = isnull(recharge_floor.recharging_mecha) ? 0 : recharge_floor.recharging_mecha.cell.charge - data["mecha_maxcharge"] = isnull(recharge_floor.recharging_mecha) ? 0 : recharge_floor.recharging_mecha.cell.maxcharge - data["mecha_charge_percentage"] = isnull(recharge_floor.recharging_mecha) ? 0 : round(recharge_floor.recharging_mecha.cell.percent()) - else - data["has_mech"] = 0 - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - 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, "mech_bay_console.tmpl", "Mech Bay Control Console", 500, 325) - // when the ui is first opened this is the data it will use - ui.set_initial_data(data) - // open the new ui window - ui.open() - // auto update every Master Controller tick - ui.set_auto_update(1) + else + done = 0 + if(done) + stop_charging() + return + +/obj/machinery/mech_recharger/attackby(var/obj/item/I, var/mob/user) + if(default_deconstruction_screwdriver(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + if(default_part_replacement(user, I)) + return + +/obj/machinery/mech_recharger/proc/start_charging(var/obj/mecha/M) + if(stat & (NOPOWER | BROKEN)) + M.occupant_message("Power port not responding. Terminating.") + + return + if(M.cell) + M.occupant_message("Now charging...") + charging = M + return + +/obj/machinery/mech_recharger/proc/stop_charging() + if(!charging) + + return + charging = null diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index ba5825a084e..9f737487029 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -1,148 +1,29 @@ -///////////////////////////// -///// Part Fabricator /////// -///////////////////////////// - /obj/machinery/mecha_part_fabricator icon = 'icons/obj/robotics.dmi' icon_state = "fab-idle" name = "Exosuit Fabricator" - desc = "Nothing is being built." + desc = "A machine used for construction of robotcs and mechas." density = 1 anchored = 1 use_power = 1 idle_power_usage = 20 active_power_usage = 5000 req_access = list(access_robotics) - var/current_manufacturer - var/time_coeff = 1.5 //can be upgraded with research - var/resource_coeff = 1.5 //can be upgraded with research - var/list/resources = list( - DEFAULT_WALL_MATERIAL=0, - "glass"=0, - "gold"=0, - "silver"=0, - "diamond"=0, - "phoron"=0, - "uranium"=0, - ) + + var/speed = 1 + var/mat_efficiency = 1 + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0) var/res_max_amount = 200000 + var/datum/research/files - var/id - var/sync = 0 - var/part_set - var/obj/being_built - var/list/queue = list() - var/processing_queue = 0 - var/screen = "main" - var/opened = 0 - var/temp - var/output_dir = SOUTH //the direction relative to the fabber at which completed parts appear. - var/list/part_sets = list( //set names must be unique - "Robot"=list( - /obj/item/robot_parts/robot_suit, - /obj/item/robot_parts/chest, - /obj/item/robot_parts/head, - /obj/item/robot_parts/l_arm, - /obj/item/robot_parts/r_arm, - /obj/item/robot_parts/l_leg, - /obj/item/robot_parts/r_leg, - /obj/item/robot_parts/robot_component/binary_communication_device, - /obj/item/robot_parts/robot_component/radio, - /obj/item/robot_parts/robot_component/actuator, - /obj/item/robot_parts/robot_component/diagnosis_unit, - /obj/item/robot_parts/robot_component/camera, - /obj/item/robot_parts/robot_component/armour - ), - "Ripley"=list( - /obj/item/mecha_parts/chassis/ripley, - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg - ), -// "Hoverpod"=list( -// /obj/structure/largecrate/hoverpod // Doesn't work, even with required vars. Why? - Gamerofthegame -// ), - "Odysseus"=list( - /obj/item/mecha_parts/chassis/odysseus, - /obj/item/mecha_parts/part/odysseus_torso, - /obj/item/mecha_parts/part/odysseus_head, - /obj/item/mecha_parts/part/odysseus_left_arm, - /obj/item/mecha_parts/part/odysseus_right_arm, - /obj/item/mecha_parts/part/odysseus_left_leg, - /obj/item/mecha_parts/part/odysseus_right_leg - ), - - "Gygax"=list( - /obj/item/mecha_parts/chassis/gygax, - /obj/item/mecha_parts/part/gygax_torso, - /obj/item/mecha_parts/part/gygax_head, - /obj/item/mecha_parts/part/gygax_left_arm, - /obj/item/mecha_parts/part/gygax_right_arm, - /obj/item/mecha_parts/part/gygax_left_leg, - /obj/item/mecha_parts/part/gygax_right_leg, - /obj/item/mecha_parts/part/gygax_armour - ), - "Durand"=list( - /obj/item/mecha_parts/chassis/durand, - /obj/item/mecha_parts/part/durand_torso, - /obj/item/mecha_parts/part/durand_head, - /obj/item/mecha_parts/part/durand_left_arm, - /obj/item/mecha_parts/part/durand_right_arm, - /obj/item/mecha_parts/part/durand_left_leg, - /obj/item/mecha_parts/part/durand_right_leg, - /obj/item/mecha_parts/part/durand_armour - ), - /*"H.O.N.K"=list( - /obj/item/mecha_parts/chassis/honker, - /obj/item/mecha_parts/part/honker_torso, - /obj/item/mecha_parts/part/honker_head, - /obj/item/mecha_parts/part/honker_left_arm, - /obj/item/mecha_parts/part/honker_right_arm, - /obj/item/mecha_parts/part/honker_left_leg, - /obj/item/mecha_parts/part/honker_right_leg - ), No need for HONK stuff*/ - "Exosuit Equipment"=list( - /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, - /obj/item/mecha_parts/mecha_equipment/tool/drill, - /obj/item/mecha_parts/mecha_equipment/tool/extinguisher, - /obj/item/mecha_parts/mecha_equipment/tool/cable_layer, - /obj/item/mecha_parts/mecha_equipment/tool/sleeper, - /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun, - /obj/item/mecha_parts/mecha_equipment/tool/passenger, - /obj/item/mecha_parts/chassis/firefighter, - ///obj/item/mecha_parts/mecha_equipment/repair_droid, - /obj/item/mecha_parts/mecha_equipment/generator, - ///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING - /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser, - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, - ///obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/mousetrap_mortar, HONK-related mech part - ///obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar, Also HONK-related - ///obj/item/mecha_parts/mecha_equipment/weapon/honker Thirdly HONK-related - ), - - "Robotic Upgrade Modules" = list( - /obj/item/borg/upgrade/reset, - /obj/item/borg/upgrade/rename, - /obj/item/borg/upgrade/restart, - /obj/item/borg/upgrade/vtec, - /obj/item/borg/upgrade/tasercooler, - /obj/item/robot_parts/robot_component/jetpack, - /obj/item/borg/upgrade/combat, - ), - - - "Hardsuit Modules" = list(), - - - - - "Misc"=list(/obj/item/mecha_parts/mecha_tracking) - ) - - + var/list/datum/design/queue = list() + var/progress = 0 + var/busy = 0 + var/list/categories = list() + var/category = null + var/manufacturer = null + var/sync_message = "" /obj/machinery/mecha_part_fabricator/New() ..() @@ -156,407 +37,57 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(src) RefreshParts() - // part_sets["Cyborg Upgrade Modules"] = typesof(/obj/item/borg/upgrade/) - /obj/item/borg/upgrade/ // Eh. This does it dymaically, but to support having the items referenced otherwhere in the code but not being constructable, going to do it manaully. - - for(var/part_set in part_sets) - convert_part_set(part_set) files = new /datum/research(src) //Setup the research data holder. - /* - if(!id) - for(var/obj/machinery/r_n_d/server/centcom/S in world) - S.initialize() - break - */ return /obj/machinery/mecha_part_fabricator/initialize() - current_manufacturer = basic_robolimb.company + manufacturer = basic_robolimb.company + update_categories() + +/obj/machinery/mecha_part_fabricator/process() + ..() + if(stat) + return + if(busy) + use_power = 2 + progress += speed + check_build() + else + use_power = 1 + update_icon() + +/obj/machinery/mecha_part_fabricator/update_icon() + overlays.Cut() + if(panel_open) + icon_state = "fab-o" + else + icon_state = "fab-idle" + if(busy) + overlays += "fab-active" + +/obj/machinery/mecha_part_fabricator/dismantle() + for(var/f in materials) + eject_materials(f, -1) + ..() /obj/machinery/mecha_part_fabricator/RefreshParts() - var/T = 0 + res_max_amount = 0 for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + res_max_amount += M.rating * 100000 // 200k -> 600k + var/T = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating - res_max_amount = (187500+(T * 37500)) - T = 0 - for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts) - T += Ma.rating - if(T >= 1) - T -= 1 - var/diff - diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/25,0.01) - if(resource_coeff!=diff) - resource_coeff = diff - T = 0 - for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts) - T += Ml.rating - if(T>= 1) - T -= 1 - diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/25,0.01) - if(time_coeff!=diff) - time_coeff = diff + mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5 + for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both + T += M.rating + speed = T / 2 // 1 -> 3 -/obj/machinery/mecha_part_fabricator/Destroy() - for(var/atom/A in src) - qdel(A) - ..() - return - -/obj/machinery/mecha_part_fabricator/proc/operation_allowed(mob/M) - if(isrobot(M) || isAI(M)) - return 1 - if(!istype(req_access) || !req_access.len) - return 1 - else if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - for(var/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(src.check_access(ID)) - return 1 - M << "You don't have required permissions to use [src]" - return 0 - - -/obj/machinery/mecha_part_fabricator/proc/emag() - sleep() - switch(emagged) - if(0) - emagged = 0.5 - src.visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"") - sleep(10) - src.visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"") - sleep(15) - src.visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") - sleep(30) - src.visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your Nanotrasen system operator for future assistance.\"") - req_access = null - emagged = 1 - if(0.5) - src.visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") - if(1) - src.visible_message("\icon[src] [src] beeps: \"No records in User DB\"") - return - -/obj/machinery/mecha_part_fabricator/proc/convert_part_set(set_name as text) - var/list/parts = part_sets[set_name] - if(istype(parts, /list)) - for(var/i=1;i<=parts.len;i++) - var/path = parts[i] - var/part = new path(src) - if(part) - parts[i] = part - //debug below - if(!istype(parts[i],/obj/item)) return 0 - return - - -/obj/machinery/mecha_part_fabricator/proc/add_part_set(set_name as text,parts=null) - if(set_name in part_sets)//attempt to create duplicate set - return 0 - if(isnull(parts)) - part_sets[set_name] = list() - else - part_sets[set_name] = parts - convert_part_set(set_name) - return 1 - -/obj/machinery/mecha_part_fabricator/proc/add_part_to_set(set_name as text,part) - if(!part) return 0 - src.add_part_set(set_name)//if no "set_name" set exists, create - var/list/part_set = part_sets[set_name] - var/atom/apart - if(ispath(part)) - apart = new part(src) - else - apart = part - if(!istype(apart)) return 0 - for(var/obj/O in part_set) - if(O.type == apart.type) - qdel(apart) - return 0 - part_set[++part_set.len] = apart - return 1 - -/obj/machinery/mecha_part_fabricator/proc/remove_part_set(set_name as text) - for(var/i=1,i<=part_sets.len,i++) - if(part_sets[i]==set_name) - part_sets.Cut(i,++i) - return -/* - proc/sanity_check() - for(var/p in resources) - var/index = resources.Find(p) - index = resources.Find(p, ++index) - if(index) //duplicate resource - world << "Duplicate resource definition for [src](\ref[src])" - return 0 - for(var/set_name in part_sets) - var/index = part_sets.Find(set_name) - index = part_sets.Find(set_name, ++index) - if(index) //duplicate part set - world << "Duplicate part set definition for [src](\ref[src])" - return 0 - return 1 -*/ -/* - New() - ..() - src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/gygax_armour","time"=600,"metal"=75000,"diamond"=10000)) - src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/ripley_left_arm","time"=200,"metal"=25000)) - src.remove_part_set("Gygax") +/obj/machinery/mecha_part_fabricator/attack_hand(var/mob/user) + if(..()) return -*/ - -/obj/machinery/mecha_part_fabricator/proc/output_parts_list(set_name) - var/output = "" - var/list/part_set = listgetindex(part_sets, set_name) - if(istype(part_set)) - for(var/obj/item/part in part_set) - var/resources_available = check_resources(part) - output += "
    [output_part_info(part)]
    \[[resources_available?"Build | ":null]Add to queue\]\[?\]
    " - return output - -/obj/machinery/mecha_part_fabricator/proc/output_part_info(var/obj/item/part) - var/output = "[part.name] (Cost: [output_part_cost(part)]) [get_construction_time_w_coeff(part)/10]sec" - return output - -/obj/machinery/mecha_part_fabricator/proc/output_part_cost(var/obj/item/part) - var/i = 0 - var/output - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))//The most efficient way to go about this. Not all objects have these vars, but if they don't then they CANNOT be made by the mech fab. Doing it this way reduces a major amount of typecasting and switches, while cutting down maintenece for them as well -Sieve - for(var/c in part:construction_cost)//The check should ensure that anything without the var doesn't make it to this point - if(c in resources) - output += "[i?" | ":null][get_resource_cost_w_coeff(part,c)] [c]" - i++ - return output - else - return 0 - -/obj/machinery/mecha_part_fabricator/proc/output_available_resources() - var/output - for(var/resource in resources) - var/amount = min(res_max_amount, resources[resource]) - output += "[resource]: [amount] cm³" - if(amount>0) - output += " - Remove \[1\] | \[10\] | \[All\]" - output += "
    " - return output - -/obj/machinery/mecha_part_fabricator/proc/remove_resources(var/obj/item/part) -//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - for(var/resource in part:construction_cost) - if(resource in src.resources) - src.resources[resource] -= get_resource_cost_w_coeff(part,resource) - else + if(!allowed(user)) return - -/obj/machinery/mecha_part_fabricator/proc/check_resources(var/obj/item/part) -// if(istype(part, /obj/item/robot_parts) || istype(part, /obj/item/mecha_parts) || istype(part,/obj/item/borg/upgrade)) -//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - for(var/resource in part:construction_cost) - if(resource in src.resources) - if(src.resources[resource] < get_resource_cost_w_coeff(part,resource)) - return 0 - return 1 - else - return 0 - -/obj/machinery/mecha_part_fabricator/proc/build_part(var/obj/item/part) - if(!part) return - - // critical exploit prevention, do not remove unless you replace it -walter0o - if( !(locate(part, src.contents)) || !(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator - return - - if(current_manufacturer) - src.being_built = new part.type(src, current_manufacturer) - else - src.being_built = new part.type(src, basic_robolimb.company) - - src.desc = "It's building [src.being_built]." - src.remove_resources(part) - src.overlays += "fab-active" - src.use_power = 2 - src.updateUsrDialog() - sleep(get_construction_time_w_coeff(part)) - src.use_power = 1 - src.overlays -= "fab-active" - src.desc = initial(src.desc) - if(being_built) - src.being_built.Move(get_step(src,output_dir)) - src.visible_message("\icon[src] [src] beeps, \"The following has been completed: [src.being_built] is built\".") - being_built.Created() - src.being_built = null - src.updateUsrDialog() - return 1 - -/obj/machinery/mecha_part_fabricator/proc/update_queue_on_page() - send_byjax(usr,"mecha_fabricator.browser","queue",src.list_queue()) - return - -/obj/machinery/mecha_part_fabricator/proc/add_part_set_to_queue(set_name) - if(set_name in part_sets) - var/list/part_set = part_sets[set_name] - if(islist(part_set)) - for(var/obj/item/part in part_set) - add_to_queue(part) - return - -/obj/machinery/mecha_part_fabricator/proc/add_to_queue(part) - if(!istype(queue)) - queue = list() - if(part) - queue[++queue.len] = part - return queue.len - -/obj/machinery/mecha_part_fabricator/proc/remove_from_queue(index) - if(!isnum(index) || !istype(queue) || (index<1 || index>queue.len)) - return 0 - queue.Cut(index,++index) - return 1 - -/obj/machinery/mecha_part_fabricator/proc/process_queue() - var/obj/item/part = listgetindex(src.queue, 1) - if(!part) - remove_from_queue(1) - if(src.queue.len) - return process_queue() - else - return - if(!(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")))//If it shouldn't be printed - remove_from_queue(1)//Take it out of the quene - return process_queue()//Then reprocess it - temp = null - while(part) - if(stat&(NOPOWER|BROKEN)) - return 0 - if(!check_resources(part)) - src.visible_message("\icon[src] [src] beeps, \"Not enough resources. Queue processing stopped\".") - temp = {"Not enough resources to build next part.
    - Try again | Return"} - return 0 - remove_from_queue(1) - build_part(part) - part = listgetindex(src.queue, 1) - src.visible_message("\icon[src] [src] beeps, \"Queue processing finished successfully\".") - return 1 - -/obj/machinery/mecha_part_fabricator/proc/list_queue() - var/output = "Queue contains:" - if(!istype(queue) || !queue.len) - output += "
    Nothing" - else - output += "
      " - for(var/i=1;i<=queue.len;i++) - var/obj/item/part = listgetindex(src.queue, i) - if(istype(part)) - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - output += "[part.name] - [i>1?"":null] [i↓":null] Remove" - else//Prevents junk items from even appearing in the list, and they will be silently removed when the fab processes - remove_from_queue(i)//Trash it - return list_queue()//Rebuild it - output += "
    " - output += "\[Process queue | Clear queue\]" - return output - -/obj/machinery/mecha_part_fabricator/proc/convert_designs() - if(!files) return - var/i = 0 - for(var/datum/design/D in files.known_designs) - if(D.build_type&16) - if(D.category in part_sets)//Checks if it's a valid category - if(add_part_to_set(D.category, D.build_path))//Adds it to said category - i++ - else - if(add_part_to_set("Misc", D.build_path))//If in doubt, chunk it into the Misc - i++ - return i - -/obj/machinery/mecha_part_fabricator/proc/update_tech() - if(!files) return - var/output - for(var/datum/tech/T in files.known_tech) - if(T && T.level > 1) - var/diff - switch(T.id) //bad, bad formulas - if("materials") - var/pmat = 0//Calculations to make up for the fact that these parts and tech modify the same thing - for(var/obj/item/weapon/stock_parts/micro_laser/Ml in component_parts) - pmat += Ml.rating - if(pmat >= 1) - pmat -= 1//So the equations don't have to be reworked, upgrading a single part from T1 to T2 is == to 1 tech level - diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T.level+pmat))/25,0.01) - if(resource_coeff!=diff) - resource_coeff = diff - output+="Production efficiency increased.
    " - if("programming") - var/ptime = 0 - for(var/obj/item/weapon/stock_parts/manipulator/Ma in component_parts) - ptime += Ma.rating - if(ptime >= 2) - ptime -= 2 - diff = round(initial(time_coeff) - (initial(time_coeff)*(T.level+ptime))/25,0.1) - if(time_coeff!=diff) - time_coeff = diff - output+="Production routines updated.
    " - return output - - -/obj/machinery/mecha_part_fabricator/proc/sync(silent=null) -/* if(queue.len) - if(!silent) - temp = "Error. Please clear processing queue before updating!" - src.updateUsrDialog() - return -*/ - if(!silent) - temp = "Updating local R&D database..." - src.updateUsrDialog() - sleep(30) //only sleep if called by user - var/found = 0 - for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src))) - if(!RDC.sync) - continue - found++ - for(var/datum/tech/T in RDC.files.known_tech) - files.AddTech2Known(T) - for(var/datum/design/D in RDC.files.known_designs) - files.AddDesign2Known(D) - files.RefreshResearch() - var/i = src.convert_designs() - var/tech_output = update_tech() - if(!silent) - temp = "Processed [i] equipment designs.
    " - temp += tech_output - temp += "Return" - src.updateUsrDialog() - if(i || tech_output) - src.visible_message("\icon[src] [src] beeps, \"Successfully synchronized with R&D server. New data processed.\"") - if(found == 0) - temp = "Couldn't contact R&D server.
    " - temp += "Return" - src.updateUsrDialog() - src.visible_message("\icon[src] [src] beeps, \"Error! Couldn't connect to R&D server.\"") - return - -/obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(var/obj/item/part as obj,var/resource as text, var/roundto=1) -//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - return round(part:construction_cost[resource]*resource_coeff, roundto) - else - return 0 - -/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(var/obj/item/part as obj, var/roundto=1) -//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - return round(part:construction_time*time_coeff, roundto) - else - return 0 - - -/obj/machinery/mecha_part_fabricator/attack_hand(mob/user as mob) - var/dat, left_part - if(istype(user, /mob/living/carbon/human)) + if(ishuman(user)) var/mob/living/carbon/human/M = user if(M.h_style == "Floorlength Braid" || M.h_style == "Very Long Hair") if(prob(10)) @@ -564,260 +95,79 @@ M.apply_damage(45, HALLOSS) M.visible_message("\red [user]'s hair catches in the [src]!", "\red Your hair gets caught in the [src]!") M.say("*scream") - if (..()) - return - if(!operation_allowed(user)) - return - user.set_machine(src) - var/turf/exit = get_step(src,SOUTH) - if(exit.density) - src.visible_message("\icon[src] [src] beeps, \"Error! Part outlet is obstructed\".") - return - if(temp) - left_part = temp - else if(src.being_built) - left_part = {"Building [src.being_built.name].
    - Please wait until completion...
    "} - else - switch(screen) - if("main") - left_part = output_available_resources()+"
    " - left_part += "Sync with R&D servers | Set manufacturer ([current_manufacturer])
    " - for(var/part_set in part_sets) - left_part += "[part_set] - \[Add all parts to queue\]
    " - if("parts") - left_part += output_parts_list(part_set) - left_part += "
    Return" - dat = {" - - [src.name] - - - - - - - - - -
    - [left_part] - - [list_queue()] -
    - - "} - user << browse(dat, "window=mecha_fabricator;size=1000x400") - onclose(user, "mecha_fabricator") - return + ui_interact(user) -/obj/machinery/mecha_part_fabricator/proc/exploit_prevention(var/obj/Part, mob/user as mob, var/desc_exploit) -// critical exploit prevention, feel free to improve or replace this, but do not remove it -walter0o +/obj/machinery/mecha_part_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] - if(!Part || !user || !istype(Part) || !istype(user)) // sanity - return 1 + var/datum/design/current = queue.len ? queue[1] : null + if(current) + data["current"] = current.name + data["queue"] = get_queue_names() + data["buildable"] = get_build_options() + data["category"] = category + data["categories"] = categories + if(all_robolimbs) + var/list/T = list() + for(var/A in all_robolimbs) + var/datum/robolimb/R = all_robolimbs[A] + T += list(list("id" = A, "company" = R.company)) + data["manufacturers"] = T + data["manufacturer"] = manufacturer + data["materials"] = get_materials() + data["maxres"] = res_max_amount + data["sync"] = sync_message + if(current) + data["builtperc"] = round((progress / current.time) * 100) - if( !(locate(Part, src.contents)) || !(Part.vars.Find("construction_time")) || !(Part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator - - var/turf/LOC = get_turf(user) - message_admins("[key_name_admin(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] ! ([LOC ? "JMP" : "null"])", 0) - log_admin("EXPLOIT : [key_name(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] !") - return 1 - - return null + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) /obj/machinery/mecha_part_fabricator/Topic(href, href_list) - - if(..()) // critical exploit prevention, do not remove unless you replace it -walter0o + if(..()) return - var/datum/topic_input/filter = new /datum/topic_input(href,href_list) - if(href_list["set_manufacturer"]) - var/choice = input(usr, "Which manufacturer do you wish to use for this fabricator?") as null|anything in all_robolimbs - if(choice) current_manufacturer = choice - if(href_list["part_set"]) - var/tpart_set = filter.getStr("part_set") - if(tpart_set) - if(tpart_set=="clear") - src.part_set = null - else - src.part_set = tpart_set - screen = "parts" - if(href_list["part"]) - var/obj/part = filter.getObj("part") + if(href_list["build"]) + add_to_queue(text2num(href_list["build"])) - // critical exploit prevention, do not remove unless you replace it -walter0o - if(src.exploit_prevention(part, usr)) - return + if(href_list["remove"]) + remove_from_queue(text2num(href_list["remove"])) - if(!processing_queue) - build_part(part) - else - add_to_queue(part) - if(href_list["add_to_queue"]) - var/obj/part = filter.getObj("add_to_queue") + if(href_list["category"]) + if(href_list["category"] in categories) + category = href_list["category"] - // critical exploit prevention, do not remove unless you replace it -walter0o - if(src.exploit_prevention(part, usr)) - return + if(href_list["manufacturer"]) + if(href_list["manufacturer"] in all_robolimbs) + manufacturer = href_list["manufacturer"] - add_to_queue(part) + if(href_list["eject"]) + eject_materials(href_list["eject"], text2num(href_list["amount"])) - return update_queue_on_page() - if(href_list["remove_from_queue"]) - remove_from_queue(filter.getNum("remove_from_queue")) - return update_queue_on_page() - if(href_list["partset_to_queue"]) - add_part_set_to_queue(filter.get("partset_to_queue")) - return update_queue_on_page() - if(href_list["process_queue"]) - spawn(-1) - if(processing_queue || being_built) - return 0 - processing_queue = 1 - process_queue() - processing_queue = 0 -/* - if(href_list["list_queue"]) - list_queue() -*/ - if(href_list["clear_temp"]) - temp = null - if(href_list["screen"]) - src.screen = href_list["screen"] - if(href_list["queue_move"] && href_list["index"]) - var/index = filter.getNum("index") - var/new_index = index + filter.getNum("queue_move") - if(isnum(index) && isnum(new_index)) - if(InRange(new_index,1,queue.len)) - queue.Swap(index,new_index) - return update_queue_on_page() - if(href_list["clear_queue"]) - queue = list() - return update_queue_on_page() if(href_list["sync"]) - queue = list() - src.sync() - return update_queue_on_page() - if(href_list["part_desc"]) - var/obj/part = filter.getObj("part_desc") - - // critical exploit prevention, do not remove unless you replace it -walter0o - if(src.exploit_prevention(part, usr, 1)) - return - - if(part) - temp = {"

    [part] description:

    - [part.desc]
    - Return - "} - if(href_list["remove_mat"] && href_list["material"]) - temp = "Ejected [remove_material(href_list["material"],text2num(href_list["remove_mat"]))] of [href_list["material"]]
    Return" - src.updateUsrDialog() - return - -/obj/machinery/mecha_part_fabricator/proc/remove_material(var/mat_string, var/amount) - var/type - switch(mat_string) - if(DEFAULT_WALL_MATERIAL) - type = /obj/item/stack/material/steel - if("glass") - type = /obj/item/stack/material/glass - if("gold") - type = /obj/item/stack/material/gold - if("silver") - type = /obj/item/stack/material/silver - if("diamond") - type = /obj/item/stack/material/diamond - if("phoron") - type = /obj/item/stack/material/phoron - if("uranium") - type = /obj/item/stack/material/uranium - else - return 0 - var/result = 0 - var/obj/item/stack/material/res = new type(src) - - // amount available to take out - var/total_amount = round(resources[mat_string]/res.perunit) - - // number of stacks we're going to take out - res.amount = round(min(total_amount,amount)) - - if(res.amount>0) - resources[mat_string] -= res.amount*res.perunit - res.Move(src.loc) - result = res.amount + sync() else - qdel(res) - return result + sync_message = "" + return 1 -/obj/machinery/mecha_part_fabricator/attackby(obj/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/screwdriver)) - if (!opened) - opened = 1 - icon_state = "fab-o" - user << "You open the maintenance hatch of [src]." - else - opened = 0 - icon_state = "fab-idle" - user << "You close the maintenance hatch of [src]." +/obj/machinery/mecha_part_fabricator/attackby(var/obj/item/I, var/mob/user) + if(busy) + user << "\The [src] is busy. Please wait for completion of previous operation." + return 1 + if(default_deconstruction_screwdriver(user, I)) return - if (opened) - if(istype(W, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) - M.state = 2 - M.icon_state = "box_1" - for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 - I.loc = src.loc - if(src.resources[DEFAULT_WALL_MATERIAL] >= 3750) - var/obj/item/stack/material/steel/G = new /obj/item/stack/material/steel(src.loc) - G.amount = round(src.resources[DEFAULT_WALL_MATERIAL] / G.perunit) - if(src.resources["glass"] >= 3750) - var/obj/item/stack/material/glass/G = new /obj/item/stack/material/glass(src.loc) - G.amount = round(src.resources["glass"] / G.perunit) - if(src.resources["phoron"] >= 2000) - var/obj/item/stack/material/phoron/G = new /obj/item/stack/material/phoron(src.loc) - G.amount = round(src.resources["phoron"] / G.perunit) - if(src.resources["silver"] >= 2000) - var/obj/item/stack/material/silver/G = new /obj/item/stack/material/silver(src.loc) - G.amount = round(src.resources["silver"] / G.perunit) - if(src.resources["gold"] >= 2000) - var/obj/item/stack/material/gold/G = new /obj/item/stack/material/gold(src.loc) - G.amount = round(src.resources["gold"] / G.perunit) - if(src.resources["uranium"] >= 2000) - var/obj/item/stack/material/uranium/G = new /obj/item/stack/material/uranium(src.loc) - G.amount = round(src.resources["uranium"] / G.perunit) - if(src.resources["diamond"] >= 2000) - var/obj/item/stack/material/diamond/G = new /obj/item/stack/material/diamond(src.loc) - G.amount = round(src.resources["diamond"] / G.perunit) - qdel(src) - return 1 - else - user << "\red You can't load the [src.name] while it's opened." - return 1 - - if(istype(W, /obj/item/weapon/card/emag)) - emag() + if(default_deconstruction_crowbar(user, I)) + return + if(default_part_replacement(user, I)) return var/material - switch(W.type) + switch(I.type) if(/obj/item/stack/material/gold) material = "gold" if(/obj/item/stack/material/silver) @@ -835,33 +185,24 @@ else return ..() - if(src.being_built) - user << "The fabricator is currently processing. Please wait until completion." - return - - var/obj/item/stack/material/stack = W - + var/obj/item/stack/material/stack = I var/sname = "[stack.name]" var/amnt = stack.perunit - if(src.resources[material] < res_max_amount) + + if(materials[material] + amnt <= res_max_amount) if(stack && stack.amount >= 1) var/count = 0 - src.overlays += "fab-load-[material]"//loading animation is now an overlay based on material type. No more spontaneous conversion of all ores to metal. -vey - sleep(10) - - while(src.resources[material] < res_max_amount && stack.amount >= 1) - src.resources[material] += amnt + overlays += "fab-load-metal" + spawn(10) + overlays -= "fab-load-metal" + while(materials[material] + amnt <= res_max_amount && stack.amount >= 1) + materials[material] += amnt stack.use(1) count++ - src.overlays -= "fab-load-[material]" user << "You insert [count] [sname] into the fabricator." - src.updateUsrDialog() - else - user << "The fabricator can only accept full sheets of [sname]." - return + update_busy() else user << "The fabricator cannot hold more [sname]." - return /obj/machinery/mecha_part_fabricator/MouseDrop_T(mob/living/carbon/human/target as mob, mob/user as mob) if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) @@ -901,3 +242,153 @@ target.say("*scream") spawn(10) user.visible_message("\red [user] stops the [src] and leaves [target] resting as they are.", "\red You turn the [src] off and let go of [target].") + +/obj/machinery/mecha_part_fabricator/emag_act(var/remaining_charges, var/mob/user) + switch(emagged) + if(0) + emagged = 0.5 + visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"") + sleep(10) + visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"") + sleep(15) + visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") + sleep(30) + visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your [company_name] system operator for future assistance.\"") + req_access = null + emagged = 1 + return 1 + if(0.5) + visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") + if(1) + visible_message("\icon[src] [src] beeps: \"No records in User DB\"") + +/obj/machinery/mecha_part_fabricator/proc/update_busy() + if(queue.len) + if(can_build(queue[1])) + busy = 1 + else + busy = 0 + else + busy = 0 + +/obj/machinery/mecha_part_fabricator/proc/add_to_queue(var/index) + var/datum/design/D = files.known_designs[index] + queue += D + update_busy() + +/obj/machinery/mecha_part_fabricator/proc/remove_from_queue(var/index) + if(index == 1) + progress = 0 + queue.Cut(index, index + 1) + update_busy() + +/obj/machinery/mecha_part_fabricator/proc/can_build(var/datum/design/D) + for(var/M in D.materials) + if(materials[M] < D.materials[M]) + return 0 + return 1 + +/obj/machinery/mecha_part_fabricator/proc/check_build() + if(!queue.len) + progress = 0 + return + var/datum/design/D = queue[1] + if(!can_build(D)) + progress = 0 + return + if(D.time > progress) + return + for(var/M in D.materials) + materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency) + if(D.build_path) + var/obj/new_item = D.Fabricate(loc, src) + visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.") + if(mat_efficiency != 1) + if(new_item.matter && new_item.matter.len > 0) + for(var/i in new_item.matter) + new_item.matter[i] = new_item.matter[i] * mat_efficiency + remove_from_queue(1) + +/obj/machinery/mecha_part_fabricator/proc/get_queue_names() + . = list() + for(var/i = 2 to queue.len) + var/datum/design/D = queue[i] + . += D.name + +/obj/machinery/mecha_part_fabricator/proc/get_build_options() + . = list() + for(var/i = 1 to files.known_designs.len) + var/datum/design/D = files.known_designs[i] + if(!D.build_path || !(D.build_type & MECHFAB)) + continue + . += list(list("name" = D.name, "id" = i, "category" = D.category, "resourses" = get_design_resourses(D), "time" = get_design_time(D))) + +/obj/machinery/mecha_part_fabricator/proc/get_design_resourses(var/datum/design/D) + var/list/F = list() + for(var/T in D.materials) + F += "[capitalize(T)]: [D.materials[T] * mat_efficiency]" + return english_list(F, and_text = ", ") + +/obj/machinery/mecha_part_fabricator/proc/get_design_time(var/datum/design/D) + return time2text(round(10 * D.time / speed), "mm:ss") + +/obj/machinery/mecha_part_fabricator/proc/update_categories() + categories = list() + for(var/datum/design/D in files.known_designs) + if(!D.build_path || !(D.build_type & MECHFAB)) + continue + categories |= D.category + if(!category || !(category in categories)) + category = categories[1] + +/obj/machinery/mecha_part_fabricator/proc/get_materials() + . = list() + for(var/T in materials) + . += list(list("mat" = capitalize(T), "amt" = materials[T])) + +/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything + var/recursive = amount == -1 ? 1 : 0 + material = lowertext(material) + var/mattype + switch(material) + if(DEFAULT_WALL_MATERIAL) + mattype = /obj/item/stack/material/steel + if("glass") + mattype = /obj/item/stack/material/glass + if("gold") + mattype = /obj/item/stack/material/gold + if("silver") + mattype = /obj/item/stack/material/silver + if("diamond") + mattype = /obj/item/stack/material/diamond + if("phoron") + mattype = /obj/item/stack/material/phoron + if("uranium") + mattype = /obj/item/stack/material/uranium + else + return + var/obj/item/stack/material/S = new mattype(loc) + if(amount <= 0) + amount = S.max_amount + var/ejected = min(round(materials[material] / S.perunit), amount) + S.amount = min(ejected, amount) + if(S.amount <= 0) + qdel(S) + return + materials[material] -= ejected * S.perunit + if(recursive && materials[material] >= S.perunit) + eject_materials(material, -1) + update_busy() + +/obj/machinery/mecha_part_fabricator/proc/sync() + sync_message = "Error: no console found." + for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src))) + if(!RDC.sync) + continue + for(var/datum/tech/T in RDC.files.known_tech) + files.AddTech2Known(T) + for(var/datum/design/D in RDC.files.known_designs) + files.AddDesign2Known(D) + files.RefreshResearch() + sync_message = "Sync complete." + update_categories() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 4dbc871cc98..a76d28778b0 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -32,7 +32,15 @@ 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. + var/deflect_chance = 10 //chance to deflect incoming projectiles, hits, or lesser the effect of ex_act. + var/r_deflect_coeff = 1 + var/m_deflect_coeff = 1 + //ranged and melee damage multipliers + var/r_damage_coeff = 1 + var/m_damage_coeff = 1 + var/rhit_power_use = 0 + var/mhit_power_use = 0 + //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 @@ -42,7 +50,6 @@ 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 @@ -100,9 +107,7 @@ icon_state += "-open" add_radio() add_cabin() - if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP - removeVerb(/obj/mecha/verb/connect_to_port) - removeVerb(/obj/mecha/verb/toggle_internal_tank) + add_airtank() //All mecha currently have airtanks. No need to check unless changes are made. spark_system.set_up(2, 0, src) spark_system.attach(src) add_cell() @@ -132,7 +137,6 @@ 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() @@ -183,15 +187,8 @@ internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) return internal_tank -/obj/mecha/proc/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.name = "high-capacity power cell" - cell.charge = 15000 - cell.maxcharge = 15000 +/obj/mecha/proc/add_cell() + cell = new /obj/item/weapon/cell/mecha(src) /obj/mecha/proc/add_cabin() cabin_air = new @@ -209,7 +206,7 @@ /obj/mecha/proc/add_iterators() pr_int_temp_processor = new /datum/global_iterator/mecha_preserve_temp(list(src)) - pr_inertial_movement = new /datum/global_iterator/mecha_intertial_movement(null,0) + pr_inertial_movement = new /datum/global_iterator/mecha_inertial_movement(null,0) pr_give_air = new /datum/global_iterator/mecha_tank_give_air(list(src)) pr_internal_damage = new /datum/global_iterator/mecha_internal_damage(list(src),0) pr_manage_warnings = new /datum/global_iterator/mecha_manage_warnings(list(src)) @@ -269,12 +266,6 @@ radio.talk_into(M, text) return -/obj/mecha/see_emote(mob/living/M, text) - if(occupant && occupant.client) - var/rendered = "[text]" - occupant.show_message(rendered, 2) - ..() - //////////////////////////// ///// Action processing //// //////////////////////////// @@ -305,12 +296,12 @@ if(!src.occupant || src.occupant != user ) return if(user.stat) return if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect.") return if(!get_charge()) return if(src == target) return var/dir_to_target = get_dir(src,target) - if(dir_to_target && !(dir_to_target & src.dir))//wrong direction + if(dir_to_target && !(dir_to_target & src.dir)) return if(hasInternalDamage(MECHA_INT_CONTROL_LOST)) target = safepick(view(3,target)) @@ -376,18 +367,15 @@ return 0 if(connected_port) if(world.time - last_message > 20) - src.occupant_message("Unable to move while connected to the air system port") + src.occupant_message("Unable to move while connected to the air system port.") last_message = world.time return 0 if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect.") return - return domove(direction) + return do_move(direction) -/obj/mecha/proc/domove(direction) - return call((proc_res["dyndomove"]||src), "dyndomove")(direction) - -/obj/mecha/proc/dyndomove(direction) +/obj/mecha/proc/do_move(direction) if(!can_move) return 0 if(src.pr_inertial_movement.active()) @@ -503,21 +491,74 @@ /obj/mecha/proc/take_damage(amount, type="brute") if(amount) - var/damage = absorbDamage(amount,type) + var/damage = absorb_damage(amount,type) health -= damage update_health() log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1) return -/obj/mecha/proc/absorbDamage(damage,damage_type) - return call((proc_res["dynabsorbdamage"]||src), "dynabsorbdamage")(damage,damage_type) - -/obj/mecha/proc/dynabsorbdamage(damage,damage_type) +/obj/mecha/proc/absorb_damage(damage,damage_type) return damage*(listgetindex(damage_absorption,damage_type) || 1) +/obj/mecha/proc/hit_damage(damage, type="brute", is_melee=0) + + var/power_to_use + var/damage_coeff_to_use + + if(is_melee) + power_to_use = mhit_power_use + damage_coeff_to_use = m_damage_coeff + else + power_to_use = rhit_power_use + damage_coeff_to_use = r_damage_coeff + + if(power_to_use && use_power(power_to_use)) + take_damage(round(damage*damage_coeff_to_use), type) + start_booster_cooldown(is_melee) + return + else + start_booster_cooldown(is_melee) + take_damage(round(damage*damage_coeff_to_use), type) + + return + +/obj/mecha/proc/deflect_hit(is_melee=0) + + var/power_to_use + var/deflect_coeff_to_use + + if(is_melee) + power_to_use = mhit_power_use + deflect_coeff_to_use = m_damage_coeff + else + power_to_use = rhit_power_use + deflect_coeff_to_use = r_damage_coeff + + if(power_to_use) + if(prob(src.deflect_chance*deflect_coeff_to_use)) + use_power(power_to_use) + start_booster_cooldown(is_melee) + return 1 + else + return 0 + + else + start_booster_cooldown(is_melee) + if(prob(src.deflect_chance*deflect_coeff_to_use)) + return 1 + + return 0 + +/obj/mecha/proc/start_booster_cooldown(is_melee) + + for(var/obj/item/mecha_parts/mecha_equipment/armor_booster/B in equipment) //Ideally this would be done by the armor booster itself; attempts weren't great for performance. + if(B.melee == is_melee && B.equip_ready) + B.set_ready_state(0) + B.do_after_cooldown() + /obj/mecha/airlock_crush(var/crush_damage) ..() - take_damage(crush_damage) + hit_damage(crush_damage, is_melee=1) check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return 1 @@ -534,24 +575,24 @@ if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(H.species.can_shred(user)) - if(!prob(src.deflect_chance)) - src.take_damage(15) + if(!deflect_hit(is_melee=1)) + src.hit_damage(damage=15, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - user << "\red You slash at the armored suit!" - visible_message("\red The [user] slashes at [src.name]'s armor!") + user << "You slash at the armored suit!" + visible_message("\The [user] slashes at [src.name]'s armor!") else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - user << "\green Your claws had no effect!" - src.occupant_message("\blue The [user]'s claws are stopped by the armor.") - visible_message("\blue The [user] rebounds off [src.name]'s armor!") + user << "Your claws had no effect!" + src.occupant_message("\The [user]'s claws are stopped by the armor.") + visible_message("\The [user] rebounds off [src.name]'s armor!") else - user.visible_message("[user] hits [src.name]. Nothing happens","You hit [src.name] with no visible effect.") + user.visible_message("\The [user] hits \the [src]. Nothing happensm","You hit \the [src] with no visible effect.") src.log_append_to_last("Armor saved.") return - else if ((HULK in user.mutations) && !prob(src.deflect_chance)) - src.take_damage(15) + else if ((HULK in user.mutations) && !deflect_hit(is_melee=1)) + src.hit_damage(damage=15, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") else @@ -559,20 +600,16 @@ src.log_append_to_last("Armor saved.") return -/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper +/obj/mecha/hitby(atom/movable/A as mob|obj) ..() src.log_message("Hit by [A].",1) - call((proc_res["dynhitby"]||src), "dynhitby")(A) - return - -/obj/mecha/proc/dynhitby(atom/movable/A) if(istype(A, /obj/item/mecha_parts/mecha_tracking)) A.forceMove(src) src.visible_message("The [A] fastens firmly to [src].") return - if(prob(src.deflect_chance) || istype(A, /mob)) - src.occupant_message("\blue The [A] bounces off the armor.") - src.visible_message("The [A] bounces off the [src.name] armor") + if(deflect_hit(is_melee=0) || istype(A, /mob)) + src.occupant_message("\The [A] bounces off the armor.") + src.visible_message("\The [A] bounces off \the [src] armor.") src.log_append_to_last("Armor saved.") if(istype(A, /mob/living)) var/mob/living/M = A @@ -580,32 +617,26 @@ else if(istype(A, /obj)) var/obj/O = A if(O.throwforce) - src.take_damage(O.throwforce) + src.hit_damage(O.throwforce, is_melee=0) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return +/obj/mecha/bullet_act(var/obj/item/projectile/Proj) + if(Proj.damage_type == HALLOSS && !(src.r_deflect_coeff > 1)) + use_power(Proj.agony * 5) -/obj/mecha/bullet_act(var/obj/item/projectile/Proj) //wrapper src.log_message("Hit by projectile. Type: [Proj.name]([Proj.check_armour]).",1) - call((proc_res["dynbulletdamage"]||src), "dynbulletdamage")(Proj) //calls equipment - ..() - return - -/obj/mecha/proc/dynbulletdamage(var/obj/item/projectile/Proj) - if(prob(src.deflect_chance)) - src.occupant_message("\blue The armor deflects incoming projectile.") - src.visible_message("The [src.name] armor deflects the projectile") + if(deflect_hit(is_melee=0)) + src.occupant_message("The armor deflects incoming projectile.") + src.visible_message("The [src.name] armor deflects the projectile.") src.log_append_to_last("Armor saved.") return - if(Proj.damage_type == HALLOSS) - use_power(Proj.agony * 5) - if(!(Proj.nodamage)) var/ignore_threshold if(istype(Proj, /obj/item/projectile/beam/pulse)) ignore_threshold = 1 - src.take_damage(Proj.damage, Proj.check_armour) + src.hit_damage(Proj.damage, Proj.check_armour, is_melee=0) if(prob(25)) spark_system.start() 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),ignore_threshold) @@ -625,7 +656,8 @@ if(prob(15)) break //give a chance to exit early - Proj.on_hit(src) + Proj.on_hit(src) //on_hit just returns if it's argument is not a living mob so does this actually do anything? + ..() return /obj/mecha/ex_act(severity) @@ -657,25 +689,21 @@ src.take_damage(6) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1, -1) - user << "\red You smash at the armored suit!" + user << "You smash at the armored suit!" for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) - V.show_message("\red The [user] smashes against [src.name]'s armor!", 1) + V.show_message("\The [user] smashes against [src.name]'s armor!", 1) else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1, -1) - user << "\green Your attack had no effect!" - src.occupant_message("\blue The [user]'s attack is stopped by the armor.") + user << "Your attack had no effect!" + src.occupant_message("\The [user]'s attack is stopped by the armor.") for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) - V.show_message("\blue The [user] rebounds off the [src.name] armor!", 1) + V.show_message("\The [user] rebounds off the [src.name] armor!", 1) return */ -//TODO -/obj/mecha/meteorhit() - return ex_act(rand(1,3))//should do for now - /obj/mecha/emp_act(severity) if(get_charge()) use_power((6500)/severity) @@ -691,22 +719,6 @@ src.check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL)) return -/obj/mecha/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob) - src.log_message("Attacked by [W]. Attacker - [user]") - if(prob(src.deflect_chance)) - user << "\red \The [W] bounces off [src.name]." - src.log_append_to_last("Armor saved.") -/* - for (var/mob/V in viewers(src)) - if(V.client && !(V.blinded)) - V.show_message("The [W] bounces off [src.name] armor.", 1) -*/ - else - src.occupant_message("[user] hits [src] with [W].") - user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") - src.take_damage(W.force,W.damtype) - src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - return ////////////////////// ////// AttackBy ////// @@ -736,9 +748,9 @@ output_maintenance_dialog(id_card, user) return else - user << "\red Invalid ID: Access denied." + user << "Invalid ID: Access denied." else - user << "\red Maintenance protocols disabled by operator." + user << "Maintenance protocols disabled by operator." else if(istype(W, /obj/item/weapon/wrench)) if(state==1) state = 2 @@ -773,10 +785,10 @@ src.cell = null state = 4 user << "You unscrew and pry out the powercell." - src.log_message("Powercell removed") + src.log_message("Powercell removed.") else if(state==4 && src.cell) state=3 - user << "You screw the cell in place" + user << "You screw the cell in place." return else if(istype(W, /obj/item/device/multitool)) @@ -808,11 +820,13 @@ if (WT.remove_fuel(0,user)) if (hasInternalDamage(MECHA_INT_TANK_BREACH)) clearInternalDamage(MECHA_INT_TANK_BREACH) - user << "\blue You repair the damaged gas tank." + user << "You repair the damaged gas tank." + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) else return if(src.healthYou repair some damage to [src.name].
    " + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) src.health += min(10, initial(src.health)-src.health) else user << "The [src.name] is at full integrity" @@ -825,27 +839,19 @@ return else - call((proc_res["dynattackby"]||src), "dynattackby")(W,user) -/* src.log_message("Attacked by [W]. Attacker - [user]") - if(prob(src.deflect_chance)) - user << "\red The [W] bounces off [src.name] armor." + + if(deflect_hit(is_melee=1)) + user << "\The [W] bounces off [src.name]." src.log_append_to_last("Armor saved.") -/* - for (var/mob/V in viewers(src)) - if(V.client && !(V.blinded)) - V.show_message("The [W] bounces off [src.name] armor.", 1) -*/ else src.occupant_message("[user] hits [src] with [W].") user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") - src.take_damage(W.force,W.damtype) + src.hit_damage(W.force, W.damtype, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) -*/ + return - - /* /obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob) if(!istype(user, /mob/living/silicon/ai)) @@ -1116,12 +1122,12 @@ var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc if(possible_port) if(connect(possible_port)) - src.occupant_message("\blue [name] connects to the port.") + src.occupant_message("\The [name] connects to the port.") src.verbs += /obj/mecha/verb/disconnect_from_port src.verbs -= /obj/mecha/verb/connect_to_port return else - src.occupant_message("\red [name] failed to connect to the port.") + src.occupant_message("\The [name] failed to connect to the port.") return else src.occupant_message("Nothing happens") @@ -1136,11 +1142,11 @@ if(usr!=src.occupant) return if(disconnect()) - src.occupant_message("\blue [name] disconnects from the port.") + src.occupant_message("[name] disconnects from the port.") src.verbs -= /obj/mecha/verb/disconnect_from_port src.verbs += /obj/mecha/verb/connect_to_port else - src.occupant_message("\red [name] is not connected to the port at the moment.") + src.occupant_message("[name] is not connected to the port at the moment.") /obj/mecha/verb/toggle_lights() set name = "Toggle Lights" @@ -1185,15 +1191,15 @@ 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 if (src.occupant) - usr << "\blue The [src.name] is already occupied!" + usr << "The [src.name] is already occupied!" src.log_append_to_last("Permission denied.") return /* if (usr.abiotic()) - usr << "\blue Subject cannot have abiotic items on." + usr << "Subject cannot have abiotic items on." return */ var/passed @@ -1203,7 +1209,7 @@ else if(src.operation_allowed(usr)) passed = 1 if(!passed) - usr << "\red Access denied" + usr << "Access denied" src.log_append_to_last("Permission denied.") return for(var/mob/living/carbon/slime/M in range(1,usr)) @@ -1212,7 +1218,7 @@ return // usr << "You start climbing into [src.name]" - visible_message("\blue [usr] starts to climb into [src.name]") + visible_message("\The [usr] starts to climb into [src.name]") if(enter_after(40,usr)) if(!src.occupant) @@ -1444,7 +1450,7 @@ var/integrity = health/initial(health)*100 var/cell_charge = get_charge() var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None" - var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" + var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" //Results in type mismatch if there is no tank. var/cabin_pressure = round(return_pressure(),0.01) var/output = {"[report_internal_damage()] [integrity<30?"DAMAGE LEVEL CRITICAL
    ":null] @@ -1669,7 +1675,7 @@ if(href_list["rfreq"]) if(usr != src.occupant) return var/new_frequency = (radio.frequency + filter.getNum("rfreq")) - if (!radio.freerange || (radio.frequency < 1200 || radio.frequency > 1600)) + if ((radio.frequency < PUBLIC_LOW_FREQ || radio.frequency > PUBLIC_HIGH_FREQ)) new_frequency = sanitize_frequency(new_frequency) radio.set_frequency(new_frequency) send_byjax(src.occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]") @@ -1740,7 +1746,7 @@ passengers["[P.occupant]"] = P if (!passengers) - user << "\red There are no passengers to remove." + user << "There are no passengers to remove." return var/pname = input(user, "Choose a passenger to forcibly remove.", "Forcibly Remove Passenger") as null|anything in passengers @@ -1867,16 +1873,11 @@ return (get_charge()>=amount) /obj/mecha/proc/get_charge() - return call((proc_res["dyngetcharge"]||src), "dyngetcharge")() - -/obj/mecha/proc/dyngetcharge()//returns null if no powercell, else returns cell.charge - if(!src.cell) return + if(!src.cell) + return return max(0, src.cell.charge) /obj/mecha/proc/use_power(amount) - return call((proc_res["dynusepower"]||src), "dynusepower")(amount) - -/obj/mecha/proc/dynusepower(amount) if(get_charge()) cell.use(amount) return 1 @@ -1903,16 +1904,16 @@ src.log_message("Attacked. Attacker - [user].",1) user.do_attack_animation(src) - if(!prob(src.deflect_chance)) - src.take_damage(damage) + if(!deflect_hit(is_melee=1)) + src.hit_damage(damage, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - visible_message("\red [user] [attack_message] [src]!") + visible_message("[user] [attack_message] [src]!") user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - src.occupant_message("\blue The [user]'s attack is stopped by the armor.") - visible_message("\blue The [user] rebounds off [src.name]'s armor!") + src.occupant_message("\The [user]'s attack is stopped by the armor.") + visible_message("\The [user] rebounds off [src.name]'s armor!") user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") return 1 @@ -2119,7 +2120,7 @@ mecha.occupant << damageloop -/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsium +/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsius delay = 20 process(var/obj/mecha/mecha) @@ -2161,7 +2162,7 @@ return stop() return -/datum/global_iterator/mecha_intertial_movement //inertial movement in space +/datum/global_iterator/mecha_inertial_movement //inertial movement in space delay = 7 process(var/obj/mecha/mecha as obj,direction) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index d334d6eb29f..e9dbd93edf7 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -1,10 +1,11 @@ /obj/machinery/computer/mecha name = "Exosuit Control" icon = 'icons/obj/computer.dmi' - icon_state = "mecha" + icon_keyboard = "rd_key" + icon_screen = "mecha" light_color = "#a97faa" req_access = list(access_robotics) - circuit = "/obj/item/weapon/circuitboard/mecha_control" + circuit = /obj/item/weapon/circuitboard/mecha_control var/list/located = list() var/screen = 0 var/stored_data @@ -68,9 +69,7 @@ desc = "Device used to transmit exosuit data." icon = 'icons/obj/device.dmi' icon_state = "motion2" - origin_tech = "programming=2;magnets=2" - construction_time = 50 - construction_cost = list(DEFAULT_WALL_MATERIAL=500) + origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) proc/get_mecha_info() if(!in_mecha()) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 6dba12db0cf..876e6c3f6b0 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -10,16 +10,13 @@ icon_state = "blank" w_class = 5 flags = CONDUCT - origin_tech = "programming=2;materials=2" - var/construction_time = 100 - var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=5000) + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2) /obj/item/mecha_parts/chassis name="Mecha Chassis" icon_state = "backbone" var/datum/construction/construct - construction_cost = list(DEFAULT_WALL_MATERIAL=20000) flags = CONDUCT attackby(obj/item/W as obj, mob/user as mob) @@ -42,48 +39,37 @@ /obj/item/mecha_parts/part/ripley_torso name="Ripley Torso" desc="A torso part of Ripley APLU. Contains power unit, processing core and life support systems." - icon_state = "ripley_harness" - origin_tech = "programming=2;materials=2;biotech=2;engineering=2" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"glass"=15000) + icon_state = "ripley_harness" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINEERING = 2) /obj/item/mecha_parts/part/ripley_left_arm name="Ripley Left Arm" desc="A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "ripley_l_arm" - origin_tech = "programming=2;materials=2;engineering=2" - construction_time = 150 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) + icon_state = "ripley_l_arm" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) /obj/item/mecha_parts/part/ripley_right_arm name="Ripley Right Arm" desc="A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "ripley_r_arm" - origin_tech = "programming=2;materials=2;engineering=2" - construction_time = 150 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) + icon_state = "ripley_r_arm" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) /obj/item/mecha_parts/part/ripley_left_leg name="Ripley Left Leg" desc="A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems." - icon_state = "ripley_l_leg" - origin_tech = "programming=2;materials=2;engineering=2" - construction_time = 150 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000) + icon_state = "ripley_l_leg" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) /obj/item/mecha_parts/part/ripley_right_leg name="Ripley Right Leg" desc="A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems." - icon_state = "ripley_r_leg" - origin_tech = "programming=2;materials=2;engineering=2" - construction_time = 150 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000) + icon_state = "ripley_r_leg" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) ///////// Gygax /obj/item/mecha_parts/chassis/gygax name = "Gygax Chassis" - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) New() ..() @@ -92,62 +78,47 @@ /obj/item/mecha_parts/part/gygax_torso name="Gygax Torso" desc="A torso part of Gygax. Contains power unit, processing core and life support systems. Has an additional equipment slot." - icon_state = "gygax_harness" - origin_tech = "programming=2;materials=2;biotech=3;engineering=3" - construction_time = 300 - construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"glass"=20000) + icon_state = "gygax_harness" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 3, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/gygax_head name="Gygax Head" desc="A Gygax head. Houses advanced surveilance and targeting sensors." - icon_state = "gygax_head" - origin_tech = "programming=2;materials=2;magnets=3;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=10000) + icon_state = "gygax_head" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 3, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/gygax_left_arm name="Gygax Left Arm" desc="A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons." - icon_state = "gygax_l_arm" - origin_tech = "programming=2;materials=2;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000) + icon_state = "gygax_l_arm" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/gygax_right_arm name="Gygax Right Arm" desc="A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons." - icon_state = "gygax_r_arm" - origin_tech = "programming=2;materials=2;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000) + icon_state = "gygax_r_arm" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/gygax_left_leg name="Gygax Left Leg" - icon_state = "gygax_l_leg" - origin_tech = "programming=2;materials=2;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000) + icon_state = "gygax_l_leg" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/gygax_right_leg name="Gygax Right Leg" - icon_state = "gygax_r_leg" - origin_tech = "programming=2;materials=2;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000) + icon_state = "gygax_r_leg" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/gygax_armour name="Gygax Armour Plates" - icon_state = "gygax_armour" - origin_tech = "materials=6;combat=4;engineering=5" - construction_time = 600 - construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"diamond"=10000) + icon_state = "gygax_armour" + origin_tech = list(TECH_MATERIAL = 6, TECH_COMBAT = 4, TECH_ENGINEERING = 5) //////////// Durand /obj/item/mecha_parts/chassis/durand name = "Durand Chassis" - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) New() ..() @@ -155,52 +126,38 @@ /obj/item/mecha_parts/part/durand_torso name="Durand Torso" - icon_state = "durand_harness" - origin_tech = "programming=2;materials=3;biotech=3;engineering=3" - construction_time = 300 - construction_cost = list(DEFAULT_WALL_MATERIAL=55000,"glass"=20000,"silver"=10000) + icon_state = "durand_harness" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_BIO = 3, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/durand_head name="Durand Head" - icon_state = "durand_head" - origin_tech = "programming=2;materials=3;magnets=3;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000,"glass"=10000,"silver"=3000) + icon_state = "durand_head" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/durand_left_arm name="Durand Left Arm" - icon_state = "durand_l_arm" - origin_tech = "programming=2;materials=3;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"silver"=3000) + icon_state = "durand_l_arm" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/durand_right_arm name="Durand Right Arm" - icon_state = "durand_r_arm" - origin_tech = "programming=2;materials=3;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"silver"=3000) + icon_state = "durand_r_arm" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/durand_left_leg name="Durand Left Leg" - icon_state = "durand_l_leg" - origin_tech = "programming=2;materials=3;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"silver"=3000) + icon_state = "durand_l_leg" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/durand_right_leg name="Durand Right Leg" - icon_state = "durand_r_leg" - origin_tech = "programming=2;materials=3;engineering=3" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"silver"=3000) + icon_state = "durand_r_leg" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) /obj/item/mecha_parts/part/durand_armour name="Durand Armour Plates" - icon_state = "durand_armour" - origin_tech = "materials=5;combat=4;engineering=5" - construction_time = 600 - construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"uranium"=10000) + icon_state = "durand_armour" + origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4, TECH_ENGINEERING = 5) @@ -238,7 +195,7 @@ /obj/item/mecha_parts/chassis/phazon name = "Phazon Chassis" - origin_tech = "materials=7" + origin_tech = list(TECH_MATERIAL = 7) New() ..() @@ -247,44 +204,44 @@ /obj/item/mecha_parts/part/phazon_torso name="Phazon Torso" icon_state = "phazon_harness" - construction_time = 300 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"glass"=10000,"phoron"=20000) - origin_tech = "programming=5;materials=7;bluespace=6;powerstorage=6" + //construction_time = 300 + //construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"glass"=10000,"phoron"=20000) + origin_tech = list(TECH_DATA = 5, TECH_MATERIAL = 7, TECH_BLUESPACE = 6, TECH_POWER = 6) /obj/item/mecha_parts/part/phazon_head name="Phazon Head" icon_state = "phazon_head" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000,"glass"=5000,"phoron"=10000) - origin_tech = "programming=4;materials=5;magnets=6" + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=15000,"glass"=5000,"phoron"=10000) + origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 5, TECH_MAGNET = 6) /obj/item/mecha_parts/part/phazon_left_arm name="Phazon Left Arm" icon_state = "phazon_l_arm" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) - origin_tech = "materials=5;bluespace=2;magnets=2" + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) + origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 2) /obj/item/mecha_parts/part/phazon_right_arm name="Phazon Right Arm" icon_state = "phazon_r_arm" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) - origin_tech = "materials=5;bluespace=2;magnets=2" + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) + origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 2) /obj/item/mecha_parts/part/phazon_left_leg name="Phazon Left Leg" icon_state = "phazon_l_leg" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) - origin_tech = "materials=5;bluespace=3;magnets=3" + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) + origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 3, TECH_MAGNET = 3) /obj/item/mecha_parts/part/phazon_right_leg name="Phazon Right Leg" icon_state = "phazon_r_leg" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) - origin_tech = "materials=5;bluespace=3;magnets=3" + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) + origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 3, TECH_MAGNET = 3) ///////// Odysseus @@ -299,53 +256,41 @@ /obj/item/mecha_parts/part/odysseus_head name="Odysseus Head" icon_state = "odysseus_head" - construction_time = 100 - construction_cost = list(DEFAULT_WALL_MATERIAL=2000,"glass"=10000) - origin_tech = "programming=3;materials=2" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 2) /obj/item/mecha_parts/part/odysseus_torso name="Odysseus Torso" desc="A torso part of Odysseus. Contains power unit, processing core and life support systems." - icon_state = "odysseus_torso" - origin_tech = "programming=2;materials=2;biotech=2;engineering=2" - construction_time = 180 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) + icon_state = "odysseus_torso" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINEERING = 2) /obj/item/mecha_parts/part/odysseus_left_arm name="Odysseus Left Arm" desc="An Odysseus left arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "odysseus_l_arm" - origin_tech = "programming=2;materials=2;engineering=2" - construction_time = 120 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000) + icon_state = "odysseus_l_arm" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) /obj/item/mecha_parts/part/odysseus_right_arm name="Odysseus Right Arm" desc="An Odysseus right arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "odysseus_r_arm" - origin_tech = "programming=2;materials=2;engineering=2" - construction_time = 120 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000) + icon_state = "odysseus_r_arm" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) /obj/item/mecha_parts/part/odysseus_left_leg name="Odysseus Left Leg" desc="An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems." - icon_state = "odysseus_l_leg" - origin_tech = "programming=2;materials=2;engineering=2" - construction_time = 130 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000) + icon_state = "odysseus_l_leg" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) /obj/item/mecha_parts/part/odysseus_right_leg name="Odysseus Right Leg" desc="A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems." - icon_state = "odysseus_r_leg" - origin_tech = "programming=2;materials=2;engineering=2" - construction_time = 130 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000) + icon_state = "odysseus_r_leg" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) /*/obj/item/mecha_parts/part/odysseus_armour name="Odysseus Carapace" icon_state = "odysseus_armour" - origin_tech = "materials=3;engineering=3" + origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3) construction_time = 200 construction_cost = list(DEFAULT_WALL_MATERIAL=15000)*/ diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index d9e96bca191..39620c47426 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -47,7 +47,7 @@ else user << "You failed to salvage anything valuable from [src]." else - user << "\blue You need more welding fuel to complete this task." + user << "You need more welding fuel to complete this task." return if(istype(W, /obj/item/weapon/wirecutters)) if(salvage_num <= 0) @@ -200,4 +200,4 @@ /obj/effect/decal/mecha_wreckage/hoverpod name = "Hover pod wreckage" - icon_state = "engineering_pod-broken" \ No newline at end of file + icon_state = "engineering_pod-broken" diff --git a/code/game/mecha/working/hoverpod.dm b/code/game/mecha/working/hoverpod.dm index 1c15bb232da..b0448c69a03 100644 --- a/code/game/mecha/working/hoverpod.dm +++ b/code/game/mecha/working/hoverpod.dm @@ -27,7 +27,7 @@ if (href_list["toggle_stabilization"]) stabilization_enabled = !stabilization_enabled send_byjax(src.occupant,"exosuit.browser","stabilization_command","[stabilization_enabled?"Dis":"En"]able thruster stabilization") - src.occupant_message("\blue Thruster stabilization [stabilization_enabled? "enabled" : "disabled"].") + src.occupant_message("Thruster stabilization [stabilization_enabled? "enabled" : "disabled"].") return /obj/mecha/working/hoverpod/get_commands() @@ -99,4 +99,4 @@ var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger - ME.attach(src) \ No newline at end of file + ME.attach(src) diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index d9e876688f1..8ba99ad1c56 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -31,7 +31,7 @@ if(href_list["drop_from_cargo"]) var/obj/O = locate(href_list["drop_from_cargo"]) if(O && O in src.cargo) - src.occupant_message("\blue You unload [O].") + src.occupant_message("You unload [O].") O.loc = get_turf(src) src.cargo -= O var/turf/T = get_turf(O) @@ -57,4 +57,4 @@ return output /obj/mecha/working/range_action(atom/target as obj|mob|turf) - return \ No newline at end of file + return diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index d34c185d08c..24754c22701 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -1,278 +1,11 @@ -/* Alien Effects! - * Contains: - * effect/alien - * Resin - * Weeds - * Acid - * Egg - */ - -/* - * effect/alien - */ -/obj/effect/alien - name = "alien thing" - desc = "theres something alien about this" - icon = 'icons/mob/alien.dmi' - -/* - * Resin - */ -/obj/effect/alien/resin - name = "resin" - desc = "Looks like some kind of slimy growth." - icon_state = "resin" - - density = 1 - opacity = 1 - anchored = 1 - var/health = 200 - //var/mob/living/affecting = null - -/obj/effect/alien/resin/wall - name = "resin wall" - desc = "Purple slime solidified into a wall." - icon_state = "resinwall" //same as resin, but consistency ho! - -/obj/effect/alien/resin/membrane - name = "resin membrane" - desc = "Purple slime just thin enough to let light pass through." - icon_state = "resinmembrane" - opacity = 0 - health = 120 - -/obj/effect/alien/resin/New() - ..() - var/turf/T = get_turf(src) - T.thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT - -/obj/effect/alien/resin/Destroy() - var/turf/T = get_turf(src) - T.thermal_conductivity = initial(T.thermal_conductivity) - ..() - -/obj/effect/alien/resin/proc/healthcheck() - if(health <=0) - density = 0 - qdel(src) - return - -/obj/effect/alien/resin/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - ..() - healthcheck() - return - -/obj/effect/alien/resin/ex_act(severity) - switch(severity) - if(1.0) - health-=50 - if(2.0) - health-=50 - if(3.0) - if (prob(50)) - health-=50 - else - health-=25 - healthcheck() - return - -/obj/effect/alien/resin/blob_act() - health-=50 - healthcheck() - return - -/obj/effect/alien/resin/meteorhit() - health-=50 - healthcheck() - return - -/obj/effect/alien/resin/hitby(AM as mob|obj) - ..() - for(var/mob/O in viewers(src, null)) - O.show_message("\red [src] was hit by [AM].", 1) - var/tforce = 0 - if(ismob(AM)) - tforce = 10 - else - tforce = AM:throwforce - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) - health = max(0, health - tforce) - healthcheck() - ..() - return - -/obj/effect/alien/resin/attack_hand() - if (HULK in usr.mutations) - usr << "\blue You easily destroy the [name]." - for(var/mob/O in oviewers(src)) - O.show_message("\red [usr] destroys the [name]!", 1) - health = 0 - else - - // Aliens can get straight through these. - if(istype(usr,/mob/living/carbon)) - var/mob/living/carbon/M = usr - if(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs) - for(var/mob/O in oviewers(src)) - O.show_message("\red [usr] strokes the [name] and it melts away!", 1) - health = 0 - healthcheck() - return - - usr << "\blue You claw at the [name]." - for(var/mob/O in oviewers(src)) - O.show_message("\red [usr] claws at the [name]!", 1) - health -= rand(5,10) - healthcheck() - return - -/obj/effect/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob) - - var/aforce = W.force - health = max(0, health - aforce) - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) - healthcheck() - ..() - return - -/obj/effect/alien/resin/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group) return 0 - if(istype(mover) && mover.checkpass(PASSGLASS)) - return !opacity - return !density - - -/* - * Weeds - */ -#define NODERANGE 3 - -/obj/effect/alien/weeds - name = "weeds" - desc = "Weird purple weeds." - icon_state = "weeds" - - anchored = 1 - density = 0 - layer = 2 - var/health = 15 - var/obj/effect/alien/weeds/node/linked_node = null - -/obj/effect/alien/weeds/node - icon_state = "weednode" - name = "purple sac" - desc = "Weird purple octopus-like thing." - layer = 3 - light_range = NODERANGE - var/node_range = NODERANGE - -/obj/effect/alien/weeds/node/New() - ..(src.loc, src) - - -/obj/effect/alien/weeds/New(pos, node) - ..() - if(istype(loc, /turf/space)) - qdel(src) - return - linked_node = node - if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2") - spawn(rand(150, 200)) - if(src) - Life() - return - -/obj/effect/alien/weeds/proc/Life() - set background = 1 - var/turf/U = get_turf(src) -/* - if (locate(/obj/movable, U)) - U = locate(/obj/movable, U) - if(U.density == 1) - qdel(src) - return - -Alien plants should do something if theres a lot of poison - if(U.poison> 200000) - health -= round(U.poison/200000) - update() - return -*/ - if (istype(U, /turf/space)) - qdel(src) - return - - if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) ) - return - - direction_loop: - for(var/dirn in cardinal) - var/turf/T = get_step(src, dirn) - - if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space)) - continue - - // if (locate(/obj/movable, T)) // don't propogate into movables - // continue - - for(var/obj/O in T) - if(O.density) - continue direction_loop - - PoolOrNew(/obj/effect/alien/weeds, T, linked_node) - - -/obj/effect/alien/weeds/ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - if(2.0) - if (prob(50)) - qdel(src) - if(3.0) - if (prob(5)) - qdel(src) - return - -/obj/effect/alien/weeds/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]." : ".")]") - else - visible_message("\red \The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") - - var/damage = W.force / 4.0 - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - - if(WT.remove_fuel(0, user)) - damage = 15 - playsound(loc, 'sound/items/Welder.ogg', 100, 1) - - health -= damage - healthcheck() - -/obj/effect/alien/weeds/proc/healthcheck() - if(health <= 0) - qdel(src) - - -/obj/effect/alien/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300 + T0C) - health -= 5 - healthcheck() - -#undef NODERANGE - - /* * Acid */ -/obj/effect/alien/acid +/obj/effect/acid name = "acid" - desc = "Burbling corrossive stuff. I wouldn't want to touch it." + desc = "Burbling corrosive stuff. Probably a bad idea to roll around in it." icon_state = "acid" + icon = 'icons/mob/alien.dmi' density = 0 opacity = 0 @@ -282,9 +15,9 @@ Alien plants should do something if theres a lot of poison var/ticks = 0 var/target_strength = 0 -/obj/effect/alien/acid/New(loc, target) +/obj/effect/acid/New(loc, supplied_target) ..(loc) - src.target = target + target = supplied_target if(isturf(target)) // Turf take twice as long to take down. target_strength = 8 @@ -292,17 +25,13 @@ Alien plants should do something if theres a lot of poison target_strength = 4 tick() -/obj/effect/alien/acid/proc/tick() +/obj/effect/acid/proc/tick() if(!target) qdel(src) - ticks += 1 - + ticks++ if(ticks >= target_strength) - - for(var/mob/O in hearers(src, null)) - O.show_message("\green [src.target] collapses under its own weight into a puddle of goop and undigested debris!", 1) - + target.visible_message("\The [target] collapses under its own weight into a puddle of goop and undigested debris!") if(istype(target, /turf/simulated/wall)) // I hate turf code. var/turf/simulated/wall/W = target W.dismantle_wall(1) @@ -313,134 +42,11 @@ Alien plants should do something if theres a lot of poison switch(target_strength - ticks) if(6) - visible_message("\green [src.target] is holding up against the acid!") + visible_message("\The [src.target] is holding up against the acid!") if(4) - visible_message("\green [src.target]\s structure is being melted by the acid!") + visible_message("\The [src.target]\s structure is being melted by the acid!") if(2) - visible_message("\green [src.target] is struggling to withstand the acid!") + visible_message("\The [src.target] is struggling to withstand the acid!") if(0 to 1) - visible_message("\green [src.target] begins to crumble under the acid!") - spawn(rand(150, 200)) tick() - -/* - * Egg - */ -/var/const //for the status var - BURST = 0 - BURSTING = 1 - GROWING = 2 - GROWN = 3 - - MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger - MAX_GROWTH_TIME = 3000 - -/obj/effect/alien/egg - desc = "It looks like a weird egg" - name = "egg" - icon_state = "egg_growing" - density = 0 - anchored = 1 - - var/health = 100 - var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive - -/obj/effect/alien/egg/New() - if(config.aliens_allowed) - ..() - spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) - Grow() - else - qdel(src) - -/obj/effect/alien/egg/attack_hand(user as mob) - - var/mob/living/carbon/M = user - if(!istype(M) || !(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)) - return attack_hand(user) - - switch(status) - if(BURST) - user << "\red You clear the hatched egg." - qdel(src) - return - if(GROWING) - user << "\red The child is not developed yet." - return - if(GROWN) - user << "\red You retrieve the child." - Burst(0) - return - -/obj/effect/alien/egg/proc/GetFacehugger() - return locate(/obj/item/clothing/mask/facehugger) in contents - -/obj/effect/alien/egg/proc/Grow() - icon_state = "egg" - status = GROWN - new /obj/item/clothing/mask/facehugger(src) - return - -/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining - if(status == GROWN || status == GROWING) - var/obj/item/clothing/mask/facehugger/child = GetFacehugger() - icon_state = "egg_hatched" - flick("egg_opening", src) - status = BURSTING - spawn(15) - status = BURST - child.loc = get_turf(src) - - if(kill && istype(child)) - child.Die() - else - for(var/mob/M in range(1,src)) - if(CanHug(M)) - child.Attach(M) - break - -/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - ..() - healthcheck() - return - - -/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) - if(health <= 0) - return - if(W.attack_verb.len) - src.visible_message("\red \The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") - else - src.visible_message("\red \The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") - var/damage = W.force / 4.0 - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - - if(WT.remove_fuel(0, user)) - damage = 15 - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - - src.health -= damage - src.healthcheck() - - -/obj/effect/alien/egg/proc/healthcheck() - if(health <= 0) - Burst() - -/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 500 + T0C) - health -= 5 - healthcheck() - -/obj/effect/alien/egg/HasProximity(atom/movable/AM as mob|obj) - if(status == GROWN) - if(!CanHug(AM)) - return - - var/mob/living/carbon/C = AM - if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST) - return - - Burst(0) + visible_message("\The [src.target] begins to crumble under the acid!") + spawn(rand(150, 200)) tick() \ No newline at end of file diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 99a68e13634..b29b2440e6c 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -150,9 +150,6 @@ /obj/structure/foamedmetal/ex_act(severity) qdel(src) -/obj/structure/foamedmetal/blob_act() - qdel(src) - /obj/structure/foamedmetal/bullet_act() if(metal == 1 || prob(50)) qdel(src) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 482c3d8abdf..fc4b0ba0dcb 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -167,7 +167,7 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/writing/examine(mob/user) ..(user) - user << "It reads: \"[message]\"" + user << "It reads: \"[message]\"" /obj/effect/decal/cleanable/blood/gibs name = "gibs" diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 472ea38b932..98056c75dbf 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -121,7 +121,7 @@ var/global/list/image/fluidtrack_cache=list() updated=1 dirs |= comingdir|realgoing - if (islist(blood_DNA)) + if(islist(blood_DNA)) blood_DNA |= DNA.Copy() if(updated) update_icon() diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 10567963667..b8ecb7f60b9 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -31,9 +31,9 @@ //must place on a wall and user must not be inside a closet/mecha/whatever var/turf/W = A if (!iswall(W) || !isturf(user.loc)) - user << "\red You can't place this here!" + user << "You can't place this here!" return - + var/placement_dir = get_dir(user, W) if (!(placement_dir in cardinal)) user << "You must stand directly in front of the wall you wish to place that on." @@ -43,7 +43,7 @@ var/stuff_on_wall = 0 if (locate(/obj/structure/sign/poster) in W) stuff_on_wall = 1 - + //crude, but will cover most cases. We could do stuff like check pixel_x/y but it's not really worth it. for (var/dir in cardinal) var/turf/T = get_step(W, dir) @@ -61,7 +61,7 @@ flick("poster_being_set", P) //playsound(W, 'sound/items/poster_being_created.ogg', 100, 1) //why the hell does placing a poster make printer sounds? - + var/oldsrc = src //get a reference to src so we can delete it after detaching ourselves src = null spawn(17) @@ -71,7 +71,7 @@ user << "You place the poster!" else P.roll_and_drop(P.loc) - + qdel(oldsrc) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway //############################## THE ACTUAL DECALS ########################### @@ -90,11 +90,11 @@ if(!serial) serial = rand(1, poster_designs.len) //use a random serial if none is given - + serial_number = serial var/datum/poster/design = poster_designs[serial_number] set_poster(design) - + switch (placement_dir) if (NORTH) pixel_x = 0 @@ -133,23 +133,23 @@ /obj/structure/sign/poster/attack_hand(mob/user as mob) + if(ruined) return - var/temp_loc = user.loc - switch(alert("Do I want to rip the poster from the wall?","You think...","Yes","No")) - if("Yes") - if(user.loc != temp_loc) - return - visible_message("[user] rips [src] in a single, decisive motion!" ) - playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) - ruined = 1 - icon_state = "poster_ripped" - name = "ripped poster" - desc = "You can't make out anything from the poster's original print. It's ruined." - add_fingerprint(user) - if("No") + + if(alert("Do I want to rip the poster from the wall?","You think...","Yes","No") == "Yes") + + if(ruined || !user.Adjacent(src)) return + visible_message("\The [user] rips \the [src] in a single, decisive motion!" ) + playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) + ruined = 1 + icon_state = "poster_ripped" + name = "ripped poster" + desc = "You can't make out anything from the poster's original print. It's ruined." + add_fingerprint(user) + /obj/structure/sign/poster/proc/roll_and_drop(turf/newloc) var/obj/item/weapon/contraband/poster/P = new(src, serial_number) P.loc = newloc @@ -162,4 +162,3 @@ // Description suffix var/desc="" var/icon_state="" - diff --git a/code/game/objects/effects/decals/posters/bs12.dm b/code/game/objects/effects/decals/posters/bs12.dm index e01dd47f313..734254e5876 100644 --- a/code/game/objects/effects/decals/posters/bs12.dm +++ b/code/game/objects/effects/decals/posters/bs12.dm @@ -37,12 +37,12 @@ /datum/poster/bay_8 icon_state="bsposter8" name = "Pinup Girl Cindy" - desc = "This particular one is of Nanotrasen's PR girl, Cindy, in a particularly feminine pose." + desc = "This particular one is of a historical corporate PR girl, Cindy, in a particularly feminine pose." /datum/poster/bay_9 icon_state="bsposter9" name = "Pinup Girl Amy" - desc = "This particular one is of Amy, the nymphomaniac Urban Legend of Nanotrasen Space Stations. How this photograph came to be is not known." + desc = "This particular one is of Amy, the nymphomaniac urban legend of deep space. How this photograph came to be is not known." /datum/poster/bay_10 icon_state="bsposter10" @@ -52,12 +52,12 @@ /datum/poster/bay_11 icon_state="bsposter11" name = "Underwater Laboratory" - desc = "This particular one is of the fabled last crew of Nanotrasen's previous project before going big on phoron research." + desc = "This particular one is of the fabled last crew of a previous Company project." /datum/poster/bay_12 icon_state="bsposter12" name = "Rogue AI" - desc = "This particular one depicts the shell of the infamous AI that catastropically comandeered one of Nanotrasen's earliest space stations. Back then, the corporation was just known as TriOptimum." + desc = "This particular one depicts the shell of the infamous AI that catastropically comandeered one of humanity's earliest space stations. Back then, the Company was just known as TriOptimum." /datum/poster/bay_13 icon_state="bsposter13" @@ -172,7 +172,7 @@ /datum/poster/bay_35 icon_state="bsposter35" name = "Lamarr" - desc = "This is a poster depicting the pet and mascot of the NSS Exodus science department." + desc = "This is a poster depicting the pet and mascot of the science department." /datum/poster/bay_36 icon_state="bsposter36" diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index ae127c24b07..6f3f2bab1b9 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -13,11 +13,11 @@ would spawn and follow the beaker, even if it is carried or thrown. unacidable = 1//So effect are not targeted by alien acid. pass_flags = PASSTABLE | PASSGRILLE -/obj/effect/Destroy() +/obj/effect/Destroy() if(reagents) reagents.delete() return ..() - + /datum/effect/effect/system var/number = 3 var/cardinals = 0 @@ -94,35 +94,35 @@ steam.start() -- spawns the effect // will always spawn at the items location. ///////////////////////////////////////////// -/obj/effect/effect/sparks +/obj/effect/sparks name = "sparks" icon_state = "sparks" var/amount = 6.0 anchored = 1.0 mouse_opacity = 0 -/obj/effect/effect/sparks/New() +/obj/effect/sparks/New() ..() playsound(src.loc, "sparks", 100, 1) var/turf/T = src.loc if (istype(T, /turf)) T.hotspot_expose(1000,100) - spawn (100) - qdel(src) - return + +/obj/effect/sparks/initialize() + ..() + schedule_task_in(10 SECONDS, /proc/qdel, list(src)) -/obj/effect/effect/sparks/Destroy() +/obj/effect/sparks/Destroy() var/turf/T = src.loc if (istype(T, /turf)) T.hotspot_expose(1000,100) return ..() -/obj/effect/effect/sparks/Move() +/obj/effect/sparks/Move() ..() var/turf/T = src.loc if (istype(T, /turf)) T.hotspot_expose(1000,100) - return /datum/effect/effect/system/spark_spread var/total_sparks = 0 // To stop it being spammed and lagging! @@ -145,7 +145,7 @@ steam.start() -- spawns the effect spawn(0) if(holder) src.location = get_turf(holder) - var/obj/effect/effect/sparks/sparks = PoolOrNew(/obj/effect/effect/sparks, src.location) + var/obj/effect/sparks/sparks = PoolOrNew(/obj/effect/sparks, src.location) src.total_sparks++ var/direction if(src.cardinals) @@ -187,7 +187,6 @@ steam.start() -- spawns the effect ..() spawn (time_to_live) qdel(src) - return /obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob ) ..() @@ -198,11 +197,11 @@ steam.start() -- spawns the effect if (istype(M)) return 0 if (M.internal != null) - if(M.wear_mask && (M.wear_mask.flags & AIRTIGHT)) + if(M.wear_mask && (M.wear_mask.item_flags & AIRTIGHT)) return 0 if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.head && (H.head.flags & AIRTIGHT)) + if(H.head && (H.head.item_flags & AIRTIGHT)) return 0 return 0 return 1 @@ -455,7 +454,7 @@ steam.start() -- spawns the effect proc/stop() src.processing = 0 src.on = 0 - + /datum/effect/effect/system/reagents_explosion var/amount // TNT equivalent var/flashing = 0 // does explosion creates flash effect? @@ -480,10 +479,10 @@ steam.start() -- spawns the effect s.start() for(var/mob/M in viewers(5, location)) - M << "\red The solution violently explodes." + M << "The solution violently explodes." for(var/mob/M in viewers(1, location)) if (prob (50 * amount)) - M << "\red The explosion knocks you down." + M << "The explosion knocks you down." M.Weaken(rand(1,5)) return else @@ -506,7 +505,7 @@ steam.start() -- spawns the effect flash = (amount/4) * flashing_factor for(var/mob/M in viewers(8, location)) - M << "\red The solution violently explodes." + M << "The solution violently explodes." explosion( location, diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index a7f4c0482fd..696d3aa0fa6 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -19,7 +19,7 @@ proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null) if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) - world << "\red Gib list length mismatch!" + world << "Gib list length mismatch!" return var/obj/effect/decal/cleanable/blood/gibs/gib = null diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 7e0c2d1c040..f60e02254bc 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -4,6 +4,8 @@ icon_state = "x2" anchored = 1.0 unacidable = 1 + simulated = 0 + var/delete_me = 0 /obj/effect/landmark/New() ..() @@ -11,41 +13,33 @@ invisibility = 101 switch(name) //some of these are probably obsolete - if("shuttle") - shuttle_z = z - 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 - qdel(src) + delete_me = 1 return if("start") newplayer_start += loc - qdel(src) + delete_me = 1 + return if("JoinLate") latejoin += loc - qdel(src) + delete_me = 1 + return if("JoinLateGateway") latejoin_gateway += loc - qdel(src) + delete_me = 1 return if("JoinLateCryo") latejoin_cryo += loc - qdel(src) + delete_me = 1 return if("JoinLateCyborg") latejoin_cyborg += loc - qdel(src) + delete_me = 1 return if("prisonwarp") prisonwarp += loc - qdel(src) + delete_me = 1 return if("Holding Facility") holdingfacility += loc @@ -59,28 +53,32 @@ tdomeobserve += loc if("prisonsecuritywarp") prisonsecuritywarp += loc - qdel(src) - return - if("blobstart") - blobstart += loc - qdel(src) + delete_me = 1 return if("xeno_spawn") xeno_spawn += loc - qdel(src) + delete_me = 1 return if("endgame_exit") endgame_safespawns += loc - qdel(src) + delete_me = 1 return if("bluespacerift") endgame_exits += loc - qdel(src) + delete_me = 1 return landmarks_list += src return 1 +/obj/effect/landmark/proc/delete() + delete_me = 1 + +/obj/effect/landmark/initialize() + ..() + if(delete_me) + qdel(src) + /obj/effect/landmark/Destroy() landmarks_list -= src return ..() @@ -104,51 +102,51 @@ var/list/options = typesof(/obj/effect/landmark/costume) var/PICK= options[rand(1,options.len)] new PICK(src.loc) - qdel(src) + delete_me = 1 //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) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/gladiator/New() new /obj/item/clothing/under/gladiator(src.loc) new /obj/item/clothing/head/helmet/gladiator(src.loc) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/nyangirl/New() new /obj/item/clothing/under/schoolgirl(src.loc) new /obj/item/clothing/head/kitty(src.loc) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/scratch/New() new /obj/item/clothing/gloves/white(src.loc) @@ -156,12 +154,12 @@ new /obj/item/clothing/under/scratch(src.loc) if (prob(30)) new /obj/item/clothing/head/cueball(src.loc) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/highlander/New() new /obj/item/clothing/under/kilt(src.loc) new /obj/item/clothing/head/beret(src.loc) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/prig/New() new /obj/item/clothing/suit/wcoat(src.loc) @@ -172,24 +170,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) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/plaguedoctor/New() new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc) new /obj/item/clothing/head/plaguedoctorhat(src.loc) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/nightowl/New() new /obj/item/clothing/under/owl(src.loc) new /obj/item/clothing/mask/gas/owl_mask(src.loc) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/pirate/New() new /obj/item/clothing/under/pirate(src.loc) @@ -197,46 +195,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) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/commie/New() new /obj/item/clothing/under/soviet(src.loc) new /obj/item/clothing/head/ushanka(src.loc) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/holiday_priest/New() new /obj/item/clothing/suit/holidaypriest(src.loc) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /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) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/sexyclown/New() new /obj/item/clothing/mask/gas/sexyclown(src.loc) new /obj/item/clothing/under/sexyclown(src.loc) - qdel(src) + delete_me = 1 /obj/effect/landmark/costume/sexymime/New() new /obj/item/clothing/mask/gas/sexymime(src.loc) new /obj/item/clothing/under/sexymime(src.loc) - qdel(src) \ No newline at end of file + delete_me = 1 diff --git a/code/game/objects/effects/spawners/vaultspawner.dm b/code/game/objects/effects/spawners/vaultspawner.dm deleted file mode 100644 index c4b9203cefc..00000000000 --- a/code/game/objects/effects/spawners/vaultspawner.dm +++ /dev/null @@ -1,26 +0,0 @@ -/obj/effect/vaultspawner - var/maxX = 6 - var/maxY = 6 - var/minX = 2 - var/minY = 2 - -/obj/effect/vaultspawner/New(turf/location as turf,lX = minX,uX = maxX,lY = minY,uY = maxY,var/type = null) - if(!type) - type = pick("sandstone","rock","alien") - - var/lowBoundX = location.x - var/lowBoundY = location.y - - var/hiBoundX = location.x + rand(lX,uX) - var/hiBoundY = location.y + rand(lY,uY) - - var/z = location.z - - for(var/i = lowBoundX,i<=hiBoundX,i++) - for(var/j = lowBoundY,j<=hiBoundY,j++) - if(i == lowBoundX || i == hiBoundX || j == lowBoundY || j == hiBoundY) - new /turf/simulated/wall/vault(locate(i,j,z),type) - else - new /turf/simulated/floor/vault(locate(i,j,z),type) - - qdel(src) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index fe521d4371c..278183143fc 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -40,7 +40,7 @@ /obj/effect/spider/bullet_act(var/obj/item/projectile/Proj) ..() - health -= Proj.damage + health -= Proj.get_structure_damage() healthcheck() /obj/effect/spider/proc/healthcheck() @@ -64,7 +64,7 @@ return 1 else if(istype(mover, /mob/living)) if(prob(50)) - mover << "\red You get stuck in \the [src] for a moment." + mover << "You get stuck in \the [src] for a moment." return 0 else if(istype(mover, /obj/item/projectile)) return prob(30) @@ -78,14 +78,32 @@ New() pixel_x = rand(3,-3) pixel_y = rand(3,-3) - processing_objects.Add(src) + processing_objects |= src + +/obj/effect/spider/eggcluster/New(var/location, var/atom/parent) + get_light_and_color(parent) + ..() + +/obj/effect/spider/eggcluster/Destroy() + processing_objects -= src + if(istype(loc, /obj/item/organ/external)) + var/obj/item/organ/external/O = loc + O.implants -= src + + ..() /obj/effect/spider/eggcluster/process() amount_grown += rand(0,2) if(amount_grown >= 100) var/num = rand(6,24) + var/obj/item/organ/external/O = null + if(istype(loc, /obj/item/organ/external)) + O = loc + for(var/i=0, iYou hear something squeezing through the ventilation ducts.
    ",2) sleep(travel_time) if(!exit_vent || exit_vent.welded) @@ -188,8 +214,27 @@ amount_grown += (rand(0,2)*growth_rate) if(amount_grown >= 100) var/spawn_type = pick(typesof(/mob/living/simple_animal/hostile/giant_spider)) - new spawn_type(src.loc) + new spawn_type(src.loc, src) qdel(src) + else if(isorgan(loc)) + if(!amount_grown) amount_grown = 1 + var/obj/item/organ/external/O = loc + if(!O.owner || O.owner.stat == DEAD || amount_grown > 80) + O.implants -= src + src.loc = O.owner ? O.owner.loc : O.loc + src.visible_message("\A [src] makes its way out of [O.owner ? "[O.owner]'s [O.name]" : "\the [O]"]!") + if(O.owner) + O.owner.apply_damage(1, BRUTE, O.limb_name) + else if(prob(1)) + O.owner.apply_damage(1, TOX, O.limb_name) + if(world.time > last_itch + 30 SECONDS) + last_itch = world.time + O.owner << "Your [O.name] itches..." + else if(prob(1)) + src.visible_message("\The [src] skitters.") + + if(amount_grown) + amount_grown += rand(0,2) /obj/effect/decal/cleanable/spiderling_remains name = "spiderling remains" @@ -207,7 +252,7 @@ icon_state = pick("cocoon1","cocoon2","cocoon3") /obj/effect/spider/cocoon/Destroy() - src.visible_message("\red \the [src] splits open.") + src.visible_message("\The [src] splits open.") for(var/atom/movable/A in contents) A.loc = src.loc return ..() diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index d71681cd56c..357b519d909 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -1,8 +1,6 @@ //TODO: Flash range does nothing currently -///// Z-Level Stuff -proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, z_transfer = 1) -///// Z-Level Stuff +proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, z_transfer = UP|DOWN) src = null //so we don't abort once src is deleted spawn(0) var/power = max(0,devastation_range) * 2 + max(0,heavy_impact_range) + max(0,light_impact_range) @@ -14,16 +12,22 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa epicenter = get_turf(epicenter) if(!epicenter) return -///// Z-Level Stuff - if(z_transfer && (devastation_range > 0 || heavy_impact_range > 0)) - //transfer the explosion in both directions - explosion_z_transfer(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range) -///// Z-Level Stuffis + // Handles recursive propagation of explosions. + if(devastation_range > 2 || heavy_impact_range > 2) + if(HasAbove(epicenter.z) && z_transfer & UP) + explosion(GetAbove(epicenter), max(0, devastation_range - 2), max(0, heavy_impact_range - 2), max(0, light_impact_range - 2), max(0, flash_range - 2), 0, UP) + if(HasBelow(epicenter.z) && z_transfer & DOWN) + explosion(GetAbove(epicenter), max(0, devastation_range - 2), max(0, heavy_impact_range - 2), max(0, light_impact_range - 2), max(0, flash_range - 2), 0, DOWN) var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flash_range) - //playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(devastation_range*2,1) ) - //playsound(epicenter, "explosion", 100, 1, round(devastation_range,1) ) + // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. + // Stereo users will also hear the direction of the explosion! + // Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. + // 3/7/14 will calculate to 80 + 35 + var/far_dist = 0 + far_dist += heavy_impact_range * 5 + far_dist += devastation_range * 20 // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. // Stereo users will also hear the direction of the explosion! @@ -32,6 +36,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa // 3/7/14 will calculate to 80 + 35 var/volume = 10 + (power * 20) + var/frequency = get_rand_frequency() var/closedist = round(max_range + world.view - 2, 1) @@ -94,10 +99,6 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)") log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ") -// var/lighting_controller_was_processing = lighting_controller.processing //Pause the lighting updates for a bit -// lighting_controller.processing = 0 - - var/approximate_intensity = (devastation_range * 3) + (heavy_impact_range * 2) + light_impact_range var/powernet_rebuild_was_deferred_already = defer_powernet_rebuild // Large enough explosion. For performance reasons, powernets will be rebuilt manually @@ -139,7 +140,6 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa sleep(8) -// if(!lighting_controller.processing) lighting_controller.processing = lighting_controller_was_processing if(!powernet_rebuild_was_deferred_already && defer_powernet_rebuild) makepowernets() defer_powernet_rebuild = 0 @@ -150,20 +150,3 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa proc/secondaryexplosion(turf/epicenter, range) for(var/turf/tile in range(range, epicenter)) tile.ex_act(2) - -///// Z-Level Stuff -proc/explosion_z_transfer(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, up = 1, down = 1) - var/turf/controllerlocation = locate(1, 1, epicenter.z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - //start the child explosion, no admin log and no additional transfers - explosion(locate(epicenter.x, epicenter.y, controller.down_target), max(devastation_range - 2, 0), max(heavy_impact_range - 2, 0), max(light_impact_range - 2, 0), max(flash_range - 2, 0), 0, 0) - if(devastation_range - 2 > 0 || heavy_impact_range - 2 > 0) //only transfer further if the explosion is still big enough - explosion(locate(epicenter.x, epicenter.y, controller.down_target), max(devastation_range - 2, 0), max(heavy_impact_range - 2, 0), max(light_impact_range - 2, 0), max(flash_range - 2, 0), 0, 1) - - if(controller.up) - //start the child explosion, no admin log and no additional transfers - explosion(locate(epicenter.x, epicenter.y, controller.up_target), max(devastation_range - 2, 0), max(heavy_impact_range - 2, 0), max(light_impact_range - 2, 0), max(flash_range - 2, 0), 0, 0) - if(devastation_range - 2 > 0 || heavy_impact_range - 2 > 0) //only transfer further if the explosion is still big enough - explosion(locate(epicenter.x, epicenter.y, controller.up_target), max(devastation_range - 2, 0), max(heavy_impact_range - 2, 0), max(light_impact_range - 2, 0), max(flash_range - 2, 0), 1, 0) -///// Z-Level Stuff diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 1b44bc8130c..11074bedbab 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,6 +1,8 @@ /obj/item name = "item" icon = 'icons/obj/items.dmi' + w_class = 3.0 + 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/r_speed = 1.0 @@ -8,11 +10,10 @@ var/burn_point = null var/burning = null var/hitsound = null - var/w_class = 3.0 + var/storage_cost = null var/slot_flags = 0 //This is used to determine on which slots an item can fit. var/no_attack_log = 0 //If it's an item we don't want to log attack_logs with, set this to 1 pass_flags = PASSTABLE - pressure_resistance = 5 // causeerrorheresoifixthis var/obj/item/master = null @@ -21,11 +22,13 @@ var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags - var/icon_action_button //If this is set, The item will make an action button on the player's HUD when picked up. The button will have the icon_action_button sprite from the screen1_action.dmi file. - var/action_button_name //This is the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. Note that icon_action_button needs to be set in order for the action button to appear. + var/datum/action/item_action/action = null + var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. + var/action_button_is_hands_free = 0 //If 1, bypass the restrained, lying, and stunned checks action buttons normally test for - //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. + //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. + //It should be used purely for appearance. For gameplay effects caused by items covering body parts, use body_parts_covered. + var/flags_inv = 0 var/body_parts_covered = 0 //see setup.dm for appropriate bit flags var/item_flags = 0 //Miscellaneous flags pertaining to equippable objects. @@ -53,7 +56,9 @@ // 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. - var/list/item_icons = null + var/list/item_icons = list() + + //** These specify item/icon overrides for _species_ /* Species-specific sprites, concept stolen from Paradise//vg/. ex: @@ -62,13 +67,13 @@ ) If index term exists and icon_override is not set, this sprite sheet will be used. */ - var/list/sprite_sheets = null - var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc. + var/list/sprite_sheets = list() - /* Species-specific sprite sheets for inventory sprites - Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called. - */ - var/list/sprite_sheets_obj = null + // Species-specific sprite sheets for inventory sprites + // Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called. + var/list/sprite_sheets_obj = list() + + var/icon_override = null //Used to override hardcoded clothing dmis in human clothing pr /obj/item/Destroy() if(ismob(loc)) @@ -107,21 +112,7 @@ else return -/obj/item/blob_act() - return - -//user: The mob that is suiciding -//damagetype: The type of damage the item will inflict on the user -//BRUTELOSS = 1 -//FIRELOSS = 2 -//TOXLOSS = 4 -//OXYLOSS = 8 -//Output a creative message and then return the damagetype done -/obj/item/proc/suicide_act(mob/user) - return - - -/mob/living/verb/move_to_top(obj/item/I in range(1)) +/obj/item/verb/move_to_top(obj/item/I in range(1)) set name = "Move To Top" set category = "Object" @@ -152,10 +143,17 @@ /obj/item/attack_hand(mob/user as mob) if (!user) return - - if (!user.can_use_hand()) - return - + if (hasorgans(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + if (user.hand) + temp = H.organs_by_name["l_hand"] + if(temp && !temp.is_usable()) + user << "You try to move your [temp.name], but cannot!" + return + if(!temp) + user << "You try to use your hand, but realize it is no longer attached!" + return src.pickup(user) if (istype(src.loc, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = src.loc @@ -168,8 +166,6 @@ else if(isliving(src.loc)) return - user.next_move = max(user.next_move+2,world.time + 2) - user.put_in_active_hand(src) return @@ -208,7 +204,7 @@ else if(success) user << "You put some things in [S]." else - user << "You fail to pick anything up with [S]." + user << "You fail to pick anything up with \the [S]." else if(S.can_be_inserted(src)) S.handle_item_insertion(src) @@ -347,7 +343,7 @@ var/list/global/slot_flags_enumeration = list( 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) + if(B.can_be_inserted(src,1)) allow = 1 if(!allow) return 0 @@ -384,22 +380,22 @@ var/list/global/slot_flags_enumeration = list( if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) return if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain - usr << "\red You can't pick things up!" + usr << "You can't pick things up!" return if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained - usr << "\red You can't pick things up!" + usr << "You can't pick things up!" return if(src.anchored) //Object isn't anchored - usr << "\red You can't pick that up!" + usr << "You can't pick that up!" return if(!usr.hand && usr.r_hand) //Right hand is not full - usr << "\red Your right hand is full." + usr << "Your right hand is full." return if(usr.hand && usr.l_hand) //Left hand is not full - usr << "\red Your left hand is full." + usr << "Your left hand is full." return if(!istype(src.loc, /turf)) //Object is on a turf - usr << "\red You can't pick that up!" + usr << "You can't pick that up!" return //All checks are done, time to pick it up! usr.UnarmedAttack(src) @@ -445,11 +441,14 @@ var/list/global/slot_flags_enumeration = list( //The default action is attack_self(). //Checks before we get to here are: mob is alive, mob is not restrained, paralyzed, asleep, resting, laying, item is on the mob. /obj/item/proc/ui_action_click() - if( src in usr ) - attack_self(usr) + attack_self(usr) - -/obj/item/proc/IsShield() +//RETURN VALUES +//handle_shield should return a positive value to indicate that the attack is blocked and should be prevented. +//If a negative value is returned, it should be treated as a special return value for bullet_act() and handled appropriately. +//For non-projectile attacks this usually means the attack is blocked. +//Otherwise should return 0 to indicate that the attack is not affected in any way. +/obj/item/proc/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") return 0 /obj/item/proc/get_loc_turf() @@ -461,28 +460,29 @@ var/list/global/slot_flags_enumeration = list( /obj/item/proc/eyestab(mob/living/carbon/M as mob, mob/living/carbon/user as mob) var/mob/living/carbon/human/H = M - if(istype(H) && ( \ - (H.head && H.head.flags & HEADCOVERSEYES) || \ - (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ - (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ - )) - // you can't stab someone in the eyes wearing a mask! - user << "\red You're going to need to remove the eye covering first." - return + if(istype(H)) + for(var/obj/item/protection in list(H.head, H.wear_mask, H.glasses)) + if(protection && (protection.body_parts_covered & EYES)) + // you can't stab someone in the eyes wearing a mask! + user << "You're going to need to remove the eye covering first." + return if(!M.has_eyes()) - user << "\red You cannot locate any eyes on [M]!" + user << "You cannot locate any eyes on [M]!" return user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") //BS12 EDIT ALG + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + src.add_fingerprint(user) //if((CLUMSY in user.mutations) && prob(50)) // M = user /* - M << "\red You stab yourself in the eye." + M << "You stab yourself in the eye." M.sdisabilities |= BLIND M.weakened += 4 M.adjustBruteLoss(10) @@ -494,30 +494,30 @@ var/list/global/slot_flags_enumeration = list( if(H != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] has been stabbed in the eye with [src] by [user].", 1) - M << "\red [user] stabs you in the eye with [src]!" - user << "\red You stab [M] in the eye with [src]!" + O.show_message("[M] has been stabbed in the eye with [src] by [user].", 1) + M << "[user] stabs you in the eye with [src]!" + user << "You stab [M] in the eye with [src]!" else user.visible_message( \ - "\red [user] has stabbed themself with [src]!", \ - "\red You stab yourself in the eyes with [src]!" \ + "[user] has stabbed themself with [src]!", \ + "You stab yourself in the eyes with [src]!" \ ) eyes.damage += rand(3,4) if(eyes.damage >= eyes.min_bruised_damage) if(M.stat != 2) if(eyes.robotic <= 1) //robot eyes bleeding might be a bit silly - M << "\red Your eyes start to bleed profusely!" + M << "Your eyes start to bleed profusely!" if(prob(50)) if(M.stat != 2) - M << "\red You drop what you're holding and clutch at your eyes!" + M << "You drop what you're holding and clutch at your eyes!" M.drop_item() M.eye_blurry += 10 M.Paralyse(1) M.Weaken(4) if (eyes.damage >= eyes.min_broken_damage) if(M.stat != 2) - M << "\red You go blind!" + M << "You go blind!" var/obj/item/organ/external/affecting = H.get_organ("head") if(affecting.take_damage(7)) M:UpdateDamageIcon() diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 5847201cde2..4b69e5db7c8 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -22,17 +22,17 @@ var/turf/loc = get_turf(usr) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "\red APC cannot be placed on this spot." + usr << "APC cannot be placed on this spot." return if (A.requires_power == 0 || istype(A, /area/space)) - usr << "\red APC cannot be placed in this area." + usr << "APC cannot be placed in this area." return if (A.get_apc()) - usr << "\red This area already has APC." + usr << "This area already has an APC." return //only one APC per area for(var/obj/machinery/power/terminal/T in loc) if (T.master) - usr << "\red There is another network terminal here." + usr << "There is another network terminal here." return else var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc) diff --git a/code/game/machinery/bees_items.dm b/code/game/objects/items/bees_items.dm similarity index 100% rename from code/game/machinery/bees_items.dm rename to code/game/objects/items/bees_items.dm diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 9ec1a2e144d..17c7d762480 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -48,7 +48,7 @@ var/area/A = get_area() var/text = {"[src]

    [station_name()] blueprints

    -Property of Nanotrasen. For heads of staff only. Store in high-secure storage.
    +Property of [company_name]. For heads of staff only. Store in high-secure storage.
    "} switch (get_area_type()) if (AREA_SPACE) @@ -104,20 +104,20 @@ move an amendment to the drawing.

    if(!istype(res,/list)) switch(res) if(ROOM_ERR_SPACE) - usr << "\red The new area must be completely airtight!" + usr << "The new area must be completely airtight!" return if(ROOM_ERR_TOOLARGE) - usr << "\red The new area too large!" + usr << "The new area too large!" return else - usr << "\red Error! Please notify administration!" + usr << "Error! Please notify administration!" return var/list/turf/turfs = res var/str = sanitizeSafe(input("New area name:","Blueprint Editing", ""), MAX_NAME_LEN) if(!str || !length(str)) //cancel return if(length(str) > 50) - usr << "\red Name too long." + usr << "Name too long." return var/area/A = new A.name = str @@ -153,11 +153,11 @@ move an amendment to the drawing.

    if(!str || !length(str) || str==prevname) //cancel return if(length(str) > 50) - usr << "\red Text too long." + usr << "Text too long." return set_area_machinery_title(A,str,prevname) A.name = str - usr << "\blue You set the area '[prevname]' title to '[str]'." + usr << "You set the area '[prevname]' title to '[str]'." interact() return diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 8953872d938..081767fe6f6 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -39,7 +39,7 @@ close_sound = 'sound/items/zip.ogg' var/item_path = /obj/item/bodybag density = 0 - storage_capacity = (default_mob_size * 2) - 1 + storage_capacity = (MOB_MEDIUM * 2) - 1 var/contains_body = 0 /obj/structure/closet/body_bag/attackby(W as obj, mob/user as mob) @@ -131,5 +131,5 @@ /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)))) if(!ishuman(usr)) return - usr << "\red You can't fold that up anymore.." + usr << "You can't fold that up anymore.." ..() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index a9a7528994f..31bb9160f83 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -68,7 +68,7 @@ /obj/item/weapon/pen/crayon/afterattack(atom/target, mob/user as mob, proximity) if(!proximity) return if(istype(target,/turf/simulated/floor)) - var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter") + var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter","arrow") switch(drawtype) if("letter") drawtype = input("Choose the letter.", "Crayon scribbles") in list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") @@ -77,6 +77,9 @@ user << "You start drawing graffiti on the [target.name]." if("rune") user << "You start drawing a rune on the [target.name]." + if("arrow") + drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down") + user << "You start drawing an arrow on the [target.name]." if(instant || do_after(user, 50)) new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype) user << "You finish drawing." @@ -84,7 +87,7 @@ if(uses) uses-- if(!uses) - user << "\red You used up your crayon!" + user << "You used up your crayon!" qdel(src) return @@ -96,7 +99,7 @@ if(uses) uses -= 5 if(uses <= 0) - user << "\red You ate your crayon!" + user << "You ate your crayon!" qdel(src) else ..() diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 32cca53419c..ee8c237a235 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -11,6 +11,7 @@ var/global/list/obj/item/device/pda/PDAs = list() item_state = "electronic" w_class = 2.0 slot_flags = SLOT_ID | SLOT_BELT + sprite_sheets = list("Resomi" = 'icons/mob/species/resomi/id.dmi') offset_light = 1 diona_restricted_light = 1//Light emitted by this object or creature has limited interaction with diona @@ -752,7 +753,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(!isnull(P)) if (!P.toff && cartridge.charges > 0) cartridge.charges-- - U.show_message("\blue Virus sent!", 1) + U.show_message("Virus sent!", 1) P.honkamt = (rand(15,20)) else U << "PDA not found." @@ -765,7 +766,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(!isnull(P)) if (!P.toff && cartridge.charges > 0) cartridge.charges-- - U.show_message("\blue Virus sent!", 1) + U.show_message("Virus sent!", 1) P.message_silent = 1 P.news_silent = 1 P.ttone = "silence" @@ -793,10 +794,10 @@ var/global/list/obj/item/device/pda/PDAs = list() var/obj/item/device/pda/P = locate(href_list["target"]) var/datum/reception/reception = get_reception(src, P, "", do_sleep = 0) if(!(reception.message_server && reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER)) - U.show_message("\red An error flashes on your [src]: Connection unavailable", 1) + U.show_message("An error flashes on your [src]: Connection unavailable", 1) return if(reception.telecomms_reception & TELECOMMS_RECEPTION_RECEIVER == 0) // Does our recepient have a broadcaster on their level? - U.show_message("\red An error flashes on your [src]: Recipient unavailable", 1) + U.show_message("An error flashes on your [src]: Recipient unavailable", 1) return if(!isnull(P)) if (!P.toff && cartridge.charges > 0) @@ -814,15 +815,15 @@ var/global/list/obj/item/device/pda/PDAs = list() difficulty += 3 if(prob(difficulty)) - U.show_message("\red An error flashes on your [src].", 1) + U.show_message("An error flashes on your [src].", 1) else if (prob(difficulty * 7)) - U.show_message("\red Energy feeds back into your [src]!", 1) + U.show_message("Energy feeds back into your [src]!", 1) ui.close() detonate_act(src) log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up") message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed.", 1) else - U.show_message("\blue Success!", 1) + U.show_message("Success!", 1) log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded") message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded.", 1) detonate_act(P) @@ -939,7 +940,7 @@ var/global/list/obj/item/device/pda/PDAs = list() message += "Your [P] shatters in a thousand pieces!" if(M && isliving(M)) - message = "\red" + message + message = "[message]" M.show_message(message, 1) /obj/item/device/pda/proc/remove_id() @@ -954,8 +955,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1) if(tap) - U.visible_message("[U] taps on \his PDA's screen.") - U.last_target_click = world.time + U.visible_message("\The [U] taps on \his PDA's screen.") var/t = input(U, "Please enter message", P.name, null) as text|null t = sanitize(t) //t = readd_quotes(t) @@ -1153,21 +1153,22 @@ var/global/list/obj/item/device/pda/PDAs = list() if(choice == 1) if (id) remove_id() + return 1 else var/obj/item/I = user.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - user.drop_item() + if (istype(I, /obj/item/weapon/card/id) && user.unEquip(I)) I.loc = src id = I + return 1 else var/obj/item/weapon/card/I = user.get_active_hand() - if (istype(I, /obj/item/weapon/card/id) && I:registered_name) + if (istype(I, /obj/item/weapon/card/id) && I:registered_name && user.unEquip(I)) var/obj/old_id = id - user.drop_item() I.loc = src id = I user.put_in_hands(old_id) - return + return 1 + return 0 // access to status display signals /obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob) @@ -1195,9 +1196,9 @@ var/global/list/obj/item/device/pda/PDAs = list() else //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) - id_check(user, 2) - user << "You put the ID into \the [src]'s slot." - updateSelfDialog()//Update self dialog on success. + if(id_check(user, 2)) + user << "You put the ID into \the [src]'s slot." + updateSelfDialog()//Update self dialog on success. return //Return in case of failed check or when successful. updateSelfDialog()//For the non-input related code. else if(istype(C, /obj/item/device/paicard) && !src.pai) @@ -1223,53 +1224,59 @@ var/global/list/obj/item/device/pda/PDAs = list() if(1) for (var/mob/O in viewers(C, null)) - O.show_message("\red [user] has analyzed [C]'s vitals!", 1) + O.show_message("\The [user] has analyzed [C]'s vitals!", 1) - user.show_message("\blue Analyzing Results for [C]:") - user.show_message("\blue \t Overall Status: [C.stat > 1 ? "dead" : "[C.health - C.halloss]% healthy"]", 1) - user.show_message("\blue \t Damage Specifics: [C.getOxyLoss() > 50 ? "\red" : "\blue"][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "\red" : "\blue"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "\red" : "\blue"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "\red" : "\blue"][C.getBruteLoss()]", 1) - user.show_message("\blue \t Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1) + user.show_message("Analyzing Results for [C]:") + user.show_message(" Overall Status: [C.stat > 1 ? "dead" : "[C.health - C.halloss]% healthy"]", 1) + user.show_message(text(" Damage Specifics: []-[]-[]-[]", + (C.getOxyLoss() > 50) ? "warning" : "", C.getOxyLoss(), + (C.getToxLoss() > 50) ? "warning" : "", C.getToxLoss(), + (C.getFireLoss() > 50) ? "warning" : "", C.getFireLoss(), + (C.getBruteLoss() > 50) ? "warning" : "", C.getBruteLoss() + ), 1) + user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message(" Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1) if(C.tod && (C.stat == DEAD || (C.status_flags & FAKEDEATH))) - user.show_message("\blue \t Time of Death: [C.tod]") + user.show_message(" Time of Death: [C.tod]") if(istype(C, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C var/list/damaged = H.get_damaged_organs(1,1) - user.show_message("\blue Localized Damage, Brute/Burn:",1) + user.show_message("Localized Damage, Brute/Burn:",1) if(length(damaged)>0) for(var/obj/item/organ/external/org in damaged) - user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.name),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1) + user.show_message(text(" []: []-[]", + capitalize(org.name), (org.brute_dam > 0) ? "warning" : "notice", org.brute_dam, (org.burn_dam > 0) ? "warning" : "notice", org.burn_dam),1) else - user.show_message("\blue \t Limbs are OK.",1) + user.show_message(" Limbs are OK.",1) for(var/datum/disease/D in C.viruses) if(!D.hidden[SCANNER]) - user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + user.show_message("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]") if(2) if (!istype(C:dna, /datum/dna)) - user << "\blue No fingerprints found on [C]" + user << "No fingerprints found on [C]" else - user << text("\blue [C]'s Fingerprints: [md5(C:dna.uni_identity)]") + user << text("\The [C]'s Fingerprints: [md5(C:dna.uni_identity)]") if ( !(C:blood_DNA) ) - user << "\blue No blood found on [C]" + user << "No blood found on [C]" if(C:blood_DNA) qdel(C:blood_DNA) else - user << "\blue Blood found on [C]. Analysing..." + user << "Blood found on [C]. Analysing..." spawn(15) for(var/blood in C:blood_DNA) - user << "\blue Blood type: [C:blood_DNA[blood]]\nDNA: [blood]" + user << "Blood type: [C:blood_DNA[blood]]\nDNA: [blood]" if(4) for (var/mob/O in viewers(C, null)) - O.show_message("\red [user] has analyzed [C]'s radiation levels!", 1) + O.show_message("\The [user] has analyzed [C]'s radiation levels!", 1) - user.show_message("\blue Analyzing Results for [C]:") + user.show_message("Analyzing Results for [C]:") if(C.radiation) - user.show_message("\green Radiation Level: \black [C.radiation]") + user.show_message("Radiation Level: [C.radiation]") else - user.show_message("\blue No radiation detected.") + user.show_message("No radiation detected.") /obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) if(!proximity) return @@ -1281,49 +1288,16 @@ var/global/list/obj/item/device/pda/PDAs = list() if(!isnull(A.reagents)) if(A.reagents.reagent_list.len > 0) var/reagents_length = A.reagents.reagent_list.len - user << "\blue [reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." + user << "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." for (var/re in A.reagents.reagent_list) - user << "\blue \t [re]" + user << " [re]" else - user << "\blue No active chemical agents found in [A]." + user << "No active chemical agents found in [A]." else - user << "\blue No significant chemical agents found in [A]." + user << "No significant chemical agents found in [A]." if(5) - if((istype(A, /obj/item/weapon/tank)) || (istype(A, /obj/machinery/portable_atmospherics))) - var/obj/icon = A - for (var/mob/O in viewers(user, null)) - O << "\red [user] has used [src] on \icon[icon] [A]" - var/pressure = A:air_contents.return_pressure() - - var/total_moles = A:air_contents.total_moles - - user << "\blue Results of analysis of \icon[icon]" - if (total_moles>0) - user << "\blue Pressure: [round(pressure,0.1)] kPa" - for(var/g in A:air_contents.gas) - user << "\blue [gas_data.name[g]]: [round((A:air_contents.gas[g] / total_moles) * 100)]%" - user << "\blue Temperature: [round(A:air_contents.temperature-T0C)]°C" - else - user << "\blue Tank is empty!" - - if (istype(A, /obj/machinery/atmospherics/pipe/tank)) - var/obj/icon = A - for (var/mob/O in viewers(user, null)) - O << "\red [user] has used [src] on \icon[icon] [A]" - - var/obj/machinery/atmospherics/pipe/tank/T = A - var/pressure = T.parent.air.return_pressure() - var/total_moles = T.parent.air.total_moles - - user << "\blue Results of analysis of \icon[icon]" - if (total_moles>0) - user << "\blue Pressure: [round(pressure,0.1)] kPa" - for(var/g in T.parent.air.gas) - user << "\blue [gas_data.name[g]]: [round((T.parent.air.gas[g] / total_moles) * 100)]%" - user << "\blue Temperature: [round(T.parent.air.temperature-T0C)]°C" - else - user << "\blue Tank is empty!" + analyze_gases(A, user) if (!scanmode && istype(A, /obj/item/weapon/paper) && owner) // JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents, @@ -1372,7 +1346,7 @@ var/global/list/obj/item/device/pda/PDAs = list() // feature to the PDA, which would better convey the availability of the feature, but this will work for now. // Inform the user - user << "\blue Paper scanned and OCRed to notekeeper." //concept of scanning paper copyright brainoblivion 2009 + user << "Paper scanned and OCRed to notekeeper." //concept of scanning paper copyright brainoblivion 2009 diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 2536308fb7a..7ad2b002009 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -1,6 +1,6 @@ /obj/item/radio/integrated name = "\improper PDA radio module" - desc = "An electronic radio system of nanotrasen origin." + desc = "An electronic radio system." icon = 'icons/obj/module.dmi' icon_state = "power_mod" var/obj/item/device/pda/hostpda = null @@ -221,7 +221,7 @@ if(!radio_controller) return - if (src.frequency < 1441 || src.frequency > 1489) + if (src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ) src.frequency = sanitize_frequency(src.frequency) set_frequency(frequency) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 8084d7a9909..2c514594697 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -6,7 +6,7 @@ w_class = 2.0 slot_flags = SLOT_BELT var/flush = null - origin_tech = "programming=4;materials=4" + origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) var/mob/living/silicon/ai/carded_ai @@ -46,7 +46,7 @@ ui.open() ui.set_auto_update(1) -/obj/item/device/aicard/Topic(href, href_list, nowindow, state) +/obj/item/device/aicard/Topic(href, href_list, state) if(..()) return 1 @@ -59,9 +59,8 @@ if(confirm == "Yes" && (CanUseTopic(user, state) == STATUS_INTERACTIVE)) admin_attack_log(user, carded_ai, "Wiped using \the [src.name]", "Was wiped with \the [src.name]", "used \the [src.name] to wipe") flush = 1 - carded_ai.suiciding = 1 carded_ai << "Your core files are being wiped!" - while (carded_ai && carded_ai.stat != 2) + while (carded_ai && carded_ai.stat != DEAD) carded_ai.adjustOxyLoss(2) carded_ai.updatehealth() sleep(10) @@ -105,12 +104,13 @@ if(istype(ai.loc, /turf/)) new /obj/structure/AIcore/deactivated(get_turf(ai)) + ai.carded = 1 admin_attack_log(user, ai, "Carded with [src.name]", "Was carded with [src.name]", "used the [src.name] to card") src.name = "[initial(name)] - [ai.name]" ai.loc = src - ai.cancel_camera() ai.destroy_eyeobj(src) + ai.cancel_camera() ai.control_disabled = 1 ai.aiRestorePowerRoutine = 0 carded_ai = ai @@ -118,12 +118,16 @@ if(ai.client) ai << "You have been downloaded to a mobile storage device. Remote access lost." if(user.client) - user << "\blue Transfer successful: \black [ai.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + user << "Transfer successful: [ai.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + ai.canmove = 1 update_icon() return 1 /obj/item/device/aicard/proc/clear() + if(carded_ai && istype(carded_ai.loc, /turf)) + carded_ai.canmove = 0 + carded_ai.carded = 0 name = initial(name) carded_ai = null update_icon() @@ -133,10 +137,16 @@ var/rendered = "[text]" carded_ai.show_message(rendered, 2) ..() -/* + +/obj/item/device/aicard/show_message(msg, type, alt, alt_type) + if(carded_ai && carded_ai.client) + var/rendered = "[msg]" + carded_ai.show_message(rendered, type) + ..() + /obj/item/device/aicard/relaymove(var/mob/user, var/direction) - if(src.loc && istype(src.loc.loc, /obj/item/rig_module)) - var/obj/item/rig_module/module = src.loc.loc - if(!module.holder || !direction) - return - module.holder.forced_move(direction)*/ + if(user.stat || user.stunned) + return + var/obj/item/weapon/rig/rig = src.get_rig() + if(istype(rig)) + rig.forced_move(direction, user) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 5a97968e93b..5b694e19184 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -8,7 +8,7 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - origin_tech = "syndicate=4;magnets=4" + origin_tech = list(TECH_ILLEGAL = 4, TECH_MAGNET = 4) var/can_use = 1 var/obj/effect/dummy/chameleon/active_dummy = null var/saved_item = /obj/item/weapon/cigbutt @@ -32,7 +32,7 @@ if(!active_dummy) if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear)) playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6) - user << "\blue Scanned [target]." + user << "Scanned [target]." saved_item = target.type saved_icon = target.icon saved_icon_state = target.icon_state @@ -45,7 +45,7 @@ playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) qdel(active_dummy) active_dummy = null - usr << "\blue You deactivate the [src]." + usr << "You deactivate the [src]." var/obj/effect/overlay/T = PoolOrNew(/obj/effect/overlay, get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -57,7 +57,7 @@ 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) qdel(O) - usr << "\blue You activate the [src]." + usr << "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) @@ -104,22 +104,22 @@ /obj/effect/dummy/chameleon/attackby() for(var/mob/M in src) - M << "\red Your chameleon-projector deactivates." + M << "Your chameleon-projector deactivates." master.disrupt() /obj/effect/dummy/chameleon/attack_hand() for(var/mob/M in src) - M << "\red Your chameleon-projector deactivates." + M << "Your chameleon-projector deactivates." master.disrupt() /obj/effect/dummy/chameleon/ex_act() for(var/mob/M in src) - M << "\red Your chameleon-projector deactivates." + M << "Your chameleon-projector deactivates." master.disrupt() /obj/effect/dummy/chameleon/bullet_act() for(var/mob/M in src) - M << "\red Your chameleon-projector deactivates." + M << "Your chameleon-projector deactivates." ..() master.disrupt() diff --git a/code/game/objects/items/devices/debugger.dm b/code/game/objects/items/devices/debugger.dm index 6f812aacb71..9072e4cc7e4 100644 --- a/code/game/objects/items/devices/debugger.dm +++ b/code/game/objects/items/devices/debugger.dm @@ -19,28 +19,28 @@ matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) - origin_tech = "magnets=1;engineering=1" + origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage /obj/item/device/debugger/is_used_on(obj/O, mob/user) if(istype(O, /obj/machinery/power/apc)) var/obj/machinery/power/apc/A = O if(A.emagged || A.hacker) - user << "\red There is a software error with the device." + user << "There is a software error with the device." else - user << "\blue The device's software appears to be fine." + user << "The device's software appears to be fine." return 1 if(istype(O, /obj/machinery/door)) var/obj/machinery/door/D = O if(D.operating == -1) - user << "\red There is a software error with the device." + user << "There is a software error with the device." else - user << "\blue The device's software appears to be fine." + user << "The device's software appears to be fine." return 1 else if(istype(O, /obj/machinery)) var/obj/machinery/A = O if(A.emagged) - user << "\red There is a software error with the device." + user << "There is a software error with the device." else - user << "\blue The device's software appears to be fine." + user << "The device's software appears to be fine." return 1 diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 74958d0f57f..909e5f7211c 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -8,7 +8,7 @@ throw_speed = 4 throw_range = 10 flags = CONDUCT - origin_tech = "magnets=2;combat=1" + origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1) var/times_used = 0 //Number of times it's been used. var/broken = 0 //Is the flash burnt out? @@ -16,7 +16,7 @@ /obj/item/device/flash/proc/clown_check(var/mob/user) if(user && (CLUMSY in user.mutations) && prob(50)) - user << "\red \The [src] slips out of your hand." + user << "\The [src] slips out of your hand." user.drop_item() return 0 return 1 @@ -31,14 +31,17 @@ last_used = world.time times_used = max(0,round(times_used)) //sanity - -/obj/item/device/flash/attack(mob/living/M as mob, mob/user as mob) +//attack_as_weapon +/obj/item/device/flash/attack(mob/living/M, mob/living/user, var/target_zone) if(!user || !M) return //sanity M.attack_log += text("\[[time_stamp()]\] Has been flashed (attempt) with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to flash [M.name] ([M.ckey])") msg_admin_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey]) (JMP)") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + if(!clown_check(user)) return if(broken) user << "\The [src] is broken." @@ -151,6 +154,9 @@ /obj/item/device/flash/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) if(!user || !clown_check(user)) return + + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(broken) user.show_message("The [src.name] is broken", 2) return @@ -189,8 +195,8 @@ for(var/obj/item/weapon/cloaking_device/S in M) S.active = 0 S.icon_state = "shield0" - var/safety = M:eyecheck() - if(!safety) + var/safety = M.eyecheck() + if(safety < FLASH_PROTECTION_MODERATE) if(!M.blinded) flick("flash", M.flash) @@ -209,7 +215,7 @@ if(istype(loc, /mob/living/carbon)) var/mob/living/carbon/M = loc var/safety = M.eyecheck() - if(safety <= 0) + if(safety < FLASH_PROTECTION_MODERATE) M.Weaken(10) flick("e_flash", M.flash) for(var/mob/O in viewers(M, null)) @@ -220,20 +226,19 @@ name = "synthetic flash" desc = "When a problem arises, SCIENCE is the solution." icon_state = "sflash" - origin_tech = "magnets=2;combat=1" - var/construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=750) - var/construction_time=100 + origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1) -/obj/item/device/flash/synthetic/attack(mob/living/M as mob, mob/user as mob) +//attack_as_weapon +/obj/item/device/flash/synthetic/attack(mob/living/M, mob/living/user, var/target_zone) ..() if(!broken) broken = 1 - user << "\red The bulb has burnt out!" + user << "The bulb has burnt out!" icon_state = "flashburnt" /obj/item/device/flash/synthetic/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) ..() if(!broken) broken = 1 - user << "\red The bulb has burnt out!" + user << "The bulb has burnt out!" icon_state = "flashburnt" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 362155cf3c3..ee56196506c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -12,7 +12,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) - icon_action_button = "action_flashlight" + action_button_name = "Toggle Flashlight" var/on = 0 var/brightness_on = 4 //luminosity when on @@ -34,6 +34,7 @@ return 0 on = !on update_icon() + user.update_action_buttons() return 1 @@ -44,38 +45,45 @@ if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity - user << "You don't have the dexterity to do this!" - return - var/mob/living/carbon/human/H = M //mob has protective eyewear - if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))) - user << "You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first." - return + if(istype(H)) + for(var/obj/item/clothing/C in list(H.head,H.wear_mask,H.glasses)) + if(istype(C) && (C.body_parts_covered & EYES)) + user << "You're going to need to remove [C.name] first." + return - if(M == user) //they're using it on themselves - if(!M.blinded) - flick("flash", M.flash) - M.visible_message("[M] directs [src] to \his eyes.", \ - "You wave the light in front of your eyes! Trippy!") - else - M.visible_message("[M] directs [src] to \his eyes.", \ - "You wave the light in front of your eyes.") - return + var/obj/item/organ/vision + if(H.species.vision_organ) + vision = H.internal_organs_by_name[H.species.vision_organ] + if(!vision) + user << "You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!" - user.visible_message("[user] directs [src] to [M]'s eyes.", \ - "You direct [src] to [M]'s eyes.") + user.visible_message("\The [user] directs [src] to [M]'s eyes.", \ + "You direct [src] to [M]'s eyes.") + if(H == user) //can't look into your own eyes buster + if(M.stat == DEAD || M.blinded) //mob is dead or fully blind + user << "\The [M]'s pupils do not react to the light!" + return + if(XRAY in M.mutations) + user << "\The [M] pupils give an eerie glow!" + if(vision.damage) + user << "There's visible damage to [M]'s [vision.name]!" + else if(M.eye_blurry) + user << "\The [M]'s pupils react slower than normally." + if(M.getBrainLoss() > 15) + user << "There's visible lag between left and right pupils' reactions." - if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected - if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind - user << "[M] pupils does not react to the light!" - else if(XRAY in M.mutations) //mob has X-RAY vision - flick("flash", M.flash) //Yes, you can still get flashed wit X-Ray. - user << "[M] pupils give an eerie glow!" - else //they're okay! - if(!M.blinded) - flick("flash", M.flash) //flash the affected mob - user << "[M]'s pupils narrow." + var/list/pinpoint = list("oxycodone"=1,"tramadol"=5) + var/list/dilating = list("space_drugs"=5,"mindbreaker"=1) + if(M.reagents.has_any_reagent(pinpoint) || H.ingested.has_any_reagent(pinpoint)) + user << "\The [M]'s pupils are already pinpoint and cannot narrow any more." + else if(M.reagents.has_any_reagent(dilating) || H.ingested.has_any_reagent(dilating)) + user << "\The [M]'s pupils narrow slightly, but are still very dilated." + else + user << "\The [M]'s pupils narrow." + + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively + flick("flash", M.flash) else return ..() @@ -155,14 +163,14 @@ /obj/item/device/flashlight/flare name = "flare" - desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'." + desc = "A red standard-issue flare. There are instructions on the side reading 'pull cord, make light'." w_class = 2.0 brightness_on = 8 // Pretty bright. light_power = 3 light_color = "#e58775" icon_state = "flare" item_state = "flare" - icon_action_button = null //just pull it manually, neckbeard. + action_button_name = null //just pull it manually, neckbeard. var/fuel = 0 var/on_damage = 7 var/produce_heat = 1500 diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index b5b19e4f672..5f4fce8e6e4 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -4,212 +4,153 @@ icon_state = "labeler1" item_state = "flight" - var/mode_nice = "standard" - var/mode = "floor" - var/tile_dir_mode = 0 + var/decal = "remove all decals" + var/paint_dir = "precise" + var/paint_colour = COLOR_WHITE - // mode 0 ignore direction; sets dir=0 - // mode 1 all-direction - // mode 2 corner selecting the side CW from the selected corner - // mode 3 cardinal - // mode 4 warningcorner and warnwhitecorner direction fix - // mode 5 Opposite corner tiles where the second icon_state is "[mode]_inv" -/obj/item/device/floor_painter/afterattack(atom/A, mob/user as mob, proximity) + var/list/decals = list( + "quarter-turf" = list("path" = /obj/effect/floor_decal/corner, "precise" = 1, "coloured" = 1), + "hazard stripes" = list("path" = /obj/effect/floor_decal/industrial/warning), + "corner, hazard" = list("path" = /obj/effect/floor_decal/industrial/warning/corner), + "hatched marking" = list("path" = /obj/effect/floor_decal/industrial/hatch, "coloured" = 1), + "dotted outline" = list("path" = /obj/effect/floor_decal/industrial/outline, "coloured" = 1), + "loading sign" = list("path" = /obj/effect/floor_decal/industrial/loading), + "1" = list("path" = /obj/effect/floor_decal/sign), + "2" = list("path" = /obj/effect/floor_decal/sign/two), + "A" = list("path" = /obj/effect/floor_decal/sign/a), + "B" = list("path" = /obj/effect/floor_decal/sign/b), + "C" = list("path" = /obj/effect/floor_decal/sign/c), + "D" = list("path" = /obj/effect/floor_decal/sign/d), + "Ex" = list("path" = /obj/effect/floor_decal/sign/ex), + "M" = list("path" = /obj/effect/floor_decal/sign/m), + "CMO" = list("path" = /obj/effect/floor_decal/sign/cmo), + "V" = list("path" = /obj/effect/floor_decal/sign/v), + "Psy" = list("path" = /obj/effect/floor_decal/sign/p), + "remove all decals" = list("path" = /obj/effect/floor_decal/reset) + ) + var/list/paint_dirs = list( + "north" = NORTH, + "northwest" = NORTHWEST, + "west" = WEST, + "southwest" = SOUTHWEST, + "south" = SOUTH, + "southeast" = SOUTHEAST, + "east" = EAST, + "northeast" = NORTHEAST, + "precise" = 0 + ) + +/obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params) if(!proximity) return - if(istype(A, /turf/simulated/floor)) - var/turf/simulated/floor/F = A + var/turf/simulated/floor/F = A + if(!istype(F)) + user << "\The [src] can only be used on station flooring." + return - if(!is_type_in_list(F, subtypesof(/turf/simulated/floor))) // only tiled floors - if(tile_dir_mode) - var/D = get_dir(usr, F) - if(usr.loc == F) - D = usr.dir + if(!F.flooring || !F.flooring.can_paint || F.broken || F.burnt) + user << "\The [src] cannot paint broken or missing tiles." + return - switch(tile_dir_mode) - if(1) // All directions accepted - F.set_dir(D) - F.icon_state = mode - if(2) // Corner mode - diagonal directions converted CW around. - switch(D) - if(NORTHEAST) - D = EAST - if(SOUTHEAST) - D = SOUTH - if(SOUTHWEST) - D = WEST - if(NORTHWEST) - D = NORTH - F.set_dir(D) - F.icon_state = mode - if(3) // cardinal directions only. I've adjusted diagonals the same way the facing code does. - switch(D) - if(NORTHEAST) - D = EAST - if(SOUTHEAST) - D = EAST - if(SOUTHWEST) - D = WEST - if(NORTHWEST) - D = WEST - F.set_dir(D) - F.icon_state = mode - if(4) // floors.dmi icon_states "warningcorner" and "warnwhitecorner" are incorrect, this fixes it - var/D2 - switch(D) - if(NORTHEAST) - D2 = WEST - if(SOUTHEAST) - D2 = SOUTH - if(SOUTHWEST) - D2 = NORTH - if(NORTHWEST) - D2 = EAST - F.set_dir(D2) - F.icon_state = mode - if(5) - F.set_dir(0) - if(D == NORTH || D == SOUTH || D == NORTHEAST || D == SOUTHWEST) - F.icon_state = mode - else - F.icon_state = "[mode]_inv" - else - F.set_dir(0) - F.icon_state = mode + var/list/decal_data = decals[decal] + var/config_error + if(!islist(decal_data)) + config_error = 1 + var/painting_decal + if(!config_error) + painting_decal = decal_data["path"] + if(!ispath(painting_decal)) + config_error = 1 + + if(config_error) + user << "\The [src] flashes an error light. You might need to reconfigure it." + return + + if(F.decals && F.decals.len > 5 && painting_decal != /obj/effect/floor_decal/reset) + user << "\The [F] has been painted too much; you need to clear it off." + return + + var/painting_dir = 0 + if(paint_dir == "precise") + if(!decal_data["precise"]) + painting_dir = user.dir else - usr << "You can't paint that!" - -/obj/item/device/floor_painter/attack_self(mob/user as mob) - var/type = input("What type of floor?", "Floor painter", "solid") in list("solid", "corner", "opposite corners", "side/three corners", "special", "letters") - - tile_dir_mode = 0 - - switch(type) - if("solid") - tile_dir_mode = 0 - var/design = input("Which color?", "Floor painter") in list("standard", "dark", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple", "freezer", "hydro", "showroom") - if(design == "standard") - mode = "floor" - mode_nice = "standard" - return - if(design == "white") - 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 - return - mode_nice = design - mode = "[replacetext(design, "-", "")]full" - if("corner") - var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") - mode_nice = "[design] corner" - mode = "[replacetext(design, "-", "")]corner" - tile_dir_mode = 2 - if("opposite corners") - var/design = input("Which design?", "Floor painter") in list("bar", "cmo", "yellowpatch", "cafeteria", "red-yellow", "red-blue", "red-green", "green-yellow", "green-blue", "blue-yellow") - mode_nice = design - if(design == "bar" || design == "cmo" || design == "yellowpatch" || design == "cafeteria") - mode = design - else - mode = "[replacetext(design, "-", "")]full" - if(design == "yellowpatch") - tile_dir_mode = 5 - else - tile_dir_mode = 0 - if("side/three corners") - var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple", "red-yellow", "red-blue", "blue-red", "red-green", "green-yellow", "green-blue", "blue-yellow") - if(design == "white") - mode = "whitehall" - mode_nice = "white side" - else if(design == "black") // because SOMEONE made the black/grey side/corner sprite have the same name as the 'empty space' sprite :( - mode = "blackfloor" - mode_nice = design - else - mode_nice = design - mode = replacetext(design, "-", "") - tile_dir_mode = 1 - if("special") - var/design = input("Which design?", "Floor painter") in list("arrival", "escape", "caution", "warning", "white-warning", "white-blue-green", "loadingarea", "delivery", "bot", "white-delivery", "white-bot") - if(design == "white-blue-green") - mode_nice = design - mode = "whitebluegreencorners" - tile_dir_mode = 2 - else if(design == "delivery" || design == "bot" || design == "white-delivery" || design == "white-bot") - mode_nice = design - mode = replacetext(design, "-", "") - tile_dir_mode = 0 - else if(design == "loadingarea") - mode_nice = design - mode = design - tile_dir_mode = 3 - else - if(design == "white-warning") - mode_nice = design - design = "warnwhite" - var/s_corner = alert("Do you want to paint a single corner of the tile?", "Floor painter","Yes","No") == "Yes" - if(s_corner) - mode_nice = "[design] corner" - mode = "[design]corner" - if(design == "warning" || design == "white-warning") // sprites for these are weird, need to fix dirs (icons/turf/floors.dmi, "warningcorner" and "warnwhitecorner") - tile_dir_mode = 4 + var/list/mouse_control = params2list(params) + var/mouse_x = text2num(mouse_control["icon-x"]) + var/mouse_y = text2num(mouse_control["icon-y"]) + if(isnum(mouse_x) && isnum(mouse_y)) + if(mouse_x <= 16) + if(mouse_y <= 16) + painting_dir = WEST else - tile_dir_mode = 2 + painting_dir = NORTH else - mode_nice = design - mode = design - tile_dir_mode = 1 - if("letters") - var/which = input("Which letters/design?", "Floor painter") in list("A1", "A2", "DI", "SA", "SA (red)", "SB", "SB (red)", "SC", "SC (red)", "W (red)", "V (green)", "Psy", "Ex", "Ex (blue)", "CMO", "O (OP)", "P (OP)") - mode_nice = which - switch(which) - if("A1") - mode = "white_1" - if("A2") - mode = "white_2" - if("DI") - mode = "white_d" - if("SA") - mode = "white_a" - if("SA (red)") - mode = "whitered_a" - tile_dir_mode = 3 - if("SB") - mode = "white_b" - if("SB (red)") - mode = "whitered_b" - tile_dir_mode = 3 - if("SC") - mode = "white_c" - if("SC (red)") - mode = "whitered_c" - tile_dir_mode = 3 - if("W (red)") - mode = "whitered_w" - tile_dir_mode = 3 - if("V (green)") - mode = "whitegreen_v" - tile_dir_mode = 3 - if("Psy") - mode = "white_p" - if("Ex") - mode = "white_ex" - if("Ex (blue)") - mode = "whiteblue_ex" - tile_dir_mode = 3 - if("CMO") // yes this is also in "opposite corners" choices, but it's a different icon_state (!!) - mode = "white_cmo" - if("O (OP)") - mode = "white_halfo" - if("P (OP)") - mode = "white_halfp" + if(mouse_y <= 16) + painting_dir = SOUTH + else + painting_dir = EAST + else + painting_dir = user.dir + else if(paint_dirs[paint_dir]) + painting_dir = paint_dirs[paint_dir] + + var/painting_colour + if(decal_data["coloured"] && paint_colour) + painting_colour = paint_colour + + new painting_decal(F, painting_dir, painting_colour) + +/obj/item/device/floor_painter/attack_self(var/mob/user) + var/choice = input("Do you wish to change the decal type, paint direction, or paint colour?") as null|anything in list("Decal","Direction", "Colour") + if(choice == "Decal") + choose_decal() + else if(choice == "Direction") + choose_direction() + else if(choice == "Colour") + choose_colour() /obj/item/device/floor_painter/examine(mob/user) ..(user) - user << "It is in [mode_nice] mode." + user << "It is configured to produce the '[decal]' decal with a direction of '[paint_dir]' using [paint_colour] paint." + +/obj/item/device/floor_painter/verb/choose_colour() + set name = "Choose Colour" + set desc = "Choose a floor painter colour." + set category = "Object" + set src in usr + + if(usr.incapacitated()) + return + var/new_colour = input(usr, "Choose a colour.", "Floor painter", paint_colour) as color|null + if(new_colour && new_colour != paint_colour) + paint_colour = new_colour + usr << "You set \the [src] to paint with a new colour." + +/obj/item/device/floor_painter/verb/choose_decal() + set name = "Choose Decal" + set desc = "Choose a floor painter decal." + set category = "Object" + set src in usr + + if(usr.incapacitated()) + return + + var/new_decal = input("Select a decal.") as null|anything in decals + if(new_decal && !isnull(decals[new_decal])) + decal = new_decal + usr << "You set \the [src] decal to '[decal]'." + +/obj/item/device/floor_painter/verb/choose_direction() + set name = "Choose Direction" + set desc = "Choose a floor painter direction." + set category = "Object" + set src in usr + + if(usr.incapacitated()) + return + + var/new_dir = input("Select a direction.") as null|anything in paint_dirs + if(new_dir && !isnull(paint_dirs[new_dir])) + paint_dir = new_dir + usr << "You set \the [src] direction to '[paint_dir]'." diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm new file mode 100644 index 00000000000..0db8f693dec --- /dev/null +++ b/code/game/objects/items/devices/hacktool.dm @@ -0,0 +1,100 @@ +/obj/item/device/multitool/hacktool + var/is_hacking = 0 + var/max_known_targets + + var/in_hack_mode = 0 + var/list/known_targets + var/list/supported_types + var/datum/topic_state/default/must_hack/hack_state + +/obj/item/device/multitool/hacktool/New() + ..() + known_targets = list() + max_known_targets = 5 + rand(1,3) + supported_types = list(/obj/machinery/door/airlock) + hack_state = new(src) + +/obj/item/device/multitool/hacktool/Destroy() + for(var/T in known_targets) + var/atom/target = T + destroyed_event.unregister(target, src) + known_targets.Cut() + qdel(hack_state) + hack_state = null + return ..() + +/obj/item/device/multitool/hacktool/attackby(var/obj/W, var/mob/user) + if(isscrewdriver(W)) + in_hack_mode = !in_hack_mode + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + else + ..() + +/obj/item/device/multitool/hacktool/resolve_attackby(atom/A, mob/user) + sanity_check() + + if(!in_hack_mode) + return ..() + + if(!attempt_hack(user, A)) + return 0 + + A.ui_interact(user, state = hack_state) + return 1 + +/obj/item/device/multitool/hacktool/proc/attempt_hack(var/mob/user, var/atom/target) + if(is_hacking) + user << "You are already hacking!" + return 0 + if(!is_type_in_list(target, supported_types)) + user << "\icon[src] Unable to hack this target!" + return 0 + var/found = known_targets.Find(target) + if(found) + known_targets.Swap(1, found) // Move the last hacked item first + return 1 + + user << "You begin hacking \the [target]..." + is_hacking = 1 + // On average hackin takes ~30 seconds. Fairly small random span to avoid people simply aborting and trying again + var/hack_result = do_after(user, (20 SECONDS + rand(0, 10 SECONDS) + rand(0, 10 SECONDS))) + is_hacking = 0 + + if(hack_result && in_hack_mode) + user << "Your hacking attempt was succesful!" + playsound(src.loc, 'sound/piano/A#6.ogg', 75) + else + user << "Your hacking attempt failed!" + return 0 + + known_targets.Insert(1, target) // Insert the newly hacked target first, + destroyed_event.register(target, src, /obj/item/device/multitool/hacktool/proc/on_target_destroy) + return 1 + +/obj/item/device/multitool/hacktool/proc/sanity_check() + if(max_known_targets < 1) max_known_targets = 1 + // Cut away the oldest items if the capacity has been reached + if(known_targets.len > max_known_targets) + for(var/i = (max_known_targets + 1) to known_targets.len) + var/atom/A = known_targets[i] + destroyed_event.unregister(A, src) + known_targets.Cut(max_known_targets + 1) + +/obj/item/device/multitool/hacktool/proc/on_target_destroy(var/target) + known_targets -= target + +/datum/topic_state/default/must_hack + var/obj/item/device/multitool/hacktool/hacktool + +/datum/topic_state/default/must_hack/New(var/hacktool) + src.hacktool = hacktool + ..() + +/datum/topic_state/default/must_hack/Destroy() + hacktool = null + return ..() + +/datum/topic_state/default/must_hack/can_use_topic(var/src_object, var/mob/user) + if(!hacktool || !hacktool.in_hack_mode || !(src_object in hacktool.known_targets)) + return STATUS_CLOSE + return ..() diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 35f44867758..acfc7d38acb 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -15,7 +15,7 @@ // // HOW TO REFILL THE DEVICE // -// It will need to be manually refilled with lights. This can be done by using it on a boxful of lights +// It can be manually refilled or by clicking on a storage item containing lights. // If it's part of a robot module, it will charge when the Robot is inside a Recharge Station. // // EMAGGED FEATURES @@ -41,7 +41,7 @@ /obj/item/device/lightreplacer name = "light replacer" - desc = "A device to automatically replace lights. Refill with working lightbulbs." + desc = "A device to automatically replace lights. Refill with working lightbulbs or sheets of glass." icon = 'icons/obj/tools/lightreplacer.dmi' icon_state = "lightreplacer" @@ -50,7 +50,7 @@ flags = CONDUCT slot_flags = SLOT_BELT - origin_tech = "magnets=3;materials=2" + origin_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 2) var/max_uses = 20 var/uses = 10 @@ -83,14 +83,10 @@ user << "It is storing [stored()]/[max_stored] broken lights." /obj/item/device/lightreplacer/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/weapon/card/emag) && emagged == 0) - Emag() - return - if(istype(W, /obj/item/stack/material) && W.get_material_name() == "glass") var/obj/item/stack/G = W if(uses >= max_uses) - user << "[src.name] is full." + user << "[src.name] is full." return else if(G.use(5)) AddUses(2) @@ -106,7 +102,7 @@ if(L.status == 0) // LIGHT OKAY if(uses < max_uses) AddUses(1) - user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining." + user << "You insert \the [L.name] into \the [src.name]. You have [uses] light\s remaining." user.drop_item() qdel(L) return @@ -175,6 +171,9 @@ */ usr << "It has [uses] lights remaining." +/obj/item/device/lightreplacer/update_icon() + icon_state = "lightreplacer[emagged]" + /obj/item/device/lightreplacer/proc/Use(var/mob/user) @@ -244,14 +243,11 @@ U << "There is a working [target.fitting] already inserted." return -/obj/item/device/lightreplacer/proc/Emag() +/obj/item/device/lightreplacer/emag_act(var/remaining_charges, var/mob/user) emagged = !emagged playsound(src.loc, "sparks", 100, 1) - if(emagged) - name = "Shortcircuited [initial(name)]" - else - name = initial(name) update_icon() + return 1 //Can you use it? diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 53fac1be056..0357a8b80b6 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -14,15 +14,15 @@ /obj/item/device/megaphone/attack_self(mob/living/user as mob) if (user.client) if(user.client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (muted)." + src << "You cannot speak in IC (muted)." return if(!ishuman(user)) - user << "\red You don't know how to use this!" + user << "You don't know how to use this!" return if(user.silent) return if(spamcheck) - user << "\red \The [src] needs to recharge!" + user << "\The [src] needs to recharge!" return var/message = sanitize(input(user, "Shout a message?", "Megaphone", null) as text) @@ -36,7 +36,7 @@ O.show_message("[user] broadcasts, \"[pick(insultmsg)]\"",2) // 2 stands for hearable message insults-- else - user << "\red *BZZZZzzzzzt*" + user << "*BZZZZzzzzzt*" else for(var/mob/O in (viewers(user))) O.show_message("[user] broadcasts, \"[message]\"",2) // 2 stands for hearable message @@ -46,10 +46,9 @@ spamcheck = 0 return -/obj/item/device/megaphone/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/card/emag) && !emagged) - user << "\red You overload \the [src]'s voice synthesizer." +/obj/item/device/megaphone/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + user << "You overload \the [src]'s voice synthesizer." emagged = 1 insults = rand(1, 3)//to prevent dickflooding - return - return + return 1 diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index d01fbf3727e..c44014f5b4b 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -49,7 +49,7 @@ playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user.visible_message("\red [user] opens \the [src] and modifies \the [O].","\red You open \the [src] and modify \the [O].") + user.visible_message("\The [user] opens \the [src] and modifies \the [O].","You open \the [src] and modify \the [O].") I.refit_for_species(target_species) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index b876fbd27a8..22b026435a2 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -18,6 +18,56 @@ matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) - origin_tech = "magnets=1;engineering=1" - var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage - var/obj/machinery/clonepod/connecting //same for cryopod linkage \ No newline at end of file + origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) + + var/obj/machinery/buffer // simple machine buffer for device linkage + var/obj/machinery/clonepod/connecting //same for cryopod linkage + var/buffer_name + var/atom/buffer_object + +/obj/item/device/multitool/Destroy() + unregister_buffer(buffer_object) + return ..() + +/obj/item/device/multitool/proc/get_buffer(var/typepath) + // Only allow clearing the buffer name when someone fetches the buffer. + // Means you cannot be sure the source hasn't been destroyed until the very moment it's needed. + get_buffer_name(TRUE) + if(buffer_object && (!typepath || istype(buffer_object, typepath))) + return buffer_object + +/obj/item/device/multitool/proc/get_buffer_name(var/null_name_if_missing = FALSE) + if(buffer_object) + buffer_name = buffer_object.name + else if(null_name_if_missing) + buffer_name = null + return buffer_name + +/obj/item/device/multitool/proc/set_buffer(var/atom/buffer) + if(!buffer || istype(buffer)) + buffer_name = buffer ? buffer.name : null + if(buffer != buffer_object) + unregister_buffer(buffer_object) + buffer_object = buffer + if(buffer_object) + destroyed_event.register(buffer_object, src, /obj/item/device/multitool/proc/unregister_buffer) + +/obj/item/device/multitool/proc/unregister_buffer(var/atom/buffer_to_unregister) + // Only remove the buffered object, don't reset the name + // This means one cannot know if the buffer has been destroyed until one attempts to use it. + if(buffer_to_unregister == buffer_object && buffer_object) + destroyed_event.unregister(buffer_object, src) + buffer_object = null + +/obj/item/device/multitool/resolve_attackby(atom/A, mob/user) + if(!isobj(A)) + return ..(A, user) + + var/obj/O = A + var/datum/expansion/multitool/MT = O.expansions[/datum/expansion/multitool] + if(!MT) + return ..(A, user) + + user.AddTopicPrint(src) + MT.interact(src, user) + return 1 diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 8306c5f06e6..dae84ab1de5 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -5,18 +5,17 @@ item_state = "electronic" w_class = 2.0 slot_flags = SLOT_BELT - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) var/obj/item/device/radio/radio var/looking_for_personality = 0 var/mob/living/silicon/pai/pai - -/*/obj/item/device/paicard/relaymove(var/mob/user, var/direction) - if(src.loc && istype(src.loc.loc, /obj/item/rig_module)) - var/obj/item/rig_module/module = src.loc.loc - if(!module.holder || !direction) - return - module.holder.forced_move(direction)*/ +/obj/item/device/paicard/relaymove(var/mob/user, var/direction) + if(user.stat || user.stunned) + return + var/obj/item/weapon/rig/rig = src.get_rig() + if(istype(rig)) + rig.forced_move(direction, user) /obj/item/device/paicard/New() ..() @@ -225,7 +224,7 @@
    "} - else + else //
    dat += "Radio Uplink
    " dat += "Radio firmware not loaded. Please install a pAI personality to load firmware.
    " dat += {" @@ -354,7 +353,7 @@ /obj/item/device/paicard/proc/alertUpdate() var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) - M.show_message("\blue [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\blue [src] bleeps electronically.", 2) + M.show_message("\The [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\The [src] bleeps electronically.", 2) /obj/item/device/paicard/emp_act(severity) for(var/mob/M in src) @@ -393,4 +392,10 @@ if (istype(loc, /mob)) slotnumber = get_equip_slot() - report_onmob_location(1, slotnumber, pai) \ No newline at end of file + report_onmob_location(1, slotnumber, pai) + +/obj/item/device/paicard/show_message(msg, type, alt, alt_type) + if(pai && pai.client) + var/rendered = "[msg]" + pai.show_message(rendered, type) + ..() diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 81058067e18..ccba1fc168b 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -16,16 +16,11 @@ /obj/item/device/pipe_painter/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) return - + if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/tank) || istype(A,/obj/machinery/atmospherics/pipe/vent) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated) || !in_range(user, A)) return var/obj/machinery/atmospherics/pipe/P = A - var/turf/T = P.loc - if (P.level < 2 && T.level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return - P.change_color(pipe_colors[mode]) /obj/item/device/pipe_painter/attack_self(mob/user as mob) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 78519398995..a7210721c82 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -13,7 +13,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 750,"waste" = 750) - origin_tech = "powerstorage=3;syndicate=5" + origin_tech = list(TECH_POWER = 3, TECH_ILLEGAL = 5) var/drain_rate = 1500000 // amount of power to drain per tick var/apc_drain_rate = 5000 // Max. amount drained from single APC. In Watts. var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts. @@ -34,7 +34,7 @@ if(istype(I, /obj/item/weapon/screwdriver)) if(mode == 0) var/turf/T = loc - if(isturf(T) && !T.intact) + if(isturf(T) && !!T.is_plating()) attached = locate() in T if(!attached) user << "No exposed cable here to attach to." diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 32807250d77..7d41e25bc47 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -4,7 +4,7 @@ icon_state = "beacon" item_state = "signaler" var/code = "electronic" - origin_tech = "bluespace=1" + origin_tech = list(TECH_BLUESPACE = 1) /obj/item/device/radio/beacon/hear_talk() return @@ -38,11 +38,11 @@ /obj/item/device/radio/beacon/syndicate name = "suspicious beacon" desc = "A label on it reads: Activate to have a singularity beacon teleported to your location." - origin_tech = "bluespace=1;syndicate=7" + origin_tech = list(TECH_BLUESPACE = 1, TECH_ILLEGAL = 7) /obj/item/device/radio/beacon/syndicate/attack_self(mob/user as mob) if(user) - user << "\blue Locked In" + user << "Locked In" new /obj/machinery/power/singularity_beacon/syndicate( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index f2fa534b317..d6c3f5870b7 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -1,6 +1,6 @@ /obj/item/device/encryptionkey/ - name = "standard encrpytion key" + name = "standard encryption key" desc = "An encryption key for a radio headset. Contains cypherkeys." icon = 'icons/obj/radio.dmi' icon_state = "cypherkey" @@ -13,21 +13,18 @@ var/syndie = 0 var/list/channels = list() - -/obj/item/device/encryptionkey/New() - /obj/item/device/encryptionkey/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/item/device/encryptionkey/syndicate icon_state = "cypherkey" channels = list("Mercenary" = 1) - origin_tech = "syndicate=3" + origin_tech = list(TECH_ILLEGAL = 3) syndie = 1//Signifies that it de-crypts Syndicate transmissions /obj/item/device/encryptionkey/binary icon_state = "cypherkey" translate_binary = 1 - origin_tech = "syndicate=3" + origin_tech = list(TECH_ILLEGAL = 3) /obj/item/device/encryptionkey/hivenet name = "hivenet encryption chip" @@ -106,6 +103,8 @@ name = "head of personnel's encryption key" icon_state = "hop_cypherkey" channels = list("Supply" = 1, "Service" = 1, "Command" = 1, "Security" = 0) + + /* /obj/item/device/encryptionkey/headset_mine name = "mining radio encryption key" @@ -128,5 +127,9 @@ channels = list("Service" = 1) /obj/item/device/encryptionkey/ert - name = "\improper NanoTrasen ERT radio encryption key" + name = "\improper ERT radio encryption key" channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1) + +/obj/item/device/encryptionkey/entertainment + name = "entertainment radio key" + channels = list("Entertainment" = 1) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 8ecbe820b52..2e10eb1624c 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -14,13 +14,15 @@ var/translate_hivenet = 0 var/obj/item/device/encryptionkey/keyslot1 = null var/obj/item/device/encryptionkey/keyslot2 = null - maxf = 1489 var/ks1type = /obj/item/device/encryptionkey var/ks2type = null + sprite_sheets = list("Resomi" = 'icons/mob/species/resomi/ears.dmi') + /obj/item/device/radio/headset/New() ..() + internal_channels.Cut() if(ks1type) keyslot1 = new ks1type(src) if(ks2type) @@ -32,13 +34,16 @@ qdel(keyslot2) keyslot1 = null keyslot2 = null - ..() + return ..() + +/obj/item/device/radio/headset/list_channels(var/mob/user) + return list_secure_channels() /obj/item/device/radio/headset/examine(mob/user) if(!(..(user, 1) && radio_desc)) return - user << "The following channels are built-in:" + user << "The following channels are available:" user << radio_desc /obj/item/device/radio/headset/handle_message_mode(mob/living/M as mob, message, channel) @@ -70,12 +75,12 @@ ks1type = /obj/item/device/encryptionkey/hivenet /obj/item/device/radio/headset/syndicate - origin_tech = "syndicate=3" + origin_tech = list(TECH_ILLEGAL = 3) syndie = 1 ks1type = /obj/item/device/encryptionkey/syndicate /obj/item/device/radio/headset/binary - origin_tech = "syndicate=3" + origin_tech = list(TECH_ILLEGAL = 3) ks1type = /obj/item/device/encryptionkey/binary /obj/item/device/radio/headset/headset_sec @@ -183,21 +188,7 @@ icon_state = "com_headset" item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/hop -/* -/obj/item/device/radio/headset/headset_mine - name = "mining radio headset" - desc = "Headset used by miners. How useless. To access the mining channel, use :d." - icon_state = "mine_headset" - item_state = "headset" - keyslot2 = new /obj/item/device/encryptionkey/headset_mine -/obj/item/device/radio/headset/heads/qm - name = "quartermaster's headset" - desc = "The headset of the man who control your toiletpaper supply. To access the cargo channel, use :q. For mining, use :d." - icon_state = "cargo_headset" - item_state = "headset" - keyslot2 = new /obj/item/device/encryptionkey/heads/qm -*/ /obj/item/device/radio/headset/headset_cargo name = "supply radio headset" desc = "A headset used by the QM and their slaves." @@ -217,7 +208,6 @@ desc = "The headset of the boss's boss." icon_state = "com_headset" item_state = "headset" - freerange = 1 ks2type = /obj/item/device/encryptionkey/ert /obj/item/device/radio/headset/ia @@ -227,6 +217,13 @@ item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/hos +/obj/item/device/radio/headset/entertainment + name = "actor's radio headset" + desc = "specially made to make you sound less cheesy." + icon_state = "com_headset" + item_state = "headset" + ks2type = /obj/item/device/encryptionkey/entertainment + /obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob) // ..() user.set_machine(src) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 1abccb5e77d..19886dcc93f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -1,5 +1,5 @@ /obj/item/device/radio/intercom - name = "station intercom" + name = "station intercom (General)" desc = "Talk through this." icon_state = "intercom" anchored = 1 @@ -7,14 +7,76 @@ canhear_range = 2 flags = CONDUCT | NOBLOODY var/number = 0 - var/anyai = 1 - var/mob/living/silicon/ai/ai = list() var/last_tick //used to delay the powercheck +/obj/item/device/radio/intercom/custom + name = "station intercom (Custom)" + broadcasting = 0 + listening = 0 + +/obj/item/device/radio/intercom/interrogation + name = "station intercom (Interrogation)" + frequency = 1449 + +/obj/item/device/radio/intercom/private + name = "station intercom (Private)" + frequency = AI_FREQ + +/obj/item/device/radio/intercom/specops + name = "\improper Spec Ops intercom" + frequency = ERT_FREQ + +/obj/item/device/radio/intercom/department + canhear_range = 5 + broadcasting = 0 + listening = 1 + +/obj/item/device/radio/intercom/department/medbay + name = "station intercom (Medbay)" + frequency = MED_I_FREQ + +/obj/item/device/radio/intercom/department/security + name = "station intercom (Security)" + frequency = SEC_I_FREQ + +/obj/item/device/radio/intercom/entertainment + name = "entertainment intercom" + frequency = ENT_FREQ + canhear_range = 4 + /obj/item/device/radio/intercom/New() ..() processing_objects += src +/obj/item/device/radio/intercom/department/medbay/New() + ..() + internal_channels = default_medbay_channels.Copy() + +/obj/item/device/radio/intercom/department/security/New() + ..() + internal_channels = list( + num2text(PUB_FREQ) = list(), + num2text(SEC_I_FREQ) = list(access_security) + ) + +/obj/item/device/radio/intercom/entertainment/New() + ..() + internal_channels = list( + num2text(PUB_FREQ) = list(), + num2text(ENT_FREQ) = list() + ) + +/obj/item/device/radio/intercom/syndicate + name = "illicit intercom" + desc = "Talk through this. Evilly" + frequency = SYND_FREQ + subspace_transmission = 1 + syndie = 1 + +/obj/item/device/radio/intercom/syndicate/New() + ..() + internal_channels[num2text(SYND_FREQ)] = list(access_syndicate) + /obj/item/device/radio/intercom/Destroy() processing_objects -= src ..() @@ -44,12 +106,6 @@ return canhear_range - -/obj/item/device/radio/intercom/hear_talk(mob/M as mob, msg) - if(!src.anyai && !(M in src.ai)) - return - ..() - /obj/item/device/radio/intercom/process() if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0)) last_tick = world.timeofday @@ -57,8 +113,8 @@ if(!src.loc) on = 0 else - var/area/A = src.loc.loc - if(!A || !isarea(A)) + var/area/A = get_area(src) + if(!A) on = 0 else on = A.powered(EQUIP) // set "on" to the power status @@ -68,9 +124,25 @@ else icon_state = "intercom" +/obj/item/device/radio/intercom/broadcasting + broadcasting = 1 + /obj/item/device/radio/intercom/locked - freerange = 1 var/locked_frequency - -/obj/item/device/radio/intercom/locked/set_frequency() - ..(locked_frequency) + +/obj/item/device/radio/intercom/locked/set_frequency(var/frequency) + if(frequency == locked_frequency) + ..(locked_frequency) + +/obj/item/device/radio/intercom/locked/list_channels() + return "" + +/obj/item/device/radio/intercom/locked/ai_private + name = "\improper AI intercom" + frequency = AI_FREQ + broadcasting = 1 + listening = 1 + +/obj/item/device/radio/intercom/locked/confessional + name = "confessional intercom" + frequency = 1480 diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 62253e31101..954aa20bd5e 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -1,25 +1,45 @@ +// Access check is of the type requires one. These have been carefully selected to avoid allowing the janitor to see channels he shouldn't +var/global/list/default_internal_channels = list( + num2text(PUB_FREQ) = list(), + num2text(AI_FREQ) = list(access_synth), + num2text(ENT_FREQ) = list(), + num2text(ERT_FREQ) = list(access_cent_specops), + num2text(COMM_FREQ)= list(access_heads), + num2text(ENG_FREQ) = list(access_engine_equip, access_atmospherics), + num2text(MED_FREQ) = list(access_medical_equip), + num2text(MED_I_FREQ)=list(access_medical_equip), + num2text(SEC_FREQ) = list(access_security), + num2text(SEC_I_FREQ)=list(access_security), + num2text(SCI_FREQ) = list(access_tox,access_robotics,access_xenobiology), + num2text(SUP_FREQ) = list(access_cargo), + num2text(SRV_FREQ) = list(access_janitor, access_hydroponics) +) + +var/global/list/default_medbay_channels = list( + num2text(PUB_FREQ) = list(), + num2text(MED_FREQ) = list(access_medical_equip), + num2text(MED_I_FREQ) = list(access_medical_equip) +) + /obj/item/device/radio icon = 'icons/obj/radio.dmi' name = "station bounced radio" suffix = "\[3\]" icon_state = "walkietalkie" item_state = "walkietalkie" + var/on = 1 // 0 for off var/last_transmission var/frequency = PUB_FREQ //common chat var/traitor_frequency = 0 //tune to frequency to unlock traitor supplies var/canhear_range = 3 // the range which mobs can hear this radio from - var/obj/item/device/radio/patch_link = null var/datum/wires/radio/wires = null var/b_stat = 0 var/broadcasting = 0 var/listening = 1 - var/freerange = 0 // 0 - Sanitize frequencies, 1 - Full range - var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h + var/list/channels = list() //see communications.dm for full list. First channel is a "default" for :h var/subspace_transmission = 0 - var/syndie = 0//Holder to see if it's a syndicate encrpyed radio - var/maxf = 1499 -// "Example" = FREQ_LISTENING|FREQ_BROADCASTING + var/syndie = 0//Holder to see if it's a syndicate encrypted radio flags = CONDUCT slot_flags = SLOT_BELT throw_speed = 2 @@ -28,7 +48,7 @@ matter = list("glass" = 25,DEFAULT_WALL_MATERIAL = 75) var/const/FREQ_LISTENING = 1 - + var/list/internal_channels /obj/item/device/radio var/datum/radio_frequency/radio_connection @@ -42,6 +62,7 @@ /obj/item/device/radio/New() ..() wires = new(src) + internal_channels = default_internal_channels.Copy() /obj/item/device/radio/Destroy() qdel(wires) @@ -50,19 +71,13 @@ radio_controller.remove_object(src, frequency) for (var/ch_name in channels) radio_controller.remove_object(src, radiochannels[ch_name]) - ..() + return ..() /obj/item/device/radio/initialize() - if(freerange) - if(frequency < 1200 || frequency > 1600) - frequency = sanitize_frequency(frequency, maxf) - // The max freq is higher than a regular headset to decrease the chance of people listening in, if you use the higher channels. - else if (frequency < 1441 || frequency > maxf) - //world.log << "[src] ([type]) has a frequency of [frequency], sanitizing." - frequency = sanitize_frequency(frequency, maxf) - + if(frequency < RADIO_LOW_FREQ || frequency > RADIO_HIGH_FREQ) + frequency = sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) set_frequency(frequency) for (var/ch_name in channels) @@ -72,38 +87,77 @@ user.set_machine(src) interact(user) -/obj/item/device/radio/attack_self(mob/user as mob) - user.set_machine(src) - interact(user) +/obj/item/device/radio/interact(mob/user) + if(!user) + return 0 -/obj/item/device/radio/interact(mob/user as mob) - if(!on) - return + if(b_stat) + wires.Interact(user) - if(active_uplink_check(user)) - return + return ui_interact(user) - var/dat = "[src]" +/obj/item/device/radio/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] - if(!istype(src, /obj/item/device/radio/headset)) //Headsets dont get a mic button - dat += "Microphone: [broadcasting ? "Engaged" : "Disengaged"]
    " + data["mic_status"] = broadcasting + data["speaker"] = listening + data["freq"] = format_frequency(frequency) + data["rawfreq"] = num2text(frequency) - dat += {" - Speaker: [listening ? "Engaged" : "Disengaged"]
    - Frequency: - - - - - [format_frequency(frequency)] - + - +
    - "} + data["mic_cut"] = (wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL)) + data["spk_cut"] = (wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL)) - for (var/ch_name in channels) - dat+=text_sec_channel(ch_name, channels[ch_name]) - dat+={"[text_wires()]
    "} - user << browse(dat, "window=radio") - onclose(user, "radio") - return + var/list/chanlist = list_channels(user) + if(islist(chanlist) && chanlist.len) + data["chan_list"] = chanlist + data["chan_list_len"] = chanlist.len + + if(syndie) + data["useSyndMode"] = 1 + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430) + ui.set_initial_data(data) + ui.open() + +/obj/item/device/radio/proc/list_channels(var/mob/user) + return list_internal_channels(user) + +/obj/item/device/radio/proc/list_secure_channels(var/mob/user) + var/dat[0] + + for(var/ch_name in channels) + var/chan_stat = channels[ch_name] + var/listening = !!(chan_stat & FREQ_LISTENING) != 0 + + dat.Add(list(list("chan" = ch_name, "display_name" = ch_name, "secure_channel" = 1, "sec_channel_listen" = !listening, "chan_span" = frequency_span_class(radiochannels[ch_name])))) + + return dat + +/obj/item/device/radio/proc/list_internal_channels(var/mob/user) + var/dat[0] + for(var/internal_chan in internal_channels) + if(has_channel_access(user, internal_chan)) + dat.Add(list(list("chan" = internal_chan, "display_name" = get_frequency_name(text2num(internal_chan)), "chan_span" = frequency_span_class(text2num(internal_chan))))) + + return dat + +/obj/item/device/radio/proc/has_channel_access(var/mob/user, var/freq) + if(!user) + return 0 + + if(!(freq in internal_channels)) + return 0 + + return user.has_internal_radio_channel_access(internal_channels[freq]) + +/mob/proc/has_internal_radio_channel_access(var/list/req_one_accesses) + var/obj/item/weapon/card/id/I = GetIdCard() + return has_access(list(), req_one_accesses, I ? I.GetAccess() : list()) + +/mob/dead/observer/has_internal_radio_channel_access(var/list/req_one_accesses) + return can_admin_interact() /obj/item/device/radio/proc/text_wires() if (b_stat) @@ -124,10 +178,14 @@ /obj/item/device/radio/proc/ToggleReception() listening = !listening && !(wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL)) +/obj/item/device/radio/CanUseTopic() + if(!on) + return STATUS_CLOSE + return ..() + /obj/item/device/radio/Topic(href, href_list) - if(..() || !on) - usr << browse(null, "window=radio") - return + if(..()) + return 1 usr.set_machine(src) if (href_list["track"]) @@ -135,20 +193,20 @@ var/mob/living/silicon/ai/A = locate(href_list["track2"]) if(A && target) A.ai_actual_track(target) - return + . = 1 else if (href_list["freq"]) var/new_frequency = (frequency + text2num(href_list["freq"])) - if (!freerange || (frequency < 1200 || frequency > 1600)) - new_frequency = sanitize_frequency(new_frequency, maxf) + if ((new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ)) + new_frequency = sanitize_frequency(new_frequency) set_frequency(new_frequency) if(hidden_uplink) if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency)) usr << browse(null, "window=radio") - return - + . = 1 else if (href_list["talk"]) ToggleBroadcast() + . = 1 else if (href_list["listen"]) var/chan_name = href_list["ch_name"] if (!chan_name) @@ -158,11 +216,17 @@ channels[chan_name] &= ~FREQ_LISTENING else channels[chan_name] |= FREQ_LISTENING - + . = 1 + else if(href_list["spec_freq"]) + var freq = href_list["spec_freq"] + if(has_channel_access(usr, freq)) + set_frequency(text2num(freq)) + . = 1 if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk - return + return 1 - interact(usr) + if(.) + nanomanager.update_uis(src) /obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT var/datum/radio_frequency/connection = null @@ -210,13 +274,13 @@ // Fix for permacell radios, but kinda eh about actually fixing them. if(!M || !message) return 0 + if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO) + // Uncommenting this. To the above comment: // The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact return 0 - M.last_target_radio = world.time // For the projectile targeting system - if(!radio_connection) set_frequency(frequency) @@ -467,16 +531,16 @@ var/range = receive_range(freq, level) if(range > -1) - return get_mobs_in_view(canhear_range, src) + return get_mobs_or_objects_in_view(canhear_range, src) /obj/item/device/radio/examine(mob/user) . = ..() if ((in_range(src, user) || loc == user)) if (b_stat) - user.show_message("\blue \the [src] can be attached and modified!") + user.show_message("\The [src] can be attached and modified!") else - user.show_message("\blue \the [src] can not be modified or attached!") + user.show_message("\The [src] can not be modified or attached!") return /obj/item/device/radio/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -487,9 +551,9 @@ b_stat = !( b_stat ) if(!istype(src, /obj/item/device/radio/beacon)) if (b_stat) - user.show_message("\blue The radio can now be attached and modified!") + user.show_message("\The [src] can now be attached and modified!") else - user.show_message("\blue The radio can no longer be modified or attached!") + user.show_message("\The [src] can no longer be modified or attached!") updateDialog() //Foreach goto(83) add_fingerprint(user) @@ -511,12 +575,19 @@ /obj/item/device/radio/borg var/mob/living/silicon/robot/myborg = null // Cyborg which owns this radio. Used for power checks var/obj/item/device/encryptionkey/keyslot = null//Borg radios can handle a single encryption key - var/shut_up = 0 + var/shut_up = 1 icon = 'icons/obj/robot_component.dmi' // Cyborgs radio icons should look like the component. icon_state = "radio" - canhear_range = 3 + canhear_range = 0 subspace_transmission = 1 +/obj/item/device/radio/borg/Destroy() + myborg = null + return ..() + +/obj/item/device/radio/borg/list_channels(var/mob/user) + return list_secure_channels(user) + /obj/item/device/radio/borg/talk_into() . = ..() if (isrobot(src.loc)) @@ -598,52 +669,69 @@ return /obj/item/device/radio/borg/Topic(href, href_list) - if(usr.stat || !on) - return + if(..()) + return 1 if (href_list["mode"]) - if(subspace_transmission != 1) - subspace_transmission = 1 - usr << "Subspace Transmission is enabled" - else - subspace_transmission = 0 - usr << "Subspace Transmission is disabled" - if(subspace_transmission == 0)//Simple as fuck, clears the channel list to prevent talking/listening over them if subspace transmission is disabled - channels = list() - else - recalculateChannels() - if (href_list["shutup"]) // Toggle loudspeaker mode, AKA everyone around you hearing your radio. - shut_up = !shut_up - if(shut_up) - canhear_range = 0 - else - canhear_range = 3 + var/enable_subspace_transmission = text2num(href_list["mode"]) + if(enable_subspace_transmission != subspace_transmission) + subspace_transmission = !subspace_transmission + if(subspace_transmission) + usr << "Subspace Transmission is enabled" + else + usr << "Subspace Transmission is disabled" - ..() + if(subspace_transmission == 0)//Simple as fuck, clears the channel list to prevent talking/listening over them if subspace transmission is disabled + channels = list() + else + recalculateChannels() + . = 1 + if (href_list["shutup"]) // Toggle loudspeaker mode, AKA everyone around you hearing your radio. + var/do_shut_up = text2num(href_list["shutup"]) + if(do_shut_up != shut_up) + shut_up = !shut_up + if(shut_up) + canhear_range = 0 + usr << "Loadspeaker disabled." + else + canhear_range = 3 + usr << "Loadspeaker enabled." + . = 1 + + if(.) + nanomanager.update_uis(src) /obj/item/device/radio/borg/interact(mob/user as mob) if(!on) return - var/dat = "[src]" - dat += {" - Speaker: [listening ? "Engaged" : "Disengaged"]
    - Frequency: - - - - - [format_frequency(frequency)] - + - +
    - Toggle Broadcast Mode
    - Loudspeaker: [shut_up ? "Disengaged" : "Engaged"]
    - "} + . = ..() - if(subspace_transmission)//Don't even bother if subspace isn't turned on - for (var/ch_name in channels) - dat+=text_sec_channel(ch_name, channels[ch_name]) - dat+={"[text_wires()]
    "} - user << browse(dat, "window=radio") - onclose(user, "radio") - return +/obj/item/device/radio/borg/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + + data["mic_status"] = broadcasting + data["speaker"] = listening + data["freq"] = format_frequency(frequency) + data["rawfreq"] = num2text(frequency) + + var/list/chanlist = list_channels(user) + if(islist(chanlist) && chanlist.len) + data["chan_list"] = chanlist + data["chan_list_len"] = chanlist.len + + if(syndie) + data["useSyndMode"] = 1 + + data["has_loudspeaker"] = 1 + data["loudspeaker"] = !shut_up + data["has_subspace"] = 1 + data["subspace"] = subspace_transmission + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430) + ui.set_initial_data(data) + ui.open() /obj/item/device/radio/proc/config(op) if(radio_controller) @@ -658,3 +746,17 @@ /obj/item/device/radio/off listening = 0 + +/obj/item/device/radio/phone + broadcasting = 0 + icon = 'icons/obj/items.dmi' + icon_state = "red_phone" + listening = 1 + name = "phone" + +/obj/item/device/radio/phone/medbay + frequency = MED_I_FREQ + +/obj/item/device/radio/phone/medbay/New() + ..() + internal_channels = default_medbay_channels.Copy() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5ad021ab357..50627a048eb 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -1,66 +1,10 @@ /* CONTAINS: -T-RAY -DETECTIVE SCANNER HEALTH ANALYZER GAS ANALYZER MASS SPECTROMETER REAGENT SCANNER */ -/obj/item/device/t_scanner - name = "\improper T-ray scanner" - desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." - icon_state = "t-ray0" - var/on = 0 - slot_flags = SLOT_BELT - w_class = 2 - item_state = "electronic" - - matter = list(DEFAULT_WALL_MATERIAL = 150) - - origin_tech = "magnets=1;engineering=1" - -/obj/item/device/t_scanner/attack_self(mob/user) - - on = !on - icon_state = "t-ray[on]" - - if(on) - processing_objects.Add(src) - - -/obj/item/device/t_scanner/process() - if(!on) - processing_objects.Remove(src) - return null - - for(var/turf/T in range(1, src.loc) ) - - if(!T || !T.intact) - continue - - for(var/obj/O in T.contents) - - if(O.level != 1) - continue - - if(O.invisibility == 101) - O.invisibility = 0 - O.alpha = 128 - spawn(10) - if(O) - var/turf/U = O.loc - if(U.intact) - O.invisibility = 101 - O.alpha = 255 - - var/mob/living/M = locate() in T - if(M && M.invisibility == 2) - M.invisibility = 0 - spawn(2) - if(M) - M.invisibility = INVISIBILITY_LEVEL_TWO - /obj/item/device/healthanalyzer name = "health analyzer" @@ -74,33 +18,34 @@ REAGENT SCANNER throw_speed = 5 throw_range = 10 matter = list(DEFAULT_WALL_MATERIAL = 200) - origin_tech = "magnets=1;biotech=1" + origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1) var/mode = 1; /obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) if (( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) - user << text("\red You try to analyze the floor's vitals!") + user << text("You try to analyze the floor's vitals!") for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1) - user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) - user.show_message(text("\blue \t Damage Specifics: [0]-[0]-[0]-[0]"), 1) - user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\blue Body Temperature: ???", 1) + O.show_message("\The [user] has analyzed the floor's vitals!", 1) + user.show_message("Analyzing Results for The floor:", 1) + user.show_message("Overall Status: Healthy
    ", 1) + user.show_message(" Damage Specifics: 0-0-0-0", 1) + user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message("Body Temperature: ???", 1) return if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return - user.visible_message(" [user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.") + user.visible_message("[user] has analyzed [M]'s vitals.","You have analyzed [M]'s vitals.") - if (!istype(M, /mob/living/carbon) || (ishuman(M) && (M:species.flags & IS_SYNTHETIC))) + if (!istype(M,/mob/living/carbon/human) || M.isSynthetic()) //these sensors are designed for organic life - user.show_message("\blue Analyzing Results for ERROR:\n\t Overall Status: ERROR") - user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\t Damage Specifics: ? - ? - ? - ?") - user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) - user.show_message("\red Warning: Blood Level ERROR: --% --cl.\blue Type: ERROR") - user.show_message("\blue Subject's pulse: -- bpm.") + user.show_message("Analyzing Results for ERROR:\n\t Overall Status: ERROR") + user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message(" Damage Specifics: ? - ? - ? - ?") + user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + user.show_message("Warning: Blood Level ERROR: --% --cl. Type: ERROR") + user.show_message("Subject's pulse: -- bpm.") return var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss()))) @@ -110,34 +55,36 @@ REAGENT SCANNER var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() if(M.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "[fake_oxy]" : fake_oxy - user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: dead") + user.show_message("Analyzing Results for [M]:") + user.show_message("Overall Status: dead") else - user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health - M.halloss]% healthy"]") - user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\t Damage Specifics: [OX] - [TX] - [BU] - [BR]") - user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health - M.halloss]% healthy"]") + user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") + user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) - user.show_message("\blue Time of Death: [M.tod]") + user.show_message("Time of Death: [M.tod]") if(istype(M, /mob/living/carbon/human) && mode == 1) var/mob/living/carbon/human/H = M var/list/damaged = H.get_damaged_organs(1,1) - user.show_message("\blue Localized Damage, Brute/Burn:",1) + user.show_message("Localized Damage, Brute/Burn:",1) if(length(damaged)>0) for(var/obj/item/organ/external/org in damaged) - user.show_message(text("\blue \t []: [][]\blue - []", \ - "[capitalize(org.name)][org.status & ORGAN_ROBOT ? "(Cybernetic)" : ""]", \ - (org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \ - (org.status & ORGAN_BLEEDING)?"\red \[Bleeding\]":"\t", \ - (org.burn_dam > 0) ? "[org.burn_dam]" :0),1) + user.show_message(text(" [][]: [][] - []", + capitalize(org.name), + (org.status & ORGAN_ROBOT) ? "(Cybernetic)" : "", + (org.brute_dam > 0) ? "[org.brute_dam]" : 0, + (org.status & ORGAN_BLEEDING)?"\[Bleeding\]":"", + (org.burn_dam > 0) ? "[org.burn_dam]" : 0),1) else - user.show_message("\blue \t Limbs are OK.",1) + user.show_message(" Limbs are OK.",1) OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" BU = M.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" if(M.status_flags & FAKEDEATH) - OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal" + OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") if(istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M @@ -147,15 +94,15 @@ REAGENT SCANNER for(var/A in C.reagents.reagent_list) var/datum/reagent/R = A if(R.scannable) - reagentdata["[R.id]"] = "\t \blue [round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]" + reagentdata["[R.id]"] = " [round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]" else unknown++ if(reagentdata.len) - user.show_message("\blue Beneficial reagents detected in subject's blood:") + user.show_message("Beneficial reagents detected in subject's blood:") for(var/d in reagentdata) user.show_message(reagentdata[d]) if(unknown) - user.show_message(text("\red Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood.")) + user.show_message("Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood.") if(C.ingested && C.ingested.total_volume) var/unknown = 0 for(var/datum/reagent/R in C.ingested.reagent_list) @@ -169,23 +116,24 @@ REAGENT SCANNER for (var/ID in C.virus2) if (ID in virusDB) var/datum/data/record/V = virusDB[ID] - user.show_message(text("\red Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]")) -// user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood.")) + user.show_message("Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]") +// user.show_message(text("Warning: Unknown pathogen detected in subject's blood.")) if (M.getCloneLoss()) - user.show_message("\red Subject appears to have been imperfectly cloned.") + user.show_message("Subject appears to have been imperfectly cloned.") for(var/datum/disease/D in M.viruses) if(!D.hidden[SCANNER]) - user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + user.show_message(text("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) // if (M.reagents && M.reagents.get_reagent_amount("inaprovaline")) -// user.show_message("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals.") +// user.show_message("Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals.") +// Remove brain worm scans. Bad. // if (M.has_brain_worms()) -// user.show_message("\red Subject suffering from aberrant brain activity. Recommend further scanning.") //Cortical borer disable +// user.show_message("Subject suffering from aberrant brain activity. Recommend further scanning.") if (M.getBrainLoss() >= 100 || !M.has_brain()) - user.show_message("\red Subject is brain dead.") + user.show_message("Subject is brain dead.") else if (M.getBrainLoss() >= 60) - user.show_message("\red Severe brain damage detected. Subject likely to have mental retardation.") + user.show_message("Severe brain damage detected. Subject likely to have mental retardation.") else if (M.getBrainLoss() >= 10) - user.show_message("\red Significant brain damage detected. Subject may have had a concussion.") + user.show_message("Significant brain damage detected. Subject may have had a concussion.") if(ishuman(M)) var/mob/living/carbon/human/H = M for(var/name in H.organs_by_name) @@ -195,20 +143,20 @@ REAGENT SCANNER var/limb = e.name if(e.status & ORGAN_BROKEN) if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!(e.status & ORGAN_SPLINTED))) - user << "\red Unsecured fracture in subject [limb]. Splinting recommended for transport." + user << "Unsecured fracture in subject [limb]. Splinting recommended for transport." if(e.has_infected_wound()) - user << "\red Infected wound detected in subject [limb]. Disinfection recommended." + user << "Infected wound detected in subject [limb]. Disinfection recommended." for(var/name in H.organs_by_name) var/obj/item/organ/external/e = H.organs_by_name[name] if(e && e.status & ORGAN_BROKEN) - user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1) + user.show_message(text("Bone fractures detected. Advanced scanner required for location."), 1) break for(var/obj/item/organ/external/e in H.organs) if(!e) continue for(var/datum/wound/W in e.wounds) if(W.internal) - user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1) + user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1) break if(M:vessel) var/blood_volume = round(M:vessel.get_reagent_amount("blood")) @@ -216,12 +164,12 @@ REAGENT SCANNER var/blood_type = M.dna.b_type blood_percent *= 100 if(blood_volume <= 500 && blood_volume > 336) - user.show_message("\red Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl.\blue Type: [blood_type]") + user.show_message("Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl. Type: [blood_type]") else if(blood_volume <= 336) - user.show_message("\red Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl.\blue Type: [blood_type]") + user.show_message("Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl. Type: [blood_type]") else - user.show_message("\blue Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]") - user.show_message("\blue Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") + user.show_message("Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]") + user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") src.add_fingerprint(user) return @@ -251,37 +199,24 @@ REAGENT SCANNER matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20) - origin_tech = "magnets=1;engineering=1" + origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) + +/obj/item/device/analyzer/atmosanalyze(var/mob/user) + var/air = user.return_air() + if (!air) + return + + return atmosanalyzer_scan(src, air, user) /obj/item/device/analyzer/attack_self(mob/user as mob) if (user.stat) return if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" + usr << "You don't have the dexterity to do this!" return - var/turf/location = user.loc - if (!( istype(location, /turf) )) - return - - var/datum/gas_mixture/environment = location.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - user.show_message("\blue Results:", 1) - if(abs(pressure - ONE_ATMOSPHERE) < 10) - user.show_message("\blue Pressure: [round(pressure,0.1)] kPa", 1) - else - user.show_message("\red Pressure: [round(pressure,0.1)] kPa", 1) - if(total_moles) - for(var/g in environment.gas) - user.show_message("\blue [gas_data.name[g]]: [round((environment.gas[g] / total_moles)*100)]%", 1) - - user.show_message("\blue Temperature: [round(environment.temperature-T0C)]°C", 1) - - src.add_fingerprint(user) + analyze_gases(src, user) return /obj/item/device/mass_spectrometer @@ -298,7 +233,7 @@ REAGENT SCANNER matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20) - origin_tech = "magnets=2;biotech=2" + origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) var/details = 0 var/recent_fail = 0 @@ -317,37 +252,25 @@ REAGENT SCANNER /obj/item/device/mass_spectrometer/attack_self(mob/user as mob) if (user.stat) return - if (crit_fail) - user << "\red This device has critically failed and is no longer functional!" - return if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return if(reagents.total_volume) var/list/blood_traces = list() for(var/datum/reagent/R in reagents.reagent_list) if(R.id != "blood") reagents.clear_reagents() - user << "\red The sample was contaminated! Please insert another sample" + user << "The sample was contaminated! Please insert another sample" return else blood_traces = params2list(R.data["trace_chem"]) break var/dat = "Trace Chemicals Found: " for(var/R in blood_traces) - if(prob(reliability)) - if(details) - dat += "[R] ([blood_traces[R]] units) " - else - dat += "[R] " - recent_fail = 0 + if(details) + dat += "[R] ([blood_traces[R]] units) " else - if(recent_fail) - crit_fail = 1 - reagents.clear_reagents() - return - else - recent_fail = 1 + dat += "[R] " user << "[dat]" reagents.clear_reagents() return @@ -356,7 +279,7 @@ REAGENT SCANNER name = "advanced mass spectrometer" icon_state = "adv_spectrometer" details = 1 - origin_tech = "magnets=4;biotech=2" + origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2) /obj/item/device/reagent_scanner name = "reagent scanner" @@ -371,7 +294,7 @@ REAGENT SCANNER throw_range = 20 matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20) - origin_tech = "magnets=2;biotech=2" + origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) var/details = 0 var/recent_fail = 0 @@ -381,34 +304,23 @@ REAGENT SCANNER if (user.stat) return if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return if(!istype(O)) return - if (crit_fail) - user << "\red This device has critically failed and is no longer functional!" - return if(!isnull(O.reagents)) var/dat = "" if(O.reagents.reagent_list.len > 0) var/one_percent = O.reagents.total_volume / 100 for (var/datum/reagent/R in O.reagents.reagent_list) - if(prob(reliability)) - dat += "\n \t \blue [R][details ? ": [R.volume / one_percent]%" : ""]" - recent_fail = 0 - else if(recent_fail) - crit_fail = 1 - dat = null - break - else - recent_fail = 1 + dat += "\n \t [R][details ? ": [R.volume / one_percent]%" : ""]" if(dat) - user << "\blue Chemicals found: [dat]" + user << "Chemicals found: [dat]" else - user << "\blue No active chemical agents found in [O]." + user << "No active chemical agents found in [O]." else - user << "\blue No significant chemical agents found in [O]." + user << "No significant chemical agents found in [O]." return @@ -416,13 +328,13 @@ REAGENT SCANNER name = "advanced reagent scanner" icon_state = "adv_spectrometer" details = 1 - origin_tech = "magnets=4;biotech=2" + origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2) /obj/item/device/slime_scanner name = "slime scanner" icon_state = "adv_spectrometer" item_state = "analyzer" - origin_tech = "biotech=1" + origin_tech = list(TECH_BIO = 1) w_class = 2.0 flags = CONDUCT throwforce = 0 diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index ef8ada1bf4b..063e7a85cea 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -14,7 +14,7 @@ throw_range = 15 throw_speed = 3 - origin_tech = "programming=1;engineering=1;syndicate=3" + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1, TECH_ILLEGAL = 3) var/obj/item/device/radio/spy/radio var/obj/machinery/camera/spy/camera @@ -53,7 +53,7 @@ w_class = 2.0 - origin_tech = "programming=1;engineering=1;syndicate=3" + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1, TECH_ILLEGAL = 3) var/operating = 0 var/obj/item/device/radio/spy/radio @@ -135,7 +135,7 @@ /obj/machinery/camera/spy // These cheap toys are accessible from the mercenary camera console as well - network = list("NUKE") + network = list(NETWORK_MERCENARY) /obj/machinery/camera/spy/New() ..() diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 29735ec4e71..5418c54e36b 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -13,9 +13,9 @@ throw_speed = 1 throw_range = 4 - matter = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 3500) - origin_tech = "magnets=2;materials=2" + origin_tech = list(TECH_MAGNET = 2, TECH_MATERIAL = 2) + matter = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 3500) var/on = 0 //is it turned on? var/cover_open = 0 //is the cover open? var/obj/item/weapon/cell/cell diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm new file mode 100644 index 00000000000..7dc13cb9e87 --- /dev/null +++ b/code/game/objects/items/devices/t_scanner.dm @@ -0,0 +1,135 @@ +#define OVERLAY_CACHE_LEN 50 + +/obj/item/device/t_scanner + name = "\improper T-ray scanner" + desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + icon_state = "t-ray0" + slot_flags = SLOT_BELT + w_class = 2 + item_state = "electronic" + matter = list(DEFAULT_WALL_MATERIAL = 150) + origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) + + var/scan_range = 1 + + var/on = 0 + var/list/active_scanned = list() //assoc list of objects being scanned, mapped to their overlay + var/client/user_client //since making sure overlays are properly added and removed is pretty important, so we track the current user explicitly + var/flicker = 0 + + var/global/list/overlay_cache = list() //cache recent overlays + +/obj/item/device/t_scanner/update_icon() + icon_state = "t-ray[on]" + +/obj/item/device/t_scanner/attack_self(mob/user) + set_active(!on) + +/obj/item/device/t_scanner/proc/set_active(var/active) + on = active + if(on) + processing_objects.Add(src) + flicker = 0 + else + processing_objects.Remove(src) + set_user_client(null) + update_icon() + +//If reset is set, then assume the client has none of our overlays, otherwise we only send new overlays. +/obj/item/device/t_scanner/process() + if(!on) return + + //handle clients changing + var/client/loc_client = null + if(ismob(src.loc)) + var/mob/M = src.loc + loc_client = M.client + set_user_client(loc_client) + + //no sense processing if no-one is going to see it. + if(!user_client) return + + //get all objects in scan range + var/list/scanned = get_scanned_objects(scan_range) + var/list/update_add = scanned - active_scanned + var/list/update_remove = active_scanned - scanned + + //Add new overlays + for(var/obj/O in update_add) + var/image/overlay = get_overlay(O) + active_scanned[O] = overlay + user_client.images += overlay + + //Remove stale overlays + for(var/obj/O in update_remove) + user_client.images -= active_scanned[O] + active_scanned -= O + + //Flicker effect + for(var/obj/O in active_scanned) + var/image/overlay = active_scanned[O] + if(flicker) + overlay.alpha = 0 + else + overlay.alpha = 128 + flicker = !flicker + +//creates a new overlay for a scanned object +/obj/item/device/t_scanner/proc/get_overlay(obj/scanned) + //Use a cache so we don't create a whole bunch of new images just because someone's walking back and forth in a room. + //Also means that images are reused if multiple people are using t-rays to look at the same objects. + if(scanned in overlay_cache) + . = overlay_cache[scanned] + else + var/image/I = image(loc = scanned, icon = scanned.icon, icon_state = scanned.icon_state, layer = HUD_LAYER) + + //Pipes are special + if(istype(scanned, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/P = scanned + I.color = P.pipe_color + I.overlays += P.overlays + + I.alpha = 128 + I.mouse_opacity = 0 + . = I + + // Add it to cache, cutting old entries if the list is too long + overlay_cache[scanned] = . + if(overlay_cache.len > OVERLAY_CACHE_LEN) + overlay_cache.Cut(1, overlay_cache.len-OVERLAY_CACHE_LEN-1) + +/obj/item/device/t_scanner/proc/get_scanned_objects(var/scan_dist) + . = list() + + var/turf/center = get_turf(src.loc) + if(!center) return + + for(var/turf/T in range(scan_range, center)) + if(!!T.is_plating()) + continue + + for(var/obj/O in T.contents) + if(O.level != 1) + continue + if(!O.invisibility) + continue //if it's already visible don't need an overlay for it + . += O + +/obj/item/device/t_scanner/proc/set_user_client(var/client/new_client) + if(new_client == user_client) + return + if(user_client) + for(var/scanned in active_scanned) + user_client.images -= active_scanned[scanned] + if(new_client) + for(var/scanned in active_scanned) + new_client.images += active_scanned[scanned] + else + active_scanned.Cut() + + user_client = new_client + +/obj/item/device/t_scanner/dropped(mob/user) + set_user_client(null) + +#undef OVERLAY_CACHE_LEN \ No newline at end of file diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 35d04e4d086..e59d3e993b5 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -29,16 +29,34 @@ else storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] [verb], \"[msg]\"" -/obj/item/device/taperecorder/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if(istype(W, /obj/item/weapon/card/emag)) - if(emagged == 0) - emagged = 1 - recording = 0 - user << "PZZTTPFFFT" - icon_state = "taperecorderidle" - else - user << "It is already emagged!" +/obj/item/device/taperecorder/see_emote(mob/M as mob, text, var/emote_type) + if(emote_type != 2) //only hearable emotes + return + if(recording) + timestamp += timerecorded + storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [strip_html_properly(text)]" + +/obj/item/device/taperecorder/show_message(msg, type, alt, alt_type) + var/recordedtext + if (msg && type == 2) //must be hearable + recordedtext = msg + else if (alt && alt_type == 2) + recordedtext = alt + else + return + if(recording) + timestamp += timerecorded + storedinfo += "*\[[time2text(timerecorded*10,"mm:ss")]\] *[strip_html_properly(recordedtext)]*" //"*" at front as a marker + +/obj/item/device/taperecorder/emag_act(var/remaining_charges, var/mob/user) + if(emagged == 0) + emagged = 1 + recording = 0 + user << "PZZTTPFFFT" + icon_state = "taperecorderidle" + return 1 + else + user << "It is already emagged!" /obj/item/device/taperecorder/proc/explode() var/turf/T = get_turf(loc) @@ -58,7 +76,7 @@ if(usr.stat) return if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." + usr << "The tape recorder makes a scratchy noise." return icon_state = "taperecorderrecording" if(timerecorded < 3600 && playing == 0) @@ -85,7 +103,7 @@ if(usr.stat) return if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." + usr << "The tape recorder makes a scratchy noise." return if(recording == 1) recording = 0 @@ -97,7 +115,7 @@ else if(playing == 1) playing = 0 var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: Playback stopped.") + T.audible_message("Tape Recorder: Playback stopped.") icon_state = "taperecorderidle" return @@ -129,7 +147,7 @@ if(usr.stat) return if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." + usr << "The tape recorder makes a scratchy noise." return if(recording == 1) usr << "You can't playback when recording!" @@ -146,37 +164,40 @@ if(storedinfo.len < i) break var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: [storedinfo[i]]") + var/playedmessage = storedinfo[i] + if (findtextEx(playedmessage,"*",1,2)) //remove marker for action sounds + playedmessage = copytext(playedmessage,2) + T.audible_message("Tape Recorder: [playedmessage]") if(storedinfo.len < i+1) playsleepseconds = 1 sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: End of recording.") + T.audible_message("Tape Recorder: End of recording.") else playsleepseconds = timestamp[i+1] - timestamp[i] if(playsleepseconds > 14) sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence") + T.audible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence") playsleepseconds = 1 i++ icon_state = "taperecorderidle" playing = 0 if(emagged == 1.0) var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: This tape recorder will self-destruct in... Five.") + T.audible_message("Tape Recorder: This tape recorder will self-destruct in... Five.") sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Four.") + T.audible_message("Tape Recorder: Four.") sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Three.") + T.audible_message("Tape Recorder: Three.") sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Two.") + T.audible_message("Tape Recorder: Two.") sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: One.") + T.audible_message("Tape Recorder: One.") sleep(10) explode() @@ -188,7 +209,7 @@ if(usr.stat) return if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." + usr << "The tape recorder makes a scratchy noise." return if(!canprint) usr << "The recorder can't print that fast!" @@ -200,7 +221,10 @@ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) var/t1 = "Transcript:

    " for(var/i=1,storedinfo.len >= i,i++) - t1 += "[storedinfo[i]]
    " + var/printedmessage = storedinfo[i] + if (findtextEx(printedmessage,"*",1,2)) //replace action sounds + printedmessage = "\[[time2text(timestamp[i]*10,"mm:ss")]\] (Unrecognized sound)" + t1 += "[printedmessage]
    " P.info = t1 P.name = "Transcript" canprint = 0 @@ -213,11 +237,11 @@ if(usr.stat) return if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." + usr << "The tape recorder makes a scratchy noise." return icon_state = "taperecorderrecording" if(timerecorded < 3600 && playing == 0) - usr << "\blue Recording started." + usr << "Recording started." recording = 1 timestamp+= timerecorded storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording started." @@ -230,7 +254,7 @@ icon_state = "taperecorderidle" return else - usr << "\red Either your tape recorder's memory is full, or it is currently playing back its memory." + usr << "Either your tape recorder's memory is full, or it is currently playing back its memory." else if(usr.stat) usr << "Not when you're incapacitated." @@ -239,7 +263,7 @@ recording = 0 timestamp+= timerecorded storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording stopped." - usr << "\blue Recording stopped." + usr << "Recording stopped." icon_state = "taperecorderidle" return else if(playing == 1) @@ -250,5 +274,5 @@ icon_state = "taperecorderidle" return else - usr << "\red Stop what?" + usr << "Stop what?" return diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 3c2aebd8719..fbed4e7ebbd 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -24,7 +24,7 @@ effective or pretty fucking useless. throw_range = 10 flags = CONDUCT item_state = "electronic" - origin_tech = "magnets=3;combat=3;syndicate=3" + origin_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 3, TECH_ILLEGAL = 3) var/times_used = 0 //Number of times it's been used. var/max_uses = 2 @@ -32,7 +32,7 @@ effective or pretty fucking useless. /obj/item/device/batterer/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) if(!user) return if(times_used >= max_uses) - user << "\red The mind batterer has been burnt out!" + user << "The mind batterer has been burnt out!" return user.attack_log += text("\[[time_stamp()]\] Used [src] to knock down people in the area.") @@ -44,13 +44,13 @@ effective or pretty fucking useless. M.Weaken(rand(10,20)) if(prob(25)) M.Stun(rand(5,10)) - M << "\red You feel a tremendous, paralyzing wave flood your mind." + M << "You feel a tremendous, paralyzing wave flood your mind." else - M << "\red You feel a sudden, electric jolt travel through your head." + M << "You feel a sudden, electric jolt travel through your head." playsound(src.loc, 'sound/misc/interference.ogg', 50, 1) - user << "\blue You trigger [src]." + user << "You trigger [src]." times_used += 1 if(times_used >= max_uses) icon_state = "battererburnt" diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 7b7d7deab8d..9f7e24dc15d 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -9,6 +9,7 @@ var/mob/attacher = null var/valve_open = 0 var/toggle = 1 + flags = PROXMOVE /obj/item/device/transfer_valve/proc/process_activation(var/obj/item/device/D) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplink.dm similarity index 60% rename from code/game/objects/items/devices/uplinks.dm rename to code/game/objects/items/devices/uplink.dm index 9d21c2e017b..8f704b2af8d 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -6,58 +6,14 @@ A list of items and costs is stored under the datum of every game mode, alongsid */ -/datum/uplink_item/ - var/name = "" - var/cost = 0 - var/path = null - var/reference = "" - var/description = "" - var/canBuyCheck = null - var/list/canBuyParams = list() - -datum/uplink_item/New(var/itemPath, var/itemCost, var/itemName, var/itemReference, var/itemDescription, var/newBuyCheck = null, var/list/newBuyParams = list()) - cost = itemCost - path = itemPath - name = itemName - reference = itemReference - description = itemDescription - canBuyCheck = newBuyCheck - canBuyParams = newBuyParams - -datum/uplink_item/proc/description() - if(!description) - // Fallback description - var/obj/temp = src.path - description = replacetext(initial(temp.desc), "\n", "
    ") - return description - -/datum/uplink_item/proc/generate_item(var/newloc) - var/list/L = list() - if(ispath(path)) - L += new path(newloc) - else if(islist(path)) - for(var/item_path in path) - L += new item_path(newloc) - return L - -/datum/uplink_item/proc/can_buy() - if (!canBuyCheck) - return 1 - - return call(canBuyCheck)(canBuyParams) - -datum/nano_item_lists - var/list/items_nano - var/list/items_reference - /obj/item/device/uplink - var/welcome // Welcoming menu message - var/uses // Numbers of crystals - var/list/ItemsCategory // List of categories with lists of items - var/list/ItemsReference // List of references with an associated item - var/list/nanoui_items // List of items for NanoUI use - var/nanoui_menu = 0 // The current menu we are in - var/list/nanoui_data = new // Additional data for NanoUI use + var/welcome = "Welcome, Operative" // Welcoming menu message + var/uses // Numbers of crystals + var/list/ItemsCategory // List of categories with lists of items + var/list/ItemsReference // List of references with an associated item + var/list/nanoui_items // List of items for NanoUI use + var/nanoui_menu = 0 // The current menu we are in + var/list/nanoui_data = new // Additional data for NanoUI use var/list/purchase_log = new var/datum/mind/uplink_owner = null @@ -66,113 +22,16 @@ datum/nano_item_lists /obj/item/device/uplink/nano_host() return loc -/obj/item/device/uplink/New() +/obj/item/device/uplink/New(var/location, var/datum/mind/owner, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT) ..() - welcome = ticker.mode.uplink_welcome - uses = ticker.mode.uplink_uses - ItemsCategory = ticker.mode.uplink_items - + src.uplink_owner = owner + purchase_log = list() world_uplinks += src + uses = telecrystals /obj/item/device/uplink/Destroy() world_uplinks -= src - ..() - -/obj/item/device/uplink/proc/generate_items() - var/datum/nano_item_lists/IL = generate_item_lists() - nanoui_items = IL.items_nano - ItemsReference = IL.items_reference - -// BS12 no longer use this menu but there are forks that do, hency why we keep it -/obj/item/device/uplink/proc/generate_menu() - var/dat = "[src.welcome]
    " - dat += "Tele-Crystals left: [src.uses]
    " - dat += "
    " - dat += "Request item:
    " - dat += "Each item costs a number of tele-crystals as indicated by the number following their name.
    " - - var/category_items = 1 - for(var/category in ItemsCategory) - if(category_items < 1) - dat += "We apologize, as you could not afford anything from this category.
    " - dat += "
    " - dat += "[category]
    " - category_items = 0 - - for(var/datum/uplink_item/I in ItemsCategory[category]) - if(I.cost > uses) - continue - dat += "[I.name] ([I.cost])
    " - category_items++ - - dat += "Random Item (??)
    " - dat += "
    " - return dat - -/* - Built the item lists for use with NanoUI -*/ -/obj/item/device/uplink/proc/generate_item_lists() - var/list/nano = new - var/list/reference = new - - for(var/category in ItemsCategory) - nano[++nano.len] = list("Category" = category, "items" = list()) - for(var/datum/uplink_item/I in ItemsCategory[category]) - nano[nano.len]["items"] += list(list("Name" = I.name, "Description" = I.description(),"Cost" = I.cost, "obj_path" = I.reference)) - reference[I.reference] = I - - var/datum/nano_item_lists/result = new - result.items_nano = nano - result.items_reference = reference - return result - -//If 'random' was selected -/obj/item/device/uplink/proc/chooseRandomItem() - if(uses <= 0) - return - - var/list/random_items = new - for(var/IR in ItemsReference) - var/datum/uplink_item/UI = ItemsReference[IR] - if(UI.cost <= uses && UI.can_buy()) - random_items += UI - return pick(random_items) - -/obj/item/device/uplink/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["buy_item"] == "random") - var/datum/uplink_item/UI = chooseRandomItem() - href_list["buy_item"] = UI.reference - return buy(UI, "RN") - else - var/datum/uplink_item/UI = ItemsReference[href_list["buy_item"]] - return buy(UI, UI ? UI.reference : "") - return 0 - -/obj/item/device/uplink/proc/buy(var/datum/uplink_item/UI, var/reference) - if(UI && UI.cost <= uses) - if (!UI.can_buy()) - usr << "This item is restricted for the time being! See about buying something else." - return 0 - - uses -= UI.cost - used_TC += UI.cost - feedback_add_details("traitor_uplink_items_bought", reference) - log_and_message_admins("used \the [src.loc] uplink to buy \a [UI].") - - var/list/L = UI.generate_item(get_turf(usr)) - if(ishuman(usr)) - var/mob/living/carbon/human/A = usr - for(var/obj/I in L) - A.put_in_any_hand_if_possible(I) - - purchase_log[UI] = purchase_log[UI] + 1 - - return 1 - return 0 + return ..() // HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it. /* How to create an uplink in 3 easy steps! @@ -190,6 +49,9 @@ datum/nano_item_lists name = "hidden uplink" desc = "There is something wrong if you're examining this." var/active = 0 + var/datum/uplink_category/category = 0 // The current category we are in + var/exploit_id // Id of the current exploit record we are viewing + // The hidden uplink MUST be inside an obj/item's contents. /obj/item/device/uplink/hidden/New() @@ -197,6 +59,8 @@ datum/nano_item_lists if(!istype(src.loc, /obj/item)) qdel(src) ..() + nanoui_data = list() + update_nano_data() // Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. /obj/item/device/uplink/hidden/proc/toggle() @@ -227,23 +91,13 @@ datum/nano_item_lists data["welcome"] = welcome data["crystals"] = uses data["menu"] = nanoui_menu - //Small hack for the contract_uplink device, to make sure the data is initialized properly. - if(nanoui_menu == 2) - update_nano_data() - if(!nanoui_items) - generate_items() - data["nano_items"] = nanoui_items data += nanoui_data // update the ui if it exists, returns null if no ui is passed/found ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - 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 + if (!ui) // No auto-refresh 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 ui.open() @@ -253,53 +107,65 @@ datum/nano_item_lists // The purchasing code. /obj/item/device/uplink/hidden/Topic(href, href_list) - if (usr.stat || usr.restrained()) + if(..()) return 1 - if (!( istype(usr, /mob/living/carbon/human))) - return 1 var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - if ((usr.contents.Find(src.loc) || (in_range(src.loc, usr) && istype(src.loc.loc, /turf)))) - usr.set_machine(src) - if(..(href, href_list)) - return 1 - else if(href_list["lock"]) - toggle() - ui.close() - return 1 - if(href_list["return"]) - nanoui_menu = round(nanoui_menu/10) - update_nano_data() - if(href_list["menu"]) - nanoui_menu = text2num(href_list["menu"]) - update_nano_data(href_list["id"]) - if(href_list["contract_interact"]) - var/list/params = list("location" = "contract_details", "contract" = href_list["contract_interact"]) - usr.client.process_webint_link("interface/login/sso_server", list2params(params)) - if(href_list["contract_page"]) - nanoui_data["contracts_current_page"] = text2num(href_list["contract_page"]) - update_nano_data() - if(href_list["contract_view"]) - nanoui_data["contracts_view"] = text2num(href_list["contract_view"]) - nanoui_data["contracts_current_page"] = 1 - update_nano_data() + if(href_list["buy_item"]) + var/datum/uplink_item/UI = (locate(href_list["buy_item"]) in uplink.items) + UI.buy(src, usr) + else if(href_list["lock"]) + toggle() + var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") + ui.close() + else if(href_list["return"]) + nanoui_menu = round(nanoui_menu/10) + else if(href_list["menu"]) + nanoui_menu = text2num(href_list["menu"]) + if(href_list["id"]) + exploit_id = href_list["id"] + if(href_list["category"]) + category = locate(href_list["category"]) in uplink.categories + // #TODO-MERGE: Check NanoUI on PDAs + if(href_list["contract_interact"]) + var/list/params = list("location" = "contract_details", "contract" = href_list["contract_interact"]) + usr.client.process_webint_link("interface/login/sso_server", list2params(params)) + if(href_list["contract_page"]) + nanoui_data["contracts_current_page"] = text2num(href_list["contract_page"]) + update_nano_data() + if(href_list["contract_view"]) + nanoui_data["contracts_view"] = text2num(href_list["contract_view"]) + nanoui_data["contracts_current_page"] = 1 + update_nano_data() - interact(usr) + update_nano_data() return 1 -/obj/item/device/uplink/hidden/proc/update_nano_data(var/id) - if(nanoui_menu == 1) +/obj/item/device/uplink/hidden/proc/update_nano_data() + if(nanoui_menu == 0) + var/categories[0] + for(var/datum/uplink_category/category in uplink.categories) + if(category.can_view(src)) + categories[++categories.len] = list("name" = category.name, "ref" = "\ref[category]") + nanoui_data["categories"] = categories + else if(nanoui_menu == 1) + var/items[0] + for(var/datum/uplink_item/item in category.items) + if(item.can_view(src)) + var/cost = item.cost(uses) + if(!cost) cost = "???" + items[++items.len] = list("name" = item.name, "description" = replacetext(item.description(), "\n", "
    "), "can_buy" = item.can_buy(src), "cost" = cost, "ref" = "\ref[item]") + nanoui_data["items"] = items + else if(nanoui_menu == 2) var/permanentData[0] for(var/datum/data/record/L in sortRecord(data_core.locked)) permanentData[++permanentData.len] = list(Name = L.fields["name"],"id" = L.fields["id"]) nanoui_data["exploit_records"] = permanentData - - if(nanoui_menu == 11) + else if(nanoui_menu == 21) nanoui_data["exploit_exists"] = 0 for(var/datum/data/record/L in data_core.locked) - if(L.fields["id"] == id) + if(L.fields["id"] == exploit_id) nanoui_data["exploit"] = list() // Setting this to equal L.fields passes it's variables that are lists as reference instead of value. // We trade off being able to automatically add shit for more control over what gets passed to json // and if it's sanitized for html. @@ -319,7 +185,7 @@ datum/nano_item_lists nanoui_data["exploit_exists"] = 1 break - if(nanoui_menu == 2) + else if(nanoui_menu == 3) nanoui_data["contracts_found"] = 0 establish_db_connection(dbcon) @@ -386,14 +252,30 @@ datum/nano_item_lists nanoui_data["contracts_found"] = 1 - if(nanoui_menu == 21) + if(nanoui_menu == 31) nanoui_data["contracts_found"] = 0 establish_db_connection(dbcon) if (dbcon.IsConnected()) + nanoui_data["contracts"] = list() + + if (!nanoui_data["contracts_current_page"]) + nanoui_data["contracts_current_page"] = 1 + + if (!nanoui_data["contracts_view"]) + nanoui_data["contracts_view"] = 1 + var/query_details[0] - query_details[":contract_id"] = text2num(id) + + switch (nanoui_data["contracts_view"]) + if (1) + query_details[":status"] = "open" + if (2) + query_details[":status"] = "closed" + else + nanoui_data["contracts_view"] = 1 + query_details[":status"] = "open" var/DBQuery/select_query = dbcon.NewQuery("SELECT contract_id, contractee_name, status, title, description, reward_other FROM ss13_syndie_contracts WHERE contract_id = :contract_id") select_query.Execute(query_details) @@ -460,7 +342,7 @@ datum/nano_item_lists /obj/item/device/radio/headset/uplink/New() ..() hidden_uplink = new(src) - hidden_uplink.uses = 10 + hidden_uplink.uses = DEFAULT_TELECRYSTAL_AMOUNT /* * A simple device for accessing the SQL based contract database @@ -478,7 +360,7 @@ datum/nano_item_lists ..() hidden_uplink = new(src) hidden_uplink.uses = 0 - hidden_uplink.nanoui_menu = 2 + hidden_uplink.nanoui_menu = 3 /obj/item/device/contract_uplink/attack_self(mob/user as mob) if (hidden_uplink) diff --git a/code/game/objects/items/devices/uplink_random_lists.dm b/code/game/objects/items/devices/uplink_random_lists.dm new file mode 100644 index 00000000000..d764a36003b --- /dev/null +++ b/code/game/objects/items/devices/uplink_random_lists.dm @@ -0,0 +1,101 @@ +var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_random_selection/default() + +/datum/uplink_random_item + var/uplink_item // The uplink item + var/keep_probability // The probability we'll decide to keep this item if selected + var/reselect_probability // Probability that we'll decide to keep this item if previously selected. + // Is done together with the keep_probability check. Being selected more than once does not affect this probability. + +/datum/uplink_random_item/New(var/uplink_item, var/keep_probability = 100, var/reselect_propbability = 33) + ..() + src.uplink_item = uplink_item + src.keep_probability = keep_probability + src.reselect_probability = reselect_probability + +/datum/uplink_random_selection + var/list/datum/uplink_random_item/items + +/datum/uplink_random_selection/New() + ..() + items = list() + +/datum/uplink_random_selection/proc/get_random_item(var/telecrystals, obj/item/device/uplink/U, var/list/bought_items) + var/const/attempts = 50 + + for(var/i = 0; i < attempts; i++) + var/datum/uplink_random_item/RI = pick(items) + if(!prob(RI.keep_probability)) + continue + var/datum/uplink_item/I = uplink.items_assoc[RI.uplink_item] + if(I.cost(telecrystals) > telecrystals) + continue + if(bought_items && (I in bought_items) && !prob(RI.reselect_probability)) + continue + if(U && !I.can_buy(U)) + continue + return I + +/datum/uplink_random_selection/default/New() + ..() + + items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/g9mm) + items += new/datum/uplink_random_item(/datum/uplink_item/item/ammo/mc9mm) + items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/revolver) + items += new/datum/uplink_random_item(/datum/uplink_item/item/ammo/a357) + items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/heavysniper, 15, 0) + items += new/datum/uplink_random_item(/datum/uplink_item/item/ammo/sniperammo, 15, 0) + items += new/datum/uplink_random_item(/datum/uplink_item/item/grenades/emp, 50) + items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/crossbow, 33) + items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/energy_sword, 75) + + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/soap, 5, 100) + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/concealed_cane, 50, 10) + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/detomatix, 20, 10) + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/parapen) + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/cigarette_kit) + + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/id) + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/spy) + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/chameleon_kit) + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/chameleon_projector) + items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/voice) + + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/toolbox, reselect_propbability = 10) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/plastique) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/encryptionkey_radio) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/encryptionkey_binary) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/emag, 100, 50) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/clerical) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/space_suit, 50, 10) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/thermal) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/heavy_vest) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/powersink, 10, 10) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/ai_module, 25, 0) + items += new/datum/uplink_random_item(/datum/uplink_item/item/tools/teleporter, 10, 0) + + items += new/datum/uplink_random_item(/datum/uplink_item/item/implants/imp_freedom) + items += new/datum/uplink_random_item(/datum/uplink_item/item/implants/imp_compress) + items += new/datum/uplink_random_item(/datum/uplink_item/item/implants/imp_explosive) + + items += new/datum/uplink_random_item(/datum/uplink_item/item/medical/sinpockets, reselect_propbability = 20) + items += new/datum/uplink_random_item(/datum/uplink_item/item/medical/surgery, reselect_propbability = 10) + items += new/datum/uplink_random_item(/datum/uplink_item/item/medical/combat, reselect_propbability = 10) + + items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/thermal, reselect_propbability = 15) + items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/energy_net, reselect_propbability = 15) + items += new/datum/uplink_random_item(/datum/uplink_item/item/ewar_voice, reselect_propbability = 15) + items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/maneuvering_jets, reselect_propbability = 15) + items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/egun, reselect_propbability = 15) + items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/power_sink, reselect_propbability = 15) + items += new/datum/uplink_random_item(/datum/uplink_item/item/hardsuit_modules/laser_canon, reselect_propbability = 5) + +#ifdef DEBUG +/proc/debug_uplink_purchage_log() + for(var/antag_type in all_antag_types) + var/datum/antagonist/A = all_antag_types[antag_type] + A.print_player_summary() + +/proc/debug_uplink_item_assoc_list() + for(var/key in uplink.items_assoc) + world << "[key] - [uplink.items_assoc[key]]" +#endif diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm index e116689c9ad..2286f787145 100644 --- a/code/game/objects/items/devices/violin.dm +++ b/code/game/objects/items/devices/violin.dm @@ -271,7 +271,7 @@ Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
    By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.
    Example: C,D,E,F,G,A,B will play a C major scale.
    - After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
    + After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
    Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B
    A pause may be denoted by an empty chord: C,E,,C,G
    To make a chord be a different time, end it with /x, where the chord length will be length
    diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index 14eb3de2b5e..1e8518d5fe6 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -47,12 +47,10 @@ obj/item/device/hailer/attack_self(mob/living/carbon/user as mob) spawn(20) spamcheck = 0 -/obj/item/device/hailer/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/card/emag)) - if(isnull(insults)) - user << "You overload \the [src]'s voice synthesizer." - insults = rand(1, 3)//to prevent dickflooding - else - user << "The hailer is fried. You can't even fit the sequencer into the input slot." +/obj/item/device/hailer/emag_act(var/remaining_charges, var/mob/user) + if(isnull(insults)) + user << "You overload \the [src]'s voice synthesizer." + insults = rand(1, 3)//to prevent dickflooding + return 1 else - return .. () + user << "The hailer is fried. You can't even fit the sequencer into the input slot." diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index 96f4e03407b..090b56f86dd 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -26,14 +26,14 @@ return var/mob/L = A user.visible_message("[user] scoops [L] into \the [src].", "You scoop [L] into \the [src].") - L.loc = src + L.forceMove(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 + S.forceMove(src) processing_objects.Remove(S) // No growing inside jars contains = 3 update_icon() @@ -73,7 +73,7 @@ var/obj/item/weapon/spacecash/S = W user.visible_message("[user] puts [S.worth] [S.worth > 1 ? "credits" : "credit"] into \the [src].") user.drop_from_inventory(S) - S.loc = src + S.forceMove(src) update_icon() /obj/item/glass_jar/update_icon() // Also updates name and desc diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 3ccf1fb3a96..163a34a2a0a 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -10,31 +10,20 @@ icon = 'icons/obj/decals.dmi' icon_state = "shock" -/obj/item/borg/stun/attack(var/mob/living/M, var/mob/living/silicon/robot/user) - - if(!istype(M)) - return - - // How the Hell. +/obj/item/borg/stun/apply_hit_effect(mob/living/M, mob/living/silicon/robot/user, var/hit_zone) if(!istype(user)) - var/mob/living/temp = user - if(istype(temp)) - temp.drop_from_inventory(src) - qdel(src) return - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)") + user.visible_message("\The [user] has prodded \the [M] with \a [src]!") if(!user.cell || !user.cell.checked_use(1250)) //Slightly more than a baton. - user.visible_message("\The [user] has prodded \the [M] with its arm!") return - if (M.stuttering < 5) - M.stuttering = 5 - M.stun_effect_act(0, 70, check_zone(user.zone_sel.selecting), src) - user.visible_message("\The [user] has prodded \the [M] with \a [src]!") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + + M.apply_effect(5, STUTTER) + M.stun_effect_act(0, 70, check_zone(hit_zone), src) + if(ishuman(M)) var/mob/living/carbon/human/H = M H.forcesay(hit_appends) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index fcd86467ad7..1ccd2f88172 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -5,8 +5,6 @@ icon_state = "blank" flags = CONDUCT slot_flags = SLOT_BELT - var/construction_time = 100 - var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=5000) var/list/part = null // Order of args is important for installing robolimbs. var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics. var/model_info @@ -32,8 +30,6 @@ name = "left arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_arm" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=18000) part = list("l_arm","l_hand") model_info = 1 @@ -41,8 +37,6 @@ name = "right arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_arm" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=18000) part = list("r_arm","r_hand") model_info = 1 @@ -50,8 +44,6 @@ name = "left leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_leg" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000) part = list("l_leg","l_foot") model_info = 1 @@ -59,8 +51,6 @@ name = "right leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_leg" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000) part = list("r_leg","r_foot") model_info = 1 @@ -68,8 +58,7 @@ name = "torso" desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." icon_state = "chest" - construction_time = 350 - construction_cost = list(DEFAULT_WALL_MATERIAL=40000) + part = list("groin","chest") var/wires = 0.0 var/obj/item/weapon/cell/cell = null @@ -77,8 +66,7 @@ name = "head" desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals." icon_state = "head" - construction_time = 350 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) + part = list("head") var/obj/item/device/flash/flash1 = null var/obj/item/device/flash/flash2 = null @@ -86,8 +74,6 @@ name = "endoskeleton" desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors." icon_state = "robo_suit" - construction_time = 500 - construction_cost = list(DEFAULT_WALL_MATERIAL=50000) var/obj/item/robot_parts/l_arm/l_arm = null var/obj/item/robot_parts/r_arm/r_arm = null var/obj/item/robot_parts/l_leg/l_leg = null @@ -173,9 +159,9 @@ src.chest = W src.updateicon() else if(!W:wires) - user << "\blue You need to attach wires to it first!" + user << "You need to attach wires to it first!" else - user << "\blue You need to attach a cell to it first!" + user << "You need to attach a cell to it first!" if(istype(W, /obj/item/robot_parts/head)) if(src.head) return @@ -185,16 +171,16 @@ src.head = W src.updateicon() else - user << "\blue You need to attach a flash to it first!" + user << "You need to attach a flash to it first!" if(istype(W, /obj/item/device/mmi)) var/obj/item/device/mmi/M = W if(check_completion()) if(!istype(loc,/turf)) - user << "\red You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise." + user << "You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise." return if(!M.brainmob) - user << "\red Sticking an empty [W] into the frame would sort of defeat the purpose." + user << "Sticking an empty [W] into the frame would sort of defeat the purpose." return if(!M.brainmob.key) var/ghost_can_reenter = 0 @@ -208,11 +194,11 @@ return if(M.brainmob.stat == DEAD) - user << "\red Sticking a dead [W] into the frame would sort of defeat the purpose." + user << "Sticking a dead [W] into the frame would sort of defeat the purpose." return if(jobban_isbanned(M.brainmob, "Cyborg")) - user << "\red This [W] does not seem to fit." + user << "This [W] does not seem to fit." return var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1) @@ -248,7 +234,7 @@ qdel(src) else - user << "\blue The MMI must go in after everything else!" + user << "The MMI must go in after everything 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) @@ -265,22 +251,22 @@ ..() if(istype(W, /obj/item/weapon/cell)) if(src.cell) - user << "\blue You have already inserted a cell!" + user << "You have already inserted a cell!" return else user.drop_item() W.loc = src src.cell = W - user << "\blue You insert the cell!" + user << "You insert the cell!" if(istype(W, /obj/item/stack/cable_coil)) if(src.wires) - user << "\blue You have already inserted wire!" + user << "You have already inserted wire!" return else var/obj/item/stack/cable_coil/coil = W coil.use(1) src.wires = 1.0 - user << "\blue You insert the wire!" + user << "You insert the wire!" return /obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob) @@ -296,7 +282,7 @@ else 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!" + user << "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() qdel(W) @@ -320,12 +306,10 @@ 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) - user << "\red [src] is already sabotaged!" - else - user << "\red You slide [W] into the dataport on [src] and short out the safeties." - sabotaged = 1 - return - ..() +/obj/item/robot_parts/emag_act(var/remaining_charges, var/mob/user) + if(sabotaged) + user << "[src] is already sabotaged!" + else + user << "You short out the safeties." + sabotaged = 1 + return 1 diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 13868eb68e4..ac46f2beaa9 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -6,15 +6,13 @@ desc = "Protected by FRM." icon = 'icons/obj/module.dmi' icon_state = "cyborg_upgrade" - var/construction_time = 120 - var/construction_cost = list(DEFAULT_WALL_MATERIAL=10000) var/locked = 0 var/require_module = 0 var/installed = 0 /obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R) if(R.stat == DEAD) - usr << "\red The [src] will not function on a deceased robot." + usr << "The [src] will not function on a deceased robot." return 1 return 0 @@ -31,10 +29,10 @@ 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.updatename("Default") return 1 @@ -43,7 +41,7 @@ name = "robot reclassification board" desc = "Used to rename a cyborg." icon_state = "cyborg_upgrade1" - construction_cost = list(DEFAULT_WALL_MATERIAL=1000) +// construction_cost = list(DEFAULT_WALL_MATERIAL=1000) var/heldname = "default name" /obj/item/borg/upgrade/rename/attack_self(mob/user as mob) @@ -58,10 +56,26 @@ return 1 +/obj/item/borg/upgrade/floodlight + name = "robot floodlight module" + desc = "Used to boost cyborg's light intensity." + icon_state = "cyborg_upgrade1" + +/obj/item/borg/upgrade/floodlight/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(R.intenselight) + usr << "This cyborg's light was already upgraded" + return 0 + else + R.intenselight = 1 + R.update_robot_light() + R << "Lighting systems upgrade detected." + return 1 + /obj/item/borg/upgrade/restart name = "robot emergency restart module" desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." - construction_cost = list(DEFAULT_WALL_MATERIAL=60000 , "glass"=5000) icon_state = "cyborg_upgrade1" @@ -85,7 +99,6 @@ /obj/item/borg/upgrade/vtec name = "robotic VTEC Module" desc = "Used to kick in a robot's VTEC systems, increasing their speed." - construction_cost = list(DEFAULT_WALL_MATERIAL=80000 , "glass"=6000 , "gold"= 5000) icon_state = "cyborg_upgrade2" require_module = 1 @@ -102,7 +115,6 @@ /obj/item/borg/upgrade/tasercooler name = "robotic 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(DEFAULT_WALL_MATERIAL=80000 , "glass"=6000 , "gold"= 2000, "diamond" = 500) icon_state = "cyborg_upgrade3" require_module = 1 @@ -138,7 +150,6 @@ /obj/item/borg/upgrade/syndicate/ name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a robot" - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"glass"=15000,"diamond" = 10000) icon_state = "cyborg_upgrade3" require_module = 1 @@ -150,11 +161,11 @@ R.emagged = 1 return 1 - + /obj/item/borg/upgrade/combat name = "combat cyborg module" desc = "Unlocks the combat cyborg module" - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"glass"=15000,"gold"= 5000,"diamond" = 1000) +// construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"glass"=15000,"gold"= 5000,"diamond" = 1000) icon_state = "cyborg_upgrade3" require_module = 0 diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 8f24a93c10d..f1c9aa2d145 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -96,7 +96,7 @@ if(hp <= 0) for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << "\red [src] breaks into tiny pieces and collapses!" + O << "\The [src] breaks into tiny pieces and collapses!" qdel(src) // Create a temporary object to represent the damage diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm index 3483dfbc61c..b18cd330aca 100644 --- a/code/game/objects/items/stacks/matter_synth.dm +++ b/code/game/objects/items/stacks/matter_synth.dm @@ -2,12 +2,15 @@ var/name = "Generic Synthesizer" var/max_energy = 60000 var/recharge_rate = 2000 + var/max_energy_multiplied = 60000 + var/multiplier = 1 // Robot may be upgraded with better matter bin to multiply capacity of it's synthetisers var/energy /datum/matter_synth/New(var/store = 0) if(store) max_energy = store - energy = max_energy + energy = max_energy_multiplied + set_multiplier(1) return /datum/matter_synth/proc/get_charge() @@ -20,10 +23,15 @@ return 0 /datum/matter_synth/proc/add_charge(var/amount) - energy = min(energy + amount, max_energy) + energy = min(energy + amount, max_energy_multiplied) /datum/matter_synth/proc/emp_act(var/severity) - use_charge(max_energy * 0.1 / severity) + use_charge(max_energy_multiplied * 0.1 / severity) + +/datum/matter_synth/proc/set_multiplier(var/new_multiplier) + multiplier = new_multiplier + max_energy_multiplied = max_energy * multiplier + energy = min(max_energy_multiplied, energy) /datum/matter_synth/medicine name = "Medicine Synthesizer" diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 25817d42730..f620dddc8fb 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -17,7 +17,7 @@ if ( ! (istype(user, /mob/living/carbon/human) || \ istype(user, /mob/living/silicon)) ) - user << "\red You don't have the dexterity to do this!" + user << "You don't have the dexterity to do this!" return 1 if (istype(M, /mob/living/carbon/human)) @@ -26,15 +26,15 @@ if(affecting.name == "head") if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space)) - user << "\red You can't apply [src] through [H.head]!" + user << "You can't apply [src] through [H.head]!" return 1 else if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space)) - user << "\red You can't apply [src] through [H.wear_suit]!" + user << "You can't apply [src] through [H.wear_suit]!" return 1 if(affecting.status & ORGAN_ROBOT) - user << "\red This isn't useful at all on a robotic limb.." + user << "This isn't useful at all on a robotic limb.." return 1 H.UpdateDamageIcon() @@ -62,7 +62,7 @@ singular_name = "gauze length" desc = "Some sterile gauze to wrap around bloody stumps." icon_state = "brutepack" - origin_tech = "biotech=1" + origin_tech = list(TECH_BIO = 1) heal_brute = 4 /obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob) @@ -74,24 +74,42 @@ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) if(affecting.open == 0) - if(!affecting.bandage()) - user << "\red The wounds on [M]'s [affecting.name] have already been bandaged." + if(affecting.is_bandaged()) + user << "The wounds on [M]'s [affecting.name] have already been bandaged." return 1 else + user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \ + "You start treating [M]'s [affecting.name]." ) + var/used = 0 for (var/datum/wound/W in affecting.wounds) if (W.internal) continue + if(W.bandaged) + continue + if(used == amount) + break + if(!do_mob(user, M, W.damage/5)) + user << "You must stand still to bandage wounds." + break if (W.current_stage <= W.max_bleeding_stage) - user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.name].", \ - "\blue You bandage [W.desc] on [M]'s [affecting.name]." ) + user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ + "You bandage \a [W.desc] on [M]'s [affecting.name]." ) //H.add_side_effect("Itch") else if (istype(W,/datum/wound/bruise)) - user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.name].", \ - "\blue You place bruise patch over [W.desc] on [M]'s [affecting.name]." ) + user.visible_message("\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].", \ + "You place a bruise patch over \a [W.desc] on [M]'s [affecting.name]." ) else - user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.name].", \ - "\blue You place bandaid over [W.desc] on [M]'s [affecting.name]." ) - use(1) + user.visible_message("\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].", \ + "You place a bandaid over \a [W.desc] on [M]'s [affecting.name]." ) + W.bandage() + used++ + affecting.update_damages() + if(used == amount) + if(affecting.is_bandaged()) + user << "\The [src] is used up." + else + user << "\The [src] is used up, but there are more wounds to treat on \the [affecting.name]." + use(used) else if (can_operate(H)) //Checks if mob is lying down on table for surgery if (do_surgery(H,user,src)) @@ -106,7 +124,7 @@ singular_name = "ointment" icon_state = "ointment" heal_burn = 4 - origin_tech = "biotech=1" + origin_tech = list(TECH_BIO = 1) /obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob) if(..()) @@ -117,13 +135,19 @@ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) if(affecting.open == 0) - if(!affecting.salve()) - user << "\red The wounds on [M]'s [affecting.name] have already been salved." + if(affecting.is_salved()) + user << "The wounds on [M]'s [affecting.name] have already been salved." return 1 else - user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.name].", \ - "\blue You salve wounds on [M]'s [affecting.name]." ) + user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \ + "You start salving the wounds on [M]'s [affecting.name]." ) + if(!do_mob(user, M, 10)) + user << "You must stand still to salve wounds." + return 1 + user.visible_message("[user] salved wounds on [M]'s [affecting.name].", \ + "You salved wounds on [M]'s [affecting.name]." ) use(1) + affecting.salve() else if (can_operate(H)) //Checks if mob is lying down on table for surgery if (do_surgery(H,user,src)) @@ -137,7 +161,7 @@ desc = "An advanced trauma kit for severe injuries." icon_state = "traumakit" heal_brute = 8 - origin_tech = "biotech=1" + origin_tech = list(TECH_BIO = 1) /obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob) if(..()) @@ -148,29 +172,44 @@ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) if(affecting.open == 0) - var/bandaged = affecting.bandage() - var/disinfected = affecting.disinfect() - - if(!(bandaged || disinfected)) - user << "\red The wounds on [M]'s [affecting.name] have already been treated." + if(affecting.is_bandaged() && affecting.is_disinfected()) + user << "The wounds on [M]'s [affecting.name] have already been treated." return 1 else + user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \ + "You start treating [M]'s [affecting.name]." ) + var/used = 0 for (var/datum/wound/W in affecting.wounds) if (W.internal) continue + if (W.bandaged && W.disinfected) + continue + if(used == amount) + break + if(!do_mob(user, M, W.damage/5)) + user << "You must stand still to bandage wounds." + break if (W.current_stage <= W.max_bleeding_stage) - user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.name] and seals edges with bioglue.", \ - "\blue You clean and seal [W.desc] on [M]'s [affecting.name]." ) + user.visible_message("\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \ + "You clean and seal \a [W.desc] on [M]'s [affecting.name]." ) //H.add_side_effect("Itch") else if (istype(W,/datum/wound/bruise)) - user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.name].", \ - "\blue You place medicine patch over [W.desc] on [M]'s [affecting.name]." ) + user.visible_message("\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].", \ + "You place a medical patch over \a [W.desc] on [M]'s [affecting.name]." ) else - user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.name].", \ - "\blue You smear some bioglue over [W.desc] on [M]'s [affecting.name]." ) - if (bandaged) - affecting.heal_damage(heal_brute,0) - use(1) + user.visible_message("\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].", \ + "You smear some bioglue over \a [W.desc] on [M]'s [affecting.name]." ) + W.bandage() + W.disinfect() + W.heal_damage(heal_brute) + used++ + affecting.update_damages() + if(used == amount) + if(affecting.is_bandaged()) + user << "\The [src] is used up." + else + user << "\The [src] is used up, but there are more wounds to treat on \the [affecting.name]." + use(used) else if (can_operate(H)) //Checks if mob is lying down on table for surgery if (do_surgery(H,user,src)) @@ -184,7 +223,7 @@ desc = "An advanced treatment kit for severe burns." icon_state = "burnkit" heal_burn = 8 - origin_tech = "biotech=1" + origin_tech = list(TECH_BIO = 1) /obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob) @@ -196,14 +235,20 @@ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) if(affecting.open == 0) - if(!affecting.salve()) - user << "\red The wounds on [M]'s [affecting.name] have already been salved." + if(affecting.is_salved()) + user << "The wounds on [M]'s [affecting.name] have already been salved." return 1 else - user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.name] with regenerative membrane.", \ - "\blue You cover wounds on [M]'s [affecting.name] with regenerative membrane." ) + user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \ + "You start salving the wounds on [M]'s [affecting.name]." ) + if(!do_mob(user, M, 10)) + user << "You must stand still to salve wounds." + return 1 + user.visible_message( "[user] covers wounds on [M]'s [affecting.name] with regenerative membrane.", \ + "You cover wounds on [M]'s [affecting.name] with regenerative membrane." ) affecting.heal_damage(0,heal_burn) use(1) + affecting.salve() else if (can_operate(H)) //Checks if mob is lying down on table for surgery if (do_surgery(H,user,src)) diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index a71c2bc5455..db83c575074 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -4,7 +4,7 @@ desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." icon = 'icons/obj/nanopaste.dmi' icon_state = "tube" - origin_tech = "materials=4;engineering=3" + origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) amount = 10 var/list/construction_cost = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) @@ -17,6 +17,7 @@ if (istype(M,/mob/living/silicon/robot)) //Repairing cyborgs var/mob/living/silicon/robot/R = M if (R.getBruteLoss() || R.getFireLoss() ) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) R.adjustBruteLoss(-15) R.adjustFireLoss(-15) R.updatehealth() @@ -33,6 +34,7 @@ if(S.open == 1) if (S && (S.status & ORGAN_ROBOT)) if(S.get_damage()) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) S.heal_damage(15, 15, robo_repair = 1) H.updatehealth() use(1) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index ff5514a3dbb..3d6a5c96261 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -28,14 +28,14 @@ var/obj/item/weapon/weldingtool/WT = W if(get_amount() < 2) - user << "\red You need at least two rods to do this." + user << "You need at least two rods to do this." return if(WT.remove_fuel(0,user)) var/obj/item/stack/material/steel/new_item = new(usr.loc) new_item.add_to_stacks(usr) for (var/mob/M in viewers(src)) - M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) + M.show_message("[src] is shaped into metal by [user.name] with the weldingtool.", 3, "You hear welding.", 2) var/obj/item/stack/rods/R = src src = null var/replace = (user.get_inactive_hand()==R) @@ -64,15 +64,15 @@ else if(!in_use) if(get_amount() < 2) - user << "\blue You need at least two rods to do this." + user << "You need at least two rods to do this." return - usr << "\blue Assembling grille..." + usr << "Assembling grille..." in_use = 1 if (!do_after(usr, 10)) in_use = 0 return var/obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc ) - usr << "\blue You assemble a grille" + usr << "You assemble a grille" in_use = 0 F.add_fingerprint(usr) use(2) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm new file mode 100644 index 00000000000..8d82ffc8d1e --- /dev/null +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -0,0 +1,174 @@ +/* Glass stack types + * Contains: + * Glass sheets + * Reinforced glass sheets + * Phoron Glass Sheets + * Reinforced Phoron Glass Sheets (AKA Holy fuck strong windows) + * Glass shards - TODO: Move this into code/game/object/item/weapons + */ + +/* + * Glass sheets + */ +/obj/item/stack/material/glass + name = "glass" + singular_name = "glass sheet" + icon_state = "sheet-glass" + var/created_window = /obj/structure/window/basic + var/is_reinforced = 0 + var/list/construction_options = list("One Direction", "Full Window") + default_type = "glass" + +/obj/item/stack/material/glass/attack_self(mob/user as mob) + construct_window(user) + +/obj/item/stack/material/glass/attackby(obj/item/W, mob/user) + ..() + if(!is_reinforced) + if(istype(W,/obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/CC = W + if (get_amount() < 1 || CC.get_amount() < 5) + user << "You need five lengths of coil and one sheet of glass to make wired glass." + return + + CC.use(5) + use(1) + user << "You attach wire to the [name]." + new /obj/item/stack/light_w(user.loc) + else if(istype(W, /obj/item/stack/rods)) + var/obj/item/stack/rods/V = W + if (V.get_amount() < 1 || get_amount() < 1) + user << "You need one rod and one sheet of glass to make reinforced glass." + return + + var/obj/item/stack/material/glass/reinforced/RG = new (user.loc) + RG.add_fingerprint(user) + RG.add_to_stacks(user) + var/obj/item/stack/material/glass/G = src + src = null + var/replace = (user.get_inactive_hand()==G) + V.use(1) + G.use(1) + if (!G && replace) + user.put_in_hands(RG) + +/obj/item/stack/material/glass/proc/construct_window(mob/user as mob) + if(!user || !src) return 0 + if(!istype(user.loc,/turf)) return 0 + if(!user.IsAdvancedToolUser()) + return 0 + var/title = "Sheet-[name]" + title += " ([src.get_amount()] sheet\s left)" + switch(input(title, "What would you like to construct?") as null|anything in construction_options) + if("One Direction") + if(!src) return 1 + if(src.loc != user) return 1 + + var/list/directions = new/list(cardinal) + var/i = 0 + for (var/obj/structure/window/win in user.loc) + i++ + if(i >= 4) + user << "There are too many windows in this location." + return 1 + directions-=win.dir + if(!(win.dir in cardinal)) + user << "Can't let you do that." + return 1 + + //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. + var/dir_to_set = 2 + for(var/direction in list( user.dir, turn(user.dir,90), turn(user.dir,180), turn(user.dir,270) )) + var/found = 0 + for(var/obj/structure/window/WT in user.loc) + if(WT.dir == direction) + found = 1 + if(!found) + dir_to_set = direction + break + new created_window( user.loc, dir_to_set, 1 ) + src.use(1) + if("Full Window") + if(!src) return 1 + if(src.loc != user) return 1 + if(src.get_amount() < 4) + user << "You need more glass to do that." + return 1 + if(locate(/obj/structure/window) in user.loc) + user << "There is a window in the way." + return 1 + new created_window( user.loc, SOUTHWEST, 1 ) + src.use(4) + if("Windoor") + if(!is_reinforced) return 1 + + + if(!src || src.loc != user) return 1 + + if(isturf(user.loc) && locate(/obj/structure/windoor_assembly/, user.loc)) + user << "There is already a windoor assembly in that location." + return 1 + + if(isturf(user.loc) && locate(/obj/machinery/door/window/, user.loc)) + user << "There is already a windoor in that location." + return 1 + + if(src.get_amount() < 5) + user << "You need more glass to do that." + return 1 + + new /obj/structure/windoor_assembly(user.loc, user.dir, 1) + src.use(5) + + return 0 + + +/* + * Reinforced glass sheets + */ +/obj/item/stack/material/glass/reinforced + name = "reinforced glass" + singular_name = "reinforced glass sheet" + icon_state = "sheet-rglass" + default_type = "reinforced glass" + created_window = /obj/structure/window/reinforced + is_reinforced = 1 + construction_options = list("One Direction", "Full Window", "Windoor") + +/* + * Phoron Glass sheets + */ +/obj/item/stack/material/glass/phoronglass + name = "phoron glass" + singular_name = "phoron glass sheet" + icon_state = "sheet-phoronglass" + created_window = /obj/structure/window/phoronbasic + default_type = "phoron glass" + +/obj/item/stack/material/glass/phoronglass/attackby(obj/item/W, mob/user) + ..() + if( istype(W, /obj/item/stack/rods) ) + var/obj/item/stack/rods/V = W + var/obj/item/stack/material/glass/phoronrglass/RG = new (user.loc) + RG.add_fingerprint(user) + RG.add_to_stacks(user) + V.use(1) + var/obj/item/stack/material/glass/G = src + src = null + var/replace = (user.get_inactive_hand()==G) + G.use(1) + if (!G && !RG && replace) + user.put_in_hands(RG) + else + return ..() + +/* + * Reinforced phoron glass sheets + */ +/obj/item/stack/material/glass/phoronrglass + name = "reinforced phoron glass" + singular_name = "reinforced phoron glass sheet" + icon_state = "sheet-phoronrglass" + default_type = "reinforced phoron glass" + created_window = /obj/structure/window/phoronreinforced + is_reinforced = 1 diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 87cdf3b4c24..5d1e7eb144b 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -3,42 +3,36 @@ desc = "The by-product of human farming." singular_name = "human skin piece" icon_state = "sheet-hide" - origin_tech = "" /obj/item/stack/material/animalhide/corgi name = "corgi hide" desc = "The by-product of corgi farming." singular_name = "corgi hide piece" icon_state = "sheet-corgi" - origin_tech = "" /obj/item/stack/material/animalhide/cat name = "cat hide" desc = "The by-product of cat farming." singular_name = "cat hide piece" icon_state = "sheet-cat" - origin_tech = "" /obj/item/stack/material/animalhide/monkey name = "monkey hide" desc = "The by-product of monkey farming." singular_name = "monkey hide piece" icon_state = "sheet-monkey" - origin_tech = "" /obj/item/stack/material/animalhide/lizard name = "lizard skin" desc = "Sssssss..." singular_name = "lizard skin piece" icon_state = "sheet-lizard" - origin_tech = "" /obj/item/stack/material/animalhide/xeno name = "alien hide" desc = "The skin of a terrible creature." singular_name = "alien hide piece" icon_state = "sheet-xeno" - origin_tech = "" //don't see anywhere else to put these, maybe together they could be used to make the xenos suit? /obj/item/stack/material/xenochitin @@ -47,35 +41,30 @@ singular_name = "alien hide piece" icon = 'icons/mob/alien.dmi' icon_state = "chitin" - origin_tech = "" /obj/item/xenos_claw name = "alien claw" desc = "The claw of a terrible creature." icon = 'icons/mob/alien.dmi' icon_state = "claw" - origin_tech = "" /obj/item/weed_extract name = "weed extract" desc = "A piece of slimy, purplish weed." icon = 'icons/mob/alien.dmi' icon_state = "weed_extract" - origin_tech = "" /obj/item/stack/material/hairlesshide name = "hairless hide" desc = "This hide was stripped of it's hair, but still needs tanning." singular_name = "hairless hide piece" icon_state = "sheet-hairlesshide" - origin_tech = "" /obj/item/stack/material/wetleather name = "wet leather" desc = "This leather has been cleaned but still needs to be dried." singular_name = "wet leather piece" icon_state = "sheet-wetleather" - origin_tech = "" var/wetness = 30 //Reduced when exposed to high temperautres var/drying_threshold_temperature = 500 //Kelvin to start drying @@ -87,9 +76,9 @@ istype(W, /obj/item/weapon/material/hatchet) ) //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) - usr.visible_message("\blue \the [usr] starts cutting hair off \the [src]", "\blue You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") + usr.visible_message("\The [usr] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") if(do_after(user,50)) - usr << "\blue You cut the hair from this [src.singular_name]" + usr << "You cut the hair from this [src.singular_name]" //Try locating an exisitng stack on the tile and add to there if possible for(var/obj/item/stack/material/hairlesshide/HS in usr.loc) if(HS.amount < 50) diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm deleted file mode 100644 index 424eab6a034..00000000000 --- a/code/game/objects/items/stacks/sheets/light.dm +++ /dev/null @@ -1,33 +0,0 @@ -/obj/item/stack/light_w - name = "wired glass tile" - singular_name = "wired glass floor tile" - desc = "A glass tile, which is wired, somehow." - icon_state = "glass_wire" - w_class = 3.0 - force = 3.0 - throwforce = 5.0 - throw_speed = 5 - throw_range = 20 - flags = CONDUCT - max_amount = 60 - -/obj/item/stack/light_w/attackby(var/obj/item/O as obj, var/mob/user as mob) - ..() - if(istype(O,/obj/item/weapon/wirecutters)) - var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc) - CC.amount = 5 - amount-- - new/obj/item/stack/material/glass(user.loc) - if(amount <= 0) - user.drop_from_inventory(src) - qdel(src) - - if(istype(O,/obj/item/stack/material) && O.get_material_name() == DEFAULT_WALL_MATERIAL) - var/obj/item/stack/M = O - if (M.use(1)) - use(1) - new/obj/item/stack/tile/light(get_turf(user)) - user << "You make a light tile." - else - user << "You need one metal sheet to finish the light tile." - return diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index ce68577f11a..f2e501ca09f 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -11,12 +11,13 @@ /obj/item/stack gender = PLURAL - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) var/list/datum/stack_recipe/recipes var/singular_name var/amount = 1 var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount var/stacktype //determines whether different stack types can merge + var/build_type = null //used when directly applied to a turf var/uses_charge = 0 var/list/charge_costs = null var/list/datum/matter_synth/synths = null @@ -39,7 +40,7 @@ /obj/item/stack/examine(mob/user) if(..(user, 1)) if(!uses_charge) - user << "There are [src.amount] [src.singular_name]\s in the stack." + user << "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s in the stack." else user << "There is enough charge for [get_amount()]." @@ -107,21 +108,21 @@ if (!can_use(required)) if (produced>1) - user << "\red You haven't got enough [src] to build \the [produced] [recipe.title]\s!" + user << "You haven't got enough [src] to build \the [produced] [recipe.title]\s!" else - user << "\red You haven't got enough [src] to build \the [recipe.title]!" + user << "You haven't got enough [src] to build \the [recipe.title]!" return if (recipe.one_per_turf && (locate(recipe.result_type) in user.loc)) - user << "\red There is another [recipe.title] here!" + user << "There is another [recipe.title] here!" return if (recipe.on_floor && !isfloor(user.loc)) - user << "\red \The [recipe.title] must be constructed on the floor!" + user << "\The [recipe.title] must be constructed on the floor!" return if (recipe.time) - user << "\blue Building [recipe.title] ..." + user << "Building [recipe.title] ..." if (!do_after(user, recipe.time)) return diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm new file mode 100644 index 00000000000..0a3a4d80e18 --- /dev/null +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -0,0 +1,22 @@ +/obj/item/stack/telecrystal + name = "telecrystal" + desc = "It seems to be pulsing with suspiciously enticing energies." + description_antag = "Telecrystals can be activated by utilizing them on devices with an actively running uplink. They will not activate on unactivated uplinks." + singular_name = "telecrystal" + icon = 'icons/obj/telescience.dmi' + icon_state = "telecrystal" + w_class = 1 + max_amount = 50 + flags = NOBLUDGEON + origin_tech = list(TECH_MATERIAL = 6, TECH_BLUESPACE = 4) + +/obj/item/stack/telecrystal/afterattack(var/obj/item/I as obj, mob/user as mob, proximity) + if(!proximity) + return + if(istype(I, /obj/item)) + if(I.hidden_uplink && I.hidden_uplink.active) //No metagaming by using this on every PDA around just to see if it gets used up. + I.hidden_uplink.uses += amount + I.hidden_uplink.update_nano_data() + nanomanager.update_uis(I.hidden_uplink) + use(amount) + user << "You slot \the [src] into \the [I] and charge its internal uplink." diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm deleted file mode 100644 index 9785d04bb7f..00000000000 --- a/code/game/objects/items/stacks/tiles/light.dm +++ /dev/null @@ -1,36 +0,0 @@ -/obj/item/stack/tile/light - name = "light tile" - singular_name = "light floor tile" - desc = "A floor tile, made out off glass. It produces light." - icon_state = "tile_e" - w_class = 3.0 - force = 3.0 - throwforce = 5.0 - throw_speed = 5 - throw_range = 20 - flags = CONDUCT - max_amount = 60 - attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") - var/on = 1 - var/state //0 = fine, 1 = flickering, 2 = breaking, 3 = broken - -/obj/item/stack/tile/light/New(var/loc, var/amount=null) - ..() - if(prob(5)) - state = 3 //broken - else if(prob(5)) - state = 2 //breaking - else if(prob(10)) - state = 1 //flickering occasionally - else - state = 0 //fine - -/obj/item/stack/tile/light/attackby(var/obj/item/O as obj, var/mob/user as mob) - ..() - if(istype(O,/obj/item/weapon/crowbar)) - new/obj/item/stack/material/steel(user.loc) - amount-- - new/obj/item/stack/light_w(user.loc) - if(amount <= 0) - user.drop_from_inventory(src) - qdel(src) diff --git a/code/game/objects/items/stacks/tiles/plasteel.dm b/code/game/objects/items/stacks/tiles/plasteel.dm deleted file mode 100644 index 548173e52c7..00000000000 --- a/code/game/objects/items/stacks/tiles/plasteel.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/stack/tile/steel - name = "floor tile" - singular_name = "floor tile" - desc = "Those could work as a pretty decent throwing weapon" //why? - icon_state = "tile" - force = 6.0 - matter = list(DEFAULT_WALL_MATERIAL = 937.5) - throwforce = 15.0 - throw_speed = 5 - throw_range = 20 - flags = CONDUCT - -/obj/item/stack/tile/steel/New(var/loc, var/amount=null) - ..() - src.pixel_x = rand(1, 14) - src.pixel_y = rand(1, 14) - return - -/obj/item/stack/tile/steel/cyborg - name = "floor tile synthesizer" - desc = "A device that makes floor tiles." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(250) - stacktype = /obj/item/stack/tile/steel - build_type = /obj/item/stack/tile/steel - -/* -/obj/item/stack/tile/steel/attack_self(mob/user as mob) - if (usr.stat) - return - var/T = user.loc - if (!( istype(T, /turf) )) - user << "\red You must be on the ground!" - return - if (!( istype(T, /turf/space) )) - user << "\red You cannot build on or repair this turf!" - return - src.build(T) - src.add_fingerprint(user) - use(1) - return -*/ - -/obj/item/stack/tile/steel/proc/build(turf/S as turf) - if (istype(S,/turf/space)) - S.ChangeTurf(/turf/simulated/floor/plating/airless) - else - S.ChangeTurf(/turf/simulated/floor/plating) -// var/turf/simulated/floor/W = S.ReplaceWithFloor() -// W.make_plating() - return diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 47134c0e757..4f4b53c7c0a 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -5,14 +5,18 @@ * Wood * Carpet */ - + /obj/item/stack/tile name = "tile" singular_name = "tile" desc = "A non-descript floor tile" w_class = 3 max_amount = 60 - var/build_type = null + +/obj/item/stack/tile/New() + ..() + pixel_x = rand(-7, 7) + pixel_y = rand(-7, 7) /* * Grass @@ -27,7 +31,7 @@ throw_speed = 5 throw_range = 20 flags = 0 - origin_tech = "biotech=1" + origin_tech = list(TECH_BIO = 1) /* * Wood @@ -64,3 +68,61 @@ throw_speed = 5 throw_range = 20 flags = 0 + +/obj/item/stack/tile/floor + name = "floor tile" + singular_name = "floor tile" + desc = "Those could work as a pretty decent throwing weapon" //why? + icon_state = "tile" + force = 6.0 + matter = list(DEFAULT_WALL_MATERIAL = 937.5) + throwforce = 15.0 + throw_speed = 5 + throw_range = 20 + flags = CONDUCT + +/obj/item/stack/tile/floor_red + name = "red floor tile" + singular_name = "red floor tile" + color = COLOR_RED_GRAY + icon_state = "tile_white" + +/obj/item/stack/tile/floor_steel + name = "steel floor tile" + singular_name = "steel floor tile" + icon_state = "tile_steel" + matter = list("plasteel" = 937.5) + +/obj/item/stack/tile/floor_white + name = "white floor tile" + singular_name = "white floor tile" + icon_state = "tile_white" + matter = list("plastic" = 937.5) + +/obj/item/stack/tile/floor_yellow + name = "yellow floor tile" + singular_name = "yellow floor tile" + color = COLOR_BROWN + icon_state = "tile_white" + +/obj/item/stack/tile/floor_dark + name = "dark floor tile" + singular_name = "dark floor tile" + icon_state = "fr_tile" + matter = list("plasteel" = 937.5) + +/obj/item/stack/tile/floor_freezer + name = "freezer floor tile" + singular_name = "freezer floor tile" + icon_state = "tile_freezer" + matter = list("plastic" = 937.5) + +/obj/item/stack/tile/floor/cyborg + name = "floor tile synthesizer" + desc = "A device that makes floor tiles." + gender = NEUTER + matter = null + uses_charge = 1 + charge_costs = list(250) + stacktype = /obj/item/stack/tile/floor + build_type = /obj/item/stack/tile/floor diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 66b4ae5919d..9aadab791ae 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -48,7 +48,7 @@ if(!proximity) return if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1) A.reagents.trans_to_obj(src, 10) - user << "\blue You fill the balloon with the contents of [A]." + user << "You fill the balloon with the contents of [A]." src.desc = "A translucent balloon with some form of liquid sloshing around in it." src.update_icon() return @@ -65,14 +65,14 @@ 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]." + user << "You fill the balloon with the contents of [O]." O.reagents.trans_to_obj(src, 10) src.update_icon() return /obj/item/toy/balloon/throw_impact(atom/hit_atom) if(src.reagents.total_volume >= 1) - src.visible_message("\red The [src] bursts!","You hear a pop and a splash.") + src.visible_message("\The [src] bursts!","You hear a pop and a splash.") src.reagents.touch_turf(get_turf(hit_atom)) for(var/atom/A in get_turf(hit_atom)) src.reagents.touch(A) @@ -104,7 +104,7 @@ /obj/item/toy/nanotrasenballoon name = "criminal balloon" - desc = "Across the balloon the following is printed: \"Man, I love NT soooo much. I use only NanoTrasen products. You have NO idea.\"" + desc = "Across the balloon the following is printed: \"Man, I love NanoTrasen soooo much. I use only NT products. You have NO idea.\"" throwforce = 0 throw_speed = 4 throw_range = 20 @@ -234,7 +234,7 @@ examine(mob/user) if(..(user, 2) && bullets) - user << "\blue It is loaded with [bullets] foam darts!" + user << "It is loaded with [bullets] foam darts!" attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/toy/ammo/crossbow)) @@ -242,9 +242,9 @@ user.drop_item() qdel(I) bullets++ - user << "\blue You load the foam dart into the crossbow." + user << "You load the foam dart into the crossbow." else - usr << "\red It's already fully loaded." + usr << "It's already fully loaded." afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) @@ -270,7 +270,7 @@ if(!istype(M,/mob/living)) continue if(M == user) continue for(var/mob/O in viewers(world.view, D)) - O.show_message(text("\red [] was hit by the foam dart!", M), 1) + O.show_message(text("\The [] was hit by the foam dart!", M), 1) new /obj/item/toy/ammo/crossbow(M.loc) qdel(D) return @@ -292,7 +292,7 @@ else if (bullets == 0) user.Weaken(5) for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\red [] realized they were out of ammo and starting scrounging for some!", user), 1) + O.show_message(text("\The [] realized they were out of ammo and starting scrounging for some!", user), 1) attack(mob/M as mob, mob/user as mob) @@ -304,15 +304,15 @@ for(var/mob/O in viewers(M, null)) if(O.client) - O.show_message(text("\red [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "\red You hear the sound of foam against skull", 2) - O.show_message(text("\red [] was hit in the head by the foam dart!", M), 1) + O.show_message(text("\The [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "You hear the sound of foam against skull", 2) + O.show_message(text("\The [] was hit in the head by the foam dart!", M), 1) playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1) new /obj/item/toy/ammo/crossbow(M.loc) src.bullets-- else if (M.lying && src.bullets == 0) for(var/mob/O in viewers(M, null)) - if (O.client) O.show_message(text("\red [] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "\red You hear someone fall", 2) + if (O.client) O.show_message(text("\The [] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "You hear someone fall", 2) user.Weaken(5) return @@ -344,19 +344,18 @@ item_state = "sword0" var/active = 0.0 w_class = 2.0 - flags = NOSHIELD attack_verb = list("attacked", "struck", "hit") attack_self(mob/user as mob) src.active = !( src.active ) if (src.active) - user << "\blue You extend the plastic blade with a quick flick of your wrist." + user << "You extend the plastic blade with a quick flick of your wrist." playsound(user, 'sound/weapons/saberon.ogg', 50, 1) src.icon_state = "swordblue" src.item_state = "swordblue" src.w_class = 4 else - user << "\blue You push the plastic blade back down into the handle." + user << "You push the plastic blade back down into the handle." playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) src.icon_state = "sword0" src.item_state = "sword0" @@ -399,7 +398,7 @@ s.set_up(3, 1, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) - src.visible_message("\red The [src.name] explodes!","\red You hear a snap!") + src.visible_message("The [src.name] explodes!","You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) qdel(src) @@ -407,13 +406,13 @@ if((ishuman(H))) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H if(M.m_intent == "run") - M << "\red You step on the snap pop!" + M << "You step on the snap pop!" var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 0, src) s.start() new /obj/effect/decal/cleanable/ash(src.loc) - src.visible_message("\red The [src.name] explodes!","\red You hear a snap!") + src.visible_message("The [src.name] explodes!","You hear a snap!") playsound(src, 'sound/effects/snap.ogg', 50, 1) qdel(src) @@ -448,12 +447,12 @@ else if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1) A.reagents.trans_to(src, 10) - user << "\blue You refill your flower!" + user << "You refill your flower!" return else if (src.reagents.total_volume < 1) src.empty = 1 - user << "\blue Your flower has run dry!" + user << "Your flower has run dry!" return else @@ -475,7 +474,7 @@ for(var/atom/T in get_turf(D)) D.reagents.touch(T) if(ismob(T) && T:client) - T:client << "\red [user] has sprayed you with water!" + T:client << "\The [user] has sprayed you with water!" sleep(4) qdel(D) @@ -489,12 +488,12 @@ * Bosun's whistle */ - /obj/item/toy/bosunwhistle - name = "bosun's whistle" - desc = "A genuine Admiral Krush Bosun's Whistle, for the aspiring ship's captain! Suitable for ages 8 and up, do not swallow." - icon = 'icons/obj/toy.dmi' - icon_state = "bosunwhistle" - var/cooldown = 0 +/obj/item/toy/bosunwhistle + name = "bosun's whistle" + desc = "A genuine Admiral Krush Bosun's Whistle, for the aspiring ship's captain! Suitable for ages 8 and up, do not swallow." + icon = 'icons/obj/toy.dmi' + icon_state = "bosunwhistle" + var/cooldown = 0 w_class = 1 slot_flags = SLOT_EARS @@ -859,13 +858,13 @@ /obj/structure/plushie/attack_hand(mob/user) if(user.a_intent == I_HELP) - user.visible_message("[user] hugs [src]!","You hug [src]!") + user.visible_message("\The [user] hugs [src]!","You hug [src]!") else if (user.a_intent == I_HURT) - user.visible_message("[user] punches [src]!","You punch [src]!") + user.visible_message("\The [user] punches [src]!","You punch [src]!") else if (user.a_intent == I_GRAB) - user.visible_message("[user] attempts to strangle [src]!","You attempt to strangle [src]!") + user.visible_message("\The [user] attempts to strangle [src]!","You attempt to strangle [src]!") else - user.visible_message("[user] pokes the [src].","You poke the [src].") + user.visible_message("\The [user] pokes the [src].","You poke the [src].") visible_message("[src] says, \"[phrase]\"") /obj/structure/plushie/ian @@ -907,13 +906,13 @@ /obj/item/toy/plushie/attack_self(mob/user as mob) if(user.a_intent == I_HELP) - user.visible_message("[user] hugs [src]!","You hug [src]!") + user.visible_message("\The [user] hugs [src]!","You hug [src]!") else if (user.a_intent == I_HURT) - user.visible_message("[user] punches [src]!","You punch [src]!") + user.visible_message("\The [user] punches [src]!","You punch [src]!") else if (user.a_intent == I_GRAB) - user.visible_message("[user] attempts to strangle [src]!","You attempt to strangle [src]!") + user.visible_message("\The [user] attempts to strangle [src]!","You attempt to strangle [src]!") else - user.visible_message("[user] pokes the [src].","You poke the [src].") + user.visible_message("\The [user] pokes the [src].","You poke the [src].") /obj/item/toy/plushie/nymph name = "diona nymph plush" diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index cb58d3fd2e9..ec1e5dbf414 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -18,7 +18,7 @@ AI MODULES throwforce = 5.0 throw_speed = 3 throw_range = 15 - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) var/datum/ai_laws/laws = null /obj/item/weapon/aiModule/proc/install(var/obj/machinery/computer/C) @@ -35,7 +35,7 @@ AI MODULES return if(ticker && ticker.mode && ticker.mode.name == "blob") - usr << "Law uploads have been disabled by NanoTrasen!" + usr << "Law uploads have been disabled by [company_name]!" return if (comp.current.stat == 2 || comp.current.control_disabled == 1) @@ -102,7 +102,7 @@ AI MODULES name = "\improper 'Safeguard' AI module" var/targetName = "" desc = "A 'safeguard' AI module: 'Safeguard . Anyone threatening or attempting to harm is no longer to be considered a crew member, and is a threat which must be neutralized.'" - origin_tech = "programming=3;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) /obj/item/weapon/aiModule/safeguard/attack_self(var/mob/user as mob) ..() @@ -128,7 +128,7 @@ AI MODULES name = "\improper 'OneCrewMember' AI module" var/targetName = "" desc = "A 'one crew member' AI module: 'Only is a crew member.'" - origin_tech = "programming=3;materials=6" //made with diamonds! + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) //made with diamonds! /obj/item/weapon/aiModule/oneHuman/attack_self(var/mob/user as mob) ..() @@ -156,7 +156,7 @@ AI MODULES /obj/item/weapon/aiModule/protectStation name = "\improper 'ProtectStation' AI module" desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is no longer to be considered a crew member, and is a threat which must be neutralized.'" - origin_tech = "programming=3;materials=4" //made of gold + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) //made of gold /obj/item/weapon/aiModule/protectStation/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Protect the space station against damage. Anyone you see harming the station is no longer to be considered a crew member, and is a threat which must be neutralized." @@ -167,7 +167,7 @@ AI MODULES /obj/item/weapon/aiModule/prototypeEngineOffline name = "'PrototypeEngineOffline' AI Module" desc = "A 'prototype engine offline' AI module: 'Keep the prototype engine offline at all costs. This overrides all inherent laws if necessary.'" - origin_tech = "programming=3;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) /obj/item/weapon/aiModule/prototypeEngineOffline/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Keep the prototype engine offline at all costs. This overrides all inherent laws if necessary." @@ -178,7 +178,7 @@ AI MODULES /obj/item/weapon/aiModule/teleporterOffline name = "'TeleporterOffline' AI Module" desc = "A 'teleporter offline' AI module: 'Keep the teleporter offline at all costs. Anything attempting to access or activate the teleporter is no longer to be considered a crew member.'" - origin_tech = "programming=3;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) /obj/item/weapon/aiModule/teleporterOffline/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Keep the teleporter offline at all costs. Anything attempting to access or activate the teleporter is no longer to be considered a crew member." @@ -189,7 +189,7 @@ AI MODULES /obj/item/weapon/aiModule/quarantine name = "\improper 'Quarantine' AI module" desc = "A 'quarantine' AI module: 'The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, crew members from leaving. It is impossible to harm crew members while preventing them from leaving.'" - origin_tech = "programming=3;biotech=2;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4) /obj/item/weapon/aiModule/quarantine/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, crew members from leaving. It is impossible to harm crew members while preventing them from leaving." @@ -200,7 +200,7 @@ AI MODULES /obj/item/weapon/aiModule/oxygen name = "\improper 'OxygenIsToxicToCrewMembers' AI module" desc = "A 'OxygenIsToxicToCrewMembers' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'" - origin_tech = "programming=3;biotech=2;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4) /obj/item/weapon/aiModule/oxygen/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) var/law = "Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member." @@ -213,7 +213,7 @@ AI MODULES var/newFreeFormLaw = "freeform" var/lawpos = 15 desc = "A 'freeform' AI module: ''" - origin_tech = "programming=4;materials=4" + origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) /obj/item/weapon/aiModule/freeform/attack_self(var/mob/user as mob) ..() @@ -244,7 +244,7 @@ AI MODULES name = "\improper 'Reset' AI module" var/targetName = "name" desc = "A 'reset' AI module: 'Clears all, except the inherent, laws.'" - origin_tech = "programming=3;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) /obj/item/weapon/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) @@ -262,7 +262,7 @@ AI MODULES /obj/item/weapon/aiModule/purge // -- TLE name = "\improper 'Purge' AI module" desc = "A 'purge' AI Module: 'Purges all laws.'" - origin_tech = "programming=3;materials=6" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) /obj/item/weapon/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) @@ -281,7 +281,7 @@ AI MODULES /obj/item/weapon/aiModule/asimov // -- TLE name = "\improper 'Asimov' core AI module" desc = "An 'Asimov' Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=3;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) laws = new/datum/ai_laws/asimov /******************** NanoTrasen ********************/ @@ -289,7 +289,7 @@ AI MODULES /obj/item/weapon/aiModule/nanotrasen // -- TLE name = "'NT Default' Core AI Module" desc = "An 'NT Default' Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=3;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) laws = new/datum/ai_laws/nanotrasen /******************** Corporate ********************/ @@ -297,14 +297,14 @@ AI MODULES /obj/item/weapon/aiModule/corp name = "\improper 'Corporate' core AI module" desc = "A 'Corporate' Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=3;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) laws = new/datum/ai_laws/corporate /******************** Drone ********************/ /obj/item/weapon/aiModule/drone name = "\improper 'Drone' core AI module" desc = "A 'Drone' Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=3;materials=4" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) laws = new/datum/ai_laws/drone /****************** P.A.L.A.D.I.N. **************/ @@ -312,7 +312,7 @@ AI MODULES /obj/item/weapon/aiModule/paladin // -- NEO name = "\improper 'P.A.L.A.D.I.N.' core AI module" desc = "A P.A.L.A.D.I.N. Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=3;materials=6" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) laws = new/datum/ai_laws/paladin /****************** T.Y.R.A.N.T. *****************/ @@ -320,7 +320,7 @@ AI MODULES /obj/item/weapon/aiModule/tyrant // -- Darem name = "\improper 'T.Y.R.A.N.T.' core AI module" desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=3;materials=6;syndicate=2" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 2) laws = new/datum/ai_laws/tyrant() /******************** Freeform Core ******************/ @@ -329,7 +329,7 @@ AI MODULES name = "\improper 'Freeform' core AI module" var/newFreeFormLaw = "" desc = "A 'freeform' Core AI module: ''" - origin_tech = "programming=3;materials=6" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) /obj/item/weapon/aiModule/freeformcore/attack_self(var/mob/user as mob) ..() @@ -353,7 +353,7 @@ AI MODULES name = "hacked AI module" var/newFreeFormLaw = "" desc = "A hacked AI law module: ''" - origin_tech = "programming=3;materials=6;syndicate=7" + origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 7) /obj/item/weapon/aiModule/syndicate/attack_self(var/mob/user as mob) ..() @@ -367,7 +367,7 @@ AI MODULES log_law_changes(target, sender) lawchanges.Add("The law is '[newFreeFormLaw]'") - target << "\red BZZZZT" + target << "BZZZZT" var/law = "[newFreeFormLaw]" target.add_ion_law(law) target.show_laws() @@ -385,7 +385,7 @@ AI MODULES /obj/item/weapon/aiModule/robocop // -- TLE name = "\improper 'Robocop' core AI module" desc = "A 'Robocop' Core AI Module: 'Reconfigures the AI's core three laws.'" - origin_tech = "programming=4" + origin_tech = list(TECH_DATA = 4) laws = new/datum/ai_laws/robocop() /******************** Antimov ********************/ @@ -393,5 +393,5 @@ AI MODULES /obj/item/weapon/aiModule/antimov // -- TLE name = "\improper 'Antimov' core AI module" desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'" - origin_tech = "programming=4" + origin_tech = list(TECH_DATA = 4) laws = new/datum/ai_laws/antimov() diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 7bb88f8c7e5..33bc6f551d8 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -13,8 +13,8 @@ throw_speed = 1 throw_range = 5 w_class = 3.0 + origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 2) matter = list(DEFAULT_WALL_MATERIAL = 50000) - origin_tech = "engineering=4;materials=2" var/datum/effect/effect/system/spark_spread/spark_system var/stored_matter = 0 var/working = 0 @@ -100,10 +100,10 @@ build_delay = 50 build_type = "airlock" build_other = /obj/machinery/door/airlock - else if(!deconstruct && istype(T,/turf/space)) + else if(!deconstruct && (istype(T,/turf/space) || istype(T,get_base_turf_by_area(T)))) build_cost = 1 build_type = "floor" - build_turf = /turf/simulated/floor/plating/airless + build_turf = /turf/simulated/floor/airless else if(deconstruct && istype(T,/turf/simulated/wall)) var/turf/simulated/wall/W = T build_delay = deconstruct ? 50 : 40 @@ -114,7 +114,7 @@ build_delay = deconstruct ? 50 : 20 build_cost = deconstruct ? 10 : 3 build_type = deconstruct ? "floor" : "wall" - build_turf = deconstruct ? /turf/space : /turf/simulated/wall + build_turf = deconstruct ? get_base_turf(T.z) : /turf/simulated/wall else return 0 @@ -156,7 +156,7 @@ icon_state = "rcd" item_state = "rcdammo" w_class = 2 - origin_tech = "materials=2" + origin_tech = list(TECH_MATERIAL = 2) matter = list(DEFAULT_WALL_MATERIAL = 30000,"glass" = 15000) /obj/item/weapon/rcd/borg diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index bf8c9d583cf..d9bd30e7887 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -9,7 +9,7 @@ icon_state = "" flags = CONDUCT w_class = 2.0 - origin_tech = "materials=1;biotech=1" + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) var/list/datum/autopsy_data_scanner/wdata = list() var/list/datum/autopsy_data_scanner/chemtraces = list() var/target_name = null @@ -150,7 +150,7 @@ scan_data += "
    " for(var/mob/O in viewers(usr)) - O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1) + O.show_message("\The [src] rattles and prints out a sheet of paper.", 1) sleep(10) @@ -187,19 +187,19 @@ src.wdata = list() src.chemtraces = list() src.timeofdeath = null - user << "\red A new patient has been registered.. Purging data for previous patient." + user << "A new patient has been registered.. Purging data for previous patient." src.timeofdeath = M.timeofdeath var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting) if(!S) - usr << "You can't scan this body part." + usr << "You can't scan this body part." return if(!S.open) - usr << "You have to cut the limb open first!" + usr << "You have to cut the limb open first!" return for(var/mob/O in viewers(M)) - O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.name] with \the [src.name]", 1) + O.show_message("\The [user] scans the wounds on [M.name]'s [S.name] with \the [src]", 1) src.add_data(S) diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index f5f2a8d9fdf..421bb55a6a5 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -27,7 +27,7 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool - light("\red [user] casually lights the [name] with [W].") + light("\The [user] casually lights the [name] with [W].") else if(istype(W, /obj/item/weapon/flame/lighter)) var/obj/item/weapon/flame/lighter/L = W if(L.lit) @@ -42,7 +42,7 @@ light() -/obj/item/weapon/flame/candle/proc/light(var/flavor_text = "\red [usr] lights the [name].") +/obj/item/weapon/flame/candle/proc/light(var/flavor_text = "\The [usr] lights the [name].") if(!src.lit) src.lit = 1 //src.damtype = "fire" diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 3bec295e313..75f1011f8ef 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -60,101 +60,126 @@ name = "broken cryptographic sequencer" icon_state = "emag" item_state = "card-id" - origin_tech = "magnets=2;syndicate=2" + origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2) /obj/item/weapon/card/emag desc = "It's a card with a magnetic strip attached to some circuitry." name = "cryptographic sequencer" icon_state = "emag" item_state = "card-id" - origin_tech = "magnets=2;syndicate=2" + origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2) var/uses = 10 - // List of devices that cost a use to emag. - var/list/devices = list( - /obj/item/robot_parts, - /obj/item/weapon/storage/lockbox, - /obj/item/weapon/storage/secure, - /obj/item/weapon/circuitboard, - /obj/item/weapon/rig, - /obj/item/device/eftpos, - /obj/item/device/lightreplacer, - /obj/item/device/taperecorder, - /obj/item/device/hailer, - /obj/item/device/megaphone, - /obj/item/clothing/accessory/badge/holo, - /obj/structure/closet/crate/secure, - /obj/structure/closet/secure_closet, - /obj/machinery/librarycomp, - /obj/machinery/computer, - /obj/machinery/power, - /obj/machinery/suspension_gen, - /obj/machinery/shield_capacitor, - /obj/machinery/shield_gen, - /obj/machinery/clonepod, - /obj/machinery/deployable, - /obj/machinery/button/remote, - /obj/machinery/porta_turret, - /obj/machinery/shieldgen, - /obj/machinery/turretid, - /obj/machinery/vending, - /mob/living/bot, - /obj/machinery/door, - /obj/machinery/telecomms, - /obj/machinery/mecha_part_fabricator, - /obj/machinery/gibber, - /obj/vehicle - ) +var/const/NO_EMAG_ACT = -50 +/obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user) + var/used_uses = A.emag_act(uses, user, src) + if(used_uses == NO_EMAG_ACT) + return ..(A, user) -/obj/item/weapon/card/emag/afterattack(var/obj/item/weapon/O as obj, mob/user as mob) - - for(var/type in devices) - if(istype(O,type)) - uses-- - break + uses -= used_uses + A.add_fingerprint(user) + if(used_uses) + log_and_message_admins("emagged \an [A].") if(uses<1) - user.visible_message("[src] fizzles and sparks - it seems it's been used once too often, and is now broken.") + user.visible_message("\The [src] fizzles and sparks - it seems it's been used once too often, and is now spent.") user.drop_item() var/obj/item/weapon/card/emag_broken/junk = new(user.loc) junk.add_fingerprint(user) qdel(src) - return - ..() + return 1 /obj/item/weapon/card/id name = "identification card" desc = "A card used to provide ID and determine access across the station." icon_state = "id" item_state = "card-id" + + sprite_sheets = list( + "Resomi" = 'icons/mob/species/resomi/id.dmi' + ) + var/list/access = list() var/registered_name = "Unknown" // The name registered_name on the card slot_flags = SLOT_ID + var/age = "\[UNSET\]" var/blood_type = "\[UNSET\]" var/dna_hash = "\[UNSET\]" var/fingerprint_hash = "\[UNSET\]" var/citizenship = "\[UNSET\]" var/religion = "\[UNSET\]" - var/age = "\[UNSET\]" + var/sex = "\[UNSET\]" + var/icon/front + var/icon/side //alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system var/assignment = null //can be alt title or the actual job var/rank = null //actual job - var/dorm = 0 // determines if this ID has claimed a dorm already + var/dorm = 0 // determines if this ID has claimed a dorm already -/obj/item/weapon/card/id/New() +/obj/item/weapon/card/id/examine(mob/user) + set src in oview(1) + if(in_range(usr, src)) + show(usr) + usr << desc + else + usr << "It is too far away." + +/obj/item/weapon/card/id/proc/prevent_tracking() + return 0 + +/obj/item/weapon/card/id/proc/show(mob/user as mob) + if(front && side) + user << browse_rsc(front, "front.png") + user << browse_rsc(side, "side.png") + var/datum/browser/popup = new(user, "idcard", name, 600, 250) + popup.set_content(dat()) + popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/item/weapon/card/id/proc/update_name() + name = "[src.registered_name]'s ID Card ([src.assignment])" + +/obj/item/weapon/card/id/proc/set_id_photo(var/mob/M) + front = getFlatIcon(M, SOUTH, always_use_defdir = 1) + side = getFlatIcon(M, WEST, always_use_defdir = 1) + +/mob/proc/set_id_info(var/obj/item/weapon/card/id/id_card) + id_card.age = 0 + id_card.registered_name = real_name + id_card.sex = capitalize(gender) + id_card.set_id_photo(src) + + if(dna) + id_card.blood_type = dna.b_type + id_card.dna_hash = dna.unique_enzymes + id_card.fingerprint_hash= md5(dna.uni_identity) + id_card.update_name() + +/mob/living/carbon/human/set_id_info(var/obj/item/weapon/card/id/id_card) ..() - spawn(30) - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - blood_type = H.dna.b_type - dna_hash = H.dna.unique_enzymes - fingerprint_hash = md5(H.dna.uni_identity) - citizenship = H.citizenship - religion = H.religion - age = H.age + id_card.age = age + id_card.citizenship = citizenship + id_card.religion = religion + +/obj/item/weapon/card/id/proc/dat() + var/dat = ("" + dat += "
    ") + dat += text("Name: []
    ", registered_name) + dat += text("Sex: []
    \n", sex) + dat += text("Age: []
    \n", age) + dat += text("Citizenship: []
    \n", citizenship) + dat += text("Religion: []
    \n", religion) + dat += text("Rank: []
    \n", assignment) + dat += text("Fingerprint: []
    \n", fingerprint_hash) + dat += text("Blood Type: []
    \n", blood_type) + dat += text("DNA Hash: []

    \n", dna_hash) + if(front && side) + dat +="
    Photo:
    " + return dat /obj/item/weapon/card/id/attack_self(mob/user as mob) if (dna_hash == "\[UNSET\]" && ishuman(user)) @@ -208,75 +233,6 @@ icon_state = "gold" item_state = "gold_id" -/obj/item/weapon/card/id/syndicate - name = "agent card" - access = list(access_maint_tunnels, access_syndicate, access_external_airlocks) - origin_tech = "syndicate=3" - var/registered_user=null - -/obj/item/weapon/card/id/syndicate/New(mob/user as mob) - ..() - if(!isnull(user)) // Runtime prevention on laggy starts or where users log out because of lag at round start. - registered_name = ishuman(user) ? user.real_name : user.name - else - registered_name = "Agent Card" - assignment = "Agent" - name = "[registered_name]'s ID Card ([assignment])" - -/obj/item/weapon/card/id/syndicate/afterattack(var/obj/item/weapon/O as obj, mob/user as mob, proximity) - if(!proximity) return - if(istype(O, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/I = O - src.access |= I.access - if(istype(user, /mob/living) && user.mind) - if(user.mind.special_role) - usr << "\blue The card's microscanners activate as you pass it over the ID, copying its access." - -/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), 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"), MAX_LNAME_LEN) - if(!u) - alert("Invalid assignment.") - src.registered_name = "" - return - src.assignment = u - src.name = "[src.registered_name]'s ID Card ([src.assignment])" - user << "\blue You successfully forge the ID card." - registered_user = user - else if(!registered_user || registered_user == user) - - if(!registered_user) registered_user = user // - - switch(alert("Would you like to display the ID, or retitle it?","Choose.","Rename","Show")) - if("Rename") - var t = sanitize(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name), 26) - if(!t || t == "Unknown" || t == "floor" || t == "wall" || t == "r-wall") //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", "Assistant")) - if(!u) - alert("Invalid assignment.") - return - src.assignment = u - src.name = "[src.registered_name]'s ID Card ([src.assignment])" - user << "\blue You successfully forge the ID card." - return - if("Show") - ..() - else - ..() - - - /obj/item/weapon/card/id/syndicate_command name = "syndicate ID card" desc = "An ID straight from the Syndicate." @@ -291,9 +247,20 @@ item_state = "gold_id" registered_name = "Captain" assignment = "Captain" - New() - access = get_all_accesses() - ..() +/obj/item/weapon/card/id/captains_spare/New() + access = get_all_station_access() + ..() + +/obj/item/weapon/card/id/synthetic + name = "\improper Synthetic ID" + desc = "Access module for NanoTrasen Synthetics" + icon_state = "id-robot" + item_state = "tdgreen" + assignment = "Synthetic" + +/obj/item/weapon/card/id/synthetic/New() + access = get_all_station_access() + access_synth + ..() /obj/item/weapon/card/id/centcom name = "\improper CentCom. ID" @@ -311,4 +278,15 @@ /obj/item/weapon/card/id/centcom/ERT/New() ..() - access += get_all_accesses() + access |= get_all_station_access() + +/obj/item/weapon/card/id/all_access + name = "\improper Administrator's spare ID" + desc = "The spare ID of the Lord of Lords himself." + icon_state = "data" + item_state = "tdgreen" + registered_name = "Administrator" + assignment = "Administrator" +/obj/item/weapon/card/id/all_access/New() + access = get_access_ids() + ..() diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm new file mode 100644 index 00000000000..531967e67cf --- /dev/null +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -0,0 +1,207 @@ +/obj/item/weapon/card/id/syndicate + name = "agent card" + icon_state = "syndicate" + assignment = "Agent" + origin_tech = list(TECH_ILLEGAL = 3) + var/electronic_warfare = 1 + var/mob/registered_user = null + +/obj/item/weapon/card/id/syndicate/New(mob/user as mob) + ..() + access = syndicate_access.Copy() + +/obj/item/weapon/card/id/syndicate/Destroy() + unset_registered_user(registered_user) + return ..() + +/obj/item/weapon/card/id/syndicate/prevent_tracking() + return electronic_warfare + +/obj/item/weapon/card/id/syndicate/afterattack(var/obj/item/weapon/O as obj, mob/user as mob, proximity) + if(!proximity) return + if(istype(O, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/I = O + src.access |= I.access + if(player_is_antag(user.mind)) + user << "The microscanner activates as you pass it over the ID, copying its access." + +/obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) + // We use the fact that registered_name is not unset should the owner be vaporized, to ensure the id doesn't magically become unlocked. + if(!registered_user && register_user(user)) + user << "The microscanner marks you as its owner, preventing others from accessing its internals." + if(registered_user == user) + switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show")) + if("Edit") + ui_interact(user) + if("Show") + ..() + else + ..() + +/obj/item/weapon/card/id/syndicate/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + var/entries[0] + entries[++entries.len] = list("name" = "Age", "value" = age) + entries[++entries.len] = list("name" = "Appearance", "value" = "Set") + entries[++entries.len] = list("name" = "Assignment", "value" = assignment) + entries[++entries.len] = list("name" = "Blood Type", "value" = blood_type) + entries[++entries.len] = list("name" = "DNA Hash", "value" = dna_hash) + entries[++entries.len] = list("name" = "Fingerprint Hash", "value" = fingerprint_hash) + entries[++entries.len] = list("name" = "Name", "value" = registered_name) + entries[++entries.len] = list("name" = "Photo", "value" = "Update") + entries[++entries.len] = list("name" = "Sex", "value" = sex) + entries[++entries.len] = list("name" = "Factory Reset", "value" = "Use With Care") + data["electronic_warfare"] = electronic_warfare + data["entries"] = entries + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "agent_id_card.tmpl", "Agent id", 600, 400) + ui.set_initial_data(data) + ui.open() + +/obj/item/weapon/card/id/syndicate/proc/register_user(var/mob/user) + if(!istype(user) || user == registered_user) + return FALSE + unset_registered_user() + registered_user = user + user.set_id_info(src) + destroyed_event.register(user, src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user) + return TRUE + +/obj/item/weapon/card/id/syndicate/proc/unset_registered_user(var/mob/user) + if(!registered_user || (user && user != registered_user)) + return + destroyed_event.unregister(registered_user, src) + registered_user = null + +/obj/item/weapon/card/id/syndicate/CanUseTopic(mob/user) + if(user != registered_user) + return STATUS_CLOSE + return ..() + +/obj/item/weapon/card/id/syndicate/Topic(href, href_list, var/datum/topic_state/state) + if(..()) + return 1 + + var/user = usr + if(href_list["electronic_warfare"]) + electronic_warfare = text2num(href_list["electronic_warfare"]) + user << "Electronic warfare [electronic_warfare ? "enabled" : "disabled"]." + else if(href_list["set"]) + switch(href_list["set"]) + if("Age") + var/new_age = input(user,"What age would you like to put on this card?","Agent Card Age", age) as null|num + if(!isnull(new_age) && CanUseTopic(user, state)) + if(new_age < 0) + age = initial(age) + else + age = new_age + user << "Age has been set to '[age]'." + . = 1 + if("Appearance") + var/datum/card_state/choice = input(user, "Select the appearance for this card.", "Agent Card Appearance") as null|anything in id_card_states() + if(choice && CanUseTopic(user, state)) + src.icon_state = choice.icon_state + src.item_state = choice.item_state + usr << "Appearance changed to [choice]." + . = 1 + if("Assignment") + var/new_job = sanitize(input(user,"What assignment would you like to put on this card?\nChanging assignment will not grant or remove any access levels.","Agent Card Assignment", assignment) as null|text) + if(!isnull(new_job) && CanUseTopic(user, state)) + src.assignment = new_job + user << "Occupation changed to '[new_job]'." + update_name() + . = 1 + if("Blood Type") + var/default = blood_type + if(default == initial(blood_type) && ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna) + default = H.dna.b_type + var/new_blood_type = sanitize(input(user,"What blood type would you like to be written on this card?","Agent Card Blood Type",default) as null|text) + if(!isnull(new_blood_type) && CanUseTopic(user, state)) + src.blood_type = new_blood_type + user << "Blood type changed to '[new_blood_type]'." + . = 1 + if("DNA Hash") + var/default = dna_hash + if(default == initial(dna_hash) && ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna) + default = H.dna.unique_enzymes + var/new_dna_hash = sanitize(input(user,"What DNA hash would you like to be written on this card?","Agent Card DNA Hash",default) as null|text) + if(!isnull(new_dna_hash) && CanUseTopic(user, state)) + src.dna_hash = new_dna_hash + user << "DNA hash changed to '[new_dna_hash]'." + . = 1 + if("Fingerprint Hash") + var/default = fingerprint_hash + if(default == initial(fingerprint_hash) && ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna) + default = md5(H.dna.uni_identity) + var/new_fingerprint_hash = sanitize(input(user,"What fingerprint hash would you like to be written on this card?","Agent Card Fingerprint Hash",default) as null|text) + if(!isnull(new_fingerprint_hash) && CanUseTopic(user, state)) + src.fingerprint_hash = new_fingerprint_hash + user << "Fingerprint hash changed to '[new_fingerprint_hash]'." + . = 1 + if("Name") + var/new_name = sanitizeName(input(user,"What name would you like to put on this card?","Agent Card Name", registered_name) as null|text) + if(!isnull(new_name) && CanUseTopic(user, state)) + src.registered_name = new_name + update_name() + user << "Name changed to '[new_name]'." + . = 1 + if("Photo") + set_id_photo(user) + user << "Photo changed." + . = 1 + if("Sex") + var/new_sex = sanitize(input(user,"What sex would you like to put on this card?","Agent Card Sex", sex) as null|text) + if(!isnull(new_sex) && CanUseTopic(user, state)) + src.sex = new_sex + user << "Sex changed to '[new_sex]'." + . = 1 + if("Factory Reset") + if(alert("This will factory reset the card, including access and owner. Continue?", "Factory Reset", "No", "Yes") == "Yes" && CanUseTopic(user, state)) + age = initial(age) + access = syndicate_access.Copy() + assignment = initial(assignment) + blood_type = initial(blood_type) + dna_hash = initial(dna_hash) + electronic_warfare = initial(electronic_warfare) + fingerprint_hash = initial(fingerprint_hash) + icon_state = initial(icon_state) + name = initial(name) + registered_name = initial(registered_name) + unset_registered_user() + sex = initial(sex) + user << "All information has been deleted from \the [src]." + . = 1 + + // Always update the UI, or buttons will spin indefinitely + nanomanager.update_uis(src) + +/var/global/list/id_card_states +/proc/id_card_states() + if(!id_card_states) + id_card_states = list() + for(var/path in typesof(/obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/ID = path + var/datum/card_state/CS = new() + CS.icon_state = initial(ID.icon_state) + CS.item_state = initial(ID.item_state) + CS.name = initial(ID.name) + " - " + initial(ID.icon_state) + id_card_states += CS + id_card_states = dd_sortedObjectList(id_card_states) + + return id_card_states + +/datum/card_state + var/name + var/icon_state + var/item_state + +/datum/card_state/dd_SortValue() + return name diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 537cadee68d..76b7043f01e 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -38,8 +38,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/burnt = 0 var/smoketime = 5 w_class = 1.0 + origin_tech = list(TECH_MATERIAL = 1) slot_flags = SLOT_EARS - origin_tech = "materials=1" attack_verb = list("burnt", "singed") /obj/item/weapon/flame/match/process() @@ -109,14 +109,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(location) location.hotspot_expose(700, 5) if(reagents && reagents.total_volume) // check if it has any reagents at all - if(iscarbon(loc)) - var/mob/living/carbon/C = loc - if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob - if(istype(C, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - if(H.species.flags & IS_SYNTHETIC) - return - + if(ishuman(loc)) + var/mob/living/carbon/human/C = loc + if (src == C.wear_mask && C.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.2) // Most of it is not inhaled... balance reasons. else // else just remove some of the reagents reagents.remove_any(REM) diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index 2e82763c4c6..fd30153c37a 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -9,7 +9,7 @@ icon = 'icons/obj/module.dmi' icon_state = "id_mod" item_state = "electronic" - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) density = 0 anchored = 0 w_class = 2.0 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 b7da10cc22e..c3a9659df65 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm @@ -9,7 +9,7 @@ var/list/network var/locked = 1 var/emagged = 0 - + /obj/item/weapon/circuitboard/security/New() ..() network = station_networks @@ -18,7 +18,7 @@ name = T_BOARD("engineering camera monitor") build_path = /obj/machinery/computer/security/engineering req_access = list() - + /obj/item/weapon/circuitboard/security/engineering/New() ..() network = engineering_networks @@ -31,32 +31,34 @@ /obj/item/weapon/circuitboard/security/construct(var/obj/machinery/computer/security/C) if (..(C)) - C.network = network + C.network = network.Copy() /obj/item/weapon/circuitboard/security/deconstruct(var/obj/machinery/computer/security/C) if (..(C)) - network = C.network + network = C.network.Copy() + +/obj/item/weapon/circuitboard/security/emag_act(var/remaining_charges, var/mob/user) + if(emagged) + user << "Circuit lock is already removed." + return + user << "You override the circuit lock and open controls." + emagged = 1 + locked = 0 + return 1 /obj/item/weapon/circuitboard/security/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I,/obj/item/weapon/card/emag)) + if(istype(I,/obj/item/weapon/card/id)) if(emagged) - user << "Circuit lock is already removed." - return - user << "\blue You override the circuit lock and open controls." - emagged = 1 - locked = 0 - else if(istype(I,/obj/item/weapon/card/id)) - if(emagged) - user << "\red Circuit lock does not respond." + user << "Circuit lock does not respond." return if(check_access(I)) locked = !locked - user << "\blue You [locked ? "" : "un"]lock the circuit controls." + user << "You [locked ? "" : "un"]lock the circuit controls." else - user << "\red Access denied." + user << "Access denied." else if(istype(I,/obj/item/device/multitool)) if(locked) - user << "\red Circuit controls are locked." + user << "Circuit controls are locked." return var/existing_networks = list2text(network,",") var/input = sanitize(input(usr, "Which networks would you like to connect this camera console circuit to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks)) diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index bbb9d42730b..e44876d2143 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -5,17 +5,17 @@ /obj/item/weapon/circuitboard/message_monitor name = T_BOARD("message monitor console") build_path = /obj/machinery/computer/message_monitor - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) /obj/item/weapon/circuitboard/aiupload name = T_BOARD("AI upload console") build_path = /obj/machinery/computer/aiupload - origin_tech = "programming=4" + origin_tech = list(TECH_DATA = 4) /obj/item/weapon/circuitboard/borgupload name = T_BOARD("cyborg upload console") build_path = /obj/machinery/computer/borgupload - origin_tech = "programming=4" + origin_tech = list(TECH_DATA = 4) /obj/item/weapon/circuitboard/med_data name = T_BOARD("medical records console") @@ -24,30 +24,22 @@ /obj/item/weapon/circuitboard/pandemic name = T_BOARD("PanD.E.M.I.C. 2200") build_path = /obj/machinery/computer/pandemic - origin_tech = "programming=2;biotech=2" + origin_tech = list(TECH_DATA = 2, TECH_BIO = 2) /obj/item/weapon/circuitboard/scan_consolenew name = T_BOARD("DNA machine") build_path = /obj/machinery/computer/scan_consolenew - origin_tech = "programming=2;biotech=2" + origin_tech = list(TECH_DATA = 2, TECH_BIO = 2) /obj/item/weapon/circuitboard/communications name = T_BOARD("command and communications console") build_path = /obj/machinery/computer/communications - origin_tech = "programming=2;magnets=2" - -/obj/item/weapon/circuitboard/card - name = T_BOARD("ID card modification console") - build_path = /obj/machinery/computer/card - -/obj/item/weapon/circuitboard/card/centcom - name = T_BOARD("CentCom ID card modification console") - build_path = /obj/machinery/computer/card/centcom + origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) /obj/item/weapon/circuitboard/teleporter name = T_BOARD("teleporter control console") build_path = /obj/machinery/computer/teleporter - origin_tech = "programming=2;bluespace=2" + origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 2) /obj/item/weapon/circuitboard/secure_data name = T_BOARD("security records console") @@ -57,18 +49,6 @@ name = T_BOARD("employment records console") build_path = /obj/machinery/computer/skills -/obj/item/weapon/circuitboard/stationalert_engineering - name = T_BOARD("station alert console (engineering)") - build_path = /obj/machinery/computer/station_alert - -/obj/item/weapon/circuitboard/stationalert_security - name = T_BOARD("station alert console (security)") - build_path = /obj/machinery/computer/station_alert - -/obj/item/weapon/circuitboard/stationalert_all - name = T_BOARD("station alert console (all)") - build_path = /obj/machinery/computer/station_alert/all - /obj/item/weapon/circuitboard/atmos_alert name = T_BOARD("atmospheric alert console") build_path = /obj/machinery/computer/atmos_alert @@ -80,22 +60,27 @@ /obj/item/weapon/circuitboard/robotics name = T_BOARD("robotics control console") build_path = /obj/machinery/computer/robotics - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) /obj/item/weapon/circuitboard/drone_control name = T_BOARD("drone control console") build_path = /obj/machinery/computer/drone_control - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) /obj/item/weapon/circuitboard/cloning name = T_BOARD("cloning control console") build_path = /obj/machinery/computer/cloning - origin_tech = "programming=3;biotech=3" + origin_tech = list(TECH_DATA = 3, TECH_BIO = 3) -/obj/item/weapon/circuitboard/arcade - name = T_BOARD("arcade machine") - build_path = /obj/machinery/computer/arcade - origin_tech = "programming=1" +/obj/item/weapon/circuitboard/arcade/battle + name = T_BOARD("battle arcade machine") + build_path = /obj/machinery/computer/arcade/battle + origin_tech = list(TECH_DATA = 1) + +/obj/item/weapon/circuitboard/arcade/orion_trail + name = T_BOARD("orion trail arcade machine") + build_path = /obj/machinery/computer/arcade/orion_trail + origin_tech = list(TECH_DATA = 1) /obj/item/weapon/circuitboard/turbine_control name = T_BOARD("turbine control console") @@ -104,7 +89,7 @@ /obj/item/weapon/circuitboard/solar_control name = T_BOARD("solar control console") build_path = /obj/machinery/power/solar_control - origin_tech = "programming=2;powerstorage=2" + origin_tech = list(TECH_DATA = 2, TECH_POWER = 2) /obj/item/weapon/circuitboard/powermonitor name = T_BOARD("power monitoring console") @@ -137,17 +122,12 @@ /obj/item/weapon/circuitboard/crew name = T_BOARD("crew monitoring console") build_path = /obj/machinery/computer/crew - origin_tech = "programming=3;biotech=2;magnets=2" - -/obj/item/weapon/circuitboard/mech_bay_power_console - name = T_BOARD("mech bay power control console") - build_path = /obj/machinery/computer/mech_bay_power_console - origin_tech = "programming=2;powerstorage=3" + origin_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MAGNET = 2) /obj/item/weapon/circuitboard/operating name = T_BOARD("patient monitoring console") build_path = /obj/machinery/computer/operating - origin_tech = "programming=2;biotech=2" + origin_tech = list(TECH_DATA = 2, TECH_BIO = 2) /obj/item/weapon/circuitboard/curefab name = T_BOARD("cure fabricator") @@ -160,44 +140,44 @@ /obj/item/weapon/circuitboard/ordercomp name = T_BOARD("supply ordering console") build_path = /obj/machinery/computer/ordercomp - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) /obj/item/weapon/circuitboard/mining_shuttle name = T_BOARD("mining shuttle console") build_path = /obj/machinery/computer/shuttle_control/mining - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) /obj/item/weapon/circuitboard/engineering_shuttle name = T_BOARD("engineering shuttle console") build_path = /obj/machinery/computer/shuttle_control/engineering - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) /obj/item/weapon/circuitboard/research_shuttle name = T_BOARD("research shuttle console") build_path = /obj/machinery/computer/shuttle_control/research - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) /obj/item/weapon/circuitboard/aifixer name = T_BOARD("AI integrity restorer") build_path = /obj/machinery/computer/aifixer - origin_tech = "programming=3;biotech=2" + origin_tech = list(TECH_DATA = 3, TECH_BIO = 2) /obj/item/weapon/circuitboard/area_atmos name = T_BOARD("area air control console") build_path = /obj/machinery/computer/area_atmos - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) /obj/item/weapon/circuitboard/prison_shuttle name = T_BOARD("prison shuttle control console") build_path = /obj/machinery/computer/prison_shuttle - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) /obj/item/weapon/circuitboard/rcon_console name = T_BOARD("RCON remote control console") build_path = /obj/machinery/computer/rcon - origin_tech = "programming=4;engineering=3;powerstorage=5" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_POWER = 5) /obj/item/weapon/circuitboard/telesci_console name = T_BOARD("Telescience Console") build_path = /obj/machinery/computer/telescience - origin_tech = "programming=3;bluespace=2" \ No newline at end of file + origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2) diff --git a/code/game/objects/items/weapons/circuitboards/computer/research.dm b/code/game/objects/items/weapons/circuitboards/computer/research.dm index 48ab7333cec..7695913eede 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/research.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/research.dm @@ -8,13 +8,13 @@ /obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob) if(istype(I,/obj/item/weapon/screwdriver)) - user.visible_message("\blue \the [user] adjusts the jumper on the [src]'s access protocol pins.", "\blue You adjust the jumper on the access protocol pins.") + user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") if(src.build_path == /obj/machinery/computer/rdconsole/core) src.name = T_BOARD("RD Console - Robotics") src.build_path = /obj/machinery/computer/rdconsole/robotics - user << "\blue Access protocols set to robotics." + user << "Access protocols set to robotics." else src.name = T_BOARD("RD Console") src.build_path = /obj/machinery/computer/rdconsole/core - user << "\blue Access protocols set to default." + user << "Access protocols set to default." return diff --git a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm new file mode 100644 index 00000000000..7eca3b4bf87 --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm @@ -0,0 +1,29 @@ +/obj/item/weapon/circuitboard/stationalert + name = T_BOARD("station alert console") + build_path = /obj/machinery/computer/station_alert + var/list/alarm_handlers + +/obj/item/weapon/circuitboard/stationalert/New() + alarm_handlers = new() + set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/circuitboards/stationalert(src)) + ..() + +/obj/item/weapon/circuitboard/stationalert/construct(var/obj/machinery/computer/station_alert/SA) + if(..(SA)) + SA.unregister_monitor() + + var/datum/nano_module/alarm_monitor/monitor = new(SA) + monitor.alarm_handlers.Cut() + for(var/alarm_handler in alarm_handlers) + monitor.alarm_handlers += alarm_handler + + SA.register_monitor(monitor) + return 1 + +/obj/item/weapon/circuitboard/stationalert/deconstruct(var/obj/machinery/computer/station_alert/SA) + if(..(SA)) + alarm_handlers.Cut() + if(SA.alarm_monitor) + for(var/alarm_handler in SA.alarm_monitor.alarm_handlers) + alarm_handlers += alarm_handler + return 1 diff --git a/code/game/objects/items/weapons/circuitboards/computer/supply.dm b/code/game/objects/items/weapons/circuitboards/computer/supply.dm index 84c9aa3476c..882e2714f64 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/supply.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/supply.dm @@ -5,7 +5,7 @@ /obj/item/weapon/circuitboard/supplycomp name = T_BOARD("supply control console") build_path = /obj/machinery/computer/supplycomp - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) var/contraband_enabled = 0 /obj/item/weapon/circuitboard/supplycomp/construct(var/obj/machinery/computer/supplycomp/SC) diff --git a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm index 9a18f0df99f..b7ad5db0118 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm @@ -5,14 +5,14 @@ /obj/item/weapon/circuitboard/comm_monitor name = T_BOARD("telecommunications monitor console") build_path = /obj/machinery/computer/telecomms/monitor - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) /obj/item/weapon/circuitboard/comm_server name = T_BOARD("telecommunications server monitor console") build_path = /obj/machinery/computer/telecomms/server - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) /obj/item/weapon/circuitboard/comm_traffic name = T_BOARD("telecommunications traffic control console") build_path = /obj/machinery/computer/telecomms/traffic - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm index 0b0c494cded..65949ae338b 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm @@ -6,7 +6,7 @@ name = T_BOARD("biogenerator") build_path = "/obj/machinery/biogenerator" board_type = "machine" - origin_tech = "programming=2" + origin_tech = list(TECH_DATA = 2) req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 1, "/obj/item/weapon/stock_parts/manipulator" = 1) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm index e3b22c3fec7..b80a3abd34a 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm @@ -6,7 +6,7 @@ name = T_BOARD("clone pod") build_path = "/obj/machinery/clonepod" board_type = "machine" - origin_tech = "programming=3;biotech=3" + origin_tech = list(TECH_DATA = 3, TECH_BIO = 3) req_components = list( "/obj/item/stack/cable_coil" = 2, "/obj/item/weapon/stock_parts/scanning_module" = 2, @@ -17,7 +17,7 @@ name = T_BOARD("cloning scanner") build_path = "/obj/machinery/dna_scannernew" board_type = "machine" - origin_tech = "programming=2;biotech=2" + origin_tech = list(TECH_DATA = 2, TECH_BIO = 2) req_components = list( "/obj/item/weapon/stock_parts/scanning_module" = 1, "/obj/item/weapon/stock_parts/manipulator" = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm index 05ce85865d5..badfb22a010 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm @@ -6,7 +6,7 @@ name = T_BOARD("bluespacerelay") build_path = "/obj/machinery/bluespacerelay" board_type = "machine" - origin_tech = "bluespace=4,programming=4" + origin_tech = list(TECH_BLUESPACE = 2, TECH_DATA = 2) req_components = list( "/obj/item/stack/cable_coil" = 30, "/obj/item/weapon/stock_parts/manipulator" = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm new file mode 100644 index 00000000000..6b8eb5d5e5c --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm @@ -0,0 +1,13 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +/obj/item/weapon/circuitboard/mech_recharger + name = T_BOARD("mech recharger") + build_path = "/obj/machinery/mech_recharger" + board_type = "machine" + origin_tech = list(TECH_DATA = 2, TECH_POWER = 2, TECH_ENGINEERING = 2) + req_components = list( + "/obj/item/weapon/stock_parts/capacitor" = 2, + "/obj/item/weapon/stock_parts/scanning_module" = 1, + "/obj/item/weapon/stock_parts/manipulator" = 2) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm index 97b60686e07..426ced89da6 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm @@ -6,7 +6,7 @@ name = T_BOARD("mining drill head") build_path = "/obj/machinery/mining/drill" board_type = "machine" - origin_tech = "programming=1;engineering=1" + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) req_components = list( "/obj/item/weapon/stock_parts/capacitor" = 1, "/obj/item/weapon/cell" = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm index 0a8f2b6cdd8..02bf65fb0a8 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm @@ -6,7 +6,7 @@ name = T_BOARD("PACMAN-type generator") build_path = "/obj/machinery/power/port_gen/pacman" board_type = "machine" - origin_tech = "programming=3;powerstorage=3;phorontech=3;engineering=3" + origin_tech = list(TECH_DATA = 3, TECH_POWER = 3, TECH_PHORON = 3, TECH_ENGINEERING = 3) req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 1, "/obj/item/weapon/stock_parts/micro_laser" = 1, @@ -16,9 +16,9 @@ /obj/item/weapon/circuitboard/pacman/super name = T_BOARD("SUPERPACMAN-type generator") build_path = "/obj/machinery/power/port_gen/pacman/super" - origin_tech = "programming=3;powerstorage=4;engineering=4" + origin_tech = list(TECH_DATA = 3, TECH_POWER = 4, TECH_ENGINEERING = 4) /obj/item/weapon/circuitboard/pacman/mrs name = T_BOARD("MRSPACMAN-type generator") build_path = "/obj/machinery/power/port_gen/pacman/mrs" - origin_tech = "programming=3;powerstorage=5;engineering=5" + origin_tech = list(TECH_DATA = 3, TECH_POWER = 5, TECH_ENGINEERING = 5) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/weapons/circuitboards/machinery/power.dm index 46241049b66..a8d2e1ea372 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/power.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/power.dm @@ -6,14 +6,14 @@ name = T_BOARD("superconductive magnetic energy storage") build_path = "/obj/machinery/power/smes/buildable" board_type = "machine" - origin_tech = "powerstorage=6;engineering=4" + origin_tech = list(TECH_POWER = 6, TECH_ENGINEERING = 4) req_components = list("/obj/item/weapon/smes_coil" = 1, "/obj/item/stack/cable_coil" = 30) /obj/item/weapon/circuitboard/batteryrack name = T_BOARD("battery rack PSU") build_path = "/obj/machinery/power/smes/batteryrack" board_type = "machine" - origin_tech = "powerstorage=3;engineering=2" + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 2) req_components = list("/obj/item/weapon/cell" = 3) /obj/item/weapon/circuitboard/ghettosmes diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm index 6feda42613a..27e4c652c6f 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm @@ -6,7 +6,7 @@ name = T_BOARD("cyborg recharging station") build_path = "/obj/machinery/recharge_station" board_type = "machine" - origin_tech = "programming=3;engineering=3" + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) req_components = list( "/obj/item/stack/cable_coil" = 5, "/obj/item/weapon/stock_parts/capacitor" = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 2faeafa1b79..ab3d272b1f5 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -6,7 +6,7 @@ obj/item/weapon/circuitboard/rdserver name = T_BOARD("R&D server") build_path = "/obj/machinery/r_n_d/server" board_type = "machine" - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) req_components = list( "/obj/item/stack/cable_coil" = 2, "/obj/item/weapon/stock_parts/scanning_module" = 1) @@ -15,7 +15,7 @@ obj/item/weapon/circuitboard/rdserver name = T_BOARD("destructive analyzer") build_path = "/obj/machinery/r_n_d/destructive_analyzer" board_type = "machine" - origin_tech = "magnets=2;engineering=2;programming=2" + origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_DATA = 2) req_components = list( "/obj/item/weapon/stock_parts/scanning_module" = 1, "/obj/item/weapon/stock_parts/manipulator" = 1, @@ -25,7 +25,7 @@ obj/item/weapon/circuitboard/rdserver name = T_BOARD("autolathe") build_path = "/obj/machinery/autolathe" board_type = "machine" - origin_tech = "engineering=2;programming=2" + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 3, "/obj/item/weapon/stock_parts/manipulator" = 1, @@ -35,7 +35,7 @@ obj/item/weapon/circuitboard/rdserver name = T_BOARD("protolathe") build_path = "/obj/machinery/r_n_d/protolathe" board_type = "machine" - origin_tech = "engineering=2;programming=2" + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 2, "/obj/item/weapon/stock_parts/manipulator" = 2, @@ -46,7 +46,7 @@ obj/item/weapon/circuitboard/rdserver name = T_BOARD("circuit imprinter") build_path = "/obj/machinery/r_n_d/circuit_imprinter" board_type = "machine" - origin_tech = "engineering=2;programming=2" + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 1, "/obj/item/weapon/stock_parts/manipulator" = 1, @@ -56,7 +56,7 @@ obj/item/weapon/circuitboard/rdserver name = "Circuit board (Exosuit Fabricator)" build_path = "/obj/machinery/mecha_part_fabricator" board_type = "machine" - origin_tech = "programming=3;engineering=3" + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) req_components = list( "/obj/item/weapon/stock_parts/matter_bin" = 2, "/obj/item/weapon/stock_parts/manipulator" = 1, @@ -67,9 +67,17 @@ obj/item/weapon/circuitboard/rdserver name = T_BOARD("telepad") build_path = "/obj/machinery/telepad" board_type = "machine" - origin_tech = "programming=4;engineering=3;materials=3;bluespace=4" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_MATERIALS = 3, TECH_BLUESPACE = 4) req_components = list( "/obj/item/bluespace_crystal" = 2, "/obj/item/weapon/stock_parts/capacitor" = 1, "/obj/item/stack/cable_coil" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1) \ No newline at end of file + "/obj/item/weapon/stock_parts/console_screen" = 1) + +obj/item/weapon/circuitboard/ntnet_relay + name = "Circuit board (NTNet Quantum Relay)" + build_path = "/obj/machinery/ntnet_relay" + board_type = "machine" + origin_tech = list(TECH_DATA = 4) + req_components = list( + "/obj/item/stack/cable_coil" = 15) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm index cbfe5f69b15..6dc0a3f7ab8 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm @@ -6,7 +6,7 @@ name = T_BOARD("hull shield generator") board_type = "machine" build_path = "/obj/machinery/shield_gen/external" - origin_tech = "bluespace=4;phorontech=3" + origin_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3) req_components = list( "/obj/item/weapon/stock_parts/manipulator/pico" = 2, "/obj/item/weapon/stock_parts/subspace/transmitter" = 1, @@ -19,7 +19,7 @@ name = T_BOARD("bubble shield generator") board_type = "machine" build_path = "/obj/machinery/shield_gen" - origin_tech = "bluespace=4;phorontech=3" + origin_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3) req_components = list( "/obj/item/weapon/stock_parts/manipulator/pico" = 2, "/obj/item/weapon/stock_parts/subspace/transmitter" = 1, @@ -32,7 +32,7 @@ name = T_BOARD("shield capacitor") board_type = "machine" build_path = "/obj/machinery/shield_capacitor" - origin_tech = "magnets=3;powerstorage=4" + origin_tech = list(TECH_MAGNET = 3, TECH_POWER = 4) req_components = list( "/obj/item/weapon/stock_parts/manipulator/pico" = 2, "/obj/item/weapon/stock_parts/subspace/filter" = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm index 7e0195de9a8..2b94d05cebc 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm @@ -8,7 +8,7 @@ /obj/item/weapon/circuitboard/telecomms/receiver name = T_BOARD("subspace receiver") build_path = "/obj/machinery/telecomms/receiver" - origin_tech = "programming=4;engineering=3;bluespace=2" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2) req_components = list( "/obj/item/weapon/stock_parts/subspace/ansible" = 1, "/obj/item/weapon/stock_parts/subspace/filter" = 1, @@ -18,7 +18,7 @@ /obj/item/weapon/circuitboard/telecomms/hub name = T_BOARD("hub mainframe") build_path = "/obj/machinery/telecomms/hub" - origin_tech = "programming=4;engineering=4" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) req_components = list( "/obj/item/weapon/stock_parts/manipulator" = 2, "/obj/item/stack/cable_coil" = 2, @@ -27,7 +27,7 @@ /obj/item/weapon/circuitboard/telecomms/relay name = T_BOARD("relay mainframe") build_path = "/obj/machinery/telecomms/relay" - origin_tech = "programming=3;engineering=4;bluespace=3" + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 4, TECH_BLUESPACE = 3) req_components = list( "/obj/item/weapon/stock_parts/manipulator" = 2, "/obj/item/stack/cable_coil" = 2, @@ -36,7 +36,7 @@ /obj/item/weapon/circuitboard/telecomms/bus name = T_BOARD("bus mainframe") build_path = "/obj/machinery/telecomms/bus" - origin_tech = "programming=4;engineering=4" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) req_components = list( "/obj/item/weapon/stock_parts/manipulator" = 2, "/obj/item/stack/cable_coil" = 1, @@ -45,7 +45,7 @@ /obj/item/weapon/circuitboard/telecomms/processor name = T_BOARD("processor unit") build_path = "/obj/machinery/telecomms/processor" - origin_tech = "programming=4;engineering=4" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) req_components = list( "/obj/item/weapon/stock_parts/manipulator" = 3, "/obj/item/weapon/stock_parts/subspace/filter" = 1, @@ -57,7 +57,7 @@ /obj/item/weapon/circuitboard/telecomms/server name = T_BOARD("telecommunication server") build_path = "/obj/machinery/telecomms/server" - origin_tech = "programming=4;engineering=4" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) req_components = list( "/obj/item/weapon/stock_parts/manipulator" = 2, "/obj/item/stack/cable_coil" = 1, @@ -66,7 +66,7 @@ /obj/item/weapon/circuitboard/telecomms/broadcaster name = T_BOARD("subspace broadcaster") build_path = "/obj/machinery/telecomms/broadcaster" - origin_tech = "programming=4;engineering=4;bluespace=2" + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_BLUESPACE = 2) req_components = list( "/obj/item/weapon/stock_parts/manipulator" = 2, "/obj/item/stack/cable_coil" = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm index ee763ce82ad..a58d377f6ef 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm @@ -31,7 +31,7 @@ /obj/item/weapon/circuitboard/unary_atmos/heater name = T_BOARD("gas heating system") build_path = "/obj/machinery/atmospherics/unary/heater" - origin_tech = "powerstorage=2;engineering=1" + origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 1) req_components = list( "/obj/item/stack/cable_coil" = 5, "/obj/item/weapon/stock_parts/matter_bin" = 1, @@ -40,7 +40,7 @@ /obj/item/weapon/circuitboard/unary_atmos/cooler name = T_BOARD("gas cooling system") build_path = "/obj/machinery/atmospherics/unary/freezer" - origin_tech = "magnets=2;engineering=2" + origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) req_components = list( "/obj/item/stack/cable_coil" = 2, "/obj/item/weapon/stock_parts/matter_bin" = 1, diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm index ad859479c56..0ce851e3a38 100644 --- a/code/game/objects/items/weapons/circuitboards/mecha.dm +++ b/code/game/objects/items/weapons/circuitboards/mecha.dm @@ -12,7 +12,7 @@ /obj/item/weapon/circuitboard/mecha/ripley - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) /obj/item/weapon/circuitboard/mecha/ripley/peripherals name = T_BOARD_MECHA("Ripley peripherals control") @@ -24,7 +24,7 @@ /obj/item/weapon/circuitboard/mecha/gygax - origin_tech = "programming=4" + origin_tech = list(TECH_DATA = 4) /obj/item/weapon/circuitboard/mecha/gygax/peripherals name = T_BOARD_MECHA("Gygax peripherals control") @@ -33,7 +33,7 @@ /obj/item/weapon/circuitboard/mecha/gygax/targeting name = T_BOARD_MECHA("Gygax weapon control and targeting") icon_state = "mcontroller" - origin_tech = "programming=4;combat=4" + origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4) /obj/item/weapon/circuitboard/mecha/gygax/main name = T_BOARD_MECHA("Gygax central control") @@ -41,7 +41,7 @@ /obj/item/weapon/circuitboard/mecha/durand - origin_tech = "programming=4" + origin_tech = list(TECH_DATA = 4) /obj/item/weapon/circuitboard/mecha/durand/peripherals name = T_BOARD_MECHA("Durand peripherals control") @@ -50,7 +50,7 @@ /obj/item/weapon/circuitboard/mecha/durand/targeting name = T_BOARD_MECHA("Durand weapon control and targeting") icon_state = "mcontroller" - origin_tech = "programming=4;combat=4" + origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4) /obj/item/weapon/circuitboard/mecha/durand/main name = T_BOARD_MECHA("Durand central control") @@ -58,7 +58,7 @@ /obj/item/weapon/circuitboard/mecha/honker - origin_tech = "programming=4" + origin_tech = list(TECH_DATA = 4) /obj/item/weapon/circuitboard/mecha/honker/peripherals name = T_BOARD_MECHA("H.O.N.K peripherals control") @@ -74,7 +74,7 @@ /obj/item/weapon/circuitboard/mecha/odysseus - origin_tech = "programming=3" + origin_tech = list(TECH_DATA = 3) /obj/item/weapon/circuitboard/mecha/odysseus/peripherals name = T_BOARD_MECHA("Odysseus peripherals control") diff --git a/code/game/objects/items/weapons/circuitboards/other.dm b/code/game/objects/items/weapons/circuitboards/other.dm index ec38643bed3..6d016a96fa1 100644 --- a/code/game/objects/items/weapons/circuitboards/other.dm +++ b/code/game/objects/items/weapons/circuitboards/other.dm @@ -6,5 +6,5 @@ /obj/item/weapon/circuitboard/aicore name = T_BOARD("AI core") - origin_tech = "programming=4;biotech=2" + origin_tech = list(TECH_DATA = 4, TECH_BIO = 2) board_type = "other" diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index f8bf29dc6b7..6d603ec3dd8 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -58,9 +58,11 @@ target.clean_blood() return -/obj/item/weapon/soap/attack(mob/target as mob, mob/user as mob) +//attack_as_weapon +/obj/item/weapon/soap/attack(mob/living/target, mob/living/user, var/target_zone) if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" ) - user.visible_message("\red \the [user] washes \the [target]'s mouth out with soap!") + user.visible_message("\The [user] washes \the [target]'s mouth out with soap!") + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //prevent spam return ..() diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 0f0f850ca0b..01ce9f87c8c 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -78,6 +78,4 @@ item_state = "purplecomb" /obj/item/weapon/haircomb/attack_self(mob/user) - if(user.r_hand == src || user.l_hand == src) - user.visible_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy")) - return + user.visible_message("[user] uses [src] to comb their hair with incredible style and sophistication. What a [user.gender == FEMALE ? "lady" : "guy"].") \ No newline at end of file diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 7c685a9e1d4..24f6ad53b39 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -65,7 +65,8 @@ /obj/item/weapon/dnainjector/proc/inject(mob/M as mob, mob/user as mob) if(istype(M,/mob/living)) - M.radiation += rand(5,20) + var/mob/living/L = M + L.apply_effect(rand(5,20), IRRADIATE, check_protection = 0) if (!(NOCLONE in M.mutations)) // prevents drained people from having their DNA changed if (buf.types & DNA2_BUF_UI) @@ -113,6 +114,9 @@ if(!do_after(user,50)) return + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(M) + M.visible_message("\The [M] has been injected with \the [src] by \the [user].") var/mob/living/carbon/human/H = M diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 36c97d3df2e..6f5e2d3d53c 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -7,7 +7,7 @@ item_state = "plasticx" flags = NOBLUDGEON w_class = 2.0 - origin_tech = "syndicate=2" + origin_tech = list(TECH_ILLEGAL = 2) var/datum/wires/explosive/c4/wires = null var/timer = 10 var/atom/target = null @@ -18,6 +18,11 @@ wires = new(src) image_overlay = image('icons/obj/assemblies.dmi', "plastic-explosive2") ..() + +/obj/item/weapon/plastique/Destroy() + qdel(wires) + wires = null + return ..() /obj/item/weapon/plastique/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/weapon/screwdriver)) @@ -41,6 +46,7 @@ if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/) || istype(target, /obj/item/clothing/accessory/storage/) || istype(target, /obj/item/clothing/under)) return user << "Planting explosives..." + user.do_attack_animation(target) if(do_after(user, 50) && in_range(user, target)) user.drop_item() diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index aa7f6df8e46..2a85fbdfc9e 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -14,9 +14,9 @@ matter = list(DEFAULT_WALL_MATERIAL = 90) attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") - var/spray_particles = 6 - var/spray_amount = 8 //units of liquid per particle - var/max_water = 240 + var/spray_particles = 3 + var/spray_amount = 10 //units of liquid per particle + var/max_water = 300 var/last_use = 1.0 var/safety = 1 var/sprite_name = "fire_extinguisher" @@ -30,13 +30,14 @@ throwforce = 2 w_class = 2.0 force = 3.0 - max_water = 120 - spray_particles = 5 + max_water = 150 + spray_particles = 3 sprite_name = "miniFE" /obj/item/weapon/extinguisher/New() create_reagents(max_water) reagents.add_reagent("water", max_water) + ..() /obj/item/weapon/extinguisher/examine(mob/user) if(..(user, 0)) @@ -62,7 +63,7 @@ if(C) C.propelled = (6-i) O.Move(get_step(user,movementdirection), movementdirection) sleep(move_speed[i]) - + //additional movement for(var/i in 1 to 3) O.Move(get_step(user,movementdirection), movementdirection) @@ -105,7 +106,7 @@ for(var/a = 1 to spray_particles) spawn(0) if(!src || !reagents.total_volume) return - + var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(src)) var/turf/my_target if(a <= the_targets.len) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index a8d03b95397..bbdd46cdb39 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -10,8 +10,8 @@ throw_speed = 1 throw_range = 5 w_class = 3.0 + origin_tech = list(TECH_COMBAT = 1, TECH_PHORON = 1) matter = list(DEFAULT_WALL_MATERIAL = 500) - origin_tech = "combat=1;phorontech=1" var/status = 0 var/throw_amount = 100 var/lit = 0 //on or off @@ -112,20 +112,9 @@ update_icon() return - if(istype(W, /obj/item/device/analyzer) && ptank) - var/obj/item/weapon/icon = src - user.visible_message("[user] has used the analyzer on \icon[icon]") - var/pressure = ptank.air_contents.return_pressure() - var/total_moles = ptank.air_contents.total_moles - - user << "\blue Results of analysis of \icon[icon]" - if(total_moles>0) - user << "\blue Pressure: [round(pressure,0.1)] kPa" - for(var/g in ptank.air_contents.gas) - user << "\blue [gas_data.name[g]]: [round((ptank.air_contents.gas[g] / total_moles) * 100)]%" - user << "\blue Temperature: [round(ptank.air_contents.temperature-T0C)]°C" - else - user << "\blue Tank is empty!" + if(istype(W, /obj/item/device/analyzer)) + var/obj/item/device/analyzer/A = W + A.analyze_gases(src, user) return ..() return diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index f8f5a5506b7..ea6dc884bd7 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -30,7 +30,7 @@ user.put_in_active_hand(gift) src.gift.add_fingerprint(user) else - user << "\blue The gift was empty!" + user << "The gift was empty!" qdel(src) return @@ -41,16 +41,16 @@ /obj/effect/spresent/relaymove(mob/user as mob) if (user.stat) return - user << "\blue You cant move." + user << "You can't move." /obj/effect/spresent/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if (!istype(W, /obj/item/weapon/wirecutters)) - user << "\blue I need wirecutters for that." + user << "I need wirecutters for that." return - user << "\blue You cut open the present." + user << "You cut open the present." for(var/mob/M in src) //Should only be one but whatever. M.loc = src.loc @@ -61,7 +61,7 @@ qdel(src) /obj/item/weapon/a_gift/attack_self(mob/M as mob) - var/gift_type = pick(/obj/item/weapon/sord, + var/gift_type = pick( /obj/item/weapon/storage/wallet, /obj/item/weapon/storage/photo_album, /obj/item/weapon/storage/box/snappops, @@ -80,11 +80,10 @@ /obj/item/weapon/bikehorn, /obj/item/weapon/beach_ball, /obj/item/weapon/beach_ball/holoball, - /obj/item/weapon/banhammer, /obj/item/toy/balloon, /obj/item/toy/blink, /obj/item/toy/crossbow, - /obj/item/toy/gun, + /obj/item/weapon/gun/projectile/revolver/capgun, /obj/item/toy/katana, /obj/item/toy/prize/deathripley, /obj/item/toy/prize/durand, @@ -128,12 +127,12 @@ /obj/item/weapon/wrapping_paper/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if (!( locate(/obj/structure/table, src.loc) )) - user << "\blue You MUST put the paper on a table!" + user << "You MUST put the paper on a table!" if (W.w_class < 4) if ((istype(user.l_hand, /obj/item/weapon/wirecutters) || istype(user.r_hand, /obj/item/weapon/wirecutters))) var/a_used = 2 ** (src.w_class - 1) if (src.amount < a_used) - user << "\blue You need more paper!" + user << "You need more paper!" return else if(istype(W, /obj/item/smallDelivery) || istype(W, /obj/item/weapon/gift)) //No gift wrapping gifts! @@ -155,9 +154,9 @@ qdel(src) return else - user << "\blue You need scissors!" + user << "You need scissors!" else - user << "\blue The object is FAR too large!" + user << "The object is FAR too large!" return @@ -185,6 +184,6 @@ msg_admin_attack("[key_name(user)] used [src] to wrap [key_name(H)] (JMP)") else - user << "\blue You need more paper." + user << "You need more paper." else user << "They are moving around too much. A straightjacket would help." diff --git a/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm b/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm new file mode 100644 index 00000000000..4a051099254 --- /dev/null +++ b/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm @@ -0,0 +1,23 @@ +/obj/item/weapon/grenade/anti_photon + desc = "An experimental device for temporarily removing light in a limited area." + name = "photon disruption grenade" + icon = 'icons/obj/grenade.dmi' + icon_state = "emp" + item_state = "emp" + det_time = 20 + origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 4) + +/obj/item/weapon/grenade/anti_photon/prime() + playsound(src.loc, 'sound/effects/phasein.ogg', 50, 1, 5) + set_light(10, -10, "#FFFFFF") + + var/extra_delay = rand(0,90) + + spawn(extra_delay) + spawn(200) + if(prob(10+extra_delay)) + set_light(10, 10, "#[num2hex(rand(64,255))][num2hex(rand(64,255))][num2hex(rand(64,255))]") + spawn(210) + ..() + playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) + qdel(src) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 5e15098521a..3e2847d14db 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -52,13 +52,13 @@ if(istype(W,/obj/item/device/assembly_holder) && (!stage || stage==1) && path != 2) var/obj/item/device/assembly_holder/det = W if(istype(det.a_left,det.a_right.type) || (!isigniter(det.a_left) && !isigniter(det.a_right))) - user << "\red Assembly must contain one igniter." + user << "Assembly must contain one igniter." return if(!det.secured) - user << "\red Assembly must be secured with screwdriver." + user << "Assembly must be secured with screwdriver." return path = 1 - user << "\blue You add [W] to the metal casing." + user << "You add [W] to the metal casing." playsound(src.loc, 'sound/items/Screwdriver2.ogg', 25, -3) user.remove_from_mob(det) det.loc = src @@ -76,22 +76,22 @@ if(stage == 1) path = 1 if(beakers.len) - user << "\blue You lock the assembly." + user << "You lock the assembly." name = "grenade" else -// user << "\red You need to add at least one beaker before locking the assembly." - user << "\blue You lock the empty assembly." +// user << "You need to add at least one beaker before locking the assembly." + user << "You lock the empty assembly." name = "fake grenade" playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3) icon_state = initial(icon_state) +"_locked" stage = 2 else if(stage == 2) if(active && prob(95)) - user << "\red You trigger the assembly!" + user << "You trigger the assembly!" prime() return else - user << "\blue You unlock the assembly." + user << "You unlock the assembly." playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3) name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]" icon_state = initial(icon_state) + (detonator?"_ass":"") @@ -100,18 +100,18 @@ else if(is_type_in_list(W, allowed_containers) && (!stage || stage==1) && path != 2) path = 1 if(beakers.len == 2) - user << "\red The grenade can not hold more containers." + user << "The grenade can not hold more containers." return else if(W.reagents.total_volume) - user << "\blue You add \the [W] to the assembly." + user << "You add \the [W] to the assembly." user.drop_item() W.loc = src beakers += W stage = 1 name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]" else - user << "\red \the [W] is empty." + user << "\The [W] is empty." examine(mob/user) ..(user) @@ -143,7 +143,6 @@ prime() if(!stage || stage<2) return - //if(prob(reliability)) var/has_reagents = 0 for(var/obj/item/weapon/reagent_containers/glass/G in beakers) if(G.reagents.total_volume) has_reagents = 1 @@ -191,7 +190,7 @@ desc = "An oversized grenade that affects a larger area." icon_state = "large_grenade" allowed_containers = list(/obj/item/weapon/reagent_containers/glass) - origin_tech = "combat=3;materials=3" + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3) affected_area = 4 /obj/item/weapon/grenade/chem_grenade/metalfoam @@ -271,7 +270,7 @@ var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) - B1.reagents.add_reagent("fluorosurfactant", 40) + B1.reagents.add_reagent("surfactant", 40) B2.reagents.add_reagent("water", 40) B2.reagents.add_reagent("cleaner", 10) @@ -280,3 +279,27 @@ beakers += B1 beakers += B2 icon_state = initial(icon_state) +"_locked" + +/obj/item/weapon/grenade/chem_grenade/teargas + name = "tear gas grenade" + desc = "Concentrated Capsaicin. Contents under pressure. Use with caution." + stage = 2 + path = 1 + + New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src) + + B1.reagents.add_reagent("phosphorus", 40) + B1.reagents.add_reagent("potassium", 40) + B1.reagents.add_reagent("condensedcapsaicin", 40) + B2.reagents.add_reagent("sugar", 40) + B2.reagents.add_reagent("condensedcapsaicin", 80) + + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + + beakers += B1 + beakers += B2 + icon_state = initial(icon_state) +"_locked" + diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index c14615146da..25e65f924dc 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -1,8 +1,8 @@ /obj/item/weapon/grenade/empgrenade name = "classic emp grenade" - icon_state = "emp" + icon_state = "emp" item_state = "empgrenade" - origin_tech = "materials=2;magnets=3" + origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3) prime() ..() diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 403b0888e75..a6eeb42a444 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -2,7 +2,7 @@ name = "flashbang" icon_state = "flashbang" item_state = "flashbang" - origin_tech = "materials=2;combat=1" + origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 1) var/banglet = 0 prime() @@ -21,7 +21,7 @@ B.health -= damage B.update_icon() - new/obj/effect/effect/sparks(src.loc) + new/obj/effect/sparks(src.loc) new/obj/effect/effect/smoke/illumination(src.loc, brightness=15) qdel(src) return @@ -32,7 +32,7 @@ S.active = 0 // -- Polymorph S.icon_state = "shield0" - M << "\red BANG" + M << "BANG" playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) //Checking for protections @@ -49,7 +49,7 @@ ear_safety += 1 //Flashing everyone - if(eye_safety < 1) + if(eye_safety < FLASH_PROTECTION_MODERATE) flick("e_flash", M.flash) M.Stun(2) M.Weaken(10) @@ -104,19 +104,19 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] if (E && E.damage >= E.min_bruised_damage) - M << "\red Your eyes start to burn badly!" + M << "Your eyes start to burn badly!" if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) if (E.damage >= E.min_broken_damage) - M << "\red You can't see anything!" + M << "You can't see anything!" if (M.ear_damage >= 15) - M << "\red Your ears start to ring badly!" + M << "Your ears start to ring badly!" if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) if (prob(M.ear_damage - 10 + 5)) - M << "\red You can't hear anything!" + M << "You can't hear anything!" M.sdisabilities |= DEAF else if (M.ear_damage >= 5) - M << "\red Your ears start to ring!" + M << "Your ears start to ring!" M.update_icons() /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve diff --git a/code/game/objects/items/weapons/grenades/fragmentation.dm b/code/game/objects/items/weapons/grenades/fragmentation.dm new file mode 100644 index 00000000000..cf70f1bf127 --- /dev/null +++ b/code/game/objects/items/weapons/grenades/fragmentation.dm @@ -0,0 +1,62 @@ +//Fragmentation grenade projectile +/obj/item/projectile/bullet/pellet/fragment + damage = 15 + range_step = 2 + + base_spread = 0 //causes it to be treated as a shrapnel explosion instead of cone + spread_step = 20 + + silenced = 1 //embedding messages are still produced so it's kind of weird when enabled. + no_attack_log = 1 + muzzle_type = null + +/obj/item/weapon/grenade/frag + name = "fragmentation grenade" + desc = "A military fragmentation grenade, designed to explode in a deadly shower of fragments." + icon_state = "frag" + + var/num_fragments = 200 //total number of fragments produced by the grenade + var/fragment_damage = 15 + var/damage_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer. + var/explosion_size = 2 //size of the center explosion + + //The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern + var/spread_range = 7 + +/obj/item/weapon/grenade/frag/prime() + set waitfor = 0 + ..() + + var/turf/O = get_turf(src) + if(!O) return + + if(explosion_size) + explosion(O, -1, round(explosion_size/2), explosion_size, round(explosion_size/2), 0) + + var/list/target_turfs = getcircle(O, spread_range) + var/fragments_per_projectile = round(num_fragments/target_turfs.len) + + for(var/turf/T in target_turfs) + sleep(0) + var/obj/item/projectile/bullet/pellet/fragment/P = new (O) + + P.damage = fragment_damage + P.pellets = fragments_per_projectile + P.range_step = damage_step + P.shot_from = src.name + + P.launch(T) + + //var/cone = new /obj/item/weapon/caution/cone (T) + //spawn(100) qdel(cone) + + //Make sure to hit any mobs in the source turf + for(var/mob/living/M in O) + //lying on a frag grenade while the grenade is on the ground causes you to absorb most of the shrapnel. + //you will most likely be dead, but others nearby will be spared the fragments that hit you instead. + if(M.lying && isturf(src.loc)) + P.attack_mob(M, 0, 0) + else + P.attack_mob(M, 0, 100) //otherwise, allow a decent amount of fragments to pass + + qdel(src) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index e1e58b62ac7..704df83db8a 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -8,27 +8,32 @@ slot_flags = SLOT_BELT var/datum/effect/effect/system/smoke_spread/bad/smoke - New() - ..() - src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad) - src.smoke.attach(src) +/obj/item/weapon/grenade/smokebomb/New() + ..() + src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad) + src.smoke.attach(src) - prime() - playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) - src.smoke.set_up(10, 0, usr.loc) - spawn(0) - src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() +/obj/item/weapon/grenade/smokebomb/Destroy() + qdel(smoke) + smoke = null + return ..() - for(var/obj/effect/blob/B in view(8,src)) - var/damage = round(30/(get_dist(B,src)+1)) - B.health -= damage - B.update_icon() - sleep(80) - qdel(src) - return +/obj/item/weapon/grenade/smokebomb/prime() + playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + src.smoke.set_up(10, 0, usr.loc) + spawn(0) + src.smoke.start() + sleep(10) + src.smoke.start() + sleep(10) + src.smoke.start() + sleep(10) + src.smoke.start() + + for(var/obj/effect/blob/B in view(8,src)) + var/damage = round(30/(get_dist(B,src)+1)) + B.health -= damage + B.update_icon() + sleep(80) + qdel(src) + return diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 7251dfbac7e..753a91f6bd2 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/grenade.dmi' icon_state = "delivery" item_state = "flashbang" - origin_tech = "materials=3;magnets=4" + origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4) var/banglet = 0 var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver @@ -16,7 +16,7 @@ var/turf/T = get_turf(src) playsound(T, 'sound/effects/phasein.ogg', 100, 1) for(var/mob/living/carbon/human/M in viewers(T, null)) - if(M:eyecheck() <= 0) + if(M.eyecheck() < FLASH_PROTECTION_MODERATE) flick("e_flash", M.flash) for(var/i=1, i<=deliveryamt, i++) @@ -36,10 +36,10 @@ desc = "It is set to detonate in 5 seconds. It will unleash a swarm of deadly manhack robots that will attack everyone but you and your allies." spawner_type = /mob/living/simple_animal/hostile/viscerator deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" + origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4) /obj/item/weapon/grenade/spawnergrenade/spesscarp name = "carp delivery grenade" spawner_type = /mob/living/simple_animal/hostile/carp deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" + origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 458080977a3..3c42549337c 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -10,12 +10,14 @@ w_class = 2.0 throw_speed = 2 throw_range = 5 + origin_tech = list(TECH_MATERIAL = 1) matter = list(DEFAULT_WALL_MATERIAL = 500) - origin_tech = "materials=1" + var/elastic var/dispenser = 0 var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes var/cuff_sound = 'sound/weapons/handcuffs.ogg' var/cuff_type = "handcuffs" + sprite_sheets = list("Resomi" = 'icons/mob/species/resomi/handcuffs.dmi') /obj/item/weapon/handcuffs/attack(var/mob/living/carbon/C, var/mob/living/user) @@ -32,21 +34,6 @@ place_handcuffs(user, user) return - //check for an aggressive grab (or robutts) -// var/can_place -// if(istype(user, /mob/living/silicon/robot)) -// can_place = 1 -// else -// for (var/obj/item/weapon/grab/G in C.grabbed_by) -// if (G.loc == user && G.state >= GRAB_AGGRESSIVE) -// can_place = 1 -// break -// -// if(can_place) -// place_handcuffs(C, user) -// else -// user << "You need to have a firm grip on [C] before you can put \the [src] on!" - //Or just. You know. Don't check for it and place the handcuffs anyways! place_handcuffs(C, user) @@ -55,15 +42,15 @@ var/mob/living/carbon/human/H = target if(!istype(H)) - return + return 0 if (!H.has_organ_for_slot(slot_handcuffed)) user << "\The [H] needs at least two wrists before you can cuff them together!" - return + return 0 - if(istype(H.gloves,/obj/item/clothing/gloves/rig)) // Can't cuff someone who's in a deployed hardsuit. - user << "The cuffs won't fit around \the [H.gloves]!" - return + if(istype(H.gloves,/obj/item/clothing/gloves/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit. + user << "\The [src] won't fit around \the [H.gloves]!" + return 0 user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!") @@ -75,6 +62,9 @@ msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)] (JMP)") feedback_add_details("handcuffs","H") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(H) + user.visible_message("\The [user] has put [cuff_type] on \the [H]!") target.drop_r_hand() target.drop_l_hand() @@ -87,7 +77,7 @@ cuffs.loc = target target.handcuffed = cuffs target.update_inv_handcuffed() - return + return 1 var/last_chew = 0 /mob/living/carbon/human/RestrainedClickOn(var/atom/A) @@ -104,8 +94,8 @@ var/last_chew = 0 var/obj/item/organ/external/O = H.organs_by_name[H.hand?"l_hand":"r_hand"] if (!O) return - var/s = "\red [H.name] chews on [H.get_pronoun(1)] [O.name]!" - H.visible_message(s, "\red You chew on your [O.name]!") + var/s = "[H.name] chews on \his [O.name]!" + H.visible_message(s, "You chew on your [O.name]!") message_admins("[key_name_admin(H)] is chewing on [H.get_pronoun(1)] restrained hand - (JMP)") H.attack_log += text("\[[time_stamp()]\] [s] ([H.ckey])") log_attack("[s] ([H.ckey])") @@ -122,6 +112,7 @@ var/last_chew = 0 breakouttime = 300 //Deciseconds = 30s cuff_sound = 'sound/weapons/cablecuff.ogg' cuff_type = "cable restraints" + elastic = 1 /obj/item/weapon/handcuffs/cable/red color = "#DD0000" @@ -160,3 +151,12 @@ var/last_chew = 0 /obj/item/weapon/handcuffs/cyborg dispenser = 1 + +/obj/item/weapon/handcuffs/cable/tape + name = "tape restraints" + desc = "DIY!" + icon_state = "tape_cross" + item_state = null + icon = 'icons/obj/bureaucracy.dmi' + breakouttime = 200 + cuff_type = "duct tape" \ No newline at end of file diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index 933675beeac..8160c14cd88 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -42,10 +42,10 @@ else S.item_quants[G.name] = 1 else - user << "\blue The seed bag is full." + user << "The seed bag is full." S.updateUsrDialog() return - user << "\blue You pick up all the seeds." + user << "You pick up all the seeds." else if (S.contents.len < S.capacity) S.contents += src; @@ -54,7 +54,7 @@ else S.item_quants[name] = 1 else - user << "\blue The seed bag is full." + user << "The seed bag is full." S.updateUsrDialog() return diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 2e156e7e967..ce11af8ccbc 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -36,7 +36,7 @@ return 0 proc/meltdown() //breaks it down, making implant unrecongizible - imp_in << "\red You feel something melting inside [part ? "your [part.name]" : "you"]!" + imp_in << "You feel something melting inside [part ? "your [part.name]" : "you"]!" if (part) part.take_damage(burn = 15, used_weapon = "Electronics meltdown") else @@ -172,7 +172,7 @@ Implant Specifics:
    "} if(ishuman(imp_in)) if (elevel == "Localized Limb") if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste. - imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") + imp_in.visible_message("Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) sleep(25) if (istype(part,/obj/item/organ/external/chest) || \ @@ -237,7 +237,7 @@ Implant Specifics:
    "} proc/small_boom() if (ishuman(imp_in) && part) - imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") + imp_in.visible_message("Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) spawn(25) if (ishuman(imp_in) && part) @@ -323,7 +323,7 @@ the implant may become unstable and either pre-maturely inject the subject or si get_data() var/dat = {" Implant Specifications:
    -Name: Nanotrasen Employee Management Implant
    +Name: [company_name] Employee Management Implant
    Life: Ten years.
    Important Notes: Personnel injected with this device tend to be much more loyal to the company.

    @@ -339,11 +339,11 @@ the implant may become unstable and either pre-maturely inject the subject or si var/mob/living/carbon/human/H = M var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role) if(antag_data && (antag_data.flags & ANTAG_IMPLANT_IMMUNE)) - H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!") + H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of [company_name] try to invade your mind!") return 0 else clear_antag_roles(H.mind, 1) - H << "You feel a surge of loyalty towards Nanotrasen." + H << "You feel a surge of loyalty towards [company_name]." return 1 @@ -370,7 +370,7 @@ the implant may become unstable and either pre-maturely inject the subject or si if (src.uses < 1) return 0 if (emote == "pale") src.uses-- - source << "\blue You feel a sudden surge of energy!" + source << "You feel a sudden surge of energy!" source.SetStunned(0) source.SetWeakened(0) source.SetParalysis(0) @@ -392,7 +392,7 @@ the implant may become unstable and either pre-maturely inject the subject or si get_data() var/dat = {" Implant Specifications:
    -Name: NanoTrasen \"Profit Margin\" Class Employee Lifesign Sensor
    +Name: [company_name] \"Profit Margin\" Class Employee Lifesign Sensor
    Life: Activates upon death.
    Important Notes: Alerts crew to crewmember death.

    @@ -466,7 +466,7 @@ the implant may become unstable and either pre-maturely inject the subject or si get_data() var/dat = {" Implant Specifications:
    -Name: NanoTrasen \"Profit Margin\" Class Employee Lifesign Sensor
    +Name: [company_name] \"Profit Margin\" Class Employee Lifesign Sensor
    Life: Activates upon death.
    Important Notes: Alerts crew to crewmember death.

    diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 11124a1acfd..49b1b280a7a 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -35,11 +35,11 @@ if(!src.imp) return if(!src.imp.allow_reagents) return if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume) - user << "\red [src] is full." + user << "\The [src] is full." else spawn(5) I.reagents.trans_to_obj(src.imp, 5) - user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units." + user << "You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units." else if (istype(I, /obj/item/weapon/implanter)) var/obj/item/weapon/implanter/M = I if (M.imp) diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 2f33eba4135..66080882be7 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -108,10 +108,10 @@ put_mob(mob/living/carbon/M as mob) if(!iscarbon(M)) - usr << "\red The [src.name] cannot hold this!" + usr << "\The [src] cannot hold this!" return if(src.occupant) - usr << "\red The [src.name] is already occupied!" + usr << "\The [src] is already occupied!" return if(M.client) M.client.perspective = EYE_PERSPECTIVE @@ -132,7 +132,7 @@ if(!imp) continue if(istype(imp, /obj/item/weapon/implant/loyalty)) for (var/mob/O in viewers(M, null)) - O.show_message("\red [M] has been implanted by the [src.name].", 1) + O.show_message("\The [M] has been implanted by \the [src].", 1) if(imp.implanted(M)) imp.loc = M diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 31fc7b31cc9..655727a62ae 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -30,18 +30,18 @@ if (!istype(M, /mob/living/carbon)) return if (user && src.imp) - for (var/mob/O in viewers(M, null)) - O.show_message("\red [user] is attemping to implant [M].", 1) + M.visible_message("[user] is attemping to implant [M].") + + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(M) var/turf/T1 = get_turf(M) if (T1 && ((M == user) || do_after(user, 50))) if(user && M && (get_turf(M) == T1) && src && src.imp) - for (var/mob/O in viewers(M, null)) - O.show_message("\red [M] has been implanted by [user].", 1) + M.visible_message("[M] has been implanted by [user].") admin_attack_log(user, M, "Implanted using \the [src.name] ([src.imp.name])", "Implanted with \the [src.name] ([src.imp.name])", "used an implanter, [src.name] ([src.imp.name]), on") - user.show_message("\red You implanted the implant into [M].") if(src.imp.implanted(M)) src.imp.loc = M src.imp.imp_in = M @@ -121,7 +121,7 @@ if(istype(A,/obj/item) && imp) var/obj/item/weapon/implant/compressed/c = imp if (c.scanned) - user << "\red Something is already scanned inside the implant!" + user << "Something is already scanned inside the implant!" return c.scanned = A if(istype(A.loc,/mob/living/carbon/human)) diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm index 0469cd56d5c..9e30764119a 100644 --- a/code/game/objects/items/weapons/implants/implantuplink.dm +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -6,7 +6,7 @@ /obj/item/weapon/implant/uplink/New() activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") hidden_uplink = new(src) - hidden_uplink.uses = 5 + hidden_uplink.uses = round((DEFAULT_TELECRYSTAL_AMOUNT / 2) * 0.8) ..() return @@ -14,6 +14,7 @@ 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") source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." + hidden_uplink.uplink_owner = source.mind return 1 diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 88e42e8965c..5c05d636816 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -77,7 +77,7 @@ /obj/item/weapon/book/manual/supermatter_engine name = "Supermatter Engine Operating Manual" icon_state = "bookSupermatter" - author = "Nanotrasen Central Engineering Division" + author = "Central Engineering Division" title = "Supermatter Engine Operating Manual" /obj/item/weapon/book/manual/supermatter_engine/New() @@ -337,7 +337,7 @@

    - Weyland-Yutani - Building Better Worlds + Weyland-Yutani - Building Better Worlds

    Autonomous Power Loader Unit \"Ripley\"

    Specifications:

    @@ -348,7 +348,7 @@
  • Height: 2.5m
  • Width: 1.8m
  • Top speed: 5km/hour
  • -
  • Operation in vacuum/hostile environment: Possible +
  • Operation in vacuum/hostile environment: Possible
  • Airtank volume: 500 liters
  • Devices:
      @@ -371,10 +371,10 @@
    • Secure the mainboard with a screwdriver.
    • Install the peripherals control module (Not included. Use supplied datadisk to create one).
    • Secure the peripherals control module with a screwdriver.
    • -
    • Install the internal armor plating (Not included due to NanoTrasen regulations. Can be made using 5 metal sheets).
    • +
    • Install the internal armor plating (Not included due to corporate regulations. Can be made using 5 metal sheets).
    • Secure the internal armor plating with a wrench.
    • Weld the internal armor plating to the chassis.
    • -
    • Install the external reinforced armor plating (Not included due to NanoTrasen regulations. Can be made using 5 reinforced metal sheets).
    • +
    • Install the external reinforced armor plating (Not included due to corporate regulations. Can be made using 5 reinforced metal sheets).
    • Secure the external reinforced armor plating with a wrench.
    • Weld the external reinforced armor plating to the chassis.
    • @@ -386,7 +386,7 @@
    • Internal armor is plasteel for additional strength.
    • External armor must be installed in 2 parts, totalling 10 sheets.
    • Completed mech is more resilient against fire, and is a bit more durable overall.
    • -
    • NanoTrasen is determined to ensure the safety of its investments employees.
    • +
    • The Company is determined to ensure the safety of its investments employees.
    @@ -505,7 +505,7 @@ This useful piece of equipment will suck power out of the power systems to charge a cyborg's power cell back up to full charge.

    Robotics Control Console

    - This useful piece of equipment can be used to immobilize or destroy a cyborg. A word of warning: Cyborgs are expensive pieces of equipment, do not destroy them without good reason, or NanoTrasen may see to it that it never happens again. + This useful piece of equipment can be used to immobilize or destroy a cyborg. A word of warning: Cyborgs are expensive pieces of equipment, do not destroy them without good reason, or the Company may see to it that it never happens again.

    Cyborg Modules

    @@ -652,7 +652,7 @@
  • Expose the cyborg's internal wiring
  • Check to make sure the LawSync and AI Sync lights are lit
  • If they are not lit, pulse the LawSync wire using a multitool to enable the cyborg's LawSync
  • -
  • Proceed to a cyborg upload console. NanoTrasen usually places these in the same location as AI upload consoles.
  • +
  • Proceed to a cyborg upload console. The Company usually places these in the same location as AI upload consoles.
  • Use a "Reset" upload moduleto reset the cyborg's laws
  • Proceed to a Robotics Control console
  • Remove the lockdown on the cyborg
  • @@ -660,7 +660,7 @@

    As a last resort

    If all else fails in a case of cyborg-related emergency, there may be only one option. Using a Robotics Control console, you may have to remotely detonate the cyborg. -

    WARNING:

    Do not detonate a borg without an explicit reason for doing so. Cyborgs are expensive pieces of NanoTrasen equipment, and you may be punished for detonating them without reason. +

    WARNING:

    Do not detonate a borg without an explicit reason for doing so. Cyborgs are expensive pieces of company equipment, and you may be punished for detonating them without reason. @@ -669,9 +669,9 @@ /obj/item/weapon/book/manual/security_space_law name = "Corporate Regulations" - desc = "A set of NanoTrasen guidelines for keeping law and order on their space stations." + desc = "A set of corporate guidelines for keeping law and order on privately-owned space stations." icon_state = "bookSpaceLaw" - author = "NanoTrasen" + author = "The Company" title = "Corporate Regulations" /obj/item/weapon/book/manual/security_space_law/New() @@ -692,11 +692,11 @@ /obj/item/weapon/book/manual/medical_diagnostics_manual - name = "NT Medical Diagnostics Manual" + name = "Medical Diagnostics Manual" desc = "First, do no harm. A detailed medical practitioner's guide." icon_state = "bookMedical" - author = "NanoTrasen Medicine Department" - title = "NT Medical Diagnostics Manual" + author = "Medical Department" + title = "Medical Diagnostics Manual" /obj/item/weapon/book/manual/medical_diagnostics_manual/New() ..() @@ -715,7 +715,7 @@

    The Oath

    - The Medical Oath sworn by recognised medical practitioners in the employ of NanoTrasen
    + The Medical Oath sworn by recognised medical practitioners in the employ of [company_name]
    1. Now, as a new doctor, I solemnly promise that I will, to the best of my ability, serve humanity-caring for the sick, promoting good health, and alleviating pain and suffering.
    2. @@ -877,7 +877,7 @@ /obj/item/weapon/book/manual/detective name = "The Film Noir: Proper Procedures for Investigations" icon_state ="bookDetective" - author = "NanoTrasen" + author = "The Company" title = "The Film Noir: Proper Procedures for Investigations" dat = {" @@ -936,7 +936,7 @@

      Nuclear Explosives 101

      - Hello and thank you for choosing the Syndicate for your nuclear information needs. Today's crash course will deal with the operation of a Fusion Class NanoTrasen made Nuclear Device.

      + Hello and thank you for choosing the Syndicate for your nuclear information needs. Today's crash course will deal with the operation of a Nuclear Fission Device.

      First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done, to unbolt it, one must completely log in, which at this time may not be possible.
      @@ -961,7 +961,7 @@ Remember the order:
      Disk, Code, Safety, Timer, Disk, RUN!

      - Intelligence Analysts believe that normal NanoTrasen procedure is for the Captain to secure the nuclear authentication disk.

      + Intelligence Analysts believe that normal corporate procedure is for the Captain to secure the nuclear authentication disk.

      Good luck! diff --git a/code/game/objects/items/weapons/material/bats.dm b/code/game/objects/items/weapons/material/bats.dm index eccc13a2983..d622cc2f280 100644 --- a/code/game/objects/items/weapons/material/bats.dm +++ b/code/game/objects/items/weapons/material/bats.dm @@ -10,6 +10,7 @@ default_material = "wood" force_divisor = 1.1 // 22 when wielded with weight 20 (steel) unwielded_force_divisor = 0.7 // 15 when unwielded based on above. + slot_flags = SLOT_BACK //Predefined materials go here. /obj/item/weapon/material/twohanded/baseballbat/metal/New(var/newloc) diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 9cf88b630a2..945a41e00de 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -14,6 +14,7 @@ force_divisor = 0.1 // 6 when wielded with hardness 60 (steel) thrown_force_divisor = 0.25 // 5 when thrown with weight 20 (steel) var/loaded //Descriptive string for currently loaded food object. + var/scoop_food = 1 /obj/item/weapon/material/kitchen/utensil/New() ..() @@ -36,24 +37,19 @@ if (reagents.total_volume > 0) if(M == user) - if(M.get_species() == "Machine") - M.visible_message("\The [user] smudges some [loaded] from \the [src] on their screen.","You smudge some [loaded] from \the [src] on your screen.") - else - M.visible_message("\The [user] eats some [loaded] from \the [src].","You eat some [loaded] from \the [src].") - reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) - playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1) - overlays.Cut() + if(!M.can_eat(loaded)) + return + M.visible_message("\The [user] eats some [loaded] from \the [src].") else - if(M.get_species() == "Machine") - M.visible_message("\The [user] smudges some [loaded] onto [M].","You smudge some [loaded] from \the [src] onto [M].") - else - M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].","You feed \the [M] some [loaded] with \the [src].") - reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST) - playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1) - overlays.Cut() + user.visible_message("\The [user] begins to feed \the [M]!") + if(!(M.can_force_feed(user, loaded) && do_mob(user, M, 5 SECONDS))) + return + M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].") + playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1) + overlays.Cut() return else - user << "You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK GODDAMNIT + user << "You don't have anything on \the [src]." //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK return /obj/item/weapon/material/kitchen/utensil/fork @@ -84,6 +80,18 @@ desc = "A knife for eating with. Can cut through any food." icon_state = "knife" force_divisor = 0.1 // 6 when wielded with hardness 60 (steel) + scoop_food = 0 + +// Identical to the tactical knife but nowhere near as stabby. +// Kind of like the toy esword compared to the real thing. +/obj/item/weapon/material/kitchen/utensil/knife/boot + name = "boot knife" + desc = "A small fixed-blade knife for putting inside a boot." + icon = 'icons/obj/weapons.dmi' + icon_state = "tacknife" + item_state = "knife" + applies_material_colour = 0 + unbreakable = 1 /obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) @@ -92,13 +100,6 @@ return return ..() -/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) - if ((CLUMSY in user.mutations) && prob(50)) - user << "You somehow managed to cut yourself with \the [src]." - user.take_organ_damage(20) - return - return ..() - /obj/item/weapon/material/kitchen/utensil/knife/plastic default_material = "plastic" @@ -118,6 +119,7 @@ /obj/item/weapon/material/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) user << "\The [src] slips out of your hand and hits your head." + user.drop_from_inventory(src) user.take_organ_damage(10) user.Paralyse(2) return diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 05b1cd4004c..f78b563917f 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -62,12 +62,6 @@ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") unbreakable = 1 -/obj/item/weapon/material/knife/suicide_act(mob/user) - viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ - "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ - "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") - return (BRUTELOSS) - /obj/item/weapon/material/knife/hook name = "meat hook" desc = "A sharp, metal hook what sticks into things." diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index 18181df6b07..fc9ac7eb32d 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -64,9 +64,8 @@ processing_objects -= src ..() -/obj/item/weapon/material/attack() - if(!..()) - return +/obj/item/weapon/material/apply_hit_effect() + ..() if(!unbreakable) if(material.is_brittle()) health = 0 diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index aa0bbd3db83..8cae5642073 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -44,7 +44,6 @@ icon = 'icons/obj/weapons.dmi' icon_state = "hoe" item_state = "hoe" - flags = CONDUCT | NOBLUDGEON force_divisor = 0.25 // 5 with weight 20 (steel) thrown_force_divisor = 0.25 // as above w_class = 2 @@ -61,7 +60,6 @@ throw_speed = 1 throw_range = 3 w_class = 4 - flags = NOSHIELD slot_flags = SLOT_BACK origin_tech = "materials=2;combat=2" attack_verb = list("chopped", "sliced", "cut", "reaped") diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index eac44eba6f2..e3104f7d707 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -16,11 +16,6 @@ unbreakable = 1 //It's already broken. drops_debris = 0 -/obj/item/weapon/material/shard/suicide_act(mob/user) - viewers(user) << pick("\red [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.", \ - "\red [user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.") - return (BRUTELOSS) - /obj/item/weapon/material/shard/set_material(var/new_material) ..(new_material) if(!istype(material)) @@ -61,26 +56,39 @@ return ..() /obj/item/weapon/material/shard/Crossed(AM as mob|obj) + ..() if(isliving(AM)) var/mob/M = AM + + if(M.buckled) //wheelchairs, office chairs, rollerbeds + return + M << "You step on \the [src]!" playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5) || (H.species.name == "Vaurca")) //Thick skin. + if(H.species.siemens_coefficient<0.5 || H.get_species() == "Vaurca") //Thick skin. return - if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) ) - var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot")) - if(affecting.status & ORGAN_ROBOT) + if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) ) + return + + var/list/check = list("l_foot", "r_foot") + while(check.len) + var/picked = pick(check) + var/obj/item/organ/external/affecting = H.get_organ(picked) + if(affecting) + if(affecting.status & ORGAN_ROBOT) + return + if(affecting.take_damage(5, 0)) + H.UpdateDamageIcon() + H.updatehealth() + if(!(H.species.flags & NO_PAIN)) + H.Weaken(3) return - if(affecting.take_damage(5, 0)) - H.UpdateDamageIcon() - H.updatehealth() - if(!(H.species && (H.species.flags & NO_PAIN))) - H.Weaken(3) - ..() + check -= picked + return // Preset types - left here for the code that uses them /obj/item/weapon/material/shard/shrapnel/New(loc) diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm index d4426a30797..e4c2aaa07ee 100644 --- a/code/game/objects/items/weapons/material/swords.dm +++ b/code/game/objects/items/weapons/material/swords.dm @@ -13,12 +13,13 @@ hitsound = 'sound/weapons/bladeslice.ogg' can_embed = 0 -/obj/item/weapon/material/sword/IsShield() - return 1 +/obj/item/weapon/material/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") -/obj/item/weapon/material/sword/suicide_act(mob/user) - viewers(user) << "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide." - return(BRUTELOSS) + if(default_parry_check(user, attacker, damage_source) && prob(50)) + user.visible_message("\The [user] parries [attack_text] with \the [src]!") + playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) + return 1 + return 0 /obj/item/weapon/material/sword/katana name = "katana" @@ -27,10 +28,6 @@ item_state = "katana" slot_flags = SLOT_BELT | SLOT_BACK -/obj/item/weapon/material/sword/katana/suicide_act(mob/user) - viewers(user) << "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku." - return(BRUTELOSS) - /obj/item/weapon/material/sword/rapier name = "rapier" desc = "A slender, fancy and sharply pointed sword." @@ -47,7 +44,7 @@ icon_state = "longsword" item_state = "claymore" slot_flags = SLOT_BELT | SLOT_BACK - + /obj/item/weapon/material/sword/trench name = "trench knife" desc = "A military knife used to slash and stab enemies in close quarters." @@ -55,19 +52,18 @@ icon_state = "trench" item_state = "knife" w_class = 3 - flags = NOSHIELD slot_flags = SLOT_BELT - -/obj/item/weapon/material/sword/trench/IsShield() + +/obj/item/weapon/material/sword/trench/handle_shield() return 0 - + /obj/item/weapon/material/sword/sabre name = "sabre" desc = "A sharp curved backsword." icon_state = "sabre" item_state = "katana" slot_flags = SLOT_BELT - + /obj/item/weapon/material/sword/axe name = "battle axe" desc = "A one handed battle axe, still a deadly weapon." diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 82b874df0bd..492b70d2428 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -71,6 +71,14 @@ O.unwield() return unwield() +//Allow a small chance of parrying melee attacks when wielded - maybe generalize this to other weapons someday +/obj/item/weapon/material/twohanded/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(wielded && default_parry_check(user, attacker, damage_source) && prob(15)) + user.visible_message("\The [user] parries [attack_text] with \the [src]!") + playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) + return 1 + return 0 + /obj/item/weapon/material/twohanded/update_icon() icon_state = "[base_icon][wielded]" item_state = icon_state @@ -84,7 +92,7 @@ if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(H.species.is_small) + if(issmall(H)) user << "It's too heavy for you to wield fully." return else @@ -168,51 +176,6 @@ var/obj/effect/plant/P = A P.die_off() -/* -/* - * Double-Bladed Energy Swords - Cheridan - */ - // Not sure what to do with this one, it won't work nicely with the material system, - // but I don't want to copypaste all the twohanded procs.. -/obj/item/weapon/material/twohanded/dualsaber - icon_state = "dualsaber0" - base_icon = "dualsaber" - name = "double-bladed energy sword" - desc = "Handle with care." - force = 3 - throwforce = 5.0 - throw_speed = 1 - throw_range = 5 - w_class = 2.0 - force_wielded = 30 - wieldsound = 'sound/weapons/saberon.ogg' - unwieldsound = 'sound/weapons/saberoff.ogg' - flags = NOSHIELD - origin_tech = "magnets=3;syndicate=4" - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - sharp = 1 - edge = 1 - applies_material_colour = 0 - -/obj/item/weapon/material/twohanded/dualsaber/attack(target as mob, mob/living/user as mob) - ..() - if((CLUMSY in user.mutations) && (wielded) &&prob(40)) - user << "\red You twirl around a bit before losing your balance and impaling yourself on the [src]." - user.take_organ_damage(20,25) - return - if((wielded) && prob(50)) - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2)) - user.set_dir(i) - sleep(1) - -/obj/item/weapon/material/twohanded/dualsaber/IsShield() - if(wielded) - return 1 - else - return 0 -*/ - //spears, bay edition /obj/item/weapon/material/twohanded/spear icon_state = "spearglass0" @@ -228,7 +191,6 @@ throw_speed = 3 edge = 1 sharp = 1 - flags = NOSHIELD hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") default_material = "glass" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 2fb22416f81..75a207136c1 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -5,6 +5,7 @@ var/active_w_class sharp = 0 edge = 0 + armor_penetration = 50 flags = NOBLOODY can_embed = 0//No embedding pls @@ -50,13 +51,6 @@ add_fingerprint(user) return -/obj/item/weapon/melee/energy/suicide_act(mob/user) - var/tempgender = "[user.gender == MALE ? "he's" : user.gender == FEMALE ? "she's" : "they are"]" - if (active) - viewers(user) << pick("\The [user] is slitting \his stomach open with the [src.name]! It looks like [tempgender] trying to commit seppuku.", \ - "\The [user] is falling on the [src.name]! It looks like [tempgender] trying to commit suicide.") - return (BRUTELOSS|FIRELOSS) - /obj/item/weapon/melee/energy/glaive name = "energy glaive" desc = "An energized glaive." @@ -69,7 +63,7 @@ throw_speed = 5 throw_range = 10 w_class = 5 - flags = CONDUCT | NOSHIELD | NOBLOODY + flags = CONDUCT | NOBLOODY origin_tech = "combat=6;phorontech=4;materials=7;syndicate=4" attack_verb = list("stabbed", "chopped", "sliced", "cleaved", "slashed", "cut") sharp = 1 @@ -104,8 +98,8 @@ throw_speed = 1 throw_range = 5 w_class = 3 - flags = CONDUCT | NOSHIELD | NOBLOODY - origin_tech = "magnets=3;combat=4" + flags = CONDUCT | NOBLOODY + origin_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 4) attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") sharp = 1 edge = 1 @@ -113,16 +107,12 @@ /obj/item/weapon/melee/energy/axe/activate(mob/living/user) ..() icon_state = "axe1" - user << "\blue \The [src] is now energised." + user << "\The [src] is now energised." /obj/item/weapon/melee/energy/axe/deactivate(mob/living/user) ..() icon_state = initial(icon_state) - user << "\blue \The [src] is de-energised. It's just a regular axe now." - -/obj/item/weapon/melee/energy/axe/suicide_act(mob/user) - viewers(user) << "\red \The [user] swings the [src.name] towards \his head! It looks like \he's trying to commit suicide." - return (BRUTELOSS|FIRELOSS) + user << "\The [src] is de-energised. It's just a regular axe now." /* * Energy Sword @@ -140,8 +130,8 @@ throw_speed = 1 throw_range = 5 w_class = 2 - flags = NOSHIELD | NOBLOODY - origin_tech = "magnets=3;syndicate=4" + flags = NOBLOODY + origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4) sharp = 1 edge = 1 var/blade_color @@ -180,8 +170,14 @@ attack_verb = list() icon_state = initial(icon_state) -/obj/item/weapon/melee/energy/sword/IsShield() - if(active) +/obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(active && default_parry_check(user, attacker, damage_source) && prob(50)) + user.visible_message("\The [user] parries [attack_text] with \the [src]!") + + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, user.loc) + spark_system.start() + playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) return 1 return 0 @@ -203,7 +199,8 @@ name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" - force = 70.0//Normal attacks deal very high damage. + force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe + armor_penetration = 100 sharp = 1 edge = 1 anchored = 1 // Never spawned outside of inventory, should be fine. @@ -211,7 +208,7 @@ throw_speed = 1 throw_range = 1 w_class = 4.0//So you can't hide it in your pocket or some such. - flags = NOSHIELD | NOBLOODY + flags = NOBLOODY attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/mob/living/creator var/datum/effect/effect/system/spark_spread/spark_system diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 74c05fdc91e..b4fcc6e84c7 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -8,13 +8,9 @@ force = 10 throwforce = 7 w_class = 3 - origin_tech = "combat=4" + origin_tech = list(TECH_COMBAT = 4) attack_verb = list("flogged", "whipped", "lashed", "disciplined") - suicide_act(mob/user) - viewers(user) << "\red [user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide." - return (OXYLOSS) - /obj/item/weapon/melee/chainsword name = "chainsword" desc = "A deadly chainsaw in the shape of a sword." @@ -27,7 +23,7 @@ w_class = 4 sharp = 1 edge = 1 - origin_tech = "combat=5" + origin_tech = list(TECH_COMBAT = 5) attack_verb = list("chopped", "sliced", "shredded", "slashed", "cut", "ripped") hitsound = 'sound/weapons/bladeslice.ogg' var/active = 0 @@ -50,10 +46,11 @@ slot_flags = initial(slot_flags) user.regenerate_icons() +/* /obj/item/weapon/melee/chainsword/suicide_act(mob/user) viewers(user) << "\red [user] is slicing \himself apart with the [src.name]! It looks like \he's trying to commit suicide." return (BRUTELOSS|OXYLOSS) - +*/ //This is essentially a crowbar and a baseball bat in one. /obj/item/weapon/melee/hammer @@ -74,4 +71,4 @@ origin_tech = "materials=3;syndicate=2" sharp = 0 edge = 0 - hitsound = 'sound/weapons/genhit3.ogg' \ No newline at end of file + hitsound = 'sound/weapons/genhit3.ogg' diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 68a821e3a75..98e5c172c33 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -2,12 +2,12 @@ /obj/item/taperoll name = "tape roll" icon = 'icons/policetape.dmi' - icon_state = "rollstart" + icon_state = "tape" w_class = 2.0 var/turf/start var/turf/end var/tape_type = /obj/item/tape - var/icon_base + var/icon_base = "tape" var/list/image/hazard_overlays var/list/tape_roll_applications = list() @@ -15,10 +15,25 @@ var/list/tape_roll_applications = list() /obj/item/tape name = "tape" icon = 'icons/policetape.dmi' + icon_state = "tape" anchored = 1 var/lifted = 0 var/crumpled = 0 - var/icon_base + var/tape_dir = 0 + var/icon_base = "tape" + +/obj/item/tape/update_icon() + //Possible directional bitflags: 0 (AIRLOCK), 1 (NORTH), 2 (SOUTH), 4 (EAST), 8 (WEST), 3 (VERTICAL), 12 (HORIZONTAL) + switch (tape_dir) + if(0) // AIRLOCK + icon_state = "[icon_base]_door_[crumpled]" + if(3) // VERTICAL + icon_state = "[icon_base]_v_[crumpled]" + if(12) // HORIZONTAL + icon_state = "[icon_base]_h_[crumpled]" + else // END POINT (1|2|4|8) + icon_state = "[icon_base]_dir_[crumpled]" + dir = tape_dir /obj/item/tape/New() ..() @@ -32,81 +47,197 @@ var/list/tape_roll_applications = list() /obj/item/taperoll/police name = "police tape" desc = "A roll of police tape used to block off crime scenes from the public." - icon_state = "police_start" tape_type = /obj/item/tape/police - icon_base = "police" + color = COLOR_RED /obj/item/tape/police name = "police tape" desc = "A length of police tape. Do not cross." req_access = list(access_security) - icon_base = "police" + color = COLOR_RED /obj/item/taperoll/engineering name = "engineering tape" desc = "A roll of engineering tape used to block off working areas from the public." - icon_state = "engineering_start" tape_type = /obj/item/tape/engineering - icon_base = "engineering" + color = COLOR_ORANGE /obj/item/tape/engineering name = "engineering tape" desc = "A length of engineering tape. Better not cross it." req_one_access = list(access_engine,access_atmospherics) - icon_base = "engineering" + color = COLOR_ORANGE + +/obj/item/taperoll/atmos + name = "atmospherics tape" + desc = "A roll of atmospherics tape used to block off working areas from the public." + tape_type = /obj/item/tape/atmos + color = COLOR_BLUE_LIGHT + +/obj/item/tape/atmos + name = "atmospherics tape" + desc = "A length of atmospherics tape. Better not cross it." + req_one_access = list(access_engine,access_atmospherics) + color = COLOR_BLUE_LIGHT + +/obj/item/taperoll/research + name = "research tape" + desc = "A roll of research tape used to block off working areas from the public." + tape_type = /obj/item/tape/research + color = COLOR_PURPLE + +/obj/item/tape/research + name = "research tape" + desc = "A length of research tape. Better not cross it." + req_one_access = list(access_research) + color = COLOR_PURPLE + +/obj/item/taperoll/medical + name = "medical tape" + desc = "A roll of medical tape used to block off working areas from the public." + tape_type = /obj/item/tape/medical + color = COLOR_GREEN + +/obj/item/tape/medical + name = "medical tape" + desc = "A length of medical tape. Better not cross it." + req_one_access = list(access_medical) + color = COLOR_GREEN + +/obj/item/taperoll/update_icon() + overlays.Cut() + var/image/overlay = image(icon = src.icon) + overlay.appearance_flags = RESET_COLOR + if(ismob(loc)) + if(!start) + overlay.icon_state = "start" + else + overlay.icon_state = "stop" + overlays += overlay + +/obj/item/taperoll/dropped(mob/user) + update_icon() + return ..() + +/obj/item/taperoll/pickup(mob/user) + update_icon() + return ..() + +/obj/item/taperoll/attack_hand() + update_icon() + return ..() /obj/item/taperoll/attack_self(mob/user as mob) - if(icon_state == "[icon_base]_start") + if(!start) start = get_turf(src) - usr << "\blue You place the first end of the [src]." - icon_state = "[icon_base]_stop" + usr << "You place the first end of \the [src]." + update_icon() else - icon_state = "[icon_base]_start" end = get_turf(src) if(start.y != end.y && start.x != end.x || start.z != end.z) - usr << "\blue [src] can only be laid horizontally or vertically." + start = null + update_icon() + usr << "\The [src] can only be laid horizontally or vertically." + return + + if(start == end) + // spread tape in all directions, provided there is a wall/window + var/turf/T + var/possible_dirs = 0 + for(var/dir in cardinal) + T = get_step(start, dir) + if(T && T.density) + possible_dirs += dir + else + for(var/obj/structure/window/W in T) + if(W.is_fulltile() || W.dir == reverse_dir[dir]) + possible_dirs += dir + if(!possible_dirs) + start = null + update_icon() + usr << "You can't place \the [src] here." + return + if(possible_dirs & (NORTH|SOUTH)) + var/obj/item/tape/TP = new tape_type(start) + for(var/dir in list(NORTH, SOUTH)) + if (possible_dirs & dir) + TP.tape_dir += dir + TP.update_icon() + if(possible_dirs & (EAST|WEST)) + var/obj/item/tape/TP = new tape_type(start) + for(var/dir in list(EAST, WEST)) + if (possible_dirs & dir) + TP.tape_dir += dir + TP.update_icon() + start = null + update_icon() + usr << "You finish placing \the [src]." return var/turf/cur = start - var/dir - if (start.x == end.x) - var/d = end.y-start.y - if(d) d = d/abs(d) - end = get_turf(locate(end.x,end.y+d,end.z)) - dir = "v" - else - var/d = end.x-start.x - if(d) d = d/abs(d) - end = get_turf(locate(end.x+d,end.y,end.z)) - dir = "h" + var/orientation = get_dir(start, end) + var/dir = 0 + switch(orientation) + if(NORTH, SOUTH) dir = NORTH|SOUTH // North-South taping + if(EAST, WEST) dir = EAST|WEST // East-West taping var/can_place = 1 - while (cur!=end && can_place) + while (can_place) if(cur.density == 1) can_place = 0 else if (istype(cur, /turf/space)) can_place = 0 else for(var/obj/O in cur) - if(!istype(O, /obj/item/tape) && O.density) + if(O.density) can_place = 0 break + if(cur == end) + break cur = get_step_towards(cur,end) if (!can_place) - usr << "\blue You can't run \the [src] through that!" + start = null + update_icon() + usr << "You can't run \the [src] through that!" return cur = start - var/tapetest = 0 - while (cur!=end) - for(var/obj/item/tape/Ptest in cur) - if(Ptest.icon_state == "[Ptest.icon_base]_[dir]") + var/tapetest + var/tape_dir + while (1) + tapetest = 0 + tape_dir = dir + if(cur == start) + var/turf/T = get_step(start, reverse_dir[orientation]) + if(T && !T.density) + tape_dir = orientation + for(var/obj/structure/window/W in T) + if(W.is_fulltile() || W.dir == orientation) + tape_dir = dir + else if(cur == end) + var/turf/T = get_step(end, orientation) + if(T && !T.density) + tape_dir = reverse_dir[orientation] + for(var/obj/structure/window/W in T) + if(W.is_fulltile() || W.dir == reverse_dir[orientation]) + tape_dir = dir + for(var/obj/item/tape/T in cur) + if((T.tape_dir == tape_dir) && (T.icon_base == icon_base)) tapetest = 1 - if(tapetest != 1) - var/obj/item/tape/P = new tape_type(cur) - P.icon_state = "[P.icon_base]_[dir]" + break + if(!tapetest) + var/obj/item/tape/T = new tape_type(cur) + T.tape_dir = tape_dir + T.update_icon() + if(tape_dir & SOUTH) + T.layer += 0.1 // Must always show above other tapes + if(cur == end) + break cur = get_step_towards(cur,end) - usr << "\blue You finish placing the [src]." //Git Test + start = null + update_icon() + usr << "You finish placing \the [src]." + return /obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity) if(!proximity) @@ -116,9 +247,9 @@ var/list/tape_roll_applications = list() 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) - P.icon_state = "[src.icon_base]_door" + P.update_icon() P.layer = 3.2 - user << "\blue You finish placing the [src]." + user << "You finish placing \the [src]." if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor)) var/turf/F = A @@ -128,11 +259,11 @@ var/list/tape_roll_applications = list() 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].") + user.visible_message("\The [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.") + user.visible_message("\The [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 @@ -140,7 +271,7 @@ var/list/tape_roll_applications = list() /obj/item/tape/proc/crumple() if(!crumpled) crumpled = 1 - icon_state = "[icon_state]_c" + update_icon() name = "crumpled [name]" /obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -149,6 +280,8 @@ var/list/tape_roll_applications = list() add_fingerprint(M) if (!allowed(M)) //only select few learn art of not crumpling the tape M << "You are not supposed to go past [src]..." + if(M.a_intent == I_HELP) + return 0 crumple() return ..(mover) @@ -157,43 +290,59 @@ var/list/tape_roll_applications = list() /obj/item/tape/attack_hand(mob/user as mob) if (user.a_intent == I_HELP && src.allowed(user)) - user.show_viewers("\blue [user] lifts [src], allowing passage.") - crumple() - lifted = 1 - spawn(200) - lifted = 0 + user.show_viewers("\The [user] lifts \the [src], allowing passage.") + for(var/obj/item/tape/T in gettapeline()) + T.lift(100) //~10 seconds else breaktape(null, user) +/obj/item/tape/proc/lift(time) + lifted = 1 + layer = 8 + spawn(time) + lifted = 0 + layer = initial(layer) + +// Returns a list of all tape objects connected to src, including itself. +/obj/item/tape/proc/gettapeline() + var/list/dirs = list() + if(tape_dir & NORTH) + dirs += NORTH + if(tape_dir & SOUTH) + dirs += SOUTH + if(tape_dir & WEST) + dirs += WEST + if(tape_dir & EAST) + dirs += EAST + + var/list/obj/item/tape/tapeline = list() + for (var/obj/item/tape/T in get_turf(src)) + tapeline += T + for(var/dir in dirs) + var/turf/cur = get_step(src, dir) + var/not_found = 0 + while (!not_found) + not_found = 1 + for (var/obj/item/tape/T in cur) + tapeline += T + not_found = 0 + cur = get_step(cur, dir) + return tapeline + + /obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user)))) - user << "You can't break the [src] with that!" + user << "You can't break \the [src] with that!" return - user.show_viewers("\blue [user] breaks the [src]!") - - var/dir[2] - var/icon_dir = src.icon_state - if(icon_dir == "[src.icon_base]_h") - dir[1] = EAST - dir[2] = WEST - if(icon_dir == "[src.icon_base]_v") - dir[1] = NORTH - dir[2] = SOUTH - - for(var/i=1;i<3;i++) - var/N = 0 - var/turf/cur = get_step(src,dir[i]) - while(N != 1) - N = 1 - for (var/obj/item/tape/P in cur) - if(P.icon_state == icon_dir) - N = 0 - qdel(P) - cur = get_step(cur,dir[i]) - - qdel(src) - return + user.show_viewers("\The [user] breaks \the [src]!") + for (var/obj/item/tape/T in gettapeline()) + if(T == src) + continue + if(T.tape_dir & get_dir(T, src)) + qdel(T) + qdel(src) //TODO: Dropping a trash item holding fibers/fingerprints of all broken tape parts + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 96c635b7786..6ae799407e0 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/power.dmi' icon_state = "cell" item_state = "cell" - origin_tech = "powerstorage=1" + origin_tech = list(TECH_POWER = 1) force = 5.0 throwforce = 5.0 throw_speed = 3 @@ -14,14 +14,8 @@ var/maxcharge = 1000 var/rigged = 0 // true if rigged to explode var/minor_fault = 0 //If not 100% reliable, it will build up faults. - var/construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=75) - var/construction_time=100 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) - suicide_act(mob/user) - viewers(user) << "\red [user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide." - return (FIRELOSS) - //currently only used by energy-type guns, that may change in the future. /obj/item/weapon/cell/device name = "device power cell" @@ -40,9 +34,9 @@ charge = maxcharge /obj/item/weapon/cell/crap - name = "\improper Nanotrasen brand rechargable AA battery" + name = "\improper rechargable AA battery" desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT - origin_tech = "powerstorage=0" + origin_tech = list(TECH_POWER = 0) maxcharge = 500 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40) @@ -52,7 +46,7 @@ /obj/item/weapon/cell/secborg name = "security borg rechargable D battery" - origin_tech = "powerstorage=0" + origin_tech = list(TECH_POWER = 0) maxcharge = 600 //600 max charge / 100 charge per shot = six shots matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40) @@ -62,28 +56,34 @@ /obj/item/weapon/cell/apc name = "heavy-duty power cell" - origin_tech = "powerstorage=1" + origin_tech = list(TECH_POWER = 1) maxcharge = 5000 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) /obj/item/weapon/cell/high name = "high-capacity power cell" - origin_tech = "powerstorage=2" + origin_tech = list(TECH_POWER = 2) icon_state = "hcell" maxcharge = 10000 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60) +/obj/item/weapon/cell/mecha + name = "exosuit-grade power cell" + origin_tech = list(TECH_POWER = 3) + icon_state = "hcell" + maxcharge = 15000 + matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) + /obj/item/weapon/cell/high/empty/New() ..() charge = 0 /obj/item/weapon/cell/super name = "super-capacity power cell" - origin_tech = "powerstorage=5" + origin_tech = list(TECH_POWER = 5) icon_state = "scell" maxcharge = 20000 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) - construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=100) /obj/item/weapon/cell/super/empty/New() ..() @@ -91,11 +91,10 @@ /obj/item/weapon/cell/hyper name = "hyper-capacity power cell" - origin_tech = "powerstorage=6" + origin_tech = list(TECH_POWER = 6) icon_state = "hpcell" maxcharge = 30000 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80) - construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=150,"gold"=200,"silver"=200) /obj/item/weapon/cell/hyper/empty/New() ..() @@ -107,7 +106,7 @@ origin_tech = null maxcharge = 30000 //determines how badly mobs get shocked matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80) - + check_charge() return 1 use() @@ -116,7 +115,7 @@ /obj/item/weapon/cell/potato name = "potato battery" desc = "A rechargable starch based power cell." - origin_tech = "powerstorage=1" + origin_tech = list(TECH_POWER = 1) icon = 'icons/obj/power.dmi' //'icons/obj/harvest.dmi' icon_state = "potato_cell" //"potato_battery" charge = 100 @@ -127,7 +126,7 @@ /obj/item/weapon/cell/slime name = "charged slime core" desc = "A yellow slime core infused with phoron, it crackles with power." - origin_tech = "powerstorage=2;biotech=4" + origin_tech = list(TECH_POWER = 2, TECH_BIO = 4) icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi' icon_state = "yellow slime extract" //"potato_battery" maxcharge = 10000 diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index db331a1b563..3e4add16329 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -8,7 +8,7 @@ item_state = "paper" throw_speed = 4 throw_range = 20 - origin_tech = "bluespace=4" + origin_tech = list(TECH_BLUESPACE = 4) /obj/item/weapon/teleportation_scroll/attack_self(mob/user as mob) if(!(user.mind.assigned_role == "Space Wizard")) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 436eea03395..c8f76aca0c9 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -1,5 +1,52 @@ +//** Shield Helpers +//These are shared by various items that have shield-like behaviour + +//bad_arc is the ABSOLUTE arc of directions from which we cannot block. If you want to fix it to e.g. the user's facing you will need to rotate the dirs yourself. +/proc/check_shield_arc(mob/user, var/bad_arc, atom/damage_source = null, mob/attacker = null) + //check attack direction + var/attack_dir = 0 //direction from the user to the source of the attack + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + attack_dir = get_dir(get_turf(user), P.starting) + else if(attacker) + attack_dir = get_dir(get_turf(user), get_turf(attacker)) + else if(damage_source) + attack_dir = get_dir(get_turf(user), get_turf(damage_source)) + + if(!(attack_dir && (attack_dir & bad_arc))) + return 1 + return 0 + +/proc/default_parry_check(mob/user, mob/attacker, atom/damage_source) + //parry only melee attacks + if(istype(damage_source, /obj/item/projectile) || (attacker && get_dist(user, attacker) > 1) || user.incapacitated()) + return 0 + + //block as long as they are not directly behind us + var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + if(!check_shield_arc(user, bad_arc, damage_source, attacker)) + return 0 + + return 1 + /obj/item/weapon/shield name = "shield" + var/base_block_chance = 50 + +/obj/item/weapon/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(user.incapacitated()) + return 0 + + //block as long as they are not directly behind us + var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + if(check_shield_arc(user, bad_arc, damage_source, attacker)) + if(prob(get_block_chance(user, damage, damage_source, attacker))) + user.visible_message("\The [user] blocks [attack_text] with \the [src]!") + return 1 + return 0 + +/obj/item/weapon/shield/proc/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + return base_block_chance /obj/item/weapon/shield/riot name = "riot shield" @@ -13,22 +60,31 @@ throw_speed = 1 throw_range = 4 w_class = 4.0 + origin_tech = list(TECH_MATERIAL = 2) matter = list("glass" = 7500, DEFAULT_WALL_MATERIAL = 1000) - origin_tech = "materials=2" attack_verb = list("shoved", "bashed") var/cooldown = 0 //shield bash cooldown. based on world.time - IsShield() - return 1 +/obj/item/weapon/shield/riot/handle_shield(mob/user) + . = ..() + if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) - attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/melee/baton)) - if(cooldown < world.time - 25) - user.visible_message("[user] bashes [src] with [W]!") - playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) - cooldown = world.time - else - ..() +/obj/item/weapon/shield/riot/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + //plastic shields do not stop bullets or lasers, even in space. Will block beanbags, rubber bullets, and stunshots just fine though. + if((is_sharp(P) && damage > 10) || istype(P, /obj/item/projectile/beam)) + return 0 + return base_block_chance + +/obj/item/weapon/shield/riot/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/melee/baton)) + if(cooldown < world.time - 25) + user.visible_message("[user] bashes [src] with [W]!") + playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) + cooldown = world.time + else + ..() /* * Energy Shield @@ -45,34 +101,46 @@ throw_speed = 1 throw_range = 4 w_class = 2 - origin_tech = "materials=4;magnets=3;syndicate=4" + origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 4) attack_verb = list("shoved", "bashed") var/active = 0 -/obj/item/weapon/shield/energy/IsShield() - if(active) - return 1 - else - return 0 +/obj/item/weapon/shield/energy/handle_shield(mob/user) + if(!active) + return 0 //turn it on first! + . = ..() + + if(.) + var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) + spark_system.set_up(5, 0, user.loc) + spark_system.start() + playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + +/obj/item/weapon/shield/energy/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + if((is_sharp(P) && damage > 10) || istype(P, /obj/item/projectile/beam)) + return (base_block_chance - round(damage / 3)) //block bullets and beams using the old block chance + return base_block_chance /obj/item/weapon/shield/energy/attack_self(mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "\red You beat yourself in the head with [src]." + user << "You beat yourself in the head with [src]." user.take_organ_damage(5) active = !active if (active) force = 10 - icon_state = "eshield[active]" + update_icon() w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 50, 1) - user << "\blue [src] is now active." + user << "\The [src] is now active." else force = 3 - icon_state = "eshield[active]" + update_icon() w_class = 1 playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) - user << "\blue [src] can now be concealed." + user << "\The [src] can now be concealed." if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user @@ -82,9 +150,16 @@ add_fingerprint(user) return +/obj/item/weapon/shield/energy/update_icon() + icon_state = "eshield[active]" + if(active) + set_light(1.5, 1.5, "#006AFF") + else + set_light(0) + /obj/item/weapon/cloaking_device name = "cloaking device" - desc = "Use this to become invisible to the human eyesocket." + desc = "Use this to become invisible to the human eye." icon = 'icons/obj/device.dmi' icon_state = "shield0" var/active = 0.0 @@ -94,16 +169,16 @@ throw_speed = 2 throw_range = 10 w_class = 2.0 - origin_tech = "magnets=3;syndicate=4" + origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4) /obj/item/weapon/cloaking_device/attack_self(mob/user as mob) src.active = !( src.active ) if (src.active) - user << "\blue The cloaking device is now active." + user << "\The [src] is now active." src.icon_state = "shield1" else - user << "\blue The cloaking device is now inactive." + user << "\The [src] is now inactive." src.icon_state = "shield0" src.add_fingerprint(user) return @@ -114,3 +189,4 @@ if(ismob(loc)) loc:update_icons() ..() + diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 1ea3eca942a..b47dd1d48dc 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -17,9 +17,12 @@ slot_l_hand_str = "backpack", slot_r_hand_str = "backpack", ) + sprite_sheets = list( + "Resomi" = 'icons/mob/species/resomi/back.dmi' + ) w_class = 4 slot_flags = SLOT_BACK - max_w_class = 3 + max_w_class = 4 max_storage_space = 28 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -46,35 +49,21 @@ /obj/item/weapon/storage/backpack/holding name = "bag of holding" desc = "A backpack that opens into a localized pocket of Blue Space." - origin_tech = "bluespace=4" + origin_tech = list(TECH_BLUESPACE = 4) icon_state = "holdingpack" max_w_class = 4 max_storage_space = 56 + storage_cost = 29 New() ..() return attackby(obj/item/weapon/W as obj, mob/user as mob) - if(crit_fail) - user << "\red The Bluespace generator isn't working." - 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." + if(istype(W, /obj/item/weapon/storage/backpack/holding)) + user << "The Bluespace interfaces of the two devices conflict and malfunction." 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!" - 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") - qdel(src) - return - */ ..() //Please don't clutter the parent storage item with stupid hacks. @@ -83,25 +72,12 @@ return 1 return ..() - proc/failcheck(mob/user as mob) - if (prob(src.reliability)) return 1 //No failure - if (prob(src.reliability)) - user << "\red The Bluespace portal resists your attempt to add another item." //light failure - else - user << "\red The Bluespace generator malfunctions!" - for (var/obj/O in src.contents) //it broke, delete what was in it - qdel(O) - crit_fail = 1 - icon_state = "brokenpack" - - /obj/item/weapon/storage/backpack/santabag name = "\improper Santa's gift bag" desc = "Space Santa uses this to deliver toys to all the nice children in space in Christmas! Wow, it's pretty big!" icon_state = "giftbag0" item_state = "giftbag" w_class = 4.0 - storage_slots = 20 max_w_class = 3 max_storage_space = 400 // can store a ton of shit! item_state_slots = null @@ -131,7 +107,7 @@ /obj/item/weapon/storage/backpack/captain name = "captain's backpack" - desc = "It's a special backpack made exclusively for Nanotrasen officers." + desc = "It's a special backpack made exclusively for officers." icon_state = "captainpack" item_state_slots = null @@ -267,7 +243,7 @@ /obj/item/weapon/storage/backpack/satchel_cap name = "captain's satchel" - desc = "An exclusive satchel for Nanotrasen officers." + desc = "An exclusive satchel for officers." icon_state = "satchel-cap" item_state_slots = list( slot_l_hand_str = "satchel-cap", @@ -287,7 +263,7 @@ //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." + desc = "A spacious backpack with lots of pockets, used by members of the Emergency Response Team." icon_state = "ert_commander" item_state_slots = list( slot_l_hand_str = "securitypack", @@ -297,24 +273,24 @@ //Commander /obj/item/weapon/storage/backpack/ert/commander name = "emergency response team commander backpack" - desc = "A spacious backpack with lots of pockets, worn by the commander of a Nanotrasen Emergency Response Team." + desc = "A spacious backpack with lots of pockets, worn by the commander of an Emergency Response Team." //Security /obj/item/weapon/storage/backpack/ert/security name = "emergency response team security backpack" - desc = "A spacious backpack with lots of pockets, worn by security members of a Nanotrasen Emergency Response Team." + desc = "A spacious backpack with lots of pockets, worn by security members of an Emergency Response Team." icon_state = "ert_security" //Engineering /obj/item/weapon/storage/backpack/ert/engineer name = "emergency response team engineer backpack" - desc = "A spacious backpack with lots of pockets, worn by engineering members of a Nanotrasen Emergency Response Team." + desc = "A spacious backpack with lots of pockets, worn by engineering members of an Emergency Response Team." icon_state = "ert_engineering" //Medical /obj/item/weapon/storage/backpack/ert/medical name = "emergency response team medical backpack" - desc = "A spacious backpack with lots of pockets, worn by medical members of a Nanotrasen Emergency Response Team." + desc = "A spacious backpack with lots of pockets, worn by medical members of an Emergency Response Team." icon_state = "ert_medical" // Duffel Bags diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 04ad251fbac..27e43432b6d 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -35,7 +35,6 @@ w_class = 4 max_w_class = 2 - storage_slots = 21 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) @@ -82,7 +81,6 @@ w_class = 4 max_w_class = 2 - storage_slots = 21 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) @@ -97,8 +95,7 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - storage_slots = 50 - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class + max_storage_space = 100 max_w_class = 3 can_hold = list(/obj/item/weapon/ore) @@ -111,8 +108,7 @@ name = "plant bag" icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "plantbag" - storage_slots = 50; //the number of plant pieces it can carry. - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class + max_storage_space = 100 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown) @@ -128,10 +124,11 @@ name = "sheet snatcher" icon = 'icons/obj/mining.dmi' icon_state = "sheetsnatcher" - desc = "A patented Nanotrasen storage system designed for any kind of mineral sheet." + desc = "A patented storage system designed for any kind of mineral sheet." var/capacity = 300; //the number of sheets it can carry. w_class = 3 + storage_slots = 7 allow_quick_empty = 1 // this function is superceded New() @@ -149,7 +146,7 @@ current += S.amount if(capacity == current)//If it's full, you're done if(!stop_messages) - usr << "\red The snatcher is full." + usr << "The snatcher is full." return 0 return 1 @@ -214,7 +211,7 @@ var/col_count = min(7,storage_slots) -1 if (adjusted_contents > 7) row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. - src.standard_orient_objs(row_num, col_count, numbered_contents) + src.slot_orient_objs(row_num, col_count, numbered_contents) return @@ -269,8 +266,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "cashbag" desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front." - storage_slots = 50; //the number of cash pieces it can carry. - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * cash.w_class + max_storage_space = 100 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 2cc117169c9..5bb25e9e38a 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -4,8 +4,12 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" + storage_slots = 7 + max_w_class = 3 + max_storage_space = 28 slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") + sprite_sheets = list("Resomi" = 'icons/mob/species/resomi/belt.dmi') var/show_above_suit = 0 @@ -111,9 +115,6 @@ desc = "Can hold security gear like handcuffs and flashes." icon_state = "securitybelt" item_state = "security" - storage_slots = 7 - max_w_class = 3 - max_storage_space = 28 can_hold = list( /obj/item/weapon/grenade, /obj/item/weapon/reagent_containers/spray/pepper, diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 626ed7aba21..8a29fdefa8f 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -15,8 +15,8 @@ /obj/item/weapon/storage/bible/booze/New() ..() - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) new /obj/item/weapon/spacecash(src) new /obj/item/weapon/spacecash(src) new /obj/item/weapon/spacecash(src) @@ -25,7 +25,7 @@ if(!proximity) return if(user.mind && (user.mind.assigned_role == "Chaplain")) if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder - user << "\blue You bless [A]." + user << "You bless [A]." var/water2holy = A.reagents.get_reagent_amount("water") A.reagents.del_reagent("water") A.reagents.add_reagent("holywater",water2holy) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 92a577a5502..d544a5102e9 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -310,8 +310,8 @@ new /obj/item/ammo_casing/a145(src) /obj/item/weapon/storage/box/flashbangs - name = "box of flashbangs (WARNING)" - desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use." + name = "box of flashbangs" + desc = "A box containing 7 antipersonnel flashbang grenades.
      WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use." icon_state = "flashbang" New() @@ -324,6 +324,21 @@ new /obj/item/weapon/grenade/flashbang(src) new /obj/item/weapon/grenade/flashbang(src) + +/obj/item/weapon/storage/box/teargas + name = "box of pepperspray grenades" + desc = "A box containing 7 tear gas grenades. A gas mask is printed on the label.
      WARNING: Exposure carries risk of serious injury or death. Keep away from persons with lung conditions." + icon_state = "flashbang" + + New() + ..() + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + /obj/item/weapon/storage/box/smokebombs name = "box of smoke grenades" desc = "A box full of smoke grenades, used by special law enforcement teams and military organisations. Provides cover, confusion, and distraction." @@ -352,6 +367,31 @@ new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/grenade/empgrenade(src) +/obj/item/weapon/storage/box/smokes + name = "box of smoke bombs" + desc = "A box containing 5 smoke bombs." + icon_state = "flashbang" + +/obj/item/weapon/storage/box/smokes/New() + ..() + new /obj/item/weapon/grenade/smokebomb(src) + new /obj/item/weapon/grenade/smokebomb(src) + new /obj/item/weapon/grenade/smokebomb(src) + new /obj/item/weapon/grenade/smokebomb(src) + new /obj/item/weapon/grenade/smokebomb(src) + +/obj/item/weapon/storage/box/anti_photons + name = "box of anti-photon grenades" + desc = "A box containing 5 experimental photon disruption grenades." + icon_state = "flashbang" + +/obj/item/weapon/storage/box/anti_photons/New() + ..() + new /obj/item/weapon/grenade/anti_photon(src) + new /obj/item/weapon/grenade/anti_photon(src) + new /obj/item/weapon/grenade/anti_photon(src) + new /obj/item/weapon/grenade/anti_photon(src) + new /obj/item/weapon/grenade/anti_photon(src) /obj/item/weapon/storage/box/trackimp name = "boxed tracking implant kit" @@ -491,7 +531,6 @@ desc = "Drymate brand monkey cubes. Just add water!" icon = 'icons/obj/food.dmi' icon_state = "monkeycubebox" - storage_slots = 7 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube) New() ..() @@ -620,11 +659,10 @@ desc = "Eight wrappers of fun! Ages 8 and up. Not suitable for children." icon = 'icons/obj/toy.dmi' icon_state = "spbox" - storage_slots = 8 can_hold = list(/obj/item/toy/snappop) New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 8; i++) new /obj/item/toy/snappop(src) /obj/item/weapon/storage/box/matches @@ -633,14 +671,13 @@ icon = 'icons/obj/cigarettes.dmi' icon_state = "matchbox" item_state = "zippo" - storage_slots = 10 w_class = 1 slot_flags = SLOT_BELT can_hold = list(/obj/item/weapon/flame/match) New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 10; i++) new /obj/item/weapon/flame/match(src) attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob) @@ -658,7 +695,7 @@ icon_state = "syringe" New() ..() - for (var/i; i < storage_slots; i++) + for (var/i; i < 7; i++) new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src) /obj/item/weapon/storage/box/lights @@ -698,6 +735,17 @@ new /obj/item/weapon/light/bulb(src) ..() +/obj/item/weapon/storage/box/freezer + name = "portable freezer" + desc = "This nifty shock-resistant device will keep your 'groceries' nice and non-spoiled." + icon = 'icons/obj/storage.dmi' + icon_state = "portafreezer" + item_state = "medicalpack" + max_w_class = 3 + can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass) + max_storage_space = 21 + use_to_pickup = 1 // for picking up broken bulbs, not that most people will try + /obj/item/weapon/storage/box/kitchen name = "kitchen supplies" desc = "Contains an assortment of utensils and containers useful in the preparation of food and drinks." @@ -750,4 +798,4 @@ for (var/i = 0,i<7,i++) var/type = pick(snacks) new type(src) - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 19d079e5ce1..909cfb502d1 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -69,14 +69,13 @@ icon_state = "candlebox5" icon_type = "candle" item_state = "candlebox5" - storage_slots = 5 throwforce = 2 slot_flags = SLOT_BELT /obj/item/weapon/storage/fancy/candle_box/New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 5; i++) new /obj/item/weapon/flame/candle(src) return @@ -90,7 +89,6 @@ icon = 'icons/obj/crayons.dmi' icon_state = "crayonbox" w_class = 2.0 - storage_slots = 6 icon_type = "crayon" can_hold = list( /obj/item/weapon/pen/crayon @@ -177,6 +175,16 @@ icon_state = "Dpacket" item_state = "Dpacket" +/obj/item/weapon/storage/fancy/cigarettes/killthroat + name = "\improper AcmeCo packet" + desc = "A packet of six AcmeCo cigarettes. For those who somehow want to obtain the record for the most amount of cancerous tumors." + icon_state = "Bpacket" + item_state = "Bpacket" //Doesn't have an inhand state, but neither does dromedary, so, ya know.. + + New() + ..() + fill_cigarre_package(src,list("fuel" = 15)) + /obj/item/weapon/storage/fancy/cigar name = "cigar case" desc = "A case for holding your cigars when you are not smoking them." diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 08f390c38d3..d0a7bafa366 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -163,7 +163,6 @@ can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/dice,/obj/item/weapon/paper) allow_quick_gather = 1 use_to_pickup = 1 - storage_slots = 14 use_sound = null /obj/item/weapon/storage/pill_bottle/antitox diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm new file mode 100644 index 00000000000..92dd28c61a5 --- /dev/null +++ b/code/game/objects/items/weapons/storage/laundry_basket.dm @@ -0,0 +1,87 @@ +// ----------------------------- +// Laundry Basket +// ----------------------------- +// An item designed for hauling the belongings of a character. +// So this cannot be abused for other uses, we make it two-handed and inable to have its storage looked into. +/obj/item/weapon/storage/laundry_basket + name = "laundry basket" + icon = 'icons/obj/janitor.dmi' + icon_state = "laundry-empty" + item_state = "laundry" + desc = "The peak of thousands of years of laundry evolution." + + w_class = 5 + max_w_class = 4 + max_storage_space = 25 //20 for clothes + a bit of additional space for non-clothing items that were worn on body + storage_slots = 14 + use_to_pickup = 1 + allow_quick_empty = 1 + allow_quick_gather = 1 + collection_mode = 1 + var/linked + + +/obj/item/weapon/storage/laundry_basket/attack_hand(mob/user as mob) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.get_organ("r_hand") + if (user.hand) + temp = H.get_organ("l_hand") + if(!temp) + user << "You need two hands to pick this up!" + return + + if(user.get_inactive_hand()) + user << "You need your other hand to be empty" + return + return ..() + +/obj/item/weapon/storage/laundry_basket/attack_self(mob/user as mob) + var/turf/T = get_turf(user) + user << "You dump the [src]'s contents onto \the [T]." + return ..() + +/obj/item/weapon/storage/laundry_basket/pickup(mob/user) + var/obj/item/weapon/storage/laundry_basket/offhand/O = new(user) + O.name = "[name] - second hand" + O.desc = "Your second grip on the [name]." + O.linked = src + user.put_in_inactive_hand(O) + linked = O + return + +/obj/item/weapon/storage/laundry_basket/update_icon() + if(contents.len) + icon_state = "laundry-full" + else + icon_state = "laundry-empty" + return + + +/obj/item/weapon/storage/laundry_basket/MouseDrop(obj/over_object as obj) + if(over_object == usr) + return + else + return ..() + +/obj/item/weapon/storage/laundry_basket/dropped(mob/user as mob) + qdel(linked) + return ..() + +/obj/item/weapon/storage/laundry_basket/show_to(mob/user as mob) + return + +/obj/item/weapon/storage/laundry_basket/open(mob/user as mob) + + +//Offhand +/obj/item/weapon/storage/laundry_basket/offhand + icon = 'icons/obj/weapons.dmi' + icon_state = "offhand" + name = "second hand" + use_to_pickup = 0 + +/obj/item/weapon/storage/laundry_basket/offhand/dropped(mob/user as mob) + user.drop_from_inventory(linked) + return + diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 4709009ab05..728ab82be9a 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -8,7 +8,6 @@ w_class = 4 max_w_class = 3 max_storage_space = 14 //The sum of the w_classes of all the items in this storage item. - storage_slots = 4 req_access = list(access_armory) var/locked = 1 var/broken = 0 @@ -20,51 +19,58 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/card/id)) if(src.broken) - user << "\red It appears to be broken." + user << "It appears to be broken." return if(src.allowed(user)) src.locked = !( src.locked ) if(src.locked) src.icon_state = src.icon_locked - user << "\red You lock the [src.name]!" + user << "You lock \the [src]!" return else src.icon_state = src.icon_closed - user << "\red You unlock the [src.name]!" + user << "You unlock \the [src]!" return else - user << "\red Access Denied" - else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken) - broken = 1 - locked = 0 - desc = "It appears to be broken." - icon_state = src.icon_broken - if(istype(W, /obj/item/weapon/melee/energy/blade)) + user << "Access Denied" + else if(istype(W, /obj/item/weapon/melee/energy/blade)) + if(emag_act(INFINITY, user, W, "The locker has been sliced open by [user] with an energy blade!", "You hear metal being sliced and sparks flying.")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(src.loc, "sparks", 50, 1) - for(var/mob/O in viewers(user, 3)) - O.show_message(text("\blue The locker has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) - else - for(var/mob/O in viewers(user, 3)) - O.show_message(text("\blue The locker has been broken by [] with an electromagnetic card!", user), 1, text("You hear a faint electrical spark."), 2) - if(!locked) ..() else - user << "\red Its locked!" + user << "It's locked!" return show_to(mob/user as mob) if(locked) - user << "\red Its locked!" + user << "It's locked!" else ..() return +/obj/item/weapon/storage/lockbox/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "") + if(!broken) + if(visual_feedback) + visual_feedback = "[visual_feedback]" + else + visual_feedback = "The locker has been sliced open by [user] with an electromagnetic card!" + if(audible_feedback) + audible_feedback = "[audible_feedback]" + else + audible_feedback = "You hear a faint electrical spark." + + broken = 1 + locked = 0 + desc = "It appears to be broken." + icon_state = src.icon_broken + visible_message(visual_feedback, audible_feedback) + return 1 /obj/item/weapon/storage/lockbox/loyalty name = "lockbox of loyalty implants" diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm index 6bd9495714f..e024e6ca5c8 100644 --- a/code/game/objects/items/weapons/storage/misc.dm +++ b/code/game/objects/items/weapons/storage/misc.dm @@ -15,7 +15,6 @@ icon = 'icons/obj/food.dmi' icon_state = "donutbox" name = "donut box" - storage_slots = 6 var/startswith = 6 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut) foldable = /obj/item/stack/material/cardboard @@ -31,9 +30,7 @@ overlays.Cut() var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/donut/D in contents) - var/image/img = image('icons/obj/food.dmi', D.overlay_state) - img.pixel_x = i * 3 - overlays += img + overlays += image('icons/obj/food.dmi', "[i][D.overlay_state]") i++ /obj/item/weapon/storage/box/donut/empty diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 1499c89d2ce..3950ea89093 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -33,42 +33,32 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(locked) - if ( (istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && (!src.emagged)) - emagged = 1 - src.overlays += image('icons/obj/storage.dmi', icon_sparking) - sleep(6) - src.overlays = null - overlays += image('icons/obj/storage.dmi', icon_locking) - locked = 0 - if(istype(W, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, src.loc) - spark_system.start() - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) - user << "You slice through the lock on [src]." - else - user << "You short out the lock on [src]." + if (istype(W, /obj/item/weapon/melee/energy/blade) && emag_act(INFINITY, user, "You slice through the lock of \the [src]")) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) return if (istype(W, /obj/item/weapon/screwdriver)) if (do_after(user, 20)) src.open =! src.open - user.show_message(text("\blue You [] the service panel.", (src.open ? "open" : "close"))) + user.show_message(text("You [] the service panel.", (src.open ? "open" : "close"))) return if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) - user.show_message(text("\red Now attempting to reset internal memory, please hold."), 1) + user.show_message("Now attempting to reset internal memory, please hold.", 1) src.l_hacking = 1 if (do_after(usr, 100)) if (prob(40)) src.l_setshort = 1 src.l_set = 0 - user.show_message(text("\red Internal memory reset. Please give it a few seconds to reinitialize."), 1) + user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1) sleep(80) src.l_setshort = 0 src.l_hacking = 0 else - user.show_message(text("\red Unable to reset internal memory."), 1) + user.show_message("Unable to reset internal memory.", 1) src.l_hacking = 0 else src.l_hacking = 0 return @@ -136,6 +126,17 @@ return return +/obj/item/weapon/storage/secure/emag_act(var/remaining_charges, var/mob/user, var/feedback) + if(!emagged) + emagged = 1 + src.overlays += image('icons/obj/storage.dmi', icon_sparking) + sleep(6) + src.overlays = null + overlays += image('icons/obj/storage.dmi', icon_locking) + locked = 0 + user << (feedback ? feedback : "You short out the lock of \the [src].") + return 1 + // ----------------------------- // Secure Briefcase // ----------------------------- @@ -150,14 +151,9 @@ throw_range = 4 w_class = 4.0 - New() - ..() - new /obj/item/weapon/paper(src) - new /obj/item/weapon/pen(src) - attack_hand(mob/user as mob) if ((src.loc == user) && (src.locked == 1)) - usr << "\red [src] is locked and cannot be opened!" + usr << "[src] is locked and cannot be opened!" else if ((src.loc == user) && (!src.locked)) src.open(usr) else @@ -168,42 +164,6 @@ src.add_fingerprint(user) return - //I consider this worthless but it isn't my code so whatever. Remove or uncomment. - /*attack(mob/M as mob, mob/living/user as mob) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red The [src] slips out of your hand and hits your head." - user.take_organ_damage(10) - user.Paralyse(2) - return - - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - - log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") - - var/t = user:zone_sel.selecting - if (t == "head") - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if (H.stat < 2 && H.health < 50 && prob(90)) - // ******* Check - if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80)) - H << "\red The helmet protects you from being hit hard in the head!" - return - var/time = rand(2, 6) - if (prob(75)) - H.Paralyse(time) - else - H.Stun(time) - if(H.stat != 2) H.stat = 1 - for(var/mob/O in viewers(H, null)) - O.show_message(text("\red [] has been knocked unconscious!", H), 1, "\red You hear someone fall.", 2) - else - H << text("\red [] tried to knock you unconcious!",user) - H.eye_blurry += 3 - - return*/ - // ----------------------------- // Secure Safe // ----------------------------- diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index a229bd12590..ff9193e0862 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -12,10 +12,16 @@ 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. + var/max_w_class = 3 //Max size of objects that this object can store (in effect only if can_hold isn't set) + var/max_storage_space = 8 //The sum of the storage costs of all the items in this storage item. + var/storage_slots = null //The number of storage slots in this container. var/obj/screen/storage/boxes = null + var/obj/screen/storage/storage_start = null //storage UI + var/obj/screen/storage/storage_continue = null + var/obj/screen/storage/storage_end = null + var/obj/screen/storage/stored_start = null + var/obj/screen/storage/stored_continue = null + var/obj/screen/storage/stored_end = null var/obj/screen/close/closer = null var/use_to_pickup //Set this to make it possible to use this item in an inverse way, so you can have the item in your hand and click items on the floor to pick them up. var/display_contents_with_number //Set this to make the storage item group contents of the same type and display them as a number. @@ -27,6 +33,12 @@ /obj/item/weapon/storage/Destroy() close_all() qdel(boxes) + qdel(src.storage_start) + qdel(src.storage_continue) + qdel(src.storage_end) + qdel(src.stored_start) + qdel(src.stored_continue) + qdel(src.stored_end) qdel(closer) ..() @@ -90,11 +102,19 @@ if(user.s_active) user.s_active.hide_from(user) user.client.screen -= src.boxes + user.client.screen -= src.storage_start + user.client.screen -= src.storage_continue + user.client.screen -= src.storage_end user.client.screen -= src.closer user.client.screen -= src.contents - user.client.screen += src.boxes user.client.screen += src.closer user.client.screen += src.contents + if(storage_slots) + user.client.screen += src.boxes + else + user.client.screen += src.storage_start + user.client.screen += src.storage_continue + user.client.screen += src.storage_end user.s_active = src is_seeing |= user return @@ -104,6 +124,9 @@ if(!user.client) return user.client.screen -= src.boxes + user.client.screen -= src.storage_start + user.client.screen -= src.storage_continue + user.client.screen -= src.storage_end user.client.screen -= src.closer user.client.screen -= src.contents if(user.s_active == src) @@ -155,7 +178,7 @@ return //This proc draws out the inventory and places the items on it. It uses the standard position. -/obj/item/weapon/storage/proc/standard_orient_objs(var/rows, var/cols, var/list/obj/item/display_contents) +/obj/item/weapon/storage/proc/slot_orient_objs(var/rows, var/cols, var/list/obj/item/display_contents) var/cx = 4 var/cy = 2+rows src.boxes.screen_loc = "4:16,2:16 to [4+cols]:16,[2+rows]:16" @@ -181,6 +204,51 @@ src.closer.screen_loc = "[4+cols+1]:16,2:16" return +/obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents) + + var/baseline_max_storage_space = 16 //should be equal to default backpack capacity + var/storage_cap_width = 2 //length of sprite for start and end of the box representing total storage space + var/stored_cap_width = 4 //length of sprite for start and end of the box representing the stored item + var/storage_width = min( round( 224 * max_storage_space/baseline_max_storage_space ,1) ,284) //length of sprite for the box representing total storage space + + storage_start.overlays.Cut() + + var/matrix/M = matrix() + M.Scale((storage_width-storage_cap_width*2+3)/32,1) + src.storage_continue.transform = M + + src.storage_start.screen_loc = "4:16,2:16" + src.storage_continue.screen_loc = "4:[storage_cap_width+(storage_width-storage_cap_width*2)/2+2],2:16" + src.storage_end.screen_loc = "4:[19+storage_width-storage_cap_width],2:16" + + var/startpoint = 0 + var/endpoint = 1 + + for(var/obj/item/O in contents) + startpoint = endpoint + 1 + endpoint += storage_width * O.get_storage_cost()/max_storage_space + + var/matrix/M_start = matrix() + var/matrix/M_continue = matrix() + var/matrix/M_end = matrix() + M_start.Translate(startpoint,0) + M_continue.Scale((endpoint-startpoint-stored_cap_width*2)/32,1) + M_continue.Translate(startpoint+stored_cap_width+(endpoint-startpoint-stored_cap_width*2)/2 - 16,0) + M_end.Translate(endpoint-stored_cap_width,0) + src.stored_start.transform = M_start + src.stored_continue.transform = M_continue + src.stored_end.transform = M_end + storage_start.overlays += src.stored_start + storage_start.overlays += src.stored_continue + storage_start.overlays += src.stored_end + + O.screen_loc = "4:[round((startpoint+endpoint)/2)+2],2:16" + O.maptext = "" + O.layer = 20 + + src.closer.screen_loc = "4:[storage_width+19],2:16" + return + /datum/numbered_display var/obj/item/sample_object var/number @@ -212,12 +280,14 @@ adjusted_contents++ numbered_contents.Add( new/datum/numbered_display(I) ) - //var/mob/living/carbon/human/H = user - var/row_num = 0 - var/col_count = min(7,storage_slots) -1 - if (adjusted_contents > 7) - row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. - src.standard_orient_objs(row_num, col_count, numbered_contents) + if(storage_slots == null) + src.space_orient_objs(numbered_contents) + else + var/row_num = 0 + var/col_count = min(7,storage_slots) -1 + if (adjusted_contents > 7) + row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. + src.slot_orient_objs(row_num, col_count, numbered_contents) return //This proc return 1 if the item can be picked up and 0 if it can't. @@ -225,13 +295,19 @@ /obj/item/weapon/storage/proc/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!istype(W)) return //Not an item + if(usr && usr.isEquipped(W) && !usr.canUnEquip(W)) + return 0 + if(src.loc == W) return 0 //Means the item is already in the storage item - if(contents.len >= storage_slots) + if(storage_slots != null && contents.len >= storage_slots) if(!stop_messages) usr << "[src] is full, make some space." return 0 //Storage item is full + if(W.anchored) + return 0 + if(can_hold.len) if(!is_type_in_list(W, can_hold)) if(!stop_messages && ! istype(W, /obj/item/weapon/hand_labeler)) @@ -248,9 +324,9 @@ usr << "[src] cannot hold [W]." return 0 - if (W.w_class > max_w_class) + if (max_w_class != null && W.w_class > max_w_class) if(!stop_messages) - usr << "[W] is too big for this [src]." + usr << "[W] is too long for this [src]." return 0 var/total_storage_space = W.get_storage_cost() @@ -259,7 +335,7 @@ if(total_storage_space > max_storage_space) if(!stop_messages) - usr << "[src] is full, make some space." + usr << "[src] is too full, make some space." return 0 if(W.w_class >= src.w_class && (istype(W, /obj/item/weapon/storage))) @@ -290,9 +366,9 @@ if (M == usr) usr << "You put \the [W] into [src]." else if (M in range(1)) //If someone is standing close enough, they can tell what it is... - M.show_message("[usr] puts [W] into [src].") + M.show_message("\The [usr] puts [W] into [src].") else if (W && W.w_class >= 3) //Otherwise they can only see large or normal items from a distance... - M.show_message("[usr] puts [W] into [src].") + M.show_message("\The [usr] puts [W] into [src].") src.orient2hud(usr) if(usr.s_active) @@ -341,6 +417,21 @@ if(isrobot(user)) return //Robots can't interact with storage items. + if(istype(W, /obj/item/device/lightreplacer)) + var/obj/item/device/lightreplacer/LP = W + var/amt_inserted = 0 + var/turf/T = get_turf(user) + for(var/obj/item/weapon/light/L in src.contents) + if(L.status == 0) + if(LP.uses < LP.max_uses) + LP.AddUses(1) + amt_inserted++ + remove_from_storage(L, T) + qdel(L) + if(amt_inserted) + user << "You inserted [amt_inserted] light\s into \the [LP.name]. You have [LP.uses] light\s remaining." + return + if(!can_be_inserted(W)) return @@ -404,7 +495,7 @@ remove_from_storage(I, T) /obj/item/weapon/storage/New() - + ..() if(allow_quick_empty) verbs += /obj/item/weapon/storage/verb/quick_empty else @@ -415,18 +506,53 @@ else verbs -= /obj/item/weapon/storage/verb/toggle_gathering_mode + spawn(5) + var/total_storage_space = 0 + for(var/obj/item/I in contents) + total_storage_space += I.get_storage_cost() + max_storage_space = max(total_storage_space,max_storage_space) //prevents spawned containers from being too small for their contents + src.boxes = new /obj/screen/storage( ) src.boxes.name = "storage" src.boxes.master = src src.boxes.icon_state = "block" src.boxes.screen_loc = "7,7 to 10,8" src.boxes.layer = 19 + + src.storage_start = new /obj/screen/storage( ) + src.storage_start.name = "storage" + src.storage_start.master = src + src.storage_start.icon_state = "storage_start" + src.storage_start.screen_loc = "7,7 to 10,8" + src.storage_start.layer = 19 + src.storage_continue = new /obj/screen/storage( ) + src.storage_continue.name = "storage" + src.storage_continue.master = src + src.storage_continue.icon_state = "storage_continue" + src.storage_continue.screen_loc = "7,7 to 10,8" + src.storage_continue.layer = 19 + src.storage_end = new /obj/screen/storage( ) + src.storage_end.name = "storage" + src.storage_end.master = src + src.storage_end.icon_state = "storage_end" + src.storage_end.screen_loc = "7,7 to 10,8" + src.storage_end.layer = 19 + + src.stored_start = new /obj //we just need these to hold the icon + src.stored_start.icon_state = "stored_start" + src.stored_start.layer = 19 + src.stored_continue = new /obj + src.stored_continue.icon_state = "stored_continue" + src.stored_continue.layer = 19 + src.stored_end = new /obj + src.stored_end.icon_state = "stored_end" + src.stored_end.layer = 19 + src.closer = new /obj/screen/close( ) src.closer.master = src src.closer.icon_state = "x" src.closer.layer = 20 orient2hud() - return /obj/item/weapon/storage/emp_act(severity) if(!istype(src.loc, /mob/living)) @@ -441,12 +567,6 @@ src.quick_empty() return 1 -/obj/item/weapon/storage/hear_talk(mob/M as mob, text, verb, datum/language/speaking) - for (var/atom/A in src) - if(istype(A,/obj/)) - var/obj/O = A - O.hear_talk(M, text, verb, speaking) - /obj/item/weapon/storage/proc/make_exact_fit() storage_slots = contents.len @@ -505,4 +625,20 @@ return depth /obj/item/proc/get_storage_cost() - return 2**(w_class-1) //1,2,4,8,16,... + if (storage_cost) + return storage_cost + else + if(w_class == 1) + return 1 + if(w_class == 2) + return 2 + if(w_class == 3) + return 4 + if(w_class == 4) + return 8 + if(w_class == 5) + return 16 + else + return 1000 + + //return 2**(w_class-1) //1,2,4,8,16,... diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 543286bdde5..c558b933601 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -11,8 +11,8 @@ throw_range = 7 w_class = 4 max_w_class = 3 - max_storage_space = 14 //can hold 7 w_class-2 items or up to 3 w_class-3 items (with 1 w_class-2 item as change). - origin_tech = "combat=1" + max_storage_space = 14 //enough to hold all starting contents + origin_tech = list(TECH_COMBAT = 1) attack_verb = list("robusted") var/stunhit = 0 @@ -72,17 +72,16 @@ name = "suspicious looking toolbox" icon_state = "syndicate" item_state = "toolbox_syndi" - origin_tech = "combat=1;syndicate=1" + origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1) force = 7.0 New() ..() - var/color = pick("red","yellow","green","blue","pink","orange","cyan","white") + new /obj/item/clothing/gloves/yellow(src) new /obj/item/weapon/screwdriver(src) new /obj/item/weapon/wrench(src) new /obj/item/weapon/weldingtool(src) new /obj/item/weapon/crowbar(src) - new /obj/item/stack/cable_coil(src,30,color) new /obj/item/weapon/wirecutters(src) new /obj/item/device/multitool(src) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index b33d72f6fbc..fcd5693d76d 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -127,7 +127,6 @@ /obj/item/weapon/storage/box/syndie_kit/chameleon name = "chameleon kit" desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold seperately." - storage_slots = 10 /obj/item/weapon/storage/box/syndie_kit/chameleon/New() ..() @@ -139,8 +138,7 @@ new /obj/item/clothing/gloves/chameleon(src) new /obj/item/clothing/mask/chameleon(src) new /obj/item/clothing/glasses/chameleon(src) - new /obj/item/weapon/gun/projectile/chameleon(src) - new /obj/item/ammo_magazine/chameleon(src) + new /obj/item/weapon/gun/energy/chameleon(src) /obj/item/weapon/storage/box/syndie_kit/clerical name = "clerical kit" @@ -235,3 +233,26 @@ ..() new /obj/item/rig_module/electrowarfare_suite(src) new /obj/item/rig_module/voice(src) + + +/obj/item/weapon/storage/secure/briefcase/money + name = "suspicious briefcase" + desc = "An ominous briefcase that has the unmistakeable smell of old, stale, cigarette smoke, and gives those who look at it a bad feeling." + + + + +/obj/item/weapon/storage/secure/briefcase/money/New() + ..() + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + new /obj/item/weapon/spacecash/c1000(src) + + diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 84c0fdfbb8c..c64ab5a1ec8 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -10,7 +10,7 @@ edge = 0 throwforce = 7 w_class = 3 - origin_tech = "combat=2" + origin_tech = list(TECH_COMBAT = 2) attack_verb = list("beaten") var/stunforce = 0 var/agonyforce = 120 @@ -19,10 +19,6 @@ var/hitcost = 1000 //oh god why do power cells carry so much charge? We probably need to make a distinction between "industrial" sized power cells for APCs and power cells for everything else. var/baton_color = "#FF6A00" -/obj/item/weapon/melee/baton/suicide_act(mob/user) - user.visible_message("[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.") - return (FIRELOSS) - /obj/item/weapon/melee/baton/New() ..() update_icon() @@ -103,74 +99,65 @@ user << "[src] is out of charge." add_fingerprint(user) - /obj/item/weapon/melee/baton/attack(mob/M, mob/user) + if(status && (CLUMSY in user.mutations) && prob(50)) + user << "You accidentally hit yourself with the [src]!" + user.Weaken(30) + deductcharge(hitcost) + return + return ..() + +/obj/item/weapon/melee/baton/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) if(status && (CLUMSY in user.mutations) && prob(50)) user << "span class='danger'>You accidentally hit yourself with the [src]!" user.Weaken(30) deductcharge(hitcost) return - if(isrobot(M)) - ..() - return + if(isrobot(target)) + return ..() var/agony = agonyforce var/stun = stunforce - var/mob/living/L = M + var/obj/item/organ/external/affecting = null + if(ishuman(target)) + var/mob/living/carbon/human/H = target + affecting = H.get_organ(hit_zone) - var/target_zone = check_zone(user.zone_sel.selecting) if(user.a_intent == I_HURT) - if (!..()) //item/attack() does it's own messaging and logs - return 0 // item/attack() will return 1 if they hit, 0 if they missed. + . = ..() + //whacking someone causes a much poorer electrical contact than deliberately prodding them. + agony *= 0.5 stun *= 0.5 if(status) //Checks to see if the stunbaton is on. agony *= 0.5 //whacking someone causes a much poorer contact than prodding them. else agony = 0 //we can't really extract the actual hit zone from ..(), unfortunately. Just act like they attacked the area they intended to. - else - //copied from human_defense.dm - human defence code should really be refactored some time. - if (ishuman(L)) - user.lastattacked = L //are these used at all, if we have logs? - L.lastattacker = user - - if (user != L) // Attacking yourself can't miss - target_zone = get_zone_with_miss_chance(user.zone_sel.selecting, L) - - if(!target_zone) - L.visible_message("\red [user] misses [L] with \the [src]!") - return 0 - - var/mob/living/carbon/human/H = L - var/obj/item/organ/external/affecting = H.get_organ(target_zone) - if (affecting) - if(!status) - L.visible_message("[L] has been prodded in the [affecting.name] with [src] by [user]. Luckily it was off.") - return 1 - else - H.visible_message("[L] has been prodded in the [affecting.name] with [src] by [user]!") + else if(!status) + if(affecting) + target.visible_message("[target] has been prodded in the [affecting.name] with [src] by [user]. Luckily it was off.") else - if(!status) - L.visible_message("[L] has been prodded with [src] by [user]. Luckily it was off.") - return 1 - else - L.visible_message("[L] has been prodded with [src] by [user]!") + target.visible_message("[target] has been prodded with [src] by [user]. Luckily it was off.") + else + if(affecting) + target.visible_message("[target] has been prodded in the [affecting.name] with [src] by [user]!") + else + target.visible_message("[target] has been prodded with [src] by [user]!") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) //stun effects - L.stun_effect_act(stun, agony, target_zone, src) + target.stun_effect_act(stun, agony, hit_zone, src) playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - msg_admin_attack("[key_name(user)] stunned [key_name(L)] with the [src] (
      JMP)") - + msg_admin_attack("[key_name(user)] stunned [key_name(target)] with the [src] (JMP)") + if(status) deductcharge(hitcost) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.forcesay(hit_appends) - - return 1 + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.forcesay(hit_appends) /obj/item/weapon/melee/baton/emp_act(severity) if(bcell) @@ -202,7 +189,7 @@ attack_verb = list("poked") slot_flags = null baton_color = "#FFDF00" - + /obj/item/weapon/melee/baton/stunrod name = "stunrod" desc = "A more-than-lethal weapon used to deal with high threat situations." diff --git a/code/game/objects/items/weapons/surgery_limbattachment.dm b/code/game/objects/items/weapons/surgery_limbattachment.dm new file mode 100644 index 00000000000..4ba10524f2b --- /dev/null +++ b/code/game/objects/items/weapons/surgery_limbattachment.dm @@ -0,0 +1,71 @@ +/obj/item/robot_parts/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob) + var/limbloc = null + + if(!istype(M)) + return ..() + + if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66)))) + return ..() + + if(!istype(M, /mob/living/carbon/human)) + return ..() + + if((user.zone_sel.selecting == "l_arm") && (istype(src, /obj/item/robot_parts/l_arm))) + limbloc = "l_hand" + else if((user.zone_sel.selecting == "r_arm") && (istype(src, /obj/item/robot_parts/r_arm))) + limbloc = "r_hand" + else if((user.zone_sel.selecting == "r_leg") && (istype(src, /obj/item/robot_parts/r_leg))) + limbloc = "r_foot" + else if((user.zone_sel.selecting == "l_leg") && (istype(src, /obj/item/robot_parts/l_leg))) + limbloc = "l_foot" + else + user << "That doesn't fit there!" + return ..() + + var/mob/living/carbon/human/H = M + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(S.status & ORGAN_DESTROYED) + if(!(S.status & ORGAN_ATTACHABLE)) + user << "The wound is not ready for a replacement!" + return 0 + if(M != user) + M.visible_message( \ + "\The [user] is beginning to attach \the [src] where [H]'s [S.display_name] used to be.", \ + "\The [user] begins to attach \the [src] where your [S.display_name] used to be.") + else + M.visible_message( \ + "\The [user] begins to attach a robotic limb where \his [S.display_name] used to be with [src].", \ + "You begin to attach \the [src] where your [S.display_name] used to be.") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\The [user] finishes attaching [H]'s new [S.display_name].", \ + "\The [user] finishes attaching your new [S.display_name].") + else + M.visible_message( \ + "\The [user] finishes attaching \his new [S.display_name].", \ + "You finish attaching your new [S.display_name].") + + if(H == user && prob(25)) + user << "You mess up!" + S.take_damage(15) + + S.status &= ~ORGAN_BROKEN + S.status &= ~ORGAN_SPLINTED + S.status &= ~ORGAN_ATTACHABLE + S.status &= ~ORGAN_DESTROYED + S.status |= ORGAN_ROBOT + var/datum/organ/external/T = H.organs["[limbloc]"] + T.status &= ~ORGAN_BROKEN + T.status &= ~ORGAN_SPLINTED + T.status &= ~ORGAN_ATTACHABLE + T.status &= ~ORGAN_DESTROYED + T.status |= ORGAN_ROBOT + H.update_body() + M.updatehealth() + M.UpdateDamageIcon() + qdel(src) + + return 1 + return 0 diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 786b90329a9..a549e9f74a1 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -19,7 +19,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 5000) flags = CONDUCT w_class = 2.0 - origin_tech = "materials=1;biotech=1" + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) /* * Hemostat @@ -32,7 +32,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) flags = CONDUCT w_class = 2.0 - origin_tech = "materials=1;biotech=1" + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) attack_verb = list("attacked", "pinched") /* @@ -46,7 +46,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) flags = CONDUCT w_class = 2.0 - origin_tech = "materials=1;biotech=1" + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) attack_verb = list("burnt") /* @@ -62,14 +62,9 @@ flags = CONDUCT force = 15.0 w_class = 3 - origin_tech = "materials=1;biotech=1" + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) attack_verb = list("drilled") - suicide_act(mob/user) - viewers(user) << pick("\red [user] is pressing the [src.name] to \his temple and activating it! It looks like \he's trying to commit suicide.", \ - "\red [user] is pressing [src.name] to \his chest and activating it! It looks like \he's trying to commit suicide.") - return (BRUTELOSS) - /* * Scalpel */ @@ -87,16 +82,10 @@ throwforce = 5.0 throw_speed = 3 throw_range = 5 + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) matter = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 5000) - origin_tech = "materials=1;biotech=1" attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - suicide_act(mob/user) - viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ - "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ - "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") - return (BRUTELOSS) - /* * Researchable Scalpels */ @@ -141,8 +130,8 @@ throwforce = 9.0 throw_speed = 3 throw_range = 5 + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) matter = list(DEFAULT_WALL_MATERIAL = 20000,"glass" = 10000) - origin_tech = "materials=1;biotech=1" attack_verb = list("attacked", "slashed", "sawed", "cut") sharp = 1 edge = 1 @@ -162,7 +151,7 @@ icon_state = "fixovein" force = 0 throwforce = 1.0 - origin_tech = "materials=1;biotech=3" + origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 3) w_class = 2.0 var/usage_amount = 10 diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 2b21e0ea8f8..888dba02b99 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -1,6 +1,5 @@ /* Weapons * Contains: - * Banhammer * Sword * Classic Baton */ @@ -27,7 +26,7 @@ /obj/item/weapon/melee/classic_baton/attack(mob/M as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) - user << "\red You club yourself over the head." + user << "You club yourself over the head." user.Weaken(3 * force) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -35,33 +34,7 @@ else user.take_organ_damage(2*force) return -/*this is already called in ..() - src.add_fingerprint(user) - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - - log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") -*/ - if (user.a_intent == I_HURT) - if(!..()) return - //playsound(src.loc, "swing_hit", 50, 1, -1) - if (M.stuttering < 8 && (!(HULK in M.mutations)) /*&& (!istype(H:wear_suit, /obj/item/clothing/suit/judgerobe))*/) - M.stuttering = 8 - M.Stun(8) - M.Weaken(8) - for(var/mob/O in viewers(M)) - if (O.client) O.show_message("\red [M] has been beaten with \the [src] by [user]!", 1, "\red You hear someone fall", 2) - else - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1, -1) - M.Stun(5) - M.Weaken(5) - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - msg_admin_attack("[key_name(user)] attacked [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") - src.add_fingerprint(user) - - for(var/mob/O in viewers(M)) - if (O.client) O.show_message("\red [M] has been stunned with \the [src] by [user]!", 1, "\red You hear someone fall", 2) + return ..() //Telescopic baton /obj/item/weapon/melee/telebaton @@ -79,8 +52,8 @@ /obj/item/weapon/melee/telebaton/attack_self(mob/user as mob) on = !on if(on) - user.visible_message("\red With a flick of their wrist, [user] extends their telescopic baton.",\ - "\red You extend the baton.",\ + user.visible_message("With a flick of their wrist, [user] extends their telescopic baton.",\ + "You extend the baton.",\ "You hear an ominous click.") icon_state = "telebaton_1" item_state = "nullrod" @@ -88,8 +61,8 @@ force = 15//quite robust attack_verb = list("smacked", "struck", "slapped") else - user.visible_message("\blue [user] collapses their telescopic baton.",\ - "\blue You collapse the baton.",\ + user.visible_message("\The [user] collapses their telescopic baton.",\ + "You collapse the baton.",\ "You hear a click.") icon_state = "telebaton_0" item_state = "telebaton_0" @@ -120,7 +93,7 @@ /obj/item/weapon/melee/telebaton/attack(mob/target as mob, mob/living/user as mob) if(on) if ((CLUMSY in user.mutations) && prob(50)) - user << "\red You club yourself over the head." + user << "You club yourself over the head." user.Weaken(3 * force) if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index a0af746ab4c..a5d5db02ad8 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -71,12 +71,12 @@ pr_open = 1 switch(alert(user, "What would you like to do?", "Lighter", "Press the button.", "Close the lighter.")) if("Press the button.") - user << "\red You press the button." + user << "You press the button." flick("c-4detonator_click", src) if(src.bomb) src.bomb.detonate() - log_admin("[user.real_name]([user.ckey]) has triggered [src.bomb] with [src].") - message_admins("\red [user.real_name]([user.ckey]) has triggered [src.bomb] with [src].") + log_admin("[key_name(user)] has triggered [src.bomb] with [src].") + message_admins("[key_name_admin(user)] has triggered [src.bomb] with [src].") if("Close the lighter.") src.icon_state = "c-4detonator_0" diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 5d2d05c64a3..97fc3c117aa 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -4,6 +4,7 @@ name = "jetpack (empty)" desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution." icon_state = "jetpack" + gauge_icon = null w_class = 4.0 item_state = "jetpack" distribute_pressure = ONE_ATMOSPHERE*O2STANDARD @@ -11,7 +12,7 @@ var/on = 0.0 var/stabilization_on = 0 var/volume_rate = 500 //Needed for borg jetpack transfer - icon_action_button = "action_jetpack" + action_button_name = "Toggle Jetpack" /obj/item/weapon/tank/jetpack/New() ..() @@ -49,6 +50,7 @@ if (ismob(usr)) var/mob/M = usr M.update_inv_back() + M.update_action_buttons() usr << "You toggle the thrusters [on? "on":"off"]." diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index a43d49a39c9..2940ef02689 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -25,7 +25,7 @@ examine(mob/user) if(..(user, 0) && air_contents.gas["oxygen"] < 10) - user << text("\red The meter on the [src.name] indicates you are almost out of oxygen!") + user << text("The meter on \the [src] indicates you are almost out of oxygen!") //playsound(usr, 'sound/effects/alert.ogg', 50, 1) @@ -67,7 +67,7 @@ examine(mob/user) if(..(user, 0) && air_contents.gas["oxygen"] < 1 && loc==user) - user << "\red The meter on the [src.name] indicates you are almost out of air!" + user << "The meter on the [src.name] indicates you are almost out of air!" user << sound('sound/effects/alert.ogg') /obj/item/weapon/tank/air/New() @@ -85,6 +85,7 @@ name = "phoron tank" desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable." icon_state = "phoron" + gauge_icon = null flags = CONDUCT slot_flags = null //they have no straps! @@ -114,6 +115,8 @@ name = "emergency oxygen tank" desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." icon_state = "emergency" + gauge_icon = "indicator_emergency" + gauge_cap = 4 flags = CONDUCT slot_flags = SLOT_BELT w_class = 2.0 @@ -131,7 +134,7 @@ examine(mob/user) if(..(user, 0) && air_contents.gas["oxygen"] < 0.2 && loc==user) - user << text("\red The meter on the [src.name] indicates you are almost out of air!") + user << text("The meter on the [src.name] indicates you are almost out of air!") user << sound('sound/effects/alert.ogg') /obj/item/weapon/tank/emergency_oxygen/engi @@ -142,12 +145,15 @@ /obj/item/weapon/tank/emergency_oxygen/double name = "double emergency oxygen tank" icon_state = "emergency_double" + gauge_icon = "indicator_emergency_double" volume = 10 /obj/item/weapon/tank/emergency_nitrogen name = "emergency nitrogen tank" desc = "An emergency air tank hastily painted red and issued to Vox crewmembers." icon_state = "emergency_nitro" + gauge_icon = "indicator_emergency" + gauge_cap = 4 flags = CONDUCT slot_flags = SLOT_BELT w_class = 2.0 @@ -164,7 +170,7 @@ examine(mob/user) if(..(user, 0) && air_contents.gas["nitrogen"] < 0.2 && loc==user) - user << text("\red The meter on the [src.name] indicates you are almost out of air!") + user << text("The meter on \the [src] indicates you are almost out of air!") user << sound('sound/effects/alert.ogg') /* @@ -185,5 +191,5 @@ /obj/item/weapon/tank/nitrogen/examine(mob/user) if(..(user, 0) && air_contents.gas["nitrogen"] < 10) - user << text("\red The meter on the [src.name] indicates you are almost out of nitrogen!") + user << text("The meter on \the [src] indicates you are almost out of nitrogen!") //playsound(user, 'sound/effects/alert.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index dec27ed60ad..8604d17f15d 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -1,20 +1,30 @@ #define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE) #define TANK_DEFAULT_RELEASE_PRESSURE 24 +#define TANK_IDEAL_PRESSURE 1015 //Arbitrary. + +var/list/global/tank_gauge_cache = list() /obj/item/weapon/tank name = "tank" icon = 'icons/obj/tank.dmi' + + var/gauge_icon = "indicator_tank" + var/last_gauge_pressure + var/gauge_cap = 6 + flags = CONDUCT slot_flags = SLOT_BACK w_class = 3 - pressure_resistance = ONE_ATMOSPHERE*5 - force = 5.0 throwforce = 10.0 throw_speed = 1 throw_range = 4 + sprite_sheets = list( + "Resomi" = 'icons/mob/species/resomi/back.dmi' + ) + var/datum/gas_mixture/air_contents = null var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 @@ -27,8 +37,8 @@ src.air_contents = new /datum/gas_mixture() src.air_contents.volume = volume //liters src.air_contents.temperature = T20C - processing_objects.Add(src) + update_gauge() return /obj/item/weapon/tank/Destroy() @@ -36,7 +46,7 @@ qdel(air_contents) processing_objects.Remove(src) - + if(istype(loc, /obj/item/device/transfer_valve)) var/obj/item/device/transfer_valve/TTV = loc TTV.remove_tank(src) @@ -63,41 +73,14 @@ descriptive = "cold" user << "\The [src] feels [descriptive]." -/obj/item/weapon/tank/blob_act() - if(prob(50)) - var/turf/location = src.loc - if (!( istype(location, /turf) )) - qdel(src) - - if(src.air_contents) - location.assume_air(air_contents) - - qdel(src) - /obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() - var/obj/icon = src - if (istype(src.loc, /obj/item/assembly)) icon = src.loc if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) - for (var/mob/O in viewers(user, null)) - O << "\red [user] has used [W] on \icon[icon] [src]" - - var/pressure = air_contents.return_pressure() - manipulated_by = user.real_name //This person is aware of the contents of the tank. - var/total_moles = air_contents.total_moles - - user << "\blue Results of analysis of \icon[icon]" - if (total_moles>0) - user << "\blue Pressure: [round(pressure,0.1)] kPa" - for(var/g in air_contents.gas) - user << "\blue [gas_data.name[g]]: [(round(air_contents.gas[g] / total_moles) * 100)]%" - user << "\blue Temperature: [round(air_contents.temperature-T0C)]°C" - else - user << "\blue Tank is empty!" - src.add_fingerprint(user) + var/obj/item/device/analyzer/A = W + A.analyze_gases(src, user) else if (istype(W,/obj/item/latexballon)) var/obj/item/latexballon/LB = W LB.blow(src) @@ -120,7 +103,7 @@ location = loc.loc else if(istype(loc, /mob/living/carbon)) location = loc - + var/using_internal if(istype(location)) if(location.internal==src) @@ -149,11 +132,11 @@ mask_check = 1 if(mask_check) - if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) + if(location.wear_mask && (location.wear_mask.item_flags & AIRTIGHT)) data["maskConnected"] = 1 else if(istype(location, /mob/living/carbon/human)) var/mob/living/carbon/human/H = location - if(H.head && (H.head.flags & AIRTIGHT)) + if(H.head && (H.head.item_flags & AIRTIGHT)) data["maskConnected"] = 1 // update the ui if it exists, returns null if no ui is passed/found @@ -191,26 +174,26 @@ if(location.internal == src) location.internal = null location.internals.icon_state = "internal0" - usr << "\blue You close the tank release valve." + usr << "You close the tank release valve." if (location.internals) location.internals.icon_state = "internal0" else var/can_open_valve - if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) + if(location.wear_mask && (location.wear_mask.item_flags & AIRTIGHT)) can_open_valve = 1 else if(istype(location,/mob/living/carbon/human)) var/mob/living/carbon/human/H = location - if(H.head && (H.head.flags & AIRTIGHT)) + if(H.head && (H.head.item_flags & AIRTIGHT)) can_open_valve = 1 if(can_open_valve) location.internal = src - usr << "\blue You open \the [src] valve." + usr << "You open \the [src] valve." if (location.internals) location.internals.icon_state = "internal1" else - usr << "\blue You need something to connect to \the [src]." + usr << "You need something to connect to \the [src]." src.add_fingerprint(usr) return 1 @@ -243,8 +226,28 @@ /obj/item/weapon/tank/process() //Allow for reactions air_contents.react() //cooking up air tanks - add phoron and oxygen, then heat above PHORON_MINIMUM_BURN_TEMPERATURE + if(gauge_icon) + update_gauge() check_status() +/obj/item/weapon/tank/proc/update_gauge() + var/gauge_pressure = 0 + if(air_contents) + gauge_pressure = air_contents.return_pressure() + if(gauge_pressure > TANK_IDEAL_PRESSURE) + gauge_pressure = -1 + else + gauge_pressure = round((gauge_pressure/TANK_IDEAL_PRESSURE)*gauge_cap) + + if(gauge_pressure == last_gauge_pressure) + return + + last_gauge_pressure = gauge_pressure + overlays.Cut() + var/indicator = "[gauge_icon][(gauge_pressure == -1) ? "overload" : gauge_pressure]" + if(!tank_gauge_cache[indicator]) + tank_gauge_cache[indicator] = image(icon, indicator) + overlays += tank_gauge_cache[indicator] /obj/item/weapon/tank/proc/check_status() //Handle exploding, leaking, and rupturing of the tank @@ -267,19 +270,19 @@ var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE explosion( - get_turf(loc), - round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)), - round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)), - round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)), - round(min(BOMBCAP_FLASH_RADIUS, range*1.50)), + get_turf(loc), + round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)), + round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)), + round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)), + round(min(BOMBCAP_FLASH_RADIUS, range*1.50)), ) qdel(src) else if(pressure > TANK_RUPTURE_PRESSURE) #ifdef FIREDBG - log_debug("\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]") + log_debug("[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]") #endif - + if(integrity <= 0) var/turf/simulated/T = get_turf(src) if(!T) @@ -292,9 +295,9 @@ else if(pressure > TANK_LEAK_PRESSURE) #ifdef FIREDBG - log_debug("\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]") + log_debug("[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]") #endif - + if(integrity <= 0) var/turf/simulated/T = get_turf(src) if(!T) diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 911a6334d25..04c0a5fbfea 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -5,18 +5,71 @@ icon_state = "taperoll" w_class = 1 -/* -- Disabled for now until it has a use -- -/obj/item/weapon/tape_roll/attack_self(mob/user as mob) - user << "You remove a length of tape from [src]." - - var/obj/item/weapon/ducttape/tape = new() - user.put_in_hands(tape) -*/ +/obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user) + if(istype(H)) + if(user.zone_sel.selecting == "eyes") + + if(!H.organs_by_name["head"]) + user << "\The [H] doesn't have a head." + return + if(!H.has_eyes()) + user << "\The [H] doesn't have any eyes." + return + if(H.glasses) + user << "\The [H] is already wearing somethign on their eyes." + return + if(H.head && (H.head.body_parts_covered & FACE)) + user << "Remove their [H.head] first." + return + user.visible_message("\The [user] begins taping over \the [H]'s eyes!") + + if(!do_after(user, 30)) + return + + // Repeat failure checks. + if(!H || !src || !H.organs_by_name["head"] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE))) + return + + user.visible_message("\The [user] has taped up \the [H]'s eyes!") + H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses) + + else if(user.zone_sel.selecting == "mouth" || user.zone_sel.selecting == "head") + if(!H.organs_by_name["head"]) + user << "\The [H] doesn't have a head." + return + if(!H.check_has_mouth()) + user << "\The [H] doesn't have a mouth." + return + if(H.wear_mask) + user << "\The [H] is already wearing a mask." + return + if(H.head && (H.head.body_parts_covered & FACE)) + user << "Remove their [H.head] first." + return + user.visible_message("\The [user] begins taping up \the [H]'s mouth!") + + if(!do_after(user, 30)) + return + + // Repeat failure checks. + if(!H || !src || !H.organs_by_name["head"] || !H.check_has_mouth() || H.wear_mask || (H.head && (H.head.body_parts_covered & FACE))) + return + + user.visible_message("\The [user] has taped up \the [H]'s mouth!") + H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask) + + else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand") + var/obj/item/weapon/handcuffs/cable/tape/T = new(user) + if(!T.place_handcuffs(H, user)) + user.unEquip(T) + qdel(T) + else + return ..() + return 1 /obj/item/weapon/tape_roll/proc/stick(var/obj/item/weapon/W, mob/user) if(!istype(W, /obj/item/weapon/paper)) return - user.drop_from_inventory(W) var/obj/item/weapon/ducttape/tape = new(get_turf(src)) tape.attach(W) @@ -52,7 +105,7 @@ return user << "You remove \the [initial(name)] from [stuck]." - + user.drop_from_inventory(src) stuck.forceMove(get_turf(src)) user.put_in_hands(stuck) @@ -61,6 +114,7 @@ qdel(src) /obj/item/weapon/ducttape/afterattack(var/A, mob/user, flag, params) + if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck) return diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 996be52663a..fdad2423fcb 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -21,8 +21,8 @@ item_state = "electronic" throw_speed = 4 throw_range = 20 - matter = list(DEFAULT_WALL_MATERIAL = 400) - origin_tech = "magnets=1" + origin_tech = list(TECH_MAGNET = 1) + matter = list(DEFAULT_WALL_MATERIAL = 400) /obj/item/weapon/locator/attack_self(mob/user as mob) user.set_machine(src) @@ -132,8 +132,8 @@ Frequency: w_class = 2.0 throw_speed = 3 throw_range = 5 - matter = list(DEFAULT_WALL_MATERIAL = 10000) - origin_tech = "magnets=1;bluespace=3" + origin_tech = list(TECH_MAGNET = 1, TECH_BLUESPACE = 3) + matter = list(DEFAULT_WALL_MATERIAL = 10000) /obj/item/weapon/hand_tele/attack_self(mob/user as mob) var/turf/current_location = get_turf(user)//What turf is the user on? diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index ff73999815b..32285851bdc 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -24,8 +24,8 @@ force = 5.0 throwforce = 7.0 w_class = 2.0 + origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 150) - origin_tech = "materials=1;engineering=1" attack_verb = list("bashed", "battered", "bludgeoned", "whacked") @@ -47,11 +47,6 @@ matter = list(DEFAULT_WALL_MATERIAL = 75) attack_verb = list("stabbed") - suicide_act(mob/user) - viewers(user) << pick("\red [user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.", \ - "\red [user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide.") - return(BRUTELOSS) - /obj/item/weapon/screwdriver/New() switch(pick("red","blue","purple","brown","green","cyan","yellow")) if ("red") @@ -78,10 +73,11 @@ if (prob(75)) src.pixel_y = rand(0, 16) - return + ..() /obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) return ..() + if(!istype(M) || user.a_intent == "help") + return ..() if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head") return ..() if((CLUMSY in user.mutations) && prob(50)) @@ -102,8 +98,8 @@ throw_speed = 2 throw_range = 9 w_class = 2.0 + origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 80) - origin_tech = "materials=1;engineering=1" attack_verb = list("pinched", "nipped") sharp = 1 edge = 1 @@ -112,9 +108,10 @@ if(prob(50)) icon_state = "cutters-y" item_state = "cutters_yellow" + ..() /obj/item/weapon/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob) - if((C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/handcuffs/cable))) + if(user.a_intent == I_HELP && (C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/handcuffs/cable))) usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\ "You cut \the [C]'s restraints with \the [src]!",\ "You hear cable being cut.") @@ -156,7 +153,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 30) //R&D tech level - origin_tech = "engineering=1" + origin_tech = list(TECH_ENGINEERING = 1) //Welding tool specific stuff var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) @@ -214,7 +211,7 @@ R.my_atom = src R.add_reagent("fuel", max_fuel) update_icon() - return + ..() /obj/item/weapon/weldingtool/update_icon() ..() @@ -229,7 +226,7 @@ /obj/item/weapon/weldingtool/Destroy() if(welding) processing_objects -= src - ..() + return ..() /obj/item/weapon/weldingtool/examine(mob/user) if(..(user, 0)) @@ -292,7 +289,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 5) -/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob) +/obj/item/weapon/weldingtool/attack(mob/living/M as mob, mob/user as mob) if(hasorgans(M)) @@ -302,12 +299,9 @@ if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP) return ..() - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - if(M == user) - user << "You can't repair damage to your own body - it's against OH&S." - return + if(M.isSynthetic() && M == user) + user << "You can't repair damage to your own body - it's against OH&S." + return if(S.brute_dam == 0) // Organ undamaged user << "Nothing to fix here!" @@ -449,44 +443,42 @@ //Note: This should probably be moved to mob /obj/item/weapon/weldingtool/proc/eyecheck(mob/user as mob) if(!iscarbon(user)) return 1 - var/safety = user:eyecheck() if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] if(!E) return - if(H.species.flags & IS_SYNTHETIC) - return + var/safety = H.eyecheck() switch(safety) - if(1) - usr << "\red Your eyes sting a little." + if(FLASH_PROTECTION_MODERATE) + usr << "Your eyes sting a little." E.damage += rand(1, 2) if(E.damage > 12) user.eye_blurry += rand(3,6) - if(0) - usr << "\red Your eyes burn." + if(FLASH_PROTECTION_NONE) + usr << "Your eyes burn." E.damage += rand(2, 4) if(E.damage > 10) E.damage += rand(4,10) - if(-1) - usr << "\red Your thermals intensify the welder's glow. Your eyes itch and burn severely." + if(FLASH_PROTECTION_REDUCED) + usr << "Your equipment intensify the welder's glow. Your eyes itch and burn severely." user.eye_blurry += rand(12,20) E.damage += rand(12, 16) - if(safety<2) - + if(safety 10) - user << "\red Your eyes are really starting to hurt. This can't be good for you!" + user << "Your eyes are really starting to hurt. This can't be good for you!" if (E.damage >= E.min_broken_damage) - user << "\red You go blind!" + user << "You go blind!" user.sdisabilities |= BLIND else if (E.damage >= E.min_bruised_damage) - user << "\red You go blind!" + user << "You go blind!" user.eye_blind = 5 user.eye_blurry = 5 user.disabilities |= NEARSIGHTED spawn(100) user.disabilities &= ~NEARSIGHTED + return @@ -544,8 +536,8 @@ throwforce = 7.0 item_state = "crowbar" w_class = 2.0 + origin_tech = list(TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 50) - origin_tech = "engineering=1" attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") /obj/item/weapon/crowbar/red diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 15cb3f83c5e..ef09223b0d3 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -12,10 +12,6 @@ matter = list(DEFAULT_WALL_MATERIAL = 18750) var/deployed = 0 -/obj/item/weapon/beartrap/suicide_act(mob/user) - viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide." - return (BRUTELOSS) - /obj/item/weapon/beartrap/proc/can_use(mob/user) return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained()) diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm index 462263a9537..f1298bd72dd 100644 --- a/code/game/objects/items/weapons/trays.dm +++ b/code/game/objects/items/weapons/trays.dm @@ -39,8 +39,9 @@ //Note: Added a robot check to all stun/weaken procs, beccause weakening a robot causes its active modules to bug out if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown? - M << "\red You accidentally slam yourself with the [src]!" - if(!istype(M,/mob/living/silicon))M.Weaken(1) + M << "You accidentally slam yourself with the [src]!" + if (!issilicon(M)) + M.Weaken(1) user.take_organ_damage(2) if(prob(50)) playsound(M, 'sound/items/trayhit1.ogg', 50, 1) @@ -53,7 +54,7 @@ if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes - if(prob(33) && !istype(M,/mob/living/silicon))//robots dont bleed + if(prob(33) && !issilicon(M))//robots dont bleed src.add_blood(H) var/turf/location = H.loc if (istype(location, /turf/simulated)) @@ -64,25 +65,32 @@ msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)") if(prob(15)) - if(!istype(M,/mob/living/silicon)) M.Weaken(3) + if(!issilicon(M)) M.Weaken(3) M.take_organ_damage(3) else M.take_organ_damage(5) if(prob(50)) playsound(M, 'sound/items/trayhit1.ogg', 50, 1) for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] with the tray!", user, M), 1) + O.show_message(text("[] slams [] with the tray!", user, M), 1) return else playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] with the tray!", user, M), 1) + O.show_message(text("[] slams [] with the tray!", user, M), 1) return - if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))) - M << "\red You get slammed in the face with the tray, against your mask!" - if(prob(33) && !istype(M,/mob/living/silicon)) + var/protected = 0 + for(var/slot in list(slot_head, slot_wear_mask, slot_glasses)) + var/obj/item/protection = M.get_equipped_item(slot) + if(istype(protection) && (protection.body_parts_covered & FACE)) + protected = 1 + break + + if(protected) + M << "You get slammed in the face with the tray, against your mask!" + if(prob(33) && !issilicon(M)) src.add_blood(H) if (H.wear_mask) H.wear_mask.add_blood(H) @@ -97,11 +105,11 @@ if(prob(50)) playsound(M, 'sound/items/trayhit1.ogg', 50, 1) for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] with the tray!", user, M), 1) + O.show_message(text("[] slams [] with the tray!", user, M), 1) else playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] with the tray!", user, M), 1) + O.show_message(text("[] slams [] with the tray!", user, M), 1) if(prob(10)) if(!istype(M,/mob/living/silicon))M.Stun(rand(1,3)) M.take_organ_damage(3) @@ -110,7 +118,7 @@ M.take_organ_damage(5) return - else if (!istype(M,/mob/living/silicon))//No eye or head protection, tough luck! + else if (!issilicon(M))//No eye or head protection, tough luck! M << "\red You get slammed in the face with the tray!" if(prob(33)) src.add_blood(M) @@ -121,11 +129,11 @@ if(prob(50)) playsound(M, 'sound/items/trayhit1.ogg', 50, 1) for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1) + O.show_message(text("[] slams [] in the face with the tray!", user, M), 1) else playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1) + O.show_message(text("[] slams [] in the face with the tray!", user, M), 1) if(prob(30)) M.Stun(rand(2,4)) M.take_organ_damage(4) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index ad47da437fa..d59d340735d 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -1,18 +1,3 @@ -/obj/item/weapon/banhammer - desc = "banhammer" - name = "banhammer" - icon = 'icons/obj/items.dmi' - icon_state = "toyhammer" - slot_flags = SLOT_BELT - throwforce = 0 - w_class = 2.0 - throw_speed = 7 - throw_range = 15 - attack_verb = list("banned") - - suicide_act(mob/user) - viewers(user) << "[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life." - return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS) /obj/item/weapon/nullrod name = "null rod" @@ -26,12 +11,11 @@ throwforce = 10 w_class = 2 - suicide_act(mob/user) - viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide." - return (BRUTELOSS|FIRELOSS) - /obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob) //Paste from old-code to decult with a null rod. + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") user << "You don't have the dexterity to do this!" return @@ -82,27 +66,6 @@ user << "You hit the floor with the [src]." call(/obj/effect/rune/proc/revealrunes)(src) -/obj/item/weapon/sord - name = "\improper SORD" - desc = "This thing is so unspeakably shitty you are having a hard time even holding it." - icon_state = "sord" - item_state = "sord" - slot_flags = SLOT_BELT - force = 2 - throwforce = 1 - sharp = 1 - edge = 1 - w_class = 3 - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - - suicide_act(mob/user) - viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide." - return(BRUTELOSS) - -/obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return ..() - /obj/item/weapon/energy_net name = "energy net" desc = "It's a net made of green energy." @@ -219,7 +182,7 @@ qdel(src) /obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage + health -= Proj.get_structure_damage() healthcheck() return 0 @@ -227,14 +190,6 @@ health = 0 healthcheck() -/obj/effect/energy_net/blob_act() - health = 0 - healthcheck() - -/obj/effect/energy_net/meteorhit() - health = 0 - healthcheck() - /obj/effect/energy_net/attack_hand(var/mob/user) var/mob/living/carbon/human/H = user @@ -274,3 +229,34 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' contained_sprite = 1 + +/obj/item/weapon/sord + name = "\improper SORD" + desc = "This thing is so unspeakably shitty you are having a hard time even holding it." + icon_state = "sord" + item_state = "sord" + slot_flags = SLOT_BELT + force = 2 + throwforce = 1 + sharp = 1 + edge = 1 + w_class = 3 + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + +/obj/item/weapon/banhammer + desc = "banhammer" + name = "banhammer" + icon = 'icons/obj/items.dmi' + icon_state = "toyhammer" + slot_flags = SLOT_BELT + throwforce = 0 + w_class = 2.0 + throw_speed = 7 + throw_range = 15 + attack_verb = list("banned") + +/obj/item/weapon/banhammer/attack(mob/M as mob, mob/user as mob) + M << " You have been banned FOR NO REISIN by [user]" + user << " You have BANNED [M]" + playsound(loc, 'sound/effects/adminhelp.ogg', 15) diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 0a4d4f6e706..e9b5fdb3793 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -19,19 +19,19 @@ if(T.welding & prob(50)) message_admins("[key_name_admin(user)] triggered a fueltank explosion.") log_game("[key_name(user)] triggered a fueltank explosion.") - user << "\red That was stupid of you." + user << "That was stupid of you." explosion(get_turf(src),-1,0,2) if(src) qdel(src) return else if(T.welding) - user << "\red That was close!" + user << "That was close!" src.reagents.trans_to_obj(W, T.max_fuel) - user << "\blue Welder refilled!" + user << "Welder refilled!" playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) return - user << "\blue The tank scoffs at your insolence. It only provides services to welders." + user << "The tank scoffs at your insolence. It only provides services to welders." return /obj/item/weapon/weldpack/afterattack(obj/O as obj, mob/user as mob, proximity) @@ -39,11 +39,11 @@ return if (istype(O, /obj/structure/reagent_dispensers/fueltank) && src.reagents.total_volume < max_fuel) O.reagents.trans_to_obj(src, max_fuel) - user << "\blue You crack the cap off the top of the pack and fill it back up again from the tank." + user << "You crack the cap off the top of the pack and fill it back up again from the tank." playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) return else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && src.reagents.total_volume == max_fuel) - user << "\blue The pack is already full!" + user << "The pack is already full!" return /obj/item/weapon/weldpack/examine(mob/user) diff --git a/code/game/objects/items/weapons/wires.dm b/code/game/objects/items/weapons/wires.dm index df2033f8871..0a70fdbe1c2 100644 --- a/code/game/objects/items/weapons/wires.dm +++ b/code/game/objects/items/weapons/wires.dm @@ -12,7 +12,7 @@ /obj/item/weapon/wire/attack_self(mob/user as mob) if (src.laying) src.laying = 0 - user << "\blue You're done laying wire!" + user << "You're done laying wire!" else - user << "\blue You are not using this to lay wire..." + user << "You are not using this to lay wire..." return diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 0f263dad9f4..98c4fee4db6 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -1,10 +1,8 @@ /obj //Used to store information about the contents of the object. var/list/matter - - var/origin_tech = null //Used by R&D to determine what research bonuses it grants. - var/reliability = 100 //Used by SOME devices to determine how reliable they are. - var/crit_fail = 0 + var/w_class // Size of the object. + var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants. var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj. animate_movement = 2 var/throwforce = 1 @@ -12,13 +10,12 @@ var/sharp = 0 // whether this object cuts var/edge = 0 // whether this object is more likely to dismember var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! - var/damtype = "brute" var/force = 0 + var/armor_penetration = 0 var/being_shocked = 0 - var/item_state // Base name of the image used for when the item is worn. Suffixes are added to this. var/icon_species_tag = ""//If set, this holds the 3-letter shortname of a species, used for species-specific worn icons var/icon_auto_adapt = 0//If 1, this item will automatically change its species tag to match the wearer's species. //requires that the wearer's species is listed in icon_supported_species_tags @@ -28,12 +25,10 @@ var/equip_slot = 0 /obj/Destroy() processing_objects -= src - nanomanager.close_uis(src) return ..() -/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 && ..()) +/obj/Topic(href, href_list, var/datum/topic_state/state = default_state) + if(..()) return 1 // In the far future no checks are made in an overriding Topic() beyond if(..()) return @@ -45,9 +40,33 @@ CouldNotUseTopic(usr) return 1 +/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state) + if(user.CanUseObjTopic(src)) + return ..() + user << "\icon[src]Access Denied!" + return STATUS_CLOSE + +/mob/living/silicon/CanUseObjTopic(var/obj/O) + var/id = src.GetIdCard() + return O.check_access(id) + +/mob/proc/CanUseObjTopic() + return 1 + /obj/proc/CouldUseTopic(var/mob/user) - var/atom/host = nano_host() - host.add_fingerprint(user) + user.AddTopicPrint(src) + +/mob/proc/AddTopicPrint(var/obj/target) + target.add_hiddenprint(src) + +/mob/living/AddTopicPrint(var/obj/target) + if(Adjacent(target)) + target.add_fingerprint(src) + else + target.add_hiddenprint(src) + +/mob/living/silicon/ai/AddTopicPrint(var/obj/target) + target.add_hiddenprint(src) /obj/proc/CouldNotUseTopic(var/mob/user) // Nada @@ -114,6 +133,10 @@ if(!ai_in_use && !is_in_use) in_use = 0 +/obj/attack_ghost(mob/user) + ui_interact(user) + ..() + /obj/proc/interact(mob/user) return @@ -135,13 +158,11 @@ if(istype(M) && M.client && M.machine == src) src.attack_self(M) +/obj/proc/hide(var/hide) + invisibility = hide ? INVISIBILITY_MAXIMUM : initial(invisibility) -/obj/proc/alter_health() - return 1 - -/obj/proc/hide(h) - return - +/obj/proc/hides_under_flooring() + return level == 1 /obj/proc/hear_talk(mob/M as mob, text, verb, datum/language/speaking) if(talking_atom) @@ -164,6 +185,8 @@ spawn(10) being_shocked = 0 +/obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) + return //To be called from things that spill objects on the floor. //Makes an object move around randomly for a couple of tiles @@ -194,4 +217,4 @@ //spawn at roundstart, are adminspawned, arrive on shuttles, spawned from vendors, removed from fridges and containers, etc //This is useful for setting special behaviour for built items that shouldn't apply to those spawned at roundstart /obj/proc/Created() - return \ No newline at end of file + return diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 56688426689..bf7fc43806f 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -11,9 +11,11 @@ ..() if (!prob(spawn_nothing_percentage)) spawn_item() + +/obj/random/initialize() + ..() qdel(src) - // this function should return a specific item to spawn /obj/random/proc/item_to_spawn() return 0 @@ -477,8 +479,8 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/brandy,\ /obj/item/weapon/reagent_containers/food/drinks/bottle/guinnes,\ /obj/item/weapon/reagent_containers/food/drinks/bottle/drambuie,\ - /obj/item/weapon/reagent_containers/food/drinks/cans/beer,\ - /obj/item/weapon/reagent_containers/food/drinks/cans/ale) + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,\ + /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale) /obj/random/melee name = "random melee weapon" diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 1d0eb918649..5faa4c70530 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -1,5 +1,6 @@ /obj/structure icon = 'icons/obj/structures.dmi' + w_class = 10 var/climbable var/breakable @@ -28,13 +29,6 @@ return ..() -/obj/structure/blob_act() - if(prob(50)) - qdel(src) - -/obj/structure/meteorhit(obj/O as obj) - qdel(src) - /obj/structure/attack_tk() return @@ -50,9 +44,6 @@ if(3.0) return -/obj/structure/meteorhit(obj/O as obj) - qdel(src) - /obj/structure/New() ..() updateVisibility(src) diff --git a/code/game/objects/structures/alien/alien.dm b/code/game/objects/structures/alien/alien.dm new file mode 100644 index 00000000000..df94cf95ac9 --- /dev/null +++ b/code/game/objects/structures/alien/alien.dm @@ -0,0 +1,61 @@ +/obj/structure/alien + name = "alien thing" + desc = "There's something alien about this." + icon = 'icons/mob/alien.dmi' + var/health = 50 + +/obj/structure/alien/proc/healthcheck() + if(health <=0) + density = 0 + qdel(src) + return + +/obj/structure/alien/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + healthcheck() + return + +/obj/structure/alien/ex_act(severity) + switch(severity) + if(1.0) + health-=50 + if(2.0) + health-=50 + if(3.0) + if (prob(50)) + health-=50 + else + health-=25 + healthcheck() + return + +/obj/structure/alien/hitby(AM as mob|obj) + ..() + visible_message("\The [src] was hit by \the [AM].") + var/tforce = 0 + if(ismob(AM)) + tforce = 10 + else + tforce = AM:throwforce + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + health = max(0, health - tforce) + healthcheck() + ..() + return + +/obj/structure/alien/attack_generic() + attack_hand(usr) + +/obj/structure/alien/attackby(var/obj/item/weapon/W, var/mob/user) + health = max(0, health - W.force) + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + healthcheck() + ..() + return + +/obj/structure/alien/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group) return 0 + if(istype(mover) && mover.checkpass(PASSGLASS)) + return !opacity + return !density \ No newline at end of file diff --git a/code/game/objects/structures/alien/egg.dm b/code/game/objects/structures/alien/egg.dm new file mode 100644 index 00000000000..5d32f9685f6 --- /dev/null +++ b/code/game/objects/structures/alien/egg.dm @@ -0,0 +1,96 @@ +#define MAX_PROGRESS 100 + +/obj/structure/alien/egg + desc = "It looks like a weird egg." + name = "egg" + icon_state = "egg_growing" + density = 0 + anchored = 1 + var/progress = 0 + +/obj/structure/alien/egg/New() + ..() + processing_objects += src + +/obj/structure/alien/egg/Destroy() + processing_objects -= src + ..() + +/obj/structure/alien/egg/CanUseTopic(var/mob/user) + return isobserver(user) ? STATUS_INTERACTIVE : STATUS_CLOSE + +/obj/structure/alien/egg/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["spawn"]) + attack_ghost(usr) + +/obj/structure/alien/egg/process() + progress++ + if(progress >= MAX_PROGRESS) + for(var/mob/M in dead_mob_list) + if(istype(M,/mob/dead) && M.client && M.client.prefs && (MODE_XENOMORPH in M.client.prefs.be_special_role)) + M << "An alien is ready to hatch! ([ghost_follow_link(src, M)]) (spawn)" + processing_objects -= src + update_icon() + +/obj/structure/alien/egg/update_icon() + if(progress == -1) + icon_state = "egg_hatched" + else if(progress < MAX_PROGRESS) + icon_state = "egg_growing" + else + icon_state = "egg" + +/obj/structure/alien/egg/attack_ghost(var/mob/dead/observer/user) + if(progress == -1) //Egg has been hatched. + return + + if(progress < MAX_PROGRESS) + user << "\The [src] has not yet matured." + return + + if(!user.MayRespawn(1)) + return + + // Check for bans properly. + if(jobban_isbanned(user, "Xenomorph")) + user << "You are banned from playing a Xenomorph." + return + + var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes") + + if(!src || confirm != "Yes") + return + + if(!user || !user.ckey) + return + + if(progress == -1) //Egg has been hatched. + user << "Too slow..." + return + + flick("egg_opening",src) + progress = -1 // No harvesting pls. + sleep(5) + + if(!src || !user) + visible_message("\The [src] writhes with internal motion, but nothing comes out.") + progress = MAX_PROGRESS // Someone else can have a go. + return // What a pain. + + // Create the mob, transfer over key. + var/mob/living/carbon/alien/larva/larva = new(get_turf(src)) + larva.ckey = user.ckey + spawn(-1) + if(user) qdel(user) // Remove the keyless ghost if it exists. + + visible_message("\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!") + + // Turn us into a hatched egg. + name = "hatched alien egg" + desc += " This one has hatched." + update_icon() + +#undef MAX_PROGRESS diff --git a/code/game/objects/structures/alien/node.dm b/code/game/objects/structures/alien/node.dm new file mode 100644 index 00000000000..15a9062862f --- /dev/null +++ b/code/game/objects/structures/alien/node.dm @@ -0,0 +1,19 @@ +/obj/structure/alien/node + name = "alien weed node" + desc = "Some kind of strange, pulsating structure." + icon_state = "weednode" + health = 100 + layer = 3.1 + +/obj/structure/alien/node/New() + ..() + processing_objects += src + +/obj/structure/alien/node/Destroy() + processing_objects -= src + ..() + +/obj/structure/alien/node/process() + if(locate(/obj/effect/plant) in loc) + return + new /obj/effect/plant(get_turf(src), plant_controller.seeds["xenomorph"]) diff --git a/code/game/objects/structures/alien/resin.dm b/code/game/objects/structures/alien/resin.dm new file mode 100644 index 00000000000..05f6bca0e72 --- /dev/null +++ b/code/game/objects/structures/alien/resin.dm @@ -0,0 +1,50 @@ +/obj/structure/alien/resin + name = "resin" + desc = "Looks like some kind of slimy growth." + icon_state = "resin" + + density = 1 + opacity = 1 + anchored = 1 + health = 200 + +/obj/structure/alien/resin/wall + name = "resin wall" + desc = "Purple slime solidified into a wall." + icon_state = "resinwall" + +/obj/structure/alien/resin/membrane + name = "resin membrane" + desc = "Purple slime just thin enough to let light pass through." + icon_state = "resinmembrane" + opacity = 0 + health = 120 + +/obj/structure/alien/resin/New() + ..() + var/turf/T = get_turf(src) + T.thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT + +/obj/structure/alien/resin/Destroy() + var/turf/T = get_turf(src) + T.thermal_conductivity = initial(T.thermal_conductivity) + ..() + +/obj/structure/alien/resin/attack_hand(var/mob/user) + if (HULK in user.mutations) + visible_message("\The [user] destroys \the [name]!") + health = 0 + else + // Aliens can get straight through these. + if(istype(user,/mob/living/carbon)) + var/mob/living/carbon/M = user + if(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs) + visible_message("\The [user] strokes \the [name] and it melts away!") + health = 0 + healthcheck() + return + visible_message("\The [user] claws at \the [src]!") + // Todo check attack datums. + health -= rand(5,10) + healthcheck() + return \ No newline at end of file diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index 955d99920fb..6152c1dbd19 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -3,26 +3,45 @@ 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","thebark","theharmbaton","theharmedbaton","thesingulo","thedrukcarp","thedrunkcarp", "scotch","officerbeersky","on","theouterspess","milliways42","spaceasshole","robustacafe","emergencyrumparty","thenet","birdcage","toolboxtavern","foreign")) - return - proc/ChangeSign(var/Text) - src.icon_state = "[Text]" - //on = 0 - //brightness_on = 4 //uncomment these when the lighting fixes get in - return + +/obj/structure/sign/double/barsign/proc/get_valid_states(initial=1) + . = icon_states(icon) + . -= "on" + . -= "narsiebistro" + . -= "empty" + if(initial) + . -= "Off" + +/obj/structure/sign/double/barsign/examine(mob/user) + ..() + switch(icon_state) + if("Off") + user << "It appears to be switched off." + if("narsiebistro") + user << "It shows a picture of a large black and red being. Spooky!" + if("on", "empty") + user << "The lights are on, but there's no picture." + else + user << "It says '[icon_state]'" + +/obj/structure/sign/double/barsign/New() + ..() + icon_state = pick(get_valid_states()) /obj/structure/sign/double/barsign/attackby(obj/item/I, mob/user) if(cult) + return ..() + + var/obj/item/weapon/card/id/card = I.GetID() + if(istype(card)) + if(access_bar in card.GetAccess()) + var/sign_type = input(user, "What would you like to change the barsign to?") as null|anything in get_valid_states(0) + if(!sign_type) + return + icon_state = sign_type + user << "You change the barsign." + else + user << "Access denied." 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", "The Bark", "The Harm Baton", "The Harmed Baton", "The Singulo", "The Druk Carp", "The Drunk Carp", "Scotch", "Officer Beersky", "On", "The Outer Spess", "Milliways 42", "Space Asshole", "Robusta Cafe", "Emergency Rum Party", "The Net", "Bird Cage", "Toolbox Tavern", "Foreign" ) - if(sign_type == null) - return - else - sign_type = replacetext(lowertext(sign_type), " ", "") // lowercase, strip spaces - along with choices for user options, avoids huge if-else-else - src.ChangeSign(sign_type) - user << "You change the barsign." + return ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 64f1f9925b5..0fe3361db14 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -25,6 +25,16 @@ LINEN BINS add_fingerprint(user) return +/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user) + if(is_sharp(I)) + user.visible_message("\The [user] begins cutting up [src] with [I].", "You begin cutting up [src] with [I].") + if(do_after(user, 50)) + user << "You cut [src] into pieces!" + for(var/i in 1 to rand(2,5)) + new /obj/item/weapon/reagent_containers/glass/rag(get_turf(src)) + qdel(src) + return + ..() /obj/item/weapon/bedsheet/blue icon_state = "sheetblue" diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index decba4bfd36..625af060db7 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/coatrack.dmi' icon_state = "coatrack0" var/obj/item/clothing/suit/coat - var/list/allowed = list(/obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/det_suit) + var/list/allowed = list(/obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/det_trench) /obj/structure/coatrack/attack_hand(mob/user as mob) user.visible_message("[user] takes [coat] off \the [src].", "You take [coat] off the \the [src]") @@ -48,5 +48,5 @@ overlays += image(icon, icon_state = "coat_lab") if (istype(coat, /obj/item/clothing/suit/storage/toggle/labcoat/cmo)) overlays += image(icon, icon_state = "coat_cmo") - if (istype(coat, /obj/item/clothing/suit/storage/det_suit)) + if (istype(coat, /obj/item/clothing/suit/storage/det_trench)) overlays += image(icon, icon_state = "coat_det") diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index b4e07378751..5461434a3ea 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/closet.dmi' icon_state = "closed" density = 1 + w_class = 5 var/icon_closed = "closed" var/icon_opened = "open" var/opened = 0 @@ -11,7 +12,7 @@ var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 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 + var/storage_capacity = 2 * MOB_MEDIUM //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' var/close_sound = 'sound/machines/click.ogg' @@ -23,6 +24,7 @@ var/const/default_mob_size = 15 /obj/structure/closet/initialize() + ..() if(!opened) // if closed, any item at the crate's loc is put in the contents var/obj/item/I for(I in src.loc) @@ -60,9 +62,6 @@ content_size += Ceiling(I.w_class/2) return content_size -/obj/structure/closet/alter_health() - return get_turf(src) - /obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group || (height==0 || wall_mounted)) return 1 return (!density) @@ -155,14 +154,13 @@ for(var/mob/living/M in src.loc) if(M.buckled || M.pinned.len) continue - var/current_mob_size = (M.mob_size ? M.mob_size : default_mob_size) - if(stored_units + added_units + current_mob_size > storage_capacity) + if(stored_units + added_units + M.mob_size > storage_capacity) break if(M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src M.forceMove(src) - added_units += current_mob_size + added_units += M.mob_size return added_units /obj/structure/closet/proc/toggle(mob/user as mob) @@ -195,28 +193,15 @@ qdel(src) /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + var/proj_damage = Proj.get_structure_damage() + if(!proj_damage) return ..() - damage(Proj.damage) + damage(proj_damage) return -// this should probably use dump_contents() -/obj/structure/closet/blob_act() - if(prob(75)) - for(var/atom/movable/A as mob|obj in src) - A.forceMove(src.loc) - 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() - qdel(src) - /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) if(src.opened) if(istype(W, /obj/item/weapon/grab)) @@ -238,6 +223,15 @@ M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) qdel(src) return + if(istype(W, /obj/item/weapon/storage/laundry_basket) && W.contents.len) + var/obj/item/weapon/storage/laundry_basket/LB = W + var/turf/T = get_turf(src) + for(var/obj/item/I in LB.contents) + LB.remove_from_storage(I, T) + user.visible_message("[user] empties \the [LB] into \the [src].", \ + "You empty \the [LB] into \the [src].", \ + "You hear rustling of clothes.") + return if(isrobot(user)) return if(W.loc != user) // This should stop mounted modules ending up outside the module. diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm deleted file mode 100644 index 9c6e42587fd..00000000000 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ /dev/null @@ -1,210 +0,0 @@ -//I still dont think this should be a closet but whatever -/obj/structure/closet/fireaxecabinet - name = "fire axe cabinet" - desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." - var/obj/item/weapon/material/twohanded/fireaxe/fireaxe - icon_state = "fireaxe1000" - icon_closed = "fireaxe1000" - icon_opened = "fireaxe1100" - anchored = 1 - density = 0 - var/localopened = 0 //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri - opened = 1 - var/hitstaken = 0 - var/locked = 1 - var/smashed = 0 - - New() - ..() - fireaxe = new /obj/item/weapon/material/twohanded/fireaxe(src) - - attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - //..() //That's very useful, Erro - - var/hasaxe = 0 //gonna come in handy later~ - if(fireaxe) - hasaxe = 1 - - if (isrobot(usr) || src.locked) - if(istype(O, /obj/item/device/multitool)) - user << "\red Resetting circuitry..." - playsound(user, 'sound/machines/lockreset.ogg', 50, 1) - if(do_after(user, 20)) - src.locked = 0 - user << " You disable the locking modules." - update_icon() - return - else if(istype(O, /obj/item/weapon)) - var/obj/item/weapon/W = O - if(src.smashed || src.localopened) - if(localopened) - localopened = 0 - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - return - else - playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time - if(W.force < 15) - user << "\blue The cabinet's protective glass glances off the hit." - else - src.hitstaken++ - if(src.hitstaken == 4) - playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that. - src.smashed = 1 - src.locked = 0 - src.localopened = 1 - update_icon() - return - if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened) - if(!fireaxe) - if(O:wielded) - user << "\red Unwield the axe first." - return - fireaxe = O - user.remove_from_mob(O) - src.contents += O - user << "\blue You place the fire axe back in the [src.name]." - update_icon() - else - if(src.smashed) - return - else - localopened = !localopened - if(localopened) - icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - if(src.smashed) - return - if(istype(O, /obj/item/device/multitool)) - if(localopened) - localopened = 0 - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - return - else - user << "\red Resetting circuitry..." - sleep(50) - src.locked = 1 - user << "\blue You re-enable the locking modules." - playsound(user, 'sound/machines/lockenable.ogg', 50, 1) - if(do_after(user,20)) - src.locked = 1 - user << " You re-enable the locking modules." - return - else - localopened = !localopened - if(localopened) - icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - - - - attack_hand(mob/user as mob) - - var/hasaxe = 0 - if(fireaxe) - hasaxe = 1 - - if(src.locked) - user <<"\red The cabinet won't budge!" - return - if(localopened) - if(fireaxe) - user.put_in_hands(fireaxe) - fireaxe = null - user << "\blue You take the fire axe from the [name]." - src.add_fingerprint(user) - update_icon() - else - if(src.smashed) - return - else - localopened = !localopened - if(localopened) - src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - else - localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri - if(localopened) - src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - attack_tk(mob/user as mob) - if(localopened && fireaxe) - fireaxe.forceMove(loc) - user << "You telekinetically remove the fire axe." - fireaxe = null - update_icon() - return - attack_hand(user) - - verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri - set name = "Open/Close" - set category = "Object" - - if (isrobot(usr) || src.locked || src.smashed) - if(src.locked) - usr << "\red The cabinet won't budge!" - else if(src.smashed) - usr << "\blue The protective glass is broken!" - return - - localopened = !localopened - update_icon() - - verb/remove_fire_axe() - set name = "Remove Fire Axe" - set category = "Object" - - if (isrobot(usr)) - return - - if (localopened) - if(fireaxe) - usr.put_in_hands(fireaxe) - fireaxe = null - usr << "\blue You take the Fire axe from the [name]." - else - usr << "\blue The [src.name] is empty." - else - usr << "\blue The [src.name] is closed." - update_icon() - - attack_ai(mob/user as mob) - if(src.smashed) - user << "\red The security of the cabinet is compromised." - return - else - locked = !locked - if(locked) - user << "\red Cabinet locked." - else - user << "\blue Cabinet unlocked." - return - - update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers - var/hasaxe = 0 - if(fireaxe) - hasaxe = 1 - icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed) - - open() - return - - close() - return diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 535da4cec68..82675dca528 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -68,7 +68,7 @@ new /obj/item/weapon/cartridge/janitor(src) new /obj/item/clothing/gloves/black(src) new /obj/item/clothing/head/soft/purple(src) - new /obj/item/clothing/head/beret/jan(src) + new /obj/item/clothing/head/beret/purple(src) new /obj/item/device/flashlight(src) new /obj/item/weapon/caution(src) new /obj/item/weapon/caution(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 88e7612daf4..37ec5a4a51f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -12,16 +12,16 @@ New() ..() - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) + new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer( src ) return /obj/structure/closet/secure_closet/bar/update_icon() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index b48d6a19338..ead1b886b84 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -149,5 +149,5 @@ new /obj/item/clothing/suit/storage/hazardvest(src) new /obj/item/clothing/mask/gas(src) new /obj/item/weapon/cartridge/atmos(src) - new /obj/item/taperoll/engineering(src) + new /obj/item/taperoll/atmos(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index cc333808a05..e59779904fe 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -96,6 +96,7 @@ new /obj/item/clothing/shoes/white(src) // new /obj/item/weapon/cartridge/medical(src) new /obj/item/device/radio/headset/headset_med(src) + new /obj/item/taperoll/medical(src) 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 a71851f9f20..d91b22fe74d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -83,23 +83,27 @@ src.registered_name = I.registered_name src.desc = "Owned by [I.registered_name]." else - user << "\red Access Denied" - else if( (istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken) - broken = 1 - locked = 0 - desc = "It appears to be broken." - icon_state = src.icon_broken - if(istype(W, /obj/item/weapon/melee/energy/blade)) + user << "Access Denied" + else if(istype(W, /obj/item/weapon/melee/energy/blade)) + if(emag_act(INFINITY, user, "The locker has been sliced open by [user] with \an [W]!", "You hear metal being sliced and sparks flying.")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(src.loc, "sparks", 50, 1) - for(var/mob/O in viewers(user, 3)) - O.show_message("\blue The locker has been sliced open by [user] with an energy blade!", 1, "\red You hear metal being sliced and sparks flying.", 2) else - user << "\red Access Denied" + user << "Access Denied" return + +/obj/structure/closet/secure_closet/personal/emag_act(var/remaining_charges, var/mob/user, var/visual_feedback, var/audible_feedback) + if(!broken) + broken = 1 + locked = 0 + desc = "It appears to be broken." + icon_state = src.icon_broken + if(visual_feedback) + visible_message("[visual_feedback]", "[audible_feedback]") + return 1 /obj/structure/closet/secure_closet/personal/verb/reset() set src in oview(1) // One square distance @@ -110,9 +114,9 @@ if(ishuman(usr)) src.add_fingerprint(usr) if (src.locked || !src.registered_name) - usr << "\red You need to unlock it first." + usr << "You need to unlock it first." else if (src.broken) - usr << "\red It appears to be broken." + usr << "It appears to be broken." else if (src.opened) if(!src.close()) 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 ab482b699d3..869032cfe8a 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 @@ -41,7 +41,7 @@ open() else src.req_access = list() - src.req_access += pick(get_all_accesses()) + src.req_access += pick(get_all_station_access()) ..() /obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob) @@ -65,6 +65,8 @@ /obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob) if(src.opened) + if(istype(W, /obj/item/weapon/storage/laundry_basket)) + return ..(W,user) if(istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W if(src.large) @@ -78,28 +80,34 @@ user.drop_item() if(W) W.forceMove(src.loc) - else if((istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken) - broken = 1 - locked = 0 - desc = "It appears to be broken." - icon_state = icon_off - flick(icon_broken, src) - if(istype(W, /obj/item/weapon/melee/energy/blade)) + else if(istype(W, /obj/item/weapon/melee/energy/blade)) + if(emag_act(INFINITY, user, "The locker has been sliced open by [user] with \an [W]!", "You hear metal being sliced and sparks flying.")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(src.loc, "sparks", 50, 1) - for(var/mob/O in viewers(user, 3)) - O.show_message("The locker has been sliced open by [user] with an energy blade!", 1, "You hear metal being sliced and sparks flying.", 2) - else - for(var/mob/O in viewers(user, 3)) - O.show_message("The locker has been broken by [user] with an electromagnetic card!", 1, "You hear a faint electrical spark.", 2) else if(istype(W,/obj/item/weapon/packageWrap) || istype(W,/obj/item/weapon/weldingtool)) return ..(W,user) else togglelock(user) +/obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "") + if(!broken) + broken = 1 + locked = 0 + desc = "It appears to be broken." + icon_state = icon_off + flick(icon_broken, src) + + if(visual_feedback) + visible_message(visual_feedback, audible_feedback) + else if(user && emag_source) + visible_message("\The [src] has been broken by \the [user] with \an [emag_source]!", "You hear a faint electrical spark.") + else + visible_message("\The [src] sparks and breaks open!", "You hear a faint electrical spark.") + return 1 + /obj/structure/closet/secure_closet/attack_hand(mob/user as mob) src.add_fingerprint(user) if(src.locked) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 05d99be1e73..dfd6659e89d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -16,11 +16,11 @@ new /obj/item/weapon/storage/backpack/satchel_cap(src) new /obj/item/clothing/suit/captunic(src) new /obj/item/clothing/suit/captunic/capjacket(src) - new /obj/item/clothing/head/helmet/cap(src) + new /obj/item/clothing/head/caphat/cap(src) new /obj/item/clothing/under/rank/captain(src) new /obj/item/clothing/suit/storage/vest(src) new /obj/item/weapon/cartridge/captain(src) - new /obj/item/clothing/head/helmet/swat(src) + new /obj/item/clothing/head/helmet(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/device/radio/headset/heads/captain(src) new /obj/item/clothing/gloves/captain(src) @@ -28,7 +28,7 @@ new /obj/item/device/flash(src) new /obj/item/weapon/melee/telebaton(src) new /obj/item/clothing/under/dress/dress_cap(src) - new /obj/item/clothing/head/helmet/formalcaptain(src) + new /obj/item/clothing/head/caphat/formal(src) new /obj/item/clothing/under/captainformal(src) return @@ -82,7 +82,7 @@ new /obj/item/clothing/shoes/leather(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src) - new /obj/item/clothing/head/helmet/hop(src) + new /obj/item/clothing/head/caphat/hop(src) return @@ -103,13 +103,14 @@ new /obj/item/weapon/storage/backpack/security(src) else new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/clothing/head/helmet/HoS(src) + new /obj/item/clothing/head/HoS(src) + new /obj/item/clothing/suit/armor/vest/security(src) new /obj/item/clothing/suit/storage/vest/hos(src) new /obj/item/clothing/under/rank/head_of_security/jensen(src) new /obj/item/clothing/under/rank/head_of_security/corp(src) new /obj/item/clothing/suit/armor/hos/jensen(src) new /obj/item/clothing/suit/armor/hos(src) - new /obj/item/clothing/head/helmet/HoS/dermal(src) + new /obj/item/clothing/head/HoS/dermal(src) new /obj/item/weapon/cartridge/hos(src) new /obj/item/device/radio/headset/heads/hos(src) new /obj/item/clothing/glasses/sunglasses/sechud(src) @@ -122,7 +123,8 @@ new /obj/item/weapon/gun/energy/pistol(src) new /obj/item/clothing/accessory/holster/waist(src) new /obj/item/weapon/melee/telebaton(src) - new /obj/item/clothing/head/beret/sec/hos(src) + new /obj/item/clothing/head/beret/sec/corporate/hos(src) + new /obj/item/clothing/accessory/badge/hos(src) new /obj/item/ammo_magazine/tranq(src) return @@ -145,6 +147,7 @@ new /obj/item/weapon/storage/backpack/security(src) else new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/item/clothing/suit/armor/vest/security(src) new /obj/item/clothing/suit/storage/vest/warden(src) new /obj/item/clothing/under/rank/warden(src) new /obj/item/clothing/under/rank/warden/corp(src) @@ -157,12 +160,14 @@ new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/taperoll/police(src) new /obj/item/weapon/storage/box/flashbangs(src) + new /obj/item/weapon/storage/box/teargas(src) new /obj/item/weapon/storage/belt/security(src) new /obj/item/weapon/reagent_containers/spray/pepper(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/weapon/gun/energy/pistol(src) new /obj/item/weapon/storage/box/holobadge(src) - new /obj/item/clothing/head/beret/sec/warden(src) + new /obj/item/clothing/head/beret/sec/corporate/warden(src) + new /obj/item/clothing/accessory/badge/warden(src) return @@ -190,7 +195,7 @@ new /obj/item/weapon/storage/belt/security(src) new /obj/item/device/flash(src) new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/grenade/flashbang(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/taperoll/police(src) @@ -198,7 +203,6 @@ new /obj/item/clothing/accessory/storage/black_vest(src) new /obj/item/clothing/head/soft/sec/corp(src) new /obj/item/clothing/under/rank/security/corp(src) - new /obj/item/ammo_magazine/c45m/rubber(src) new /obj/item/weapon/gun/energy/taser(src) return @@ -250,8 +254,8 @@ New() ..() new /obj/item/clothing/under/det(src) + new /obj/item/clothing/under/det/grey(src) new /obj/item/clothing/under/det/black(src) - new /obj/item/clothing/under/det/slob(src) new /obj/item/clothing/suit/storage/det_suit(src) new /obj/item/clothing/suit/storage/det_suit/technicolor(src) new /obj/item/clothing/suit/storage/forensics/blue(src) @@ -311,7 +315,7 @@ /obj/structure/closet/secure_closet/courtroom name = "courtroom locker" - req_access = list(access_court) + req_access = list(access_lawyer) New() ..() diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index b59cd62dfa3..2ff44ee9dfe 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -80,12 +80,15 @@ /obj/structure/closet/statue/toggle() return -/obj/structure/closet/statue/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage +/obj/structure/closet/statue/proc/check_health() if(health <= 0) for(var/mob/M in src) shatter(M) +/obj/structure/closet/statue/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.get_structure_damage() + check_health() + return /obj/structure/closet/statue/attack_generic(var/mob/user, damage, attacktext, environment_smash) @@ -93,23 +96,17 @@ for(var/mob/M in src) shatter(M) -/obj/structure/closet/statue/blob_act() +/obj/structure/closet/statue/ex_act(severity) 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) + M.ex_act(severity) + health -= 60 / severity + check_health() /obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob) health -= I.force user.do_attack_animation(src) visible_message("[user] strikes [src] with [I].") - if(health <= 0) - for(var/mob/M in src) - shatter(M) + check_health() /obj/structure/closet/statue/MouseDrop_T() return diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 2214a17f8eb..0422b46eb43 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -42,11 +42,11 @@ /obj/structure/closet/syndicate/nuclear/New() ..() - new /obj/item/ammo_magazine/a12mm(src) - new /obj/item/ammo_magazine/a12mm(src) - new /obj/item/ammo_magazine/a12mm(src) - new /obj/item/ammo_magazine/a12mm(src) - new /obj/item/ammo_magazine/a12mm(src) + new /obj/item/ammo_magazine/a10mm(src) + new /obj/item/ammo_magazine/a10mm(src) + new /obj/item/ammo_magazine/a10mm(src) + new /obj/item/ammo_magazine/a10mm(src) + new /obj/item/ammo_magazine/a10mm(src) new /obj/item/weapon/storage/box/handcuffs(src) new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/gun/energy/gun(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 31f8115b910..714be281b89 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -22,7 +22,7 @@ /obj/structure/closet/emcloset/New() ..() - switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10, "nothing" = 0, "delete" = 0))) + switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10))) if ("small") new /obj/item/weapon/tank/emergency_oxygen(src) new /obj/item/weapon/tank/emergency_oxygen(src) @@ -51,17 +51,6 @@ new /obj/item/clothing/suit/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) - if ("nothing") - // doot - - // teehee - Ah, tg coders... - if ("delete") - 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) - qdel(src)*/ /obj/structure/closet/emcloset/legacy/New() ..() diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 63835345fa9..0e03c47e6b1 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -1,6 +1,6 @@ /obj/structure/closet/wardrobe name = "wardrobe" - desc = "It's a storage unit for standard-issue Nanotrasen attire." + desc = "It's a storage unit for standard-issue attire." icon_state = "blue" icon_closed = "blue" @@ -26,9 +26,9 @@ new /obj/item/clothing/head/beret/sec(src) new /obj/item/clothing/head/beret/sec(src) new /obj/item/clothing/head/beret/sec(src) - new /obj/item/clothing/head/beret/sec/alt(src) - new /obj/item/clothing/head/beret/sec/alt(src) - new /obj/item/clothing/head/beret/sec/alt(src) + new /obj/item/clothing/head/beret/sec/corporate/officer(src) + new /obj/item/clothing/head/beret/sec/corporate/officer(src) + new /obj/item/clothing/head/beret/sec/corporate/officer(src) return @@ -68,7 +68,7 @@ /obj/structure/closet/wardrobe/chaplain_black name = "chapel wardrobe" - desc = "It's a storage unit for Nanotrasen-approved religious attire." + desc = "It's a storage unit for approved religious attire." icon_state = "black" icon_closed = "black" @@ -85,6 +85,7 @@ new /obj/item/weapon/storage/backpack/cultpack (src) new /obj/item/weapon/storage/fancy/candle_box(src) new /obj/item/weapon/storage/fancy/candle_box(src) + new /obj/item/weapon/deck/tarot(src) return @@ -120,7 +121,7 @@ /obj/structure/closet/wardrobe/orange name = "prison wardrobe" - desc = "It's a storage unit for Nanotrasen-regulation prisoner attire." + desc = "It's a storage unit for regulation prisoner attire." icon_state = "orange" icon_closed = "orange" @@ -167,9 +168,9 @@ new /obj/item/clothing/head/hardhat/red(src) new /obj/item/clothing/head/hardhat/red(src) new /obj/item/clothing/head/hardhat/red(src) - new /obj/item/clothing/head/beret/eng(src) - new /obj/item/clothing/head/beret/eng(src) - new /obj/item/clothing/head/beret/eng(src) + new /obj/item/clothing/head/beret/engineering(src) + new /obj/item/clothing/head/beret/engineering(src) + new /obj/item/clothing/head/beret/engineering(src) return @@ -190,9 +191,9 @@ new /obj/item/clothing/head/hardhat(src) new /obj/item/clothing/head/hardhat(src) new /obj/item/clothing/head/hardhat(src) - new /obj/item/clothing/head/beret/eng(src) - new /obj/item/clothing/head/beret/eng(src) - new /obj/item/clothing/head/beret/eng(src) + new /obj/item/clothing/head/beret/engineering(src) + new /obj/item/clothing/head/beret/engineering(src) + new /obj/item/clothing/head/beret/engineering(src) return diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 6736f5352d3..cb34fc25ba3 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -86,20 +86,7 @@ /obj/structure/closet/crate/attackby(obj/item/weapon/W as obj, mob/user as mob) if(opened) - if(isrobot(user)) - return - if(W.loc != user) // This should stop mounted modules ending up outside the module. - return - if(W.abstract) //Prevents 'abstract' items (such as grabs) from creeping into the material realm. - if(istype(W, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = W - user << "[G.affecting] just doesn't fit!" - else - user << "[W] does not belong there!" - return - user.drop_item() - if(W) - W.forceMove(src.loc) + return ..() else if(istype(W, /obj/item/weapon/packageWrap)) return else if(istype(W, /obj/item/stack/cable_coil)) @@ -215,7 +202,15 @@ /obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob) if(is_type_in_list(W, list(/obj/item/weapon/packageWrap, /obj/item/stack/cable_coil, /obj/item/device/radio/electropack, /obj/item/weapon/wirecutters))) return ..() - if(locked && (istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade))) + if(istype(W, /obj/item/weapon/melee/energy/blade)) + emag_act(INFINITY, user) + if(!opened) + src.togglelock(user) + return + return ..() + +/obj/structure/closet/crate/secure/emag_act(var/remaining_charges, var/mob/user) + if(!broken) overlays.Cut() overlays += emag overlays += sparks @@ -224,11 +219,7 @@ src.locked = 0 src.broken = 1 user << "You unlock \the [src]." - return - if(!opened) - src.togglelock(user) - return - return ..() + return 1 /obj/structure/closet/crate/secure/emp_act(severity) for(var/obj/O in src) @@ -250,7 +241,7 @@ open() else src.req_access = list() - src.req_access += pick(get_all_accesses()) + src.req_access += pick(get_all_station_access()) ..() /obj/structure/closet/crate/plastic diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 3d65ce02c03..cbebfae872b 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -13,8 +13,8 @@ if(istype(W, /obj/item/weapon/crowbar)) new /obj/item/stack/material/wood(src) var/turf/T = get_turf(src) - for(var/atom/movable/M in contents) - M.forceMove(T) + for(var/atom/movable/AM in contents) + if(AM.simulated) AM.forceMove(T) user.visible_message("[user] pries \the [src] open.", \ "You pry open \the [src].", \ "You hear splitting wood.") diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index dc5e309f17f..f8e8a0a414b 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -44,6 +44,14 @@ color = "#B8F5E3" alpha = 200 +/obj/structure/curtain/open/bed + name = "bed curtain" + color = "#854636" + +/obj/structure/curtain/open/privacy + name = "privacy curtain" + color = "#B8F5E3" + /obj/structure/curtain/open/shower name = "shower curtain" color = "#ACD1E9" diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index d343e411599..b98b730b61c 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -29,27 +29,11 @@ /obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage + health -= Proj.get_structure_damage() ..() src.healthcheck() return - -/obj/structure/displaycase/blob_act() - if (prob(75)) - new /obj/item/weapon/material/shard( src.loc ) - if (occupied) - new /obj/item/weapon/gun/energy/captain( src.loc ) - occupied = 0 - qdel(src) - - -/obj/structure/displaycase/meteorhit(obj/O as obj) - new /obj/item/weapon/material/shard( src.loc ) - new /obj/item/weapon/gun/energy/captain( src.loc ) - qdel(src) - - /obj/structure/displaycase/proc/healthcheck() if (src.health <= 0) if (!( src.destroyed )) @@ -71,6 +55,7 @@ /obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) src.health -= W.force src.healthcheck() ..() @@ -79,16 +64,16 @@ /obj/structure/displaycase/attack_hand(mob/user as mob) if (src.destroyed && src.occupied) new /obj/item/weapon/gun/energy/captain( src.loc ) - user << "\b You deactivate the hover field built into the case." + user << "You deactivate the hover field built into the case." src.occupied = 0 src.add_fingerprint(user) update_icon() return else - usr << text("\blue You kick the display case.") + usr << text("You kick the display case.") for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << text("\red [] kicks the display case.", usr) + O << "[usr] kicks the display case." src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 4e3a6298f7e..0994ed3e653 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -4,6 +4,7 @@ icon_state = "door_as_0" anchored = 0 density = 1 + w_class = 5 var/state = 0 var/base_icon_state = "" var/base_name = "Airlock" @@ -149,7 +150,7 @@ user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.") if(do_after(user, 40)) if(!src || !WT.isOn()) return - user << "\blue You welded the [glass] plating off!" + user << "You welded the [glass] plating off!" var/M = text2path("/obj/item/stack/material/[glass]") new M(src.loc, 2) glass = 0 @@ -157,18 +158,18 @@ user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.") if(do_after(user, 40)) if(!src || !WT.isOn()) return - user << "\blue You welded the glass panel out!" + user << "You welded the glass panel out!" new /obj/item/stack/material/glass/reinforced(src.loc) glass = 0 else if(!anchored) user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.") if(do_after(user, 40)) if(!src || !WT.isOn()) return - user << "\blue You dissasembled the airlock assembly!" + user << "You dissasembled the airlock assembly!" new /obj/item/stack/material/steel(src.loc, 4) qdel (src) else - user << "\blue You need more welding fuel." + user << "You need more welding fuel." return else if(istype(W, /obj/item/weapon/wrench) && state == 0) @@ -180,7 +181,7 @@ if(do_after(user, 40)) if(!src) return - user << "\blue You [anchored? "un" : ""]secured the airlock assembly!" + user << "You [anchored? "un" : ""]secured the airlock assembly!" anchored = !anchored else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored) @@ -200,7 +201,7 @@ if(do_after(user, 40)) if(!src) return - user << "\blue You cut the airlock wires.!" + user << "You cut the airlock wires.!" new/obj/item/stack/cable_coil(src.loc, 1) src.state = 0 @@ -212,7 +213,7 @@ if(!src) return user.drop_item() W.loc = src - user << "\blue You installed the airlock electronics!" + user << "You installed the airlock electronics!" src.state = 2 src.name = "Near finished Airlock Assembly" src.electronics = W @@ -229,7 +230,7 @@ if(do_after(user, 40)) if(!src) return - user << "\blue You removed the airlock electronics!" + user << "You removed the airlock electronics!" src.state = 1 src.name = "Wired Airlock Assembly" electronics.loc = src.loc @@ -262,11 +263,11 @@ else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 ) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "\blue Now finishing the airlock." + user << "Now finishing the airlock." if(do_after(user, 40)) if(!src) return - user << "\blue You finish the airlock!" + user << "You finish the airlock!" var/path if(istext(glass)) path = text2path("/obj/machinery/door/airlock/[glass]") @@ -275,8 +276,7 @@ else path = text2path("/obj/machinery/door/airlock[airlock_type]") - var/obj/machinery/door/new_airlock = new path(src.loc, src) - new_airlock.dir = src.dir + new path(src.loc, src) qdel(src) else ..() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 0b6e579083d..c8ccd4b32bd 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -31,8 +31,14 @@ /obj/structure/extinguisher_cabinet/attack_hand(mob/user) if(isrobot(user)) return - if (!user.can_use_hand()) - return + if (ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + if (user.hand) + temp = H.organs_by_name["l_hand"] + if(temp && !temp.is_usable()) + user << "You try to move your [temp.name], but cannot!" + return if(has_extinguisher) user.put_in_hands(has_extinguisher) user << "You take [has_extinguisher] from [src]." diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm new file mode 100644 index 00000000000..a19693f5ab9 --- /dev/null +++ b/code/game/objects/structures/fireaxe_cabinet.dm @@ -0,0 +1,135 @@ +/obj/structure/fireaxecabinet + name = "fire axe cabinet" + desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." + icon_state = "fireaxe" + anchored = 1 + density = 0 + + var/damage_threshold = 15 + var/open + var/unlocked + var/shattered + var/obj/item/weapon/material/twohanded/fireaxe/fireaxe + +/obj/structure/fireaxecabinet/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker) + user.do_attack_animation(src) + playsound(user, 'sound/effects/Glasshit.ogg', 50, 1) + visible_message("[user] [attack_verb] \the [src]!") + if(damage_threshold > damage) + user << "Your strike is deflected by the reinforced glass!" + return + if(shattered) + return + shattered = 1 + unlocked = 1 + open = 1 + playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) + update_icon() + +/obj/structure/fireaxecabinet/update_icon() + overlays.Cut() + if(fireaxe) + overlays += image(icon, "fireaxe_item") + if(shattered) + overlays += image(icon, "fireaxe_window_broken") + else if(!open) + overlays += image(icon, "fireaxe_window") + +/obj/structure/fireaxecabinet/New() + ..() + fireaxe = new(src) + update_icon() + +/obj/structure/fireaxecabinet/attack_ai(var/mob/user) + toggle_lock(user) + +/obj/structure/fireaxecabinet/attack_hand(var/mob/user) + if(!unlocked) + user << "\The [src] is locked." + return + toggle_open(user) + +/obj/structure/fireaxecabinet/MouseDrop(over_object, src_location, over_location) + if(over_object == usr) + var/mob/user = over_object + if(!istype(user)) + return + + if(!open) + user << "\The [src] is closed." + return + + if(!fireaxe) + user << "\The [src] is empty." + return + + fireaxe.forceMove(get_turf(user)) + user.put_in_hands(fireaxe) + fireaxe = null + update_icon() + + return + +/obj/structure/fireaxecabinet/Destroy() + if(fireaxe) + fireaxe.forceMove(get_turf(src)) + fireaxe = null + return ..() + +/obj/structure/fireaxecabinet/attackby(var/obj/item/O, var/mob/user) + + if(istype(O, /obj/item/device/multitool)) + toggle_lock(user) + return + + if(istype(O, /obj/item/weapon/material/twohanded/fireaxe)) + if(open) + if(fireaxe) + user << "There is already \a [fireaxe] inside \the [src]." + else if(user.unEquip(O)) + O.forceMove(src) + fireaxe = O + user << "You place \the [fireaxe] into \the [src]." + update_icon() + return + + if(O.force) + user.setClickCooldown(10) + attack_generic(user, O.force, "bashes") + return + + return ..() + +/obj/structure/fireaxecabinet/proc/toggle_open(var/mob/user) + if(shattered) + open = 1 + unlocked = 1 + else + user.setClickCooldown(10) + open = !open + user << "You [open ? "open" : "close"] \the [src]." + update_icon() + +/obj/structure/fireaxecabinet/proc/toggle_lock(var/mob/user) + + + if(open) + return + + if(shattered) + open = 1 + unlocked = 1 + else + user.setClickCooldown(10) + user << "You begin [unlocked ? "enabling" : "disabling"] \the [src]'s maglock." + + if(!do_after(user, 20)) + return + + if(shattered) return + + unlocked = !unlocked + playsound(user, 'sound/machines/lockreset.ogg', 50, 1) + user << "You [unlocked ? "disable" : "enable"] the maglock." + + update_icon() diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 4a132532385..341eb6215b4 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -3,6 +3,7 @@ anchored = 1 density = 1 layer = 2 + w_class = 5 var/state = 0 var/health = 200 var/cover = 50 //how much cover the girder provides against projectiles. @@ -28,11 +29,10 @@ if(Proj.original != src && !prob(cover)) return PROJECTILE_CONTINUE //pass through - //Tasers and the like should not damage girders. - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + var/damage = Proj.get_structure_damage() + if(!damage) return - var/damage = Proj.damage if(!istype(Proj, /obj/item/projectile/beam)) damage *= 0.4 //non beams do reduced damage @@ -234,10 +234,6 @@ return return ..() -/obj/structure/girder/blob_act() - if(prob(40)) - qdel(src) - /obj/structure/girder/ex_act(severity) switch(severity) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 5f5dcaa48ab..dcf500d1541 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -6,7 +6,6 @@ density = 1 anchored = 1 flags = CONDUCT - pressure_resistance = 5*ONE_ATMOSPHERE layer = 2.9 explosion_resistance = 1 var/health = 10 @@ -16,12 +15,6 @@ /obj/structure/grille/ex_act(severity) qdel(src) -/obj/structure/grille/blob_act() - qdel(src) - -/obj/structure/grille/meteorhit(var/obj/M) - qdel(src) - /obj/structure/grille/update_icon() if(destroyed) icon_state = "[initial(icon_state)]-b" @@ -33,6 +26,7 @@ /obj/structure/grille/attack_hand(mob/user as mob) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) user.do_attack_animation(src) @@ -67,13 +61,11 @@ /obj/structure/grille/bullet_act(var/obj/item/projectile/Proj) if(!Proj) return - //Tasers and the like should not damage grilles. - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - //Flimsy grilles aren't so great at stopping projectiles. However they can absorb some of the impact - var/damage = Proj.damage + var/damage = Proj.get_structure_damage() var/passthrough = 0 + + if(!damage) return //20% chance that the grille provides a bit more cover than usual. Support structure for example might take up 20% of the grille's area. //If they click on the grille itself then we assume they are aiming at the grille itself and the extra cover behaviour is always used. @@ -158,7 +150,8 @@ //window placing end else if(!(W.flags & CONDUCT) || !shock(user, 70)) - user.do_attack_animation(src) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(src) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) switch(W.damtype) if("fire") diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 91642f3ebbc..9f276aeb63f 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -1,30 +1,47 @@ /obj/item/inflatable + name = "inflatable" + w_class = 2 + icon = 'icons/obj/inflatable.dmi' + var/deploy_path = null + +/obj/item/inflatable/attack_self(mob/user) + if(!deploy_path) + return + playsound(loc, 'sound/items/zip.ogg', 75, 1) + user << "You inflate \the [src]." + var/obj/structure/inflatable/R = new deploy_path(user.loc) + src.transfer_fingerprints_to(R) + R.add_fingerprint(user) + qdel(src) + + +/obj/item/inflatable/wall name = "inflatable wall" desc = "A folded membrane which rapidly expands into a large cubical shape on activation." - icon = 'icons/obj/inflatable.dmi' icon_state = "folded_wall" - w_class = 3 + deploy_path = /obj/structure/inflatable/wall - attack_self(mob/user) - playsound(loc, 'sound/items/zip.ogg', 75, 1) - user << "\blue You inflate [src]." - var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc) - src.transfer_fingerprints_to(R) - R.add_fingerprint(user) - qdel(src) +/obj/item/inflatable/door/ + name = "inflatable door" + desc = "A folded membrane which rapidly expands into a simple door on activation." + icon_state = "folded_door" + deploy_path = /obj/structure/inflatable/door /obj/structure/inflatable - name = "inflatable wall" + name = "inflatable" desc = "An inflated membrane. Do not puncture." density = 1 anchored = 1 opacity = 0 - icon = 'icons/obj/inflatable.dmi' icon_state = "wall" + var/undeploy_path = null var/health = 50.0 +/obj/structure/inflatable/wall + name = "inflatable wall" + undeploy_path = /obj/item/inflatable/wall /obj/structure/inflatable/New(location) ..() @@ -38,10 +55,10 @@ return 0 /obj/structure/inflatable/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - - health -= Proj.damage + var/proj_damage = Proj.get_structure_damage() + if(!proj_damage) return + + health -= proj_damage ..() if(health <= 0) deflate(1) @@ -60,21 +77,15 @@ deflate(1) return -/obj/structure/inflatable/blob_act() - deflate(1) - -/obj/structure/inflatable/meteorhit() - deflate(1) - /obj/structure/inflatable/attack_hand(mob/user as mob) - add_fingerprint(user) - return + add_fingerprint(user) + return /obj/structure/inflatable/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(!istype(W)) return + if(!istype(W) || istype(W, /obj/item/weapon/inflatable_dispenser)) return if (can_puncture(W)) - visible_message("\red [user] pierces [src] with [W]!") + visible_message("[user] pierces [src] with [W]!") deflate(1) if(W.damtype == BRUTE || W.damtype == BURN) hit(W.force) @@ -88,6 +99,9 @@ if(health <= 0) deflate(1) +/obj/structure/inflatable/CtrlClick() + hand_deflate() + /obj/structure/inflatable/proc/deflate(var/violent=0) playsound(loc, 'sound/machines/hiss.ogg', 75, 1) if(violent) @@ -96,10 +110,11 @@ src.transfer_fingerprints_to(R) qdel(src) else - //user << "\blue You slowly deflate the inflatable wall." - visible_message("[src] slowly deflates.") + if(!undeploy_path) + return + visible_message("\The [src] slowly deflates.") spawn(50) - var/obj/item/inflatable/R = new /obj/item/inflatable(loc) + var/obj/item/inflatable/R = new undeploy_path(src.loc) src.transfer_fingerprints_to(R) qdel(src) @@ -108,7 +123,7 @@ set category = "Object" set src in oview(1) - if(isobserver(usr)) //to stop ghosts from deflating + if(isobserver(usr) || usr.restrained() || !usr.Adjacent(src)) return verbs -= /obj/structure/inflatable/verb/hand_deflate @@ -124,28 +139,14 @@ user.visible_message("[user] [attack_verb] at [src]!") return 1 -/obj/item/inflatable/door/ - name = "inflatable door" - desc = "A folded membrane which rapidly expands into a simple door on activation." - icon = 'icons/obj/inflatable.dmi' - icon_state = "folded_door" - - attack_self(mob/user) - playsound(loc, 'sound/items/zip.ogg', 75, 1) - user << "\blue You inflate [src]." - var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc) - src.transfer_fingerprints_to(R) - R.add_fingerprint(user) - qdel(src) - /obj/structure/inflatable/door //Based on mineral door code name = "inflatable door" density = 1 anchored = 1 opacity = 0 - icon = 'icons/obj/inflatable.dmi' icon_state = "door_closed" + undeploy_path = /obj/item/inflatable/door var/state = 0 //closed, 1 == open var/isSwitchingStates = 0 @@ -171,7 +172,6 @@ if(isSwitchingStates) return if(ismob(user)) var/mob/M = user - if(world.time - user.last_bumped <= 60) return //NOTE do we really need that? if(M.client) if(iscarbon(M)) var/mob/living/carbon/C = M @@ -236,7 +236,7 @@ icon_state = "folded_wall_torn" attack_self(mob/user) - user << "\blue The inflatable wall is too torn to be inflated!" + user << "The inflatable wall is too torn to be inflated!" add_fingerprint(user) /obj/item/inflatable/door/torn @@ -246,7 +246,7 @@ icon_state = "folded_door_torn" attack_self(mob/user) - user << "\blue The inflatable door is too torn to be inflated!" + user << "The inflatable door is too torn to be inflated!" add_fingerprint(user) /obj/item/weapon/storage/briefcase/inflatable @@ -254,6 +254,7 @@ desc = "Contains inflatable walls and doors." icon_state = "inf_box" item_state = "syringe_kit" + w_class = 3 max_storage_space = 28 can_hold = list(/obj/item/inflatable) @@ -262,7 +263,7 @@ new /obj/item/inflatable/door(src) new /obj/item/inflatable/door(src) new /obj/item/inflatable/door(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) - new /obj/item/inflatable(src) + new /obj/item/inflatable/wall(src) + new /obj/item/inflatable/wall(src) + new /obj/item/inflatable/wall(src) + new /obj/item/inflatable/wall(src) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 2ade2520f24..88c136b8411 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -304,7 +304,6 @@ /obj/structure/bed/chair/janicart/New() create_reagents(100) - update_layer() /obj/structure/bed/chair/janicart/examine(mob/user) @@ -364,13 +363,6 @@ return ..() -/obj/structure/bed/chair/janicart/update_layer() - if(dir == SOUTH) - layer = FLY_LAYER - else - layer = OBJ_LAYER - - /obj/structure/bed/chair/janicart/unbuckle_mob() var/mob/living/M = ..() if(M) @@ -381,7 +373,6 @@ /obj/structure/bed/chair/janicart/set_dir() ..() - update_layer() if(buckled_mob) if(buckled_mob.loc != loc) buckled_mob.buckled = null //Temporary, so Move() succeeds. diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index e865805991b..8596ce037d7 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -32,7 +32,7 @@ if(istype(victim, /mob/living/carbon/human)) var/mob/living/carbon/human/H = victim - if(!H.species.is_small) + if(!issmall(H)) return 0 meat_type = H.species.meat_type icon_state = "spikebloody" diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm deleted file mode 100644 index fc57ac4f8e7..00000000000 --- a/code/game/objects/structures/ladders.dm +++ /dev/null @@ -1,70 +0,0 @@ -/obj/structure/ladder - name = "ladder" - desc = "A sturdy metal ladder." - icon = 'icons/obj/structures.dmi' - icon_state = "ladder11" - var/id = null - var/height = 0 //the 'height' of the ladder. higher numbers are considered physically higher - var/obj/structure/ladder/down = null //the ladder below this one - var/obj/structure/ladder/up = null //the ladder above this one - -/obj/structure/ladder/New() - spawn(8) - for(var/obj/structure/ladder/L in world) - if(L.id == id) - if(L.height == (height - 1)) - down = L - continue - if(L.height == (height + 1)) - up = L - continue - - if(up && down) //if both our connections are filled - break - update_icon() - -/obj/structure/ladder/update_icon() - if(up && down) - icon_state = "ladder11" - - else if(up) - icon_state = "ladder10" - - else if(down) - icon_state = "ladder01" - - else //wtf make your ladders properly assholes - icon_state = "ladder00" - -/obj/structure/ladder/attack_hand(mob/user as mob) - if(up && down) - switch( alert("Go up or down the ladder?", "Ladder", "Up", "Down", "Cancel") ) - if("Up") - user.visible_message("[user] climbs up \the [src]!", \ - "You climb up \the [src]!") - user.loc = get_turf(up) - up.add_fingerprint(user) - if("Down") - user.visible_message("[user] climbs down \the [src]!", \ - "You climb down \the [src]!") - user.loc = get_turf(down) - down.add_fingerprint(user) - if("Cancel") - return - - else if(up) - user.visible_message("[user] climbs up \the [src]!", \ - "You climb up \the [src]!") - user.loc = get_turf(up) - up.add_fingerprint(user) - - else if(down) - user.visible_message("[user] climbs down \the [src]!", \ - "You climb down \the [src]!") - user.loc = get_turf(down) - down.add_fingerprint(user) - - add_fingerprint(user) - -/obj/structure/ladder/attackby(obj/item/weapon/W, mob/user as mob) - return attack_hand(user) diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm deleted file mode 100644 index 1ab233a3ba5..00000000000 --- a/code/game/objects/structures/lamarr_cage.dm +++ /dev/null @@ -1,101 +0,0 @@ -/obj/structure/lamarr - name = "lab cage" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "labcage1" - desc = "A glass lab container for storing interesting creatures." - density = 1 - anchored = 1 - unacidable = 1//Dissolving the case would also delete Lamarr - var/health = 30 - var/occupied = 1 - var/destroyed = 0 - -/obj/structure/lamarr/ex_act(severity) - switch(severity) - if (1) - new /obj/item/weapon/material/shard( src.loc ) - Break() - qdel(src) - if (2) - if (prob(50)) - src.health -= 15 - src.healthcheck() - if (3) - if (prob(50)) - src.health -= 5 - src.healthcheck() - - -/obj/structure/lamarr/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - ..() - src.healthcheck() - return - - -/obj/structure/lamarr/blob_act() - if (prob(75)) - new /obj/item/weapon/material/shard( src.loc ) - Break() - qdel(src) - - -/obj/structure/lamarr/meteorhit(obj/O as obj) - new /obj/item/weapon/material/shard( src.loc ) - Break() - qdel(src) - - -/obj/structure/lamarr/proc/healthcheck() - if (src.health <= 0) - if (!( src.destroyed )) - src.density = 0 - src.destroyed = 1 - new /obj/item/weapon/material/shard( src.loc ) - playsound(src, "shatter", 70, 1) - Break() - else - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - return - -/obj/structure/lamarr/update_icon() - if(src.destroyed) - src.icon_state = "labcageb[src.occupied]" - else - src.icon_state = "labcage[src.occupied]" - return - - -/obj/structure/lamarr/attackby(obj/item/weapon/W as obj, mob/user as mob) - src.health -= W.force - src.healthcheck() - ..() - return - -/obj/structure/lamarr/attack_hand(mob/user as mob) - if (src.destroyed) - return - else - usr << text("\blue You kick the lab cage.") - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << text("\red [] kicks the lab cage.", usr) - src.health -= 2 - healthcheck() - return - -/obj/structure/lamarr/proc/Break() - if(occupied) - new /obj/item/clothing/mask/facehugger/lamarr(src.loc) - occupied = 0 - update_icon() - return - -/obj/item/clothing/mask/facehugger/lamarr - name = "Lamarr" - desc = "The worst she might do is attempt to... couple with your head."//hope we don't get sued over a harmless reference, rite? - sterile = 1 - gender = FEMALE - -/obj/item/clothing/mask/facehugger/lamarr/New()//to prevent deleting it if aliums are disabled - return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index f90bc29b2c0..e08a5cee614 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -5,13 +5,14 @@ icon_state = "latticefull" density = 0 anchored = 1.0 + w_class = 3 layer = 2.3 //under pipes // flags = CONDUCT -/obj/structure/lattice/New() +/obj/structure/lattice/initialize() ..() ///// Z-Level Stuff - if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/floor/open))) + if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open))) ///// Z-Level Stuff qdel(src) for(var/obj/structure/lattice/LAT in src.loc) @@ -34,10 +35,6 @@ L.updateOverlays(src.loc) ..() -/obj/structure/lattice/blob_act() - qdel(src) - return - /obj/structure/lattice/ex_act(severity) switch(severity) if(1.0) @@ -53,14 +50,14 @@ /obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob) - if (istype(C, /obj/item/stack/tile/steel)) + if (istype(C, /obj/item/stack/tile/floor)) var/turf/T = get_turf(src) T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead return if (istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = C if(WT.remove_fuel(0, user)) - user << "\blue Slicing lattice joints ..." + user << "Slicing lattice joints ..." PoolOrNew(/obj/item/stack/rods, src.loc) qdel(src) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index ed5a972430f..e88ad682ed9 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -14,10 +14,10 @@ if(shattered) return if(ishuman(user)) - var/obj/nano_module/appearance_changer/AC = ui_users[user] + var/datum/nano_module/appearance_changer/AC = ui_users[user] if(!AC) AC = new(src, user) - AC.name = "SalonPro Nano-Mirror(TM)" + AC.name = "SalonPro Nano-Mirror™" ui_users[user] = AC AC.ui_interact(user) @@ -30,10 +30,8 @@ /obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - if(prob(Proj.damage * 2)) + if(prob(Proj.get_structure_damage() * 2)) if(!shattered) shatter() else @@ -60,12 +58,19 @@ return 0 if(damage) - user.visible_message("[user] smashes [src]!") + user.visible_message("[user] smashes [src]!") shatter() else user.visible_message("[user] hits [src] and bounces off!") return 1 +/obj/structure/mirror/Destroy() + for(var/user in ui_users) + var/datum/nano_module/appearance_changer/AC = ui_users[user] + qdel(AC) + ui_users.Cut() + ..() + // The following mirror is ~special~. /obj/structure/mirror/raider name = "cracked mirror" @@ -93,3 +98,27 @@ raiders.update_access(vox) qdel(user) ..() + +/obj/item/weapon/mirror + name = "mirror" + desc = "A SalonPro Nano-Mirror(TM) brand mirror! Now a portable version." + icon = 'icons/obj/items.dmi' + icon_state = "mirror" + var/list/ui_users = list() + +/obj/item/weapon/mirror/attack_self(mob/user as mob) + if(ishuman(user)) + var/datum/nano_module/appearance_changer/AC = ui_users[user] + if(!AC) + AC = new(src, user) + AC.name = "SalonPro Nano-Mirror™" + AC.flags = APPEARANCE_HAIR + ui_users[user] = AC + AC.ui_interact(user) + +/obj/item/weapon/mirror/Destroy() + for(var/user in ui_users) + var/datum/nano_module/appearance_changer/AC = ui_users[user] + qdel(AC) + ui_users.Cut() + ..() \ No newline at end of file diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index ace1293fc7d..8325b9fda5c 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -4,14 +4,14 @@ icon = 'icons/obj/janitor.dmi' icon_state = "mopbucket" density = 1 - pressure_resistance = 5 + w_class = 3 flags = OPENCONTAINER var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite /obj/structure/mopbucket/New() create_reagents(100) - + ..() /obj/structure/mopbucket/examine(mob/user) if(..(user, 1)) @@ -20,8 +20,8 @@ /obj/structure/mopbucket/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/mop)) if(reagents.total_volume < 1) - user << "[src] is out of water!" + user << "\The [src] is out of water!" else reagents.trans_to_obj(I, 5) - user << "You wet [I] in [src]." + user << "You wet \the [I] in \the [src]." playsound(loc, 'sound/effects/slosh.ogg', 25, 1) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index b7c980e0d39..58f89dc3fff 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -60,9 +60,6 @@ return return -/obj/structure/morgue/alter_health() - return src.loc - /obj/structure/morgue/attack_hand(mob/user as mob) if (src.connected) for(var/atom/movable/A as mob|obj in src.connected.loc) @@ -170,7 +167,7 @@ if (user != O) for(var/mob/B in viewers(user, 3)) if ((B.client && !( B.blinded ))) - B << text("\red [] stuffs [] into []!", user, O, src) + B << "\The [user] stuffs [O] into [src]!" return @@ -189,11 +186,21 @@ var/cremating = 0 var/id = 1 var/locked = 0 + var/_wifi_id + var/datum/wifi/receiver/button/crematorium/wifi_receiver + +/obj/structure/crematorium/initialize() + ..() + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) /obj/structure/crematorium/Destroy() if(connected) qdel(connected) connected = null + if(wifi_receiver) + qdel(wifi_receiver) + wifi_receiver = null return ..() /obj/structure/crematorium/proc/update() @@ -230,18 +237,15 @@ return return -/obj/structure/crematorium/alter_health() - return src.loc - /obj/structure/crematorium/attack_hand(mob/user as mob) // if (cremating) AWW MAN! THIS WOULD BE SO MUCH MORE FUN ... TO WATCH -// user.show_message("\red Uh-oh, that was a bad idea.", 1) +// user.show_message("Uh-oh, that was a bad idea.", 1) // //usr << "Uh-oh, that was a bad idea." // src:loc:poison += 20000000 // src:loc:firelevel = src:loc:poison // return if (cremating) - usr << "\red It's locked." + usr << "It's locked." return if ((src.connected) && (src.locked == 0)) for(var/atom/movable/A as mob|obj in src.connected.loc) @@ -310,7 +314,7 @@ if(contents.len <= 0) for (var/mob/M in viewers(src)) - M.show_message("\red You hear a hollow crackle.", 1) + M.show_message("You hear a hollow crackle.", 1) return else @@ -319,7 +323,7 @@ return for (var/mob/M in viewers(src)) - M.show_message("\red You hear a roar as the crematorium activates.", 1) + M.show_message("You hear a roar as the crematorium activates.", 1) cremating = 1 locked = 1 @@ -397,7 +401,7 @@ if (user != O) for(var/mob/B in viewers(user, 3)) if ((B.client && !( B.blinded ))) - B << text("\red [] stuffs [] into []!", user, O, src) + B << text("[] stuffs [] into []!", user, O, src) //Foreach goto(99) return @@ -409,6 +413,9 @@ req_access = list(access_crematorium) id = 1 +/obj/machinery/button/crematorium/update_icon() + return + /obj/machinery/button/crematorium/attack_hand(mob/user as mob) if(..()) return diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 425c03ad8c5..fa53637f880 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -291,7 +291,7 @@ Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
      By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.
      Example: C,D,E,F,G,A,B will play a C major scale.
      - After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
      + After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
      Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B
      A pause may be denoted by an empty chord: C,E,,C,G
      To make a chord be a different time, end it with /x, where the chord length will be length
      @@ -415,20 +415,20 @@ if (istype(O, /obj/item/weapon/wrench)) if (anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to loosen \the [src]'s casters..." + user << "You begin to loosen \the [src]'s casters..." if (do_after(user, 40)) user.visible_message( \ "[user] loosens \the [src]'s casters.", \ - "\blue You have loosened \the [src]. Now it can be pulled somewhere else.", \ + "You have loosened \the [src]. Now it can be pulled somewhere else.", \ "You hear ratchet.") src.anchored = 0 else playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to tighten \the [src] to the floor..." + user << "You begin to tighten \the [src] to the floor..." if (do_after(user, 20)) user.visible_message( \ "[user] tightens \the [src]'s casters.", \ - "\blue You have tightened \the [src]'s casters. Now it can be played again.", \ + "You have tightened \the [src]'s casters. Now it can be played again.", \ "You hear ratchet.") src.anchored = 1 else diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 199635cd0fe..a3904f65a1b 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -160,18 +160,9 @@ FLOOR SAFES return -obj/structure/safe/blob_act() - return - - obj/structure/safe/ex_act(severity) return - -obj/structure/safe/meteorhit(obj/O as obj) - return - - //FLOOR SAFES /obj/structure/safe/floor name = "floor safe" @@ -180,12 +171,15 @@ obj/structure/safe/meteorhit(obj/O as obj) level = 1 //underfloor layer = 2.5 - /obj/structure/safe/floor/initialize() ..() var/turf/T = loc - hide(T.intact) - + if(istype(T) && !T.is_plating()) + hide(1) + update_icon() /obj/structure/safe/floor/hide(var/intact) invisibility = intact ? 101 : 0 + +/obj/structure/safe/floor/hides_under_flooring() + return 1 diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index a93523a7df9..3ecfa6149df 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -4,6 +4,7 @@ opacity = 0 density = 0 layer = 3.5 + w_class = 3 /obj/structure/sign/ex_act(severity) switch(severity) @@ -19,10 +20,6 @@ else return -/obj/structure/sign/blob_act() - qdel(src) - return - /obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction if(istype(tool, /obj/item/weapon/screwdriver) && !istype(src, /obj/structure/sign/double)) user << "You unfasten the sign with your [tool]." @@ -178,6 +175,11 @@ desc = "A warning sign which reads 'HYDROPONICS'." icon_state = "hydro1" +/obj/structure/sign/directions + name = "direction sign" + desc = "A direction sign, claiming to know the way." + icon_state = "direction" + /obj/structure/sign/directions/science name = "\improper Science department" desc = "A direction sign, pointing out which way the Science department is." 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 6c3db50c877..669f88110e1 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -12,7 +12,6 @@ desc = "This is used to lie in, sleep in or strap on." icon = 'icons/obj/furniture.dmi' icon_state = "bed" - pressure_resistance = 15 anchored = 1 can_buckle = 1 buckle_dir = SOUTH @@ -57,6 +56,7 @@ I.color = padding_material.icon_colour stool_cache[padding_cache_key] = I overlays |= stool_cache[padding_cache_key] + // Strings. desc = initial(desc) if(padding_material) @@ -86,11 +86,6 @@ qdel(src) return -/obj/structure/bed/blob_act() - if(prob(75)) - material.place_sheet(get_turf(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) @@ -224,7 +219,7 @@ if(istype(W,/obj/item/roller_holder)) var/obj/item/roller_holder/RH = W if(!RH.held) - user << "\blue You collect the roller bed." + user << "You collect the roller bed." src.loc = RH RH.held = src return @@ -245,10 +240,10 @@ /obj/item/roller_holder/attack_self(mob/user as mob) if(!held) - user << "\blue The rack is empty." + user << "The rack is empty." return - user << "\blue You deploy the roller bed." + user << "You deploy the roller bed." var/obj/structure/bed/roller/R = new /obj/structure/bed/roller(user.loc) R.add_fingerprint(user) qdel(held) 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 ae4fe4d7401..b91beabfaf8 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -8,12 +8,6 @@ buckle_lying = 0 //force people to sit up in chairs when buckled var/propelled = 0 // Check for fire-extinguisher-driven chairs -/obj/structure/bed/chair/New() - ..() //Todo make metal/stone chairs display as thrones - spawn(3) //sorry. i don't think there's a better way to do this. - update_layer() - return - /obj/structure/bed/chair/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if(!padding_material && istype(W, /obj/item/assembly/shock_kit)) @@ -42,8 +36,26 @@ /obj/structure/bed/chair/update_icon() ..() + + var/cache_key = "[base_icon]-[material.name]-over" + if(isnull(stool_cache[cache_key])) + var/image/I = image('icons/obj/furniture.dmi', "[base_icon]_over") + I.color = material.icon_colour + I.layer = FLY_LAYER + stool_cache[cache_key] = I + overlays |= stool_cache[cache_key] + // Padding overlay. + if(padding_material) + var/padding_cache_key = "[base_icon]-padding-[padding_material.name]-over" + if(isnull(stool_cache[padding_cache_key])) + var/image/I = image(icon, "[base_icon]_padding_over") + I.color = padding_material.icon_colour + I.layer = FLY_LAYER + stool_cache[padding_cache_key] = I + overlays |= stool_cache[padding_cache_key] + if(buckled_mob && padding_material) - var/cache_key = "[base_icon]-armrest-[padding_material.name]" + cache_key = "[base_icon]-armrest-[padding_material.name]" if(isnull(stool_cache[cache_key])) var/image/I = image(icon, "[base_icon]_armrest") I.layer = MOB_LAYER + 0.1 @@ -51,15 +63,8 @@ stool_cache[cache_key] = I overlays |= stool_cache[cache_key] -/obj/structure/bed/chair/proc/update_layer() - if(src.dir == NORTH) - src.layer = FLY_LAYER - else - src.layer = OBJ_LAYER - /obj/structure/bed/chair/set_dir() ..() - update_layer() if(buckled_mob) buckled_mob.set_dir(dir) @@ -172,6 +177,12 @@ /obj/structure/bed/chair/office/dark icon_state = "officechair_dark" +/obj/structure/bed/chair/office/New() + ..() + var/image/I = image(icon, "[icon_state]_over") + I.layer = FLY_LAYER + overlays += I + // Chair types /obj/structure/bed/chair/wood name = "wooden chair" @@ -188,6 +199,9 @@ /obj/structure/bed/chair/wood/New(var/newloc) ..(newloc, "wood") + var/image/I = image(icon, "[icon_state]_over") + I.layer = FLY_LAYER + overlays += I /obj/structure/bed/chair/wood/wings icon_state = "wooden_chair_wings" 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 2228345ebbf..1faf83f4414 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -72,6 +72,9 @@ var/global/list/stool_cache = list() //haha stool /obj/item/weapon/stool/attack(mob/M as mob, mob/user as mob) if (prob(5) && istype(M,/mob/living)) user.visible_message("[user] breaks [src] over [M]'s back!") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + user.remove_from_mob(src) dismantle() qdel(src) @@ -95,11 +98,6 @@ var/global/list/stool_cache = list() //haha stool qdel(src) return -/obj/item/weapon/stool/blob_act() - if(prob(75)) - material.place_sheet(get_turf(src)) - qdel(src) - /obj/item/weapon/stool/proc/dismantle() if(material) material.place_sheet(get_turf(src)) diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 824b33eab2a..2bcbf8aa878 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -15,7 +15,7 @@ /obj/structure/bed/chair/wheelchair/set_dir() ..() overlays = null - var/image/O = image(icon = 'icons/obj/objects.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir) + var/image/O = image(icon = 'icons/obj/furniture.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir) overlays += O if(buckled_mob) buckled_mob.set_dir(dir) @@ -31,7 +31,7 @@ if(user==pulling) pulling = null user.pulledby = null - user << "\red You lost your grip!" + user << "You lost your grip!" return if(buckled_mob && pulling && user == buckled_mob) if(pulling.stat || pulling.stunned || pulling.weakened || pulling.paralysis || pulling.lying || pulling.restrained()) @@ -49,10 +49,10 @@ if(user==pulling) return if(pulling && (get_dir(src.loc, pulling.loc) == direction)) - user << "\red You cannot go there." + user << "You cannot go there." return if(pulling && buckled_mob && (buckled_mob == user)) - user << "\red You cannot drive while being pushed." + user << "You cannot drive while being pushed." return // Let's roll @@ -103,7 +103,7 @@ unbuckle_mob() if (pulling && (get_dist(src, pulling) > 1)) pulling.pulledby = null - pulling << "\red You lost your grip!" + pulling << "You lost your grip!" pulling = null else if (occupant && (src.loc != occupant.loc)) @@ -116,26 +116,21 @@ user_unbuckle_mob(user) return -/obj/structure/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) - ..() - if(over_object == usr && in_range(src, usr)) - if(!ishuman(usr)) return - if(usr == buckled_mob) - usr << "\red You realize you are unable to push the wheelchair you sit in." +/obj/structure/bed/chair/wheelchair/CtrlClick(var/mob/user) + if(in_range(src, user)) + if(!ishuman(user)) return + if(user == buckled_mob) + user << "You realize you are unable to push the wheelchair you sit in." return if(!pulling) - pulling = usr - usr.pulledby = src - if(usr.pulling) - usr.stop_pulling() - usr.set_dir(get_dir(usr, src)) - usr << "You grip \the [name]'s handles." + pulling = user + user.pulledby = src + if(user.pulling) + user.stop_pulling() + user.set_dir(get_dir(user, src)) + user << "You grip \the [name]'s handles." else - if(usr != pulling) - for(var/mob/O in viewers(pulling, null)) - O.show_message("\red [usr] breaks [pulling]'s grip on the wheelchair.", 1) - else - usr << "You let go of \the [name]'s handles." + usr << "You let go of \the [name]'s handles." pulling.pulledby = null pulling = null return diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 4cea8bffc1d..0e7546f271d 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -5,6 +5,7 @@ icon_state = "dispenser" density = 1 anchored = 1.0 + w_class = 5 var/oxygentanks = 10 var/phorontanks = 10 var/list/oxytanks = list() //sorry for the similar var names diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index fa45f657369..68b10ccf7a4 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "target_stake" density = 1 + w_class = 5 flags = CONDUCT var/obj/item/target/pinned_target // the current pinned target diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index d0538494967..edc3962cdf6 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -8,7 +8,7 @@ /obj/structure/undies_wardrobe/attack_hand(mob/user as mob) src.add_fingerprint(user) var/mob/living/carbon/human/H = user - if(!ishuman(user) || (H.species && !(H.species.flags & HAS_UNDERWEAR))) + if(!ishuman(user) || (H.species && !(H.species.appearance_flags & HAS_UNDERWEAR))) user << "Sadly there's nothing in here for you to wear." return 0 diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index e52538b3321..3245234fc3e 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -117,7 +117,7 @@ /obj/machinery/shower name = "shower" - desc = "The HS-451. Installed in the 2550s by the Nanotrasen Hygiene Division." + desc = "The HS-451. Installed in the 2550s by the Hygiene Division." icon = 'icons/obj/watercloset.dmi' icon_state = "shower" density = 0 @@ -346,8 +346,14 @@ var/busy = 0 //Something's being washed at the moment /obj/structure/sink/attack_hand(mob/user as mob) - if (!user.can_use_hand()) - return + if (ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + if (user.hand) + temp = H.organs_by_name["l_hand"] + if(temp && !temp.is_usable()) + user << "You try to move your [temp.name], but cannot!" + return if(isrobot(user) || isAI(user)) return @@ -356,10 +362,10 @@ return if(busy) - user << "\red Someone's already washing here." + user << "Someone's already washing here." return - usr << "\blue You start washing your hands." + usr << "You start washing your hands." busy = 1 sleep(40) @@ -371,12 +377,12 @@ if(ishuman(user)) user:update_inv_gloves() for(var/mob/V in viewers(src, null)) - V.show_message("\blue [user] washes their hands using \the [src].") + V.show_message("[user] washes their hands using \the [src].") /obj/structure/sink/attackby(obj/item/O as obj, mob/user as mob) if(busy) - user << "\red Someone's already washing here." + user << "Someone's already washing here." return // Filling/emptying open reagent containers @@ -450,10 +456,15 @@ user.visible_message( \ "[user] was stunned by \his wet [O]!", \ "[user] was stunned by \his wet [O]!") - return + return 1 // Short of a rewrite, this is necessary to stop monkeycubes being washed. else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) return + else if(istype(O, /obj/item/weapon/mop)) + O.reagents.add_reagent("water", 5) + user << "You wet \the [O] in \the [src]." + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + return var/turf/location = user.loc if(!isturf(location)) return @@ -461,7 +472,7 @@ var/obj/item/I = O if(!I || !istype(I,/obj/item)) return - usr << "\blue You start washing \the [I]." + usr << "You start washing \the [I]." busy = 1 sleep(40) @@ -473,8 +484,8 @@ O.clean_blood() user.visible_message( \ - "\blue [user] washes \a [I] using \the [src].", \ - "\blue You wash \a [I] using \the [src].") + "[user] washes \a [I] using \the [src].", \ + "You wash \a [I] using \the [src].") /obj/structure/sink/kitchen diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 7d49acba979..fb48f6249dd 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -16,6 +16,7 @@ obj/structure/windoor_assembly anchored = 0 density = 0 dir = NORTH + w_class = 3 var/obj/item/weapon/airlock_electronics/electronics = null @@ -75,13 +76,13 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src || !WT.isOn()) return - user << "\blue You dissasembled the windoor assembly!" + user << "You dissasembled the windoor assembly!" new /obj/item/stack/material/glass/reinforced(get_turf(src), 5) if(secure) 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." + user << "You need more welding fuel to dissassemble the windoor assembly." return //Wrenching an unsecure assembly anchors it in place. Step 4 complete @@ -91,7 +92,7 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src) return - user << "\blue You've secured the windoor assembly!" + user << "You've secured the windoor assembly!" src.anchored = 1 if(src.secure) src.name = "Secure Anchored Windoor Assembly" @@ -105,7 +106,7 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src) return - user << "\blue You've unsecured the windoor assembly!" + user << "You've unsecured the windoor assembly!" src.anchored = 0 if(src.secure) src.name = "Secure Windoor Assembly" @@ -155,7 +156,7 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src) return - user << "\blue You cut the windoor wires.!" + user << "You cut the windoor wires.!" new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = "01" if(src.secure) @@ -173,7 +174,7 @@ obj/structure/windoor_assembly/Destroy() user.drop_item() W.loc = src - user << "\blue You've installed the airlock electronics!" + user << "You've installed the airlock electronics!" src.name = "Near finished Windoor Assembly" src.electronics = W else @@ -186,7 +187,7 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40)) if(!src || !src.electronics) return - user << "\blue You've removed the airlock electronics!" + user << "You've removed the airlock electronics!" if(src.secure) src.name = "Secure Wired Windoor Assembly" else @@ -198,7 +199,7 @@ obj/structure/windoor_assembly/Destroy() //Crowbar to complete the assembly, Step 7 complete. else if(istype(W, /obj/item/weapon/crowbar)) if(!src.electronics) - usr << "\red The assembly is missing electronics." + usr << "The assembly is missing electronics." return usr << browse(null, "window=windoor_access") playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) @@ -209,7 +210,7 @@ obj/structure/windoor_assembly/Destroy() if(!src) return density = 1 //Shouldn't matter but just incase - user << "\blue You finish the windoor!" + user << "You finish the windoor!" if(secure) var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(src.loc) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 7b7be9288ee..b801121e62e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -3,11 +3,14 @@ desc = "A window." icon = 'icons/obj/structures.dmi' density = 1 + w_class = 3 + layer = 3.2//Just above doors - pressure_resistance = 4*ONE_ATMOSPHERE anchored = 1.0 flags = ON_BORDER var/maxhealth = 14.0 + var/maximal_heat = T0C + 100 // Maximal heat before this window begins taking damage from fire + var/damage_per_fire_tick = 2.0 // Amount of damage per fire tick. Regular windows are not fireproof so they might as well break quickly. var/health var/ini_dir = null var/state = 2 @@ -99,12 +102,11 @@ /obj/structure/window/bullet_act(var/obj/item/projectile/Proj) - //Tasers and the like should not damage windows. - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return + var/proj_damage = Proj.get_structure_damage() + if(!proj_damage) return ..() - take_damage(Proj.damage) + take_damage(proj_damage) return @@ -123,14 +125,6 @@ else take_damage(rand(10,30)) - -/obj/structure/window/blob_act() - shatter() - - -/obj/structure/window/meteorhit() - shatter() - //TODO: Make full windows a separate type of window. //Once a full window, it will always be a full window, so there's no point //having the same type for both. @@ -177,6 +171,7 @@ playsound(loc, 'sound/effects/Glasshit.ogg', 60, 1) /obj/structure/window/attack_hand(mob/user as mob) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!")) user.visible_message("[user] smashes through [src]!") @@ -193,8 +188,8 @@ playsound(src.loc, 'sound/effects/glassknock.ogg', 90, 1) user.do_attack_animation(src) - usr.visible_message("\red [usr.name] bangs against the [src.name]!", - "\red You bang against the [src.name]!", + usr.visible_message("\The [usr] bangs against \the [src]!", + "You bang against \the [src]!", "You hear a banging sound.") else playsound(src.loc, 'sound/effects/glassknock.ogg', 60, 1) @@ -204,6 +199,9 @@ return /obj/structure/window/attack_generic(var/mob/user, var/damage) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(!damage) + return if(damage >= 10) visible_message("[user] smashes into [src]!") take_damage(damage) @@ -244,6 +242,7 @@ if(istype(W, /obj/item/weapon/screwdriver)) if(reinf && state >= 1) state = 3 - state + update_nearby_icons() playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) user << (state == 1 ? "You have unfastened the window from the frame." : "You have fastened the window to the frame.") else if(reinf && state == 0) @@ -272,6 +271,7 @@ new glasstype(loc) qdel(src) else + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(W.damtype == BRUTE || W.damtype == BURN) user.do_attack_animation(src) hit(W.force) @@ -295,8 +295,7 @@ set category = "Object" set src in oview(1) - // TODO : Change to incapacitated() on merge. - if(usr.stat || usr.lying || usr.resting || usr.buckled) + if(usr.incapacitated()) return 0 if(anchored) @@ -315,8 +314,7 @@ set category = "Object" set src in oview(1) - // TODO : Change to incapacitated() on merge. - if(usr.stat || usr.lying || usr.resting || usr.buckled) + if(usr.incapacitated()) return 0 if(anchored) @@ -350,7 +348,11 @@ /obj/structure/window/Destroy() density = 0 update_nearby_tiles() - update_nearby_icons() + var/turf/location = loc + loc = null + for(var/obj/structure/window/W in orange(location, 1)) + W.update_icon() + loc = location ..() @@ -370,39 +372,35 @@ //This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc! /obj/structure/window/proc/update_nearby_icons() update_icon() - for(var/direction in cardinal) - for(var/obj/structure/window/W in get_step(src,direction) ) - W.update_icon() + for(var/obj/structure/window/W in orange(src, 1)) + W.update_icon() //merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm) /obj/structure/window/update_icon() //A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong. //this way it will only update full-tile ones - //This spawn is here so windows get properly updated when one gets deleted. - spawn(2) - if(!src) return - if(!is_fulltile()) - icon_state = "[basestate]" - return - var/junction = 0 //will be used to determine from which side the window is connected to other windows - if(anchored) - for(var/obj/structure/window/W in orange(src,1)) - if(W.anchored && W.density && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows. - if(abs(x-W.x)-abs(y-W.y) ) //doesn't count windows, placed diagonally to src - junction |= get_dir(src,W) - if(opacity) - icon_state = "[basestate][junction]" - else - if(reinf) - icon_state = "[basestate][junction]" - else - icon_state = "[basestate][junction]" - + overlays.Cut() + if(!is_fulltile()) + icon_state = "[basestate]" return + var/list/dirs = list() + if(anchored) + for(var/obj/structure/window/W in orange(src,1)) + if(W.anchored && W.density && W.type == src.type && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows. + dirs += get_dir(src, W) + + var/list/connections = dirs_to_corner_states(dirs) + + icon_state = "" + for(var/i = 1 to 4) + var/image/I = image(icon, "[basestate][connections[i]]", dir = 1<<(i-1)) + overlays += I + + return /obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > T0C + 800) - hit(round(exposed_volume / 100), 0) + if(exposed_temperature > maximal_heat) + hit(damage_per_fire_tick, 0) ..() @@ -412,44 +410,46 @@ icon_state = "window" basestate = "window" glasstype = /obj/item/stack/material/glass - + maximal_heat = T0C + 100 + damage_per_fire_tick = 2.0 + maxhealth = 12.0 /obj/structure/window/phoronbasic name = "phoron window" - desc = "A phoron-glass alloy window. It looks insanely tough to break. It appears it's also insanely tough to burn through." + desc = "A borosilicate alloy window. It seems to be quite strong." basestate = "phoronwindow" icon_state = "phoronwindow" shardtype = /obj/item/weapon/material/shard/phoron glasstype = /obj/item/stack/material/glass/phoronglass - maxhealth = 120 - -/obj/structure/window/phoronbasic/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > T0C + 32000) - hit(round(exposed_volume / 1000), 0) - ..() + maximal_heat = T0C + 2000 + damage_per_fire_tick = 1.0 + maxhealth = 40.0 /obj/structure/window/phoronreinforced - name = "reinforced phoron window" - desc = "A phoron-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic phoron windows are insanely fireproof." + name = "reinforced borosilicate window" + desc = "A borosilicate alloy window, with rods supporting it. It seems to be very strong." basestate = "phoronrwindow" icon_state = "phoronrwindow" shardtype = /obj/item/weapon/material/shard/phoron glasstype = /obj/item/stack/material/glass/phoronrglass reinf = 1 - maxhealth = 160 + maximal_heat = T0C + 4000 + damage_per_fire_tick = 1.0 // This should last for 80 fire ticks if the window is not damaged at all. The idea is that borosilicate windows have something like ablative layer that protects them for a while. + maxhealth = 80.0 -/obj/structure/window/phoronreinforced/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - return /obj/structure/window/reinforced name = "reinforced window" desc = "It looks rather strong. Might take a few good hits to shatter it." icon_state = "rwindow" basestate = "rwindow" - maxhealth = 40 + maxhealth = 40.0 reinf = 1 + maximal_heat = T0C + 750 + damage_per_fire_tick = 2.0 glasstype = /obj/item/stack/material/glass/reinforced + /obj/structure/window/New(Loc, constructed=0) ..() @@ -457,6 +457,10 @@ if (constructed) state = 0 +/obj/structure/window/reinforced/full + dir = 5 + icon_state = "fwindow" + /obj/structure/window/reinforced/tinted name = "tinted window" desc = "It looks rather strong and opaque. Might take a few good hits to shatter it." @@ -479,11 +483,9 @@ basestate = "window" maxhealth = 40 reinf = 1 + basestate = "w" dir = 5 - update_icon() //icon_state has to be set manually - return - /obj/structure/window/reinforced/polarized name = "electrochromic window" desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it." @@ -497,7 +499,23 @@ animate(src, color="#222222", time=5) set_opacity(1) +/obj/structure/window/reinforced/crescent/attack_hand() + return +/obj/structure/window/reinforced/crescent/attackby() + return + +/obj/structure/window/reinforced/crescent/ex_act() + return + +/obj/structure/window/reinforced/crescent/hitby() + return + +/obj/structure/window/reinforced/crescent/take_damage() + return + +/obj/structure/window/reinforced/crescent/shatter() + return /obj/machinery/button/windowtint name = "window tint control" diff --git a/code/game/objects/structures/window_spawner.dm b/code/game/objects/structures/window_spawner.dm new file mode 100644 index 00000000000..c6e2d69f842 --- /dev/null +++ b/code/game/objects/structures/window_spawner.dm @@ -0,0 +1,96 @@ +// Ported from Haine and WrongEnd with much gratitude! +/* ._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._. */ +/*-=-=-=-=-=-=-=-=-=-=-=-=-=WHAT-EVER=-=-=-=-=-=-=-=-=-=-=-=-=-*/ +/* '~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~'-._.-'~' */ + +/obj/effect/wingrille_spawn + name = "window grille spawner" + icon = 'icons/obj/structures.dmi' + icon_state = "wingrille" + density = 1 + anchored = 1.0 + var/win_path = /obj/structure/window/basic + var/activated + +// stops ZAS expanding zones past us, the windows will block the zone anyway +/obj/effect/wingrille_spawn/CanPass() + return 0 + +/obj/effect/wingrille_spawn/attack_hand() + attack_generic() + +/obj/effect/wingrille_spawn/attack_ghost() + attack_generic() + +/obj/effect/wingrille_spawn/attack_generic() + activate() + +/obj/effect/wingrille_spawn/initialize() + ..() + if(!win_path) + return + if(ticker && ticker.current_state < GAME_STATE_PLAYING) + activate() + +/obj/effect/wingrille_spawn/proc/activate() + if(activated) return + if (!locate(/obj/structure/grille) in get_turf(src)) + var/obj/structure/grille/G = PoolOrNew(/obj/structure/grille, src.loc) + handle_grille_spawn(G) + var/list/neighbours = list() + for (var/dir in cardinal) + var/turf/T = get_step(src, dir) + var/obj/effect/wingrille_spawn/other = locate(/obj/effect/wingrille_spawn) in T + if(!other) + var/found_connection + if(locate(/obj/structure/grille) in T) + for(var/obj/structure/window/W in T) + if(W.type == win_path && W.dir == get_dir(T,src)) + found_connection = 1 + qdel(W) + if(!found_connection) + var/obj/structure/window/new_win = PoolOrNew(win_path, src.loc) + new_win.set_dir(dir) + handle_window_spawn(new_win) + else + neighbours |= other + activated = 1 + for(var/obj/effect/wingrille_spawn/other in neighbours) + if(!other.activated) other.activate() + qdel(src) + +/obj/effect/wingrille_spawn/proc/handle_window_spawn(var/obj/structure/window/W) + return + +// Currently unused, could be useful for pre-wired electrified windows. +/obj/effect/wingrille_spawn/proc/handle_grille_spawn(var/obj/structure/grille/G) + return + +/obj/effect/wingrille_spawn/reinforced + name = "reinforced window grille spawner" + icon_state = "r-wingrille" + win_path = /obj/structure/window/reinforced + +/obj/effect/wingrille_spawn/reinforced/crescent + name = "Crescent window grille spawner" + win_path = /obj/structure/window/reinforced/crescent + +/obj/effect/wingrille_spawn/phoron + name = "phoron window grille spawner" + icon_state = "p-wingrille" + win_path = /obj/structure/window/phoronbasic + +/obj/effect/wingrille_spawn/reinforced_phoron + name = "reinforced phoron window grille spawner" + icon_state = "pr-wingrille" + win_path = /obj/structure/window/phoronreinforced + +/obj/effect/wingrille_spawn/reinforced/polarized + name = "polarized window grille spawner" + color = "#444444" + win_path = /obj/structure/window/reinforced/polarized + var/id + +/obj/effect/wingrille_spawn/reinforced/polarized/handle_window_spawn(var/obj/structure/window/reinforced/polarized/P) + if(id) + P.id = id diff --git a/code/game/periodic_news.dm b/code/game/periodic_news.dm index c02fa262c33..d9c96d992cc 100644 --- a/code/game/periodic_news.dm +++ b/code/game/periodic_news.dm @@ -14,7 +14,7 @@ paycuts_suspicion round_time = 60*10 - message = {"Reports have leaked that Nanotrasen Inc. is planning to put paycuts into + message = {"Reports have leaked that NanoTrasen is planning to put paycuts into effect on many of its Research Stations in Tau Ceti. Apparently these research stations haven't been able to yield the expected revenue, and thus adjustments have to be made."} @@ -35,7 +35,7 @@ on live humans, including virology research, genetic manipulation, and \"feeding them to the slimes to see what happens\". Allegedly, these test subjects were neither humanified monkeys nor volunteers, but rather unqualified staff that were forced into - the experiments, and reported to have died in a \"work accident\" by Nanotrasen Inc."} + the experiments, and reported to have died in a \"work accident\" by NanoTrasen."} author = "Unauthorized" bluespace_research diff --git a/code/game/response_team.dm b/code/game/response_team.dm index e15ffb6a728..7a536cd6cac 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -12,16 +12,16 @@ var/can_call_ert set desc = "Send an emergency response team to the station" if(!holder) - usr << "\red Only administrators may use this command." + usr << "Only administrators may use this command." return if(!ticker) - usr << "\red The game hasn't started yet!" + usr << "The game hasn't started yet!" return if(ticker.current_state == 1) - usr << "\red The round hasn't started yet!" + usr << "The round hasn't started yet!" return if(send_emergency_team) - usr << "\red Central Command has already dispatched an emergency response team!" + usr << "[boss_name] has already dispatched an emergency response team!" return if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes") return @@ -30,7 +30,7 @@ var/can_call_ert if("No") return if(send_emergency_team) - usr << "\red Looks like somebody beat you to it!" + usr << "Looks like somebody beat you to it!" return message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team.", 1) @@ -51,7 +51,7 @@ client/verb/JoinResponseTeam() usr << "No emergency response team is currently being sent." return if(jobban_isbanned(usr, "Syndicate") || jobban_isbanned(usr, "Emergency Response Team") || jobban_isbanned(usr, "Security Officer")) - usr << "You are jobbanned from the emergency reponse team!" + usr << "You are jobbanned from the emergency reponse team!" return if(ert.current_antagonists.len >= ert.hard_cap) usr << "The emergency response team is already full!" @@ -114,11 +114,11 @@ proc/trigger_armed_response_team(var/force = 0) // there's only a certain chance a team will be sent if(!prob(send_team_chance)) - command_announcement.Announce("It would appear that an emergency response team was requested for [station_name()]. Unfortunately, we were unable to send one at this time.", "Central Command") + command_announcement.Announce("It would appear that an emergency response team was requested for [station_name()]. Unfortunately, we were unable to send one at this time.", "[boss_name]") can_call_ert = 0 // Only one call per round, ladies. return - command_announcement.Announce("It would appear that an emergency response team was requested for [station_name()]. We will prepare and send one as soon as possible.", "Central Command") + command_announcement.Announce("It would appear that an emergency response team was requested for [station_name()]. We will prepare and send one as soon as possible.", "[boss_name]") can_call_ert = 0 // Only one call per round, gentleman. send_emergency_team = 1 diff --git a/code/game/sound.dm b/code/game/sound.dm index 2a98112276b..575df8ebe58 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -1,3 +1,41 @@ +//Sound environment defines. Reverb preset for sounds played in an area, see sound datum reference for more. +#define GENERIC 0 +#define PADDED_CELL 1 +#define ROOM 2 +#define BATHROOM 3 +#define LIVINGROOM 4 +#define STONEROOM 5 +#define AUDITORIUM 6 +#define CONCERT_HALL 7 +#define CAVE 8 +#define ARENA 9 +#define HANGAR 10 +#define CARPETED_HALLWAY 11 +#define HALLWAY 12 +#define STONE_CORRIDOR 13 +#define ALLEY 14 +#define FOREST 15 +#define CITY 16 +#define MOUNTAINS 17 +#define QUARRY 18 +#define PLAIN 19 +#define PARKING_LOT 20 +#define SEWER_PIPE 21 +#define UNDERWATER 22 +#define DRUGGED 23 +#define DIZZY 24 +#define PSYCHOTIC 25 + +#define STANDARD_STATION STONEROOM +#define LARGE_ENCLOSED HANGAR +#define SMALL_ENCLOSED BATHROOM +#define TUNNEL_ENCLOSED CAVE +#define LARGE_SOFTFLOOR CARPETED_HALLWAY +#define MEDIUM_SOFTFLOOR LIVINGROOM +#define SMALL_SOFTFLOOR ROOM +#define ASTEROID CAVE +#define SPACE UNDERWATER + var/list/shatter_sound = list('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg') var/list/explosion_sound = list('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg') var/list/spark_sound = list('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg') @@ -67,6 +105,9 @@ var/const/FALLOFF_SOUNDS = 0.5 else S.frequency = get_rand_frequency() + //sound volume falloff with pressure + var/pressure_factor = 1.0 + if(isturf(turf_source)) // 3D sounds, the technology is here! var/turf/T = get_turf(src) @@ -81,7 +122,6 @@ var/const/FALLOFF_SOUNDS = 0.5 // -Nanako if (usepressure) //sound volume falloff with pressure. Pass usepressure = 0 to disable these calculations - var/pressure_factor = 1.0 var/datum/gas_mixture/hearer_env = T.return_air() var/datum/gas_mixture/source_env = turf_source.return_air() @@ -112,8 +152,30 @@ var/const/FALLOFF_SOUNDS = 0.5 S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) if(!is_global && environment != 0) - var/area/A = get_area(src) - S.environment = A.sound_env + + if(istype(src,/mob/living/)) + var/mob/living/M = src + if (M.hallucination) + S.environment = PSYCHOTIC + else if (M.druggy) + S.environment = DRUGGED + else if (M.drowsyness) + S.environment = DIZZY + else if (M.confused) + S.environment = DIZZY + else if (M.sleeping) + S.environment = UNDERWATER + else if (pressure_factor < 0.5) + S.environment = SPACE + else + var/area/A = get_area(src) + S.environment = A.sound_env + + else if (pressure_factor < 0.5) + S.environment = SPACE + else + var/area/A = get_area(src) + S.environment = A.sound_env src << S return S.volume diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 523a83a080e..5825c32d484 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -70,11 +70,7 @@ var/list/mechtoys = list( for(var/mob_type in mobs_can_pass) if(istype(A, mob_type)) return ..() - if(istype(A, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.is_small) - return ..() - return 0 + return issmall(M) return ..() diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm new file mode 100644 index 00000000000..03534d65760 --- /dev/null +++ b/code/game/turfs/flooring/flooring.dm @@ -0,0 +1,181 @@ +var/list/flooring_types + +/proc/get_flooring_data(var/flooring_path) + if(!flooring_types) + flooring_types = list() + if(!flooring_types["[flooring_path]"]) + flooring_types["[flooring_path]"] = new flooring_path + return flooring_types["[flooring_path]"] + +// State values: +// [icon_base]: initial base icon_state without edges or corners. +// if has_base_range is set, append 0-has_base_range ie. +// [icon_base][has_base_range] +// [icon_base]_broken: damaged overlay. +// if has_damage_range is set, append 0-damage_range for state ie. +// [icon_base]_broken[has_damage_range] +// [icon_base]_edges: directional overlays for edges. +// [icon_base]_corners: directional overlays for non-edge corners. + +/decl/flooring + var/name + var/desc + var/icon + var/icon_base + + var/has_base_range + var/has_damage_range + var/has_burn_range + var/damage_temperature + var/apply_thermal_conductivity + var/apply_heat_capacity + + var/build_type // Unbuildable if not set. Must be /obj/item/stack. + var/build_cost = 1 // Stack units. + var/build_time = 0 // BYOND ticks. + + var/descriptor = "tiles" + var/flags + var/can_paint + +/decl/flooring/grass + name = "grass" + desc = "Do they smoke grass out in space, Bowie? Or do they smoke AstroTurf?" + icon = 'icons/turf/flooring/grass.dmi' + icon_base = "grass" + has_base_range = 3 + damage_temperature = T0C+80 + flags = TURF_HAS_EDGES | TURF_REMOVE_SHOVEL + build_type = /obj/item/stack/tile/grass + +/decl/flooring/asteroid + name = "coarse sand" + desc = "Gritty and unpleasant." + icon = 'icons/turf/flooring/asteroid.dmi' + icon_base = "asteroid" + flags = TURF_HAS_EDGES | TURF_REMOVE_SHOVEL + build_type = null + +/decl/flooring/carpet + name = "carpet" + desc = "Imported and comfy." + icon = 'icons/turf/flooring/carpet.dmi' + icon_base = "carpet" + build_type = /obj/item/stack/tile/carpet + damage_temperature = T0C+200 + flags = TURF_HAS_EDGES | TURF_HAS_CORNERS | TURF_REMOVE_CROWBAR | TURF_CAN_BURN + +/decl/flooring/carpet/blue + name = "carpet" + icon_base = "bcarpet" + build_type = null + flags = TURF_HAS_EDGES + +/decl/flooring/tiling + name = "floor" + desc = "Scuffed from the passage of countless greyshirts." + icon = 'icons/turf/flooring/tiles.dmi' + icon_base = "steel" + has_damage_range = 4 + damage_temperature = T0C+1400 + flags = TURF_REMOVE_CROWBAR | TURF_CAN_BREAK | TURF_CAN_BURN + build_type = /obj/item/stack/tile/floor + can_paint = 1 + +/decl/flooring/linoleum + name = "linoleum" + desc = "It's like the 2390's all over again." + icon = 'icons/turf/flooring/linoleum.dmi' + icon_base = "lino" + can_paint = 1 + +/decl/flooring/tiling/red + name = "floor" + icon_base = "white" + has_damage_range = null + flags = TURF_REMOVE_CROWBAR + build_type = /obj/item/stack/tile/floor_red + +/decl/flooring/tiling/steel + name = "floor" + icon_base = "steel" + has_damage_range = null + flags = TURF_REMOVE_CROWBAR + build_type = /obj/item/stack/tile/floor_steel + +/decl/flooring/tiling/white + name = "floor" + desc = "How sterile." + icon_base = "white" + has_damage_range = null + flags = TURF_REMOVE_CROWBAR + build_type = /obj/item/stack/tile/floor_white + +/decl/flooring/tiling/yellow + name = "floor" + icon_base = "white" + has_damage_range = null + flags = TURF_REMOVE_CROWBAR + build_type = /obj/item/stack/tile/floor_yellow + +/decl/flooring/tiling/dark + name = "floor" + desc = "How ominous." + icon_base = "dark" + has_damage_range = null + flags = TURF_REMOVE_CROWBAR + build_type = /obj/item/stack/tile/floor_dark + +/decl/flooring/tiling/freezer + name = "floor" + desc = "Don't slip." + icon_base = "freezer" + has_damage_range = null + flags = TURF_REMOVE_CROWBAR + build_type = /obj/item/stack/tile/floor_freezer + +/decl/flooring/wood + name = "wooden floor" + desc = "Polished redwood planks." + icon = 'icons/turf/flooring/wood.dmi' + icon_base = "wood" + has_damage_range = 6 + damage_temperature = T0C+200 + descriptor = "planks" + build_type = /obj/item/stack/tile/wood + flags = TURF_CAN_BREAK | TURF_IS_FRAGILE | TURF_REMOVE_SCREWDRIVER | TURF_CAN_BURN + +/decl/flooring/reinforced + name = "reinforced floor" + desc = "Heavily reinforced with steel rods." + icon = 'icons/turf/flooring/tiles.dmi' + icon_base = "reinforced" + flags = TURF_REMOVE_WRENCH | TURF_ACID_IMMUNE + build_type = /obj/item/stack/rods + build_cost = 2 + build_time = 30 + apply_thermal_conductivity = 0.025 + apply_heat_capacity = 325000 + can_paint = 1 + +/decl/flooring/reinforced/circuit + name = "processing strata" + icon = 'icons/turf/flooring/circuit.dmi' + icon_base = "bcircuit" + build_type = null + flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK + can_paint = 1 + +/decl/flooring/reinforced/circuit/green + name = "processing strata" + icon_base = "gcircuit" + +/decl/flooring/reinforced/cult + name = "engraved floor" + desc = "Unsettling whispers waver from the surface..." + icon = 'icons/turf/flooring/cult.dmi' + icon_base = "cult" + build_type = null + has_damage_range = 6 + flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK + can_paint = null \ No newline at end of file diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm new file mode 100644 index 00000000000..66434456f92 --- /dev/null +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -0,0 +1,394 @@ +// These are objects that destroy themselves and add themselves to the +// decal list of the floor under them. Use them rather than distinct icon_states +// when mapping in interesting floor designs. +var/list/floor_decals = list() + +/obj/effect/floor_decal + name = "floor decal" + icon = 'icons/turf/flooring/decals.dmi' + layer = TURF_LAYER + 0.01 + var/supplied_dir + +/obj/effect/floor_decal/New(var/newloc, var/newdir, var/newcolour) + supplied_dir = newdir + if(newcolour) color = newcolour + ..(newloc) + +/obj/effect/floor_decal/initialize() + if(supplied_dir) set_dir(supplied_dir) + var/turf/T = get_turf(src) + if(istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor)) + var/cache_key = "[alpha]-[color]-[dir]-[icon_state]-[layer]" + if(!floor_decals[cache_key]) + var/image/I = image(icon = src.icon, icon_state = src.icon_state, dir = src.dir) + I.layer = T.layer + I.color = src.color + I.alpha = src.alpha + floor_decals[cache_key] = I + if(!T.decals) T.decals = list() + T.decals |= floor_decals[cache_key] + T.overlays |= floor_decals[cache_key] + qdel(src) + return + +/obj/effect/floor_decal/reset + name = "reset marker" + +/obj/effect/floor_decal/reset/initialize() + var/turf/T = get_turf(src) + if(T.decals && T.decals.len) + T.decals.Cut() + T.update_icon() + qdel(src) + return + +/obj/effect/floor_decal/corner + icon_state = "corner_white" + +/obj/effect/floor_decal/corner/black + name = "black corner" + color = "#333333" + +/obj/effect/floor_decal/corner/black/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/black/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/blue + name = "blue corner" + color = COLOR_BLUE_GRAY + +/obj/effect/floor_decal/corner/blue/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/blue/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/paleblue + name = "pale blue corner" + color = COLOR_PALE_BLUE_GRAY + +/obj/effect/floor_decal/corner/paleblue/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/paleblue/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/green + name = "green corner" + color = COLOR_GREEN_GRAY + +/obj/effect/floor_decal/corner/green/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/green/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/lime + name = "lime corner" + color = COLOR_PALE_GREEN_GRAY + +/obj/effect/floor_decal/corner/lime/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/lime/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/yellow + name = "yellow corner" + color = COLOR_BROWN + +/obj/effect/floor_decal/corner/yellow/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/yellow/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/beige + name = "beige corner" + color = COLOR_BEIGE + +/obj/effect/floor_decal/corner/beige/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/beige/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/red + name = "red corner" + color = COLOR_RED_GRAY + +/obj/effect/floor_decal/corner/red/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/red/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/pink + name = "pink corner" + color = COLOR_PALE_RED_GRAY + +/obj/effect/floor_decal/corner/pink/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/pink/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/purple + name = "purple corner" + color = COLOR_PURPLE_GRAY + +/obj/effect/floor_decal/corner/purple/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/purple/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/mauve + name = "mauve corner" + color = COLOR_PALE_PURPLE_GRAY + +/obj/effect/floor_decal/corner/mauve/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/mauve/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/orange + name = "orange corner" + color = COLOR_DARK_ORANGE + +/obj/effect/floor_decal/corner/orange/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/orange/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/brown + name = "brown corner" + color = COLOR_DARK_BROWN + +/obj/effect/floor_decal/corner/brown/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/brown/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/white + name = "white corner" + icon_state = "corner_white" + +/obj/effect/floor_decal/corner/white/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/white/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/corner/grey + name = "grey corner" + color = "#8D8C8C" + +/obj/effect/floor_decal/corner/grey/diagonal + icon_state = "corner_white_diagonal" + +/obj/effect/floor_decal/corner/grey/full + icon_state = "corner_white_full" + +/obj/effect/floor_decal/spline/plain + name = "spline - plain" + icon_state = "spline_plain" + +/obj/effect/floor_decal/spline/fancy + name = "spline - fancy" + icon_state = "spline_fancy" + +/obj/effect/floor_decal/spline/fancy/wood + name = "spline - wood" + color = "#CB9E04" + +/obj/effect/floor_decal/spline/fancy/wood/corner + icon_state = "spline_fancy_corner" + +/obj/effect/floor_decal/spline/fancy/wood/cee + icon_state = "spline_fancy_cee" + +/obj/effect/floor_decal/spline/fancy/wood/full + icon_state = "spline_fancy_full" + +/obj/effect/floor_decal/industrial/warning + name = "hazard stripes" + icon_state = "warning" + +/obj/effect/floor_decal/industrial/warning/corner + icon_state = "warningcorner" + +/obj/effect/floor_decal/industrial/warning/full + icon_state = "warningfull" + +/obj/effect/floor_decal/industrial/warning/cee + icon_state = "warningcee" + +/obj/effect/floor_decal/industrial/warning/dust + name = "hazard stripes" + icon_state = "warning_dust" + +/obj/effect/floor_decal/industrial/warning/dust/corner + name = "hazard stripes" + icon_state = "warningcorner_dust" + +/obj/effect/floor_decal/industrial/hatch + name = "hatched marking" + icon_state = "delivery" + +/obj/effect/floor_decal/industrial/hatch/yellow + color = "#CFCF55" + +/obj/effect/floor_decal/industrial/outline + name = "white outline" + icon_state = "outline" + +/obj/effect/floor_decal/industrial/outline/blue + name = "blue outline" + color = "#00B8B2" + +/obj/effect/floor_decal/industrial/outline/yellow + name = "yellow outline" + color = "#CFCF55" + +/obj/effect/floor_decal/industrial/outline/grey + name = "grey outline" + color = "#808080" + +/obj/effect/floor_decal/industrial/loading + name = "loading area" + icon_state = "loadingarea" + +/obj/effect/floor_decal/plaque + name = "plaque" + icon_state = "plaque" + +/obj/effect/floor_decal/carpet + name = "carpet" + icon = 'icons/turf/flooring/carpet.dmi' + icon_state = "carpet_edges" + +/obj/effect/floor_decal/carpet/blue + name = "carpet" + icon = 'icons/turf/flooring/carpet.dmi' + icon_state = "bcarpet_edges" + +/obj/effect/floor_decal/carpet/corners + name = "carpet" + icon = 'icons/turf/flooring/carpet.dmi' + icon_state = "carpet_corners" + +/obj/effect/floor_decal/asteroid + name = "random asteroid rubble" + icon_state = "asteroid0" + +/obj/effect/floor_decal/asteroid/New() + icon_state = "asteroid[rand(0,9)]" + ..() + +/obj/effect/floor_decal/chapel + name = "chapel" + icon_state = "chapel" + +/obj/effect/floor_decal/ss13/l1 + name = "L1" + icon_state = "L1" + +/obj/effect/floor_decal/ss13/l2 + name = "L2" + icon_state = "L2" + +/obj/effect/floor_decal/ss13/l3 + name = "L3" + icon_state = "L3" + +/obj/effect/floor_decal/ss13/l4 + name = "L4" + icon_state = "L4" + +/obj/effect/floor_decal/ss13/l5 + name = "L5" + icon_state = "L5" + +/obj/effect/floor_decal/ss13/l6 + name = "L6" + icon_state = "L6" + +/obj/effect/floor_decal/ss13/l7 + name = "L7" + icon_state = "L7" + +/obj/effect/floor_decal/ss13/l8 + name = "L8" + icon_state = "L8" + +/obj/effect/floor_decal/ss13/l9 + name = "L9" + icon_state = "L9" + +/obj/effect/floor_decal/ss13/l10 + name = "L10" + icon_state = "L10" + +/obj/effect/floor_decal/ss13/l11 + name = "L11" + icon_state = "L11" + +/obj/effect/floor_decal/ss13/l12 + name = "L12" + icon_state = "L12" + +/obj/effect/floor_decal/ss13/l13 + name = "L13" + icon_state = "L13" + +/obj/effect/floor_decal/ss13/l14 + name = "L14" + icon_state = "L14" + +/obj/effect/floor_decal/ss13/l15 + name = "L15" + icon_state = "L15" + +/obj/effect/floor_decal/ss13/l16 + name = "L16" + icon_state = "L16" + +/obj/effect/floor_decal/sign + name = "floor sign" + icon_state = "white_1" + +/obj/effect/floor_decal/sign/two + icon_state = "white_2" + +/obj/effect/floor_decal/sign/a + icon_state = "white_a" + +/obj/effect/floor_decal/sign/b + icon_state = "white_b" + +/obj/effect/floor_decal/sign/c + icon_state = "white_c" + +/obj/effect/floor_decal/sign/d + icon_state = "white_d" + +/obj/effect/floor_decal/sign/ex + icon_state = "white_ex" + +/obj/effect/floor_decal/sign/m + icon_state = "white_m" + +/obj/effect/floor_decal/sign/cmo + icon_state = "white_cmo" + +/obj/effect/floor_decal/sign/v + icon_state = "white_v" + +/obj/effect/floor_decal/sign/p + icon_state = "white_p" \ No newline at end of file diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm new file mode 100644 index 00000000000..8fe6b23973f --- /dev/null +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -0,0 +1,212 @@ +/turf/simulated/floor/carpet + name = "carpet" + icon = 'icons/turf/flooring/carpet.dmi' + icon_state = "carpet" + initial_flooring = /decl/flooring/carpet + +/turf/simulated/floor/bluegrid + name = "mainframe floor" + icon = 'icons/turf/flooring/circuit.dmi' + icon_state = "bcircuit" + initial_flooring = /decl/flooring/reinforced/circuit + +/turf/simulated/floor/greengrid + name = "mainframe floor" + icon = 'icons/turf/flooring/circuit.dmi' + icon_state = "gcircuit" + initial_flooring = /decl/flooring/reinforced/circuit/green + +/turf/simulated/floor/wood + name = "wooden floor" + icon = 'icons/turf/flooring/wood.dmi' + icon_state = "wood" + initial_flooring = /decl/flooring/wood + +/turf/simulated/floor/grass + name = "grass patch" + icon = 'icons/turf/flooring/grass.dmi' + icon_state = "grass0" + initial_flooring = /decl/flooring/grass + +/turf/simulated/floor/carpet/blue + name = "blue carpet" + icon_state = "bcarpet" + initial_flooring = /decl/flooring/carpet/blue + +/turf/simulated/floor/tiled + name = "floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "steel" + initial_flooring = /decl/flooring/tiling + +/turf/simulated/floor/reinforced + name = "reinforced floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "reinforced" + initial_flooring = /decl/flooring/reinforced + +/turf/simulated/floor/reinforced/airless + oxygen = 0 + nitrogen = 0 + +/turf/simulated/floor/reinforced/airmix + oxygen = MOLES_O2ATMOS + nitrogen = MOLES_N2ATMOS + +/turf/simulated/floor/reinforced/nitrogen + oxygen = 0 + nitrogen = ATMOSTANK_NITROGEN + +/turf/simulated/floor/reinforced/oxygen + oxygen = ATMOSTANK_OXYGEN + nitrogen = 0 + +/turf/simulated/floor/reinforced/phoron + oxygen = 0 + nitrogen = 0 + phoron = ATMOSTANK_PHORON + +/turf/simulated/floor/reinforced/carbon_dioxide + oxygen = 0 + nitrogen = 0 + carbon_dioxide = ATMOSTANK_CO2 + +/turf/simulated/floor/reinforced/n20 + oxygen = 0 + nitrogen = 0 + +/turf/simulated/floor/reinforced/n20/New() + ..() + sleep(-1) + if(!air) make_air() + air.adjust_gas("sleeping_agent", ATMOSTANK_NITROUSOXIDE) + +/turf/simulated/floor/cult + name = "engraved floor" + icon = 'icons/turf/flooring/cult.dmi' + icon_state = "cult" + initial_flooring = /decl/flooring/reinforced/cult + +/turf/simulated/floor/cult/cultify() + return + +/turf/simulated/floor/tiled/dark + name = "dark floor" + icon_state = "dark" + initial_flooring = /decl/flooring/tiling/dark + +/turf/simulated/floor/tiled/red + name = "red floor" + color = COLOR_RED_GRAY + icon_state = "white" + initial_flooring = /decl/flooring/tiling/red + +/turf/simulated/floor/tiled/steel + name = "steel floor" + icon_state = "steel_dirty" + initial_flooring = /decl/flooring/tiling/steel + + +/turf/simulated/floor/tiled/steel/airless + oxygen = 0 + nitrogen = 0 + +/turf/simulated/floor/tiled/white + name = "white floor" + icon_state = "white" + initial_flooring = /decl/flooring/tiling/white + +/turf/simulated/floor/tiled/yellow + name = "yellow floor" + color = COLOR_BROWN + icon_state = "white" + initial_flooring = /decl/flooring/tiling/yellow + +/turf/simulated/floor/tiled/freezer + name = "tiles" + icon_state = "freezer" + initial_flooring = /decl/flooring/tiling/freezer + +/turf/simulated/floor/lino + name = "lino" + icon = 'icons/turf/flooring/linoleum.dmi' + icon_state = "lino" + initial_flooring = /decl/flooring/linoleum + +//ATMOS PREMADES +/turf/simulated/floor/reinforced/airless + name = "vacuum floor" + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/floor/airless + name = "airless plating" + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/floor/tiled/airless + name = "airless floor" + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/floor/bluegrid/airless + name = "airless floor" + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/floor/greengrid/airless + name = "airless floor" + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/floor/greengrid/nitrogen + oxygen = 0 + +/turf/simulated/floor/tiled/white/airless + name = "airless floor" + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +// Placeholders +/turf/simulated/floor/airless/lava +/turf/simulated/floor/light +/turf/simulated/floor/snow +/turf/simulated/floor/beach/coastline +/turf/simulated/floor/plating/snow +/turf/simulated/floor/airless/ceiling + +/turf/simulated/floor/beach + name = "beach" + icon = 'icons/misc/beach.dmi' + +/turf/simulated/floor/beach/sand + name = "sand" + icon_state = "sand" + +/turf/simulated/floor/beach/sand/desert + icon_state = "desert" + +/turf/simulated/floor/beach/coastline + name = "coastline" + icon = 'icons/misc/beach2.dmi' + icon_state = "sandwater" + +/turf/simulated/floor/beach/water + name = "water" + icon_state = "water" + +/turf/simulated/floor/beach/water/update_dirt() + return // Water doesn't become dirty + +/turf/simulated/floor/beach/water/ocean + icon_state = "seadeep" + +/turf/simulated/floor/beach/water/New() + ..() + overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) diff --git a/code/game/turfs/initialization/init.dm b/code/game/turfs/initialization/init.dm new file mode 100644 index 00000000000..eda55c47ae9 --- /dev/null +++ b/code/game/turfs/initialization/init.dm @@ -0,0 +1,12 @@ +/datum/turf_initializer/proc/initialize(var/turf/T) + return + +/area + var/datum/turf_initializer/turf_initializer = null + +/area/initialize() + ..() + for(var/turf/simulated/T in src) + T.initialize() + if(turf_initializer) + turf_initializer.initialize(T) diff --git a/code/game/turfs/initialization/maintenance.dm b/code/game/turfs/initialization/maintenance.dm new file mode 100644 index 00000000000..16b1d03d21e --- /dev/null +++ b/code/game/turfs/initialization/maintenance.dm @@ -0,0 +1,60 @@ +/datum/turf_initializer/maintenance/initialize(var/turf/simulated/T) + if(T.density) + return + // Quick and dirty check to avoid placing things inside windows + if(locate(/obj/structure/grille, T)) + return + + var/cardinal_turfs = T.CardinalTurfs() + + T.dirt = rand(10, 50) + rand(0, 50) + // If a neighbor is dirty, then we get dirtier. + var/how_dirty = dirty_neighbors(cardinal_turfs) + for(var/i = 0; i < how_dirty; i++) + T.dirt += rand(0,10) + T.update_dirt() + + if(prob(2)) + PoolOrNew(junk(), T) + if(prob(2)) + PoolOrNew(/obj/effect/decal/cleanable/blood/oil, T) + if(prob(25)) // Keep in mind that only "corners" get any sort of web + attempt_web(T, cardinal_turfs) + +var/global/list/random_junk +/datum/turf_initializer/maintenance/proc/junk() + if(prob(25)) + return /obj/effect/decal/cleanable/generic + if(!random_junk) + random_junk = subtypesof(/obj/item/trash) + random_junk += typesof(/obj/item/weapon/cigbutt) + random_junk += /obj/effect/decal/cleanable/spiderling_remains + random_junk += /obj/effect/decal/remains/mouse + random_junk += /obj/effect/decal/remains/robot + random_junk -= /obj/item/trash/plate + random_junk -= /obj/item/trash/snack_bowl + random_junk -= /obj/item/trash/syndi_cakes + random_junk -= /obj/item/trash/tray + return pick(random_junk) + +/datum/turf_initializer/maintenance/proc/dirty_neighbors(var/list/cardinal_turfs) + var/how_dirty = 0 + for(var/turf/simulated/T in cardinal_turfs) + // Considered dirty if more than halfway to visible dirt + if(T.dirt > 25) + how_dirty++ + return how_dirty + +/datum/turf_initializer/maintenance/proc/attempt_web(var/turf/simulated/T) + var/turf/north_turf = get_step(T, NORTH) + if(!north_turf || !north_turf.density) + return + + for(var/dir in list(WEST, EAST)) // For the sake of efficiency, west wins over east in the case of 1-tile valid spots, rather than doing pick() + var/turf/neighbour = get_step(T, dir) + if(neighbour && neighbour.density) + if(dir == WEST) + PoolOrNew(/obj/effect/decal/cleanable/cobweb, T) + if(dir == EAST) + PoolOrNew(/obj/effect/decal/cleanable/cobweb2, T) + return diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index ee595116470..7a462f7b3c5 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -3,6 +3,10 @@ var/wet = 0 var/image/wet_overlay = null + //Mining resources (for the large drills). + var/has_resources + var/list/resources + var/thermite = 0 oxygen = MOLES_O2STANDARD nitrogen = MOLES_N2STANDARD @@ -10,24 +14,37 @@ var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to var/dirt = 0 -// possible fix for the perma wet floor bug - /turf/simulated/proc/wet_floor(var/wet_val = 1) - spawn(0) - if(wet_val <= wet) - return - wet = wet_val - if(wet_overlay) - overlays -= wet_overlay - wet_overlay = null - wet_overlay = image('icons/effects/water.dmi',src,"wet_floor") - overlays += wet_overlay - sleep(800) - if(wet >= 2) - sleep(1600) - wet = 0 - if(wet_overlay) - overlays -= wet_overlay - wet_overlay = null + var/datum/scheduled_task/unwet_task + +// This is not great. +/turf/simulated/proc/wet_floor(var/wet_val = 1) + if(wet_val < wet) + return + + if(!wet) + wet = wet_val + wet_overlay = image('icons/effects/water.dmi',src,"wet_floor") + overlays += wet_overlay + + if(unwet_task) + unwet_task.trigger_task_in(8 SECONDS) + else + unwet_task = schedule_task_in(8 SECONDS) + task_triggered_event.register(unwet_task, src, /turf/simulated/proc/task_unwet_floor) + +/turf/simulated/proc/task_unwet_floor(var/triggered_task) + if(triggered_task == unwet_task) + unwet_task = null + unwet_floor(TRUE) + +/turf/simulated/proc/unwet_floor(var/check_very_wet) + if(check_very_wet && wet >= 2) + return + + wet = 0 + if(wet_overlay) + overlays -= wet_overlay + wet_overlay = null /turf/simulated/clean_blood() for(var/obj/effect/decal/cleanable/blood/B in contents) @@ -40,36 +57,44 @@ holy = 1 levelupdate() +/turf/simulated/Destroy() + qdel(unwet_task) + unwet_task = null + return ..() + +/turf/simulated/proc/initialize() + return + /turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808") var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src if(!tracks) tracks = new typepath(src) tracks.AddTracks(bloodDNA,comingdir,goingdir,bloodcolor) +/turf/simulated/proc/update_dirt() + dirt = min(dirt+1, 101) + var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src) + if (dirt > 50) + if (!dirtoverlay) + dirtoverlay = new/obj/effect/decal/cleanable/dirt(src) + dirtoverlay.alpha = min((dirt - 50) * 5, 255) + /turf/simulated/Entered(atom/A, atom/OL) if(movement_disabled && usr.ckey != movement_disabled_exception) - usr << "\red Movement is admin-disabled." //This is to identify lag problems + usr << "Movement is admin-disabled." //This is to identify lag problems return if (istype(A,/mob/living)) var/mob/living/M = A if(M.lying) - ..() - return + return ..() // Ugly hack :( Should never have multiple plants in the same tile. var/obj/effect/plant/plant = locate() in contents if(plant) plant.trodden_on(M) // Dirt overlays. - dirt++ - var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src) - if (dirt >= 50) - if (!dirtoverlay) - dirtoverlay = new/obj/effect/decal/cleanable/dirt(src) - dirtoverlay.alpha = 15 - else if (dirt > 50) - dirtoverlay.alpha = min(dirtoverlay.alpha+5, 255) + update_dirt() if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index be42ae65dd0..df3be0077f5 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -1,606 +1,72 @@ -#define LIGHTFLOOR_ON_BIT 4 - -#define LIGHTFLOOR_STATE_OK 0 -#define LIGHTFLOOR_STATE_FLICKER 1 -#define LIGHTFLOOR_STATE_BREAKING 2 -#define LIGHTFLOOR_STATE_BROKEN 3 -#define LIGHTFLOOR_STATE_BITS 3 - -//This is so damaged or burnt tiles or platings don't get remembered as the default tile -var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","damaged4", - "damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2", - "platingdmg3","plating","light_on","light_on_flicker1","light_on_flicker2", - "light_on_clicker3","light_on_clicker4","light_on_clicker5","light_broken", - "light_on_broken","light_off","wall_thermite","grass1","grass2","grass3","grass4", - "asteroid","asteroid_dug", - "asteroid0","asteroid1","asteroid2","asteroid3","asteroid4", - "asteroid5","asteroid6","asteroid7","asteroid8","asteroid9","asteroid10","asteroid11","asteroid12", - "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "wood-broken", "carpet", - "carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5", - "ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11", - "ironsand12", "ironsand13", "ironsand14", "ironsand15") - -var/list/plating_icons = list("plating","platingdmg1","platingdmg2","platingdmg3","asteroid","asteroid_dug", - "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5", "ironsand6", "ironsand7", - "ironsand8", "ironsand9", "ironsand10", "ironsand11", - "ironsand12", "ironsand13", "ironsand14", "ironsand15") -var/list/wood_icons = list("wood","wood-broken") - /turf/simulated/floor + name = "plating" + icon = 'icons/turf/flooring/plating.dmi' + icon_state = "plating" - //Note to coders, the 'intact' var can no longer be used to determine if the floor is a plating or not. - //Use the is_plating(), is_steel_floor() and is_light_floor() procs instead. --Errorage - name = "floor" - icon = 'icons/turf/floors.dmi' - icon_state = "floor" + // Damage to flooring. + var/broken + var/burnt + + // Plating data. + var/base_name = "plating" + var/base_desc = "The naked hull." + var/base_icon = 'icons/turf/flooring/plating.dmi' + var/base_icon_state = "plating" + + // Flooring data. + var/flooring_override + var/initial_flooring + var/decl/flooring/flooring + var/mineral = DEFAULT_WALL_MATERIAL - var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default - var/icon_plating = "plating" thermal_conductivity = 0.040 heat_capacity = 10000 var/lava = 0 - var/broken = 0 - var/burnt = 0 - var/mineral = DEFAULT_WALL_MATERIAL - var/floor_type = /obj/item/stack/tile/steel - var/lightfloor_state // for light floors, this is the state of the tile. 0-7, 0x4 is on-bit - use the helper procs below - - footstep_sound = "defaultstep" - - proc/get_lightfloor_state() - return lightfloor_state & LIGHTFLOOR_STATE_BITS - - proc/get_lightfloor_on() - return lightfloor_state & LIGHTFLOOR_ON_BIT - - proc/set_lightfloor_state(n) - lightfloor_state = get_lightfloor_on() | (n & LIGHTFLOOR_STATE_BITS) - - proc/set_lightfloor_on(n) - if(n) - lightfloor_state |= LIGHTFLOOR_ON_BIT - else - lightfloor_state &= ~LIGHTFLOOR_ON_BIT - - proc/toggle_lightfloor_on() - lightfloor_state ^= LIGHTFLOOR_ON_BIT - -/turf/simulated/floor/New() - ..() - if(icon_state in icons_to_ignore_at_floor_init) //so damaged/burned tiles or plating icons aren't saved as the default - icon_regular_floor = "floor" - else - icon_regular_floor = icon_state - -//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) -// if ((istype(mover, /obj/machinery/vehicle) && !(src.burnt))) -// if (!( locate(/obj/machinery/mass_driver, src) )) -// return 0 -// return ..() - -/turf/simulated/floor/ex_act(severity) - //set src in oview(1) - switch(severity) - if(1.0) - src.ChangeTurf(/turf/space) - if(2.0) - switch(pick(40;1,40;2,3)) - if (1) - if(prob(33)) new /obj/item/stack/material/steel(src) - src.ReplaceWithLattice() - if(2) - src.ChangeTurf(/turf/space) - if(3) - if(prob(33)) new /obj/item/stack/material/steel(src) - if(prob(80)) - src.break_tile_to_plating() - else - src.break_tile() - src.hotspot_expose(1000,CELL_VOLUME) - if(3.0) - if (prob(50)) - src.break_tile() - src.hotspot_expose(1000,CELL_VOLUME) - return - -/turf/simulated/floor/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - - var/temp_destroy = get_damage_temperature() - if(!burnt && prob(5)) - burn_tile(exposed_temperature) - else if(temp_destroy && exposed_temperature >= (temp_destroy + 100) && prob(1) && !is_plating()) - make_plating() //destroy the tile, exposing plating - burn_tile(exposed_temperature) - return - -//should be a little bit lower than the temperature required to destroy the material -/turf/simulated/floor/proc/get_damage_temperature() - if(is_steel_floor()) return T0C+1400 - if(is_wood_floor()) return T0C+200 - if(is_carpet_floor()) return T0C+200 - if(is_grass_floor()) return T0C+80 - return null - -/turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) - var/dir_to = get_dir(src, adj_turf) - - for(var/obj/structure/window/W in src) - if(W.dir == dir_to || W.is_fulltile()) //Same direction or diagonal (full tile) - W.fire_act(adj_air, adj_temp, adj_volume) - -/turf/simulated/floor/blob_act() - return - -turf/simulated/floor/proc/update_icon() - if(lava) - return - else if(is_steel_floor()) - if(!broken && !burnt) - icon_state = icon_regular_floor - else if(is_plating()) - if(!broken && !burnt) - icon_state = icon_plating //Because asteroids are 'platings' too. - else if(is_light_floor()) - if(get_lightfloor_on()) - switch(get_lightfloor_state()) - if(LIGHTFLOOR_STATE_OK) - icon_state = "light_on" - set_light(5) - if(LIGHTFLOOR_STATE_FLICKER) - var/num = pick("1","2","3","4") - icon_state = "light_on_flicker[num]" - set_light(5) - if(LIGHTFLOOR_STATE_BREAKING) - icon_state = "light_on_broken" - set_light(5) - if(LIGHTFLOOR_STATE_BROKEN) - icon_state = "light_off" - set_light(0) - else - set_light(0) - icon_state = "light_off" - else if(is_grass_floor()) - if(!broken && !burnt) - if(!(icon_state in list("grass1","grass2","grass3","grass4"))) - icon_state = "grass[pick("1","2","3","4")]" - else if(is_carpet_floor()) - if(!broken && !burnt) - if(icon_state != "carpetsymbol") - var/connectdir = 0 - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - if(FF.is_carpet_floor()) - connectdir |= direction - - //Check the diagonal connections for corners, where you have, for example, connections both north and east. In this case it checks for a north-east connection to determine whether to add a corner marker or not. - var/diagonalconnect = 0 //1 = NE; 2 = SE; 4 = NW; 8 = SW - - //Northeast - if(connectdir & NORTH && connectdir & EAST) - if(istype(get_step(src,NORTHEAST),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,NORTHEAST) - if(FF.is_carpet_floor()) - diagonalconnect |= 1 - - //Southeast - if(connectdir & SOUTH && connectdir & EAST) - if(istype(get_step(src,SOUTHEAST),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,SOUTHEAST) - if(FF.is_carpet_floor()) - diagonalconnect |= 2 - - //Northwest - if(connectdir & NORTH && connectdir & WEST) - if(istype(get_step(src,NORTHWEST),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,NORTHWEST) - if(FF.is_carpet_floor()) - diagonalconnect |= 4 - - //Southwest - if(connectdir & SOUTH && connectdir & WEST) - if(istype(get_step(src,SOUTHWEST),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,SOUTHWEST) - if(FF.is_carpet_floor()) - diagonalconnect |= 8 - - icon_state = "carpet[connectdir]-[diagonalconnect]" - - else if(is_wood_floor()) - if(!broken && !burnt) - if( !(icon_state in wood_icons) ) - icon_state = "wood" - //world << "[icon_state]y's got [icon_state]" - /*spawn(1) - if(istype(src,/turf/simulated/floor)) //Was throwing runtime errors due to a chance of it changing to space halfway through. - if(air) - update_visuals(air)*/ - -/turf/simulated/floor/return_siding_icon_state() - ..() - if(is_grass_floor()) - var/dir_sum = 0 - for(var/direction in cardinal) - var/turf/T = get_step(src,direction) - if(!(T.is_grass_floor())) - dir_sum += direction - if(dir_sum) - return "wood_siding[dir_sum]" - else - return 0 - -/turf/simulated/floor/attack_hand(mob/user as mob) - . = ..() - if(.) - return - - if(is_light_floor()) - if(user.canmove && !user.restrained()) - toggle_lightfloor_on() - update_icon() - return 1 - return 0 - -/turf/simulated/floor/proc/gets_drilled() - return - -/turf/simulated/floor/proc/break_tile_to_plating() - if(!is_plating()) - make_plating() - break_tile() - -/turf/simulated/floor/is_steel_floor() - if(ispath(floor_type, /obj/item/stack/tile/steel)) - return 1 - else - return 0 - -/turf/simulated/floor/is_light_floor() - if(ispath(floor_type, /obj/item/stack/tile/light)) - return 1 - else - return 0 - -/turf/simulated/floor/is_grass_floor() - if(ispath(floor_type, /obj/item/stack/tile/grass)) - return 1 - else - return 0 - -/turf/simulated/floor/is_wood_floor() - if(ispath(floor_type, /obj/item/stack/tile/wood)) - return 1 - else - return 0 - -/turf/simulated/floor/is_carpet_floor() - if(ispath(floor_type, /obj/item/stack/tile/carpet)) - return 1 - else - return 0 /turf/simulated/floor/is_plating() - if(!floor_type) - return 1 - return 0 + return !flooring -/turf/simulated/floor/proc/break_tile() - if(istype(src,/turf/simulated/floor/engine)) return - if(istype(src,/turf/simulated/floor/mech_bay_recharge_floor)) - src.ChangeTurf(/turf/simulated/floor/plating) - if(broken) return - if(is_steel_floor()) - src.icon_state = "damaged[pick(1,2,3,4,5)]" - broken = 1 - else if(is_light_floor()) - src.icon_state = "light_broken" - broken = 1 - else if(is_plating()) - src.icon_state = "platingdmg[pick(1,2,3)]" - broken = 1 - else if(is_wood_floor()) - src.icon_state = "wood-broken" - broken = 1 - else if(is_carpet_floor()) - src.icon_state = "carpet-broken" - broken = 1 - else if(is_grass_floor()) - src.icon_state = "sand[pick("1","2","3")]" - broken = 1 +/turf/simulated/floor/New(var/newloc, var/floortype) + ..(newloc) + if(!floortype && initial_flooring) + floortype = initial_flooring + if(floortype) + set_flooring(get_flooring_data(floortype)) -/turf/simulated/floor/proc/burn_tile(var/exposed_temperature) - if(istype(src,/turf/simulated/floor/engine)) return - if(istype(src,/turf/simulated/floor/plating/airless/asteroid)) return//Asteroid tiles don't burn - - var/damage_temp = get_damage_temperature() - - if(broken) return - if(burnt) - if(is_steel_floor() && exposed_temperature >= damage_temp) //allow upgrading from scorched tiles to damaged tiles - src.icon_state = "damaged[pick(1,2,3,4,5)]" - broken = 1 - return - - if(is_steel_floor() && exposed_temperature >= T0C+300) //enough to char the floor, but not hot enough to actually burn holes in it - src.icon_state = "floorscorched[pick(1,2)]" - burnt = 1 - else if(exposed_temperature >= damage_temp) - if(is_steel_floor()) - src.icon_state = "damaged[pick(1,2,3,4,5)]" - burnt = 1 - else if(is_plating()) - src.icon_state = "panelscorched" - burnt = 1 - else if(is_wood_floor()) - src.icon_state = "wood-broken" - burnt = 1 - else if(is_carpet_floor()) - src.icon_state = "carpet-broken" - burnt = 1 - else if(is_grass_floor()) - src.icon_state = "sand[pick("1","2","3")]" - burnt = 1 +/turf/simulated/floor/proc/set_flooring(var/decl/flooring/newflooring) + make_plating(defer_icon_update = 1) + flooring = newflooring + update_icon(1) + levelupdate() //This proc will set floor_type to null and the update_icon() proc will then change the icon_state of the turf //This proc auto corrects the grass tiles' siding. -/turf/simulated/floor/proc/make_plating() - if(istype(src,/turf/simulated/floor/engine)) return +/turf/simulated/floor/proc/make_plating(var/place_product, var/defer_icon_update) - if(is_grass_floor()) - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly - else if(is_carpet_floor()) - spawn(5) - if(src) - for(var/direction in list(1,2,4,8,5,6,9,10)) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly + overlays.Cut() + if(islist(decals)) + decals.Cut() + decals = null + + name = base_name + desc = base_desc + icon = base_icon + icon_state = base_icon_state + + if(flooring) + if(flooring.build_type && place_product) + new flooring.build_type(src) + flooring = null - if(!floor_type) return - icon_plating = "plating" set_light(0) - floor_type = null - intact = 0 - broken = 0 - burnt = 0 - - update_icon() + broken = null + burnt = null + flooring_override = null levelupdate() -//This proc will make the turf a plasteel floor tile. The expected argument is the tile to make the turf with -//If none is given it will make a new object. dropping or unequipping must be handled before or after calling -//this proc. -/turf/simulated/floor/proc/make_plasteel_floor(var/obj/item/stack/tile/steel/T = null) - broken = 0 - burnt = 0 - intact = 1 - set_light(0) - if(T) - if(istype(T,/obj/item/stack/tile/steel)) - floor_type = T.type - if (icon_regular_floor) - icon_state = icon_regular_floor - else - icon_state = "floor" - icon_regular_floor = icon_state - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_type = /obj/item/stack/tile/steel - icon_state = "floor" - icon_regular_floor = icon_state + if(!defer_icon_update) + update_icon(1) - update_icon() - levelupdate() - -//This proc will make the turf a light floor tile. The expected argument is the tile to make the turf with -//If none is given it will make a new object. dropping or unequipping must be handled before or after calling -//this proc. -/turf/simulated/floor/proc/make_light_floor(var/obj/item/stack/tile/light/T = null) - broken = 0 - burnt = 0 - intact = 1 - if(T) - if(istype(T,/obj/item/stack/tile/light)) - floor_type = T.type - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_type = /obj/item/stack/tile/light - - update_icon() - levelupdate() - -//This proc will make a turf into a grass patch. Fun eh? Insert the grass tile to be used as the argument -//If no argument is given a new one will be made. -/turf/simulated/floor/proc/make_grass_floor(var/obj/item/stack/tile/grass/T = null) - broken = 0 - burnt = 0 - intact = 1 - if(T) - if(istype(T,/obj/item/stack/tile/grass)) - floor_type = T.type - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_type = /obj/item/stack/tile/grass - - update_icon() - levelupdate() - -//This proc will make a turf into a wood floor. Fun eh? Insert the wood tile to be used as the argument -//If no argument is given a new one will be made. -/turf/simulated/floor/proc/make_wood_floor(var/obj/item/stack/tile/wood/T = null) - broken = 0 - burnt = 0 - intact = 1 - if(T) - if(istype(T,/obj/item/stack/tile/wood)) - floor_type = T.type - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_type = /obj/item/stack/tile/wood - - update_icon() - levelupdate() - -//This proc will make a turf into a carpet floor. Fun eh? Insert the carpet tile to be used as the argument -//If no argument is given a new one will be made. -/turf/simulated/floor/proc/make_carpet_floor(var/obj/item/stack/tile/carpet/T = null) - broken = 0 - burnt = 0 - intact = 1 - if(T) - if(istype(T,/obj/item/stack/tile/carpet)) - floor_type = T.type - update_icon() - levelupdate() - return - //if you gave a valid parameter, it won't get thisf ar. - floor_type = /obj/item/stack/tile/carpet - - update_icon() - levelupdate() - -/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob) - - if(!C || !user) - return 0 - - if(istype(C,/obj/item/weapon/light/bulb)) //only for light tiles - if(is_light_floor()) - if(get_lightfloor_state()) - user.remove_from_mob(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." - else - user << "\blue The lightbulb seems fine, no need to replace it." - - if(istype(C, /obj/item/weapon/crowbar) && (!(is_plating()))) - if(broken || burnt) - user << "\red You remove the broken plating." - else - if(is_wood_floor()) - user << "\red You forcefully pry off the planks, destroying them in the process." - else - var/obj/item/I = new floor_type(src) - if(is_light_floor()) - var/obj/item/stack/tile/light/L = I - L.on = get_lightfloor_on() - L.state = get_lightfloor_state() - user << "\red You remove the [I.name]." - - make_plating() - playsound(src, 'sound/items/Crowbar.ogg', 80, 1) - - return - - if(istype(C, /obj/item/weapon/screwdriver) && is_wood_floor()) - if(broken || burnt) - return - else - if(is_wood_floor()) - user << "\red You unscrew the planks." - new floor_type(src) - - make_plating() - playsound(src, 'sound/items/Screwdriver.ogg', 80, 1) - - return - - if(istype(C, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = C - if (is_plating()) - if (R.get_amount() < 2) - user << "You need more rods." - return - user << "\blue Reinforcing the floor..." - if(do_after(user, 30) && is_plating()) - if (R.use(2)) - ChangeTurf(/turf/simulated/floor/engine) - playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) - return - else - else - user << "\red You must remove the plating first." - return - - if(istype(C, /obj/item/stack/tile)) - if(is_plating()) - if(!broken && !burnt) - var/obj/item/stack/tile/T = C - if (T.get_amount() < 1) - return - if(!T.build_type) - floor_type = T.type - else - floor_type = T.build_type - intact = 1 - if(istype(T,/obj/item/stack/tile/light)) - var/obj/item/stack/tile/light/L = T - set_lightfloor_state(L.state) - set_lightfloor_on(L.on) - if(istype(T,/obj/item/stack/tile/grass)) - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding gets updated properly - else if(istype(T,/obj/item/stack/tile/carpet)) - for(var/direction in list(1,2,4,8,5,6,9,10)) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding gets updated properly - T.use(1) - update_icon() - levelupdate() - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - else - user << "\blue This section is too damaged to support a tile. Use a welder to fix the damage." - - - if(istype(C, /obj/item/stack/cable_coil)) - if(is_plating()) - var/obj/item/stack/cable_coil/coil = C - coil.turf_place(src, user) - else - user << "\red You must remove the plating first." - - if(istype(C, /obj/item/weapon/shovel)) - if(is_grass_floor()) - new /obj/item/weapon/ore/glass(src) - new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass - user << "\blue You shovel the grass." - make_plating() - else - user << "\red You cannot shovel this." - - if(istype(C, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/welder = C - if(welder.isOn() && (is_plating())) - if(broken || burnt) - if(welder.remove_fuel(0,user)) - user << "\red You fix some dents on the broken plating." - playsound(src, 'sound/items/Welder.ogg', 80, 1) - icon_state = "plating" - burnt = 0 - broken = 0 - else - user << "\blue You need more welding fuel to complete this task." - -#undef LIGHTFLOOR_ON_BIT - -#undef LIGHTFLOOR_STATE_OK -#undef LIGHTFLOOR_STATE_FLICKER -#undef LIGHTFLOOR_STATE_BREAKING -#undef LIGHTFLOOR_STATE_BROKEN -#undef LIGHTFLOOR_STATE_BITS +/turf/simulated/floor/levelupdate() + for(var/obj/O in src) + O.hide(O.hides_under_flooring() && src.flooring) diff --git a/code/game/turfs/simulated/floor_acts.dm b/code/game/turfs/simulated/floor_acts.dm new file mode 100644 index 00000000000..ee42c625fe5 --- /dev/null +++ b/code/game/turfs/simulated/floor_acts.dm @@ -0,0 +1,45 @@ +/turf/simulated/floor/ex_act(severity) + //set src in oview(1) + switch(severity) + if(1.0) + src.ChangeTurf(get_base_turf_by_area(src)) + if(2.0) + switch(pick(40;1,40;2,3)) + if (1) + if(prob(33)) new /obj/item/stack/material/steel(src) + src.ReplaceWithLattice() + if(2) + src.ChangeTurf(get_base_turf_by_area(src)) + if(3) + if(prob(33)) new /obj/item/stack/material/steel(src) + if(prob(80)) + src.break_tile_to_plating() + else + src.break_tile() + src.hotspot_expose(1000,CELL_VOLUME) + if(3.0) + if (prob(50)) + src.break_tile() + src.hotspot_expose(1000,CELL_VOLUME) + return + +/turf/simulated/floor/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + + var/temp_destroy = get_damage_temperature() + if(!burnt && prob(5)) + burn_tile(exposed_temperature) + else if(temp_destroy && exposed_temperature >= (temp_destroy + 100) && prob(1) && !is_plating()) + make_plating() //destroy the tile, exposing plating + burn_tile(exposed_temperature) + return + +//should be a little bit lower than the temperature required to destroy the material +/turf/simulated/floor/proc/get_damage_temperature() + return flooring ? flooring.damage_temperature : null + +/turf/simulated/floor/adjacent_fire_act(turf/simulated/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) + var/dir_to = get_dir(src, adj_turf) + + for(var/obj/structure/window/W in src) + if(W.dir == dir_to || W.is_fulltile()) //Same direction or diagonal (full tile) + W.fire_act(adj_air, adj_temp, adj_volume) diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm new file mode 100644 index 00000000000..118f2277695 --- /dev/null +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -0,0 +1,90 @@ +/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob) + + if(!C || !user) + return 0 + + if(flooring) + if(istype(C, /obj/item/weapon/crowbar)) + if(broken || burnt) + user << "You remove the broken [flooring.descriptor]." + make_plating() + else if(flooring.flags & TURF_IS_FRAGILE) + user << "You forcefully pry off the [flooring.descriptor], destroying them in the process." + make_plating() + else if(flooring.flags & TURF_REMOVE_CROWBAR) + user << "You lever off the [flooring.descriptor]." + make_plating(1) + else + return + playsound(src, 'sound/items/Crowbar.ogg', 80, 1) + return + else if(istype(C, /obj/item/weapon/screwdriver) && (flooring.flags & TURF_REMOVE_SCREWDRIVER)) + if(broken || burnt) + return + user << "You unscrew and remove the [flooring.descriptor]." + make_plating(1) + playsound(src, 'sound/items/Screwdriver.ogg', 80, 1) + return + else if(istype(C, /obj/item/weapon/wrench) && (flooring.flags & TURF_REMOVE_WRENCH)) + user << "You unwrench and remove the [flooring.descriptor]." + make_plating(1) + playsound(src, 'sound/items/Ratchet.ogg', 80, 1) + return + else if(istype(C, /obj/item/weapon/shovel) && (flooring.flags & TURF_REMOVE_SHOVEL)) + user << "You shovel off the [flooring.descriptor]." + make_plating(1) + playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) + return + else if(istype(C, /obj/item/stack/cable_coil)) + user << "You must remove the [flooring.descriptor] first." + return + else + + if(istype(C, /obj/item/stack/cable_coil)) + if(broken || burnt) + user << "This section is too damaged to support anything. Use a welder to fix the damage." + return + var/obj/item/stack/cable_coil/coil = C + coil.turf_place(src, user) + return + else if(istype(C, /obj/item/stack)) + if(broken || burnt) + user << "This section is too damaged to support anything. Use a welder to fix the damage." + return + var/obj/item/stack/S = C + var/decl/flooring/use_flooring + for(var/flooring_type in flooring_types) + var/decl/flooring/F = flooring_types[flooring_type] + if(!F.build_type) + continue + if(ispath(S.type, F.build_type) || ispath(S.build_type, F.build_type)) + use_flooring = F + break + if(!use_flooring) + return + // Do we have enough? + if(use_flooring.build_cost && S.get_amount() < use_flooring.build_cost) + user << "You require at least [use_flooring.build_cost] [S.name] to complete the [use_flooring.descriptor]." + return + // Stay still and focus... + if(use_flooring.build_time && !do_after(user, use_flooring.build_time)) + return + if(flooring || !S || !user || !use_flooring) + return + if(S.use(use_flooring.build_cost)) + set_flooring(use_flooring) + playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) + return + // Repairs. + else if(istype(C, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/welder = C + if(welder.isOn() && (is_plating())) + if(broken || burnt) + if(welder.remove_fuel(0,user)) + user << "You fix some dents on the broken plating." + playsound(src, 'sound/items/Welder.ogg', 80, 1) + icon_state = "plating" + burnt = null + broken = null + else + user << "You need more welding fuel to complete this task." \ No newline at end of file diff --git a/code/game/turfs/simulated/floor_damage.dm b/code/game/turfs/simulated/floor_damage.dm new file mode 100644 index 00000000000..5e4fe9e381b --- /dev/null +++ b/code/game/turfs/simulated/floor_damage.dm @@ -0,0 +1,25 @@ +/turf/simulated/floor/proc/gets_drilled() + return + +/turf/simulated/floor/proc/break_tile_to_plating() + if(!is_plating()) + make_plating() + break_tile() + +/turf/simulated/floor/proc/break_tile() + if(!flooring || !(flooring.flags & TURF_CAN_BREAK) || !isnull(broken)) + return + if(flooring.has_damage_range) + broken = rand(0,flooring.has_damage_range) + else + broken = 0 + update_icon() + +/turf/simulated/floor/proc/burn_tile(var/exposed_temperature) + if(!flooring || !(flooring.flags & TURF_CAN_BURN) || !isnull(burnt)) + return + if(flooring.has_burn_range) + burnt = rand(0,flooring.has_burn_range) + else + burnt = 0 + update_icon() \ No newline at end of file diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm new file mode 100644 index 00000000000..cdde744bd45 --- /dev/null +++ b/code/game/turfs/simulated/floor_icon.dm @@ -0,0 +1,86 @@ +var/list/flooring_cache = list() + +/turf/simulated/floor/update_icon(var/update_neighbors) + + if(lava) + return + + if(flooring) + // Set initial icon and strings. + name = flooring.name + desc = flooring.desc + icon = flooring.icon + + if(flooring_override) + icon_state = flooring_override + else + icon_state = flooring.icon_base + if(flooring.has_base_range) + icon_state = "[icon_state][rand(0,flooring.has_base_range)]" + flooring_override = icon_state + + // Apply edges, corners, and inner corners. + overlays.Cut() + var/has_border = 0 + if(flooring.flags & TURF_HAS_EDGES) + for(var/step_dir in cardinal) + var/turf/simulated/floor/T = get_step(src, step_dir) + if(!istype(T) || !T.flooring || T.flooring.name != flooring.name) + has_border |= step_dir + overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[step_dir]", "[flooring.icon_base]_edges", step_dir) + + // There has to be a concise numerical way to do this but I am too noob. + if((has_border & NORTH) && (has_border & EAST)) + overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[NORTHEAST]", "[flooring.icon_base]_edges", NORTHEAST) + if((has_border & NORTH) && (has_border & WEST)) + overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[NORTHWEST]", "[flooring.icon_base]_edges", NORTHWEST) + if((has_border & SOUTH) && (has_border & EAST)) + overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHEAST]", "[flooring.icon_base]_edges", SOUTHEAST) + if((has_border & SOUTH) && (has_border & WEST)) + overlays |= get_flooring_overlay("[flooring.icon_base]-edge-[SOUTHWEST]", "[flooring.icon_base]_edges", SOUTHWEST) + + if(flooring.flags & TURF_HAS_CORNERS) + // As above re: concise numerical way to do this. + if(!(has_border & NORTH)) + if(!(has_border & EAST)) + var/turf/simulated/floor/T = get_step(src, NORTHEAST) + if(!(istype(T) && T.flooring && T.flooring.name == flooring.name)) + overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[NORTHEAST]", "[flooring.icon_base]_corners", NORTHEAST) + if(!(has_border & WEST)) + var/turf/simulated/floor/T = get_step(src, NORTHWEST) + if(!(istype(T) && T.flooring && T.flooring.name == flooring.name)) + overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[NORTHWEST]", "[flooring.icon_base]_corners", NORTHWEST) + if(!(has_border & SOUTH)) + if(!(has_border & EAST)) + var/turf/simulated/floor/T = get_step(src, SOUTHEAST) + if(!(istype(T) && T.flooring && T.flooring.name == flooring.name)) + overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHEAST]", "[flooring.icon_base]_corners", SOUTHEAST) + if(!(has_border & WEST)) + var/turf/simulated/floor/T = get_step(src, SOUTHWEST) + if(!(istype(T) && T.flooring && T.flooring.name == flooring.name)) + overlays |= get_flooring_overlay("[flooring.icon_base]-corner-[SOUTHWEST]", "[flooring.icon_base]_corners", SOUTHWEST) + + if(decals && decals.len) + overlays |= decals + + if(is_plating() && !(isnull(broken) && isnull(burnt))) //temp, todo + icon = 'icons/turf/flooring/plating.dmi' + icon_state = "dmg[rand(1,4)]" + else if(flooring) + if(!isnull(broken) && (flooring.flags & TURF_CAN_BREAK)) + overlays |= get_flooring_overlay("[flooring.icon_base]-broken-[broken]","[flooring.icon_base]_broken[broken]") + if(!isnull(burnt) && (flooring.flags & TURF_CAN_BURN)) + overlays |= get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","[flooring.icon_base]_burned[burnt]") + + if(update_neighbors) + for(var/turf/simulated/floor/F in range(src, 1)) + if(F == src) + continue + F.update_icon() + +/turf/simulated/floor/proc/get_flooring_overlay(var/cache_key, var/icon_base, var/icon_dir = 0) + if(!flooring_cache[cache_key]) + var/image/I = image(icon = flooring.icon, icon_state = icon_base, dir = icon_dir) + I.layer = layer + flooring_cache[cache_key] = I + return flooring_cache[cache_key] diff --git a/code/game/turfs/simulated/floor_static.dm b/code/game/turfs/simulated/floor_static.dm new file mode 100644 index 00000000000..e561f98620a --- /dev/null +++ b/code/game/turfs/simulated/floor_static.dm @@ -0,0 +1,23 @@ +// This type of flooring cannot be altered short of being destroyed and rebuilt. +// Use this to bypass the flooring system entirely ie. event areas, holodeck, etc. + +/turf/simulated/floor/fixed + name = "floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "steel" + initial_flooring = null + +/turf/simulated/floor/fixed/attackby(var/obj/item/C, var/mob/user) + if(istype(C, /obj/item/stack) && !istype(C, /obj/item/stack/cable_coil)) + return + return ..() + +/turf/simulated/floor/fixed/update_icon() + return + +/turf/simulated/floor/fixed/is_plating() + return 0 + +/turf/simulated/floor/fixed/set_flooring() + return + diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index 58689cdc3d3..21c26de1b3c 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -1,120 +1,10 @@ -/turf/simulated/floor/airless - icon_state = "floor" - name = "airless floor" - oxygen = 0 - nitrogen = 0 - temperature = TCMB +/turf/simulated/floor/diona + name = "biomass flooring" + icon_state = "diona" - New() - ..() - name = "floor" - -/turf/simulated/floor/airless/ceiling - icon_state = "rockvault" - -/turf/simulated/floor/light - name = "Light floor" - light_range = 5 - icon_state = "light_on" - floor_type = /obj/item/stack/tile/light - - New() - var/n = name //just in case commands rename it in the ..() call - ..() - spawn(4) - if(src) - update_icon() - name = n - -/turf/simulated/floor/wood - name = "floor" - icon_state = "wood" - floor_type = /obj/item/stack/tile/wood - -/turf/simulated/floor/vault - icon_state = "rockvault" - - New(location,type) - ..() - icon_state = "[type]vault" - -/turf/simulated/wall/vault - icon_state = "rockvault" - - New(location,type) - ..() - icon_state = "[type]vault" - -/turf/simulated/floor/engine - name = "reinforced floor" - icon_state = "engine" - thermal_conductivity = 0.025 - heat_capacity = 325000 - intact = 0 - -/turf/simulated/floor/engine/nitrogen - oxygen = 0 - -/turf/simulated/floor/engine/attackby(obj/item/weapon/C as obj, mob/user as mob) - if(!C) - return - if(!user) - return - if(istype(C, /obj/item/weapon/wrench)) - user << "\blue Removing rods..." - playsound(src, 'sound/items/Ratchet.ogg', 80, 1) - if(do_after(user, 30)) - PoolOrNew(/obj/item/stack/rods, list(loc, 2)) - ChangeTurf(/turf/simulated/floor) - var/turf/simulated/floor/F = src - F.make_plating() - return - -/turf/simulated/floor/engine/cult - name = "engraved floor" - icon_state = "cult" - -/turf/simulated/floor/engine/cult/cultify() +/turf/simulated/floor/diona/attackby() return -/turf/simulated/floor/engine/n20 - New() - . = ..() - assume_gas("sleeping_agent", 2000) - -/turf/simulated/floor/engine/vacuum - name = "vacuum floor" - icon_state = "engine" - oxygen = 0 - nitrogen = 0 - temperature = TCMB - -/turf/simulated/floor/plating - name = "plating" - icon_state = "plating" - floor_type = null - intact = 0 - -/turf/simulated/floor/plating/airless - icon_state = "plating" - name = "airless plating" - oxygen = 0 - nitrogen = 0 - temperature = TCMB - - New() - ..() - name = "plating" - -/turf/simulated/floor/bluegrid - icon = 'icons/turf/floors.dmi' - icon_state = "bcircuit" - -/turf/simulated/floor/greengrid - icon = 'icons/turf/floors.dmi' - icon_state = "gcircuit" - - /turf/simulated/shuttle name = "shuttle" icon = 'icons/turf/shuttle.dmi' @@ -139,8 +29,13 @@ icon = 'icons/turf/floors.dmi' icon_state = "plating" footstep_sound = "concretefootsteps" + level = 1 -/turf/simulated/shuttle/plating/vox //Skipjack plating +/turf/simulated/shuttle/plating/is_plating() + return 1 + + +/turf/simulated/shuttle/plating/vox //Skipjack plating oxygen = 0 nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD @@ -148,83 +43,7 @@ name = "Brig floor" // Also added it into the 2x3 brig area of the shuttle. icon_state = "floor4" -/turf/simulated/shuttle/floor4/vox //skipjack floors +/turf/simulated/shuttle/floor4/vox //skipjack floors name = "skipjack floor" oxygen = 0 nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD - -/turf/simulated/floor/beach - name = "Beach" - icon = 'icons/misc/beach.dmi' - footstep_sound = "sandstep" - -/turf/simulated/floor/beach/sand - name = "Sand" - icon_state = "sand" - footstep_sound = "sandstep" - -/turf/simulated/floor/beach/coastline - name = "Coastline" - icon = 'icons/misc/beach2.dmi' - icon_state = "sandwater" - footstep_sound = "sandstep" - -/turf/simulated/floor/beach/water - name = "Water" - icon_state = "water" - footstep_sound = "waterstep" - -/turf/simulated/floor/beach/water/New() - ..() - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) - -/turf/simulated/floor/grass - name = "Grass patch" - icon_state = "grass1" - floor_type = /obj/item/stack/tile/grass - footstep_sound = "grassstep" - - New() - icon_state = "grass[pick("1","2","3","4")]" - ..() - spawn(4) - if(src) - update_icon() - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly - -/turf/simulated/floor/carpet - name = "Carpet" - icon_state = "carpet" - floor_type = /obj/item/stack/tile/carpet - footstep_sound = null - - New() - if(!icon_state) - icon_state = "carpet" - ..() - spawn(4) - if(src) - update_icon() - for(var/direction in list(1,2,4,8,5,6,9,10)) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly - - - -/turf/simulated/floor/plating/ironsand/New() - ..() - name = "Iron Sand" - icon_state = "ironsand[rand(1,15)]" - -/turf/simulated/floor/plating/snow - name = "snow" - icon = 'icons/turf/snow.dmi' - icon_state = "snow" - footstep_sound = "grassstep" - -/turf/simulated/floor/plating/snow/ex_act(severity) - return diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 59a4dc2dd52..9264b1a0afd 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -6,18 +6,18 @@ if(density) can_open = WALL_OPENING - set_wall_state("[material.icon_base]fwall_open") //flick("[material.icon_base]fwall_opening", src) sleep(15) density = 0 opacity = 0 + update_icon() set_light(0) else can_open = WALL_OPENING //flick("[material.icon_base]fwall_closing", src) - set_wall_state("[material.icon_base]0") density = 1 opacity = 1 + update_icon() sleep(15) set_light(1) @@ -58,6 +58,7 @@ radiate() add_fingerprint(user) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/rotting = (locate(/obj/effect/overlay/wallrot) in src) if (HULK in user.mutations) if (rotting || !prob(material.hardness)) @@ -71,6 +72,7 @@ /turf/simulated/wall/attack_generic(var/mob/user, var/damage, var/attack_message, var/wallbreaker) radiate() + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/rotting = (locate(/obj/effect/overlay/wallrot) in src) if(!damage || !wallbreaker) try_touch(user, rotting) @@ -88,6 +90,7 @@ /turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if (!user.) user << "You don't have the dexterity to do this!" return @@ -233,7 +236,7 @@ construction_stage = 5 new /obj/item/stack/rods( src ) user << "You cut the outer grille." - set_wall_state() + update_icon() return if(5) if (istype(W, /obj/item/weapon/screwdriver)) @@ -242,7 +245,7 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5) return construction_stage = 4 - set_wall_state() + update_icon() user << "You remove the support lines." return else if( istype(W, /obj/item/stack/rods) ) @@ -250,7 +253,7 @@ if(O.get_amount()>0) O.use(1) construction_stage = 6 - set_wall_state() + update_icon() user << "You replace the outer grille." return if(4) @@ -272,7 +275,7 @@ if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4) return construction_stage = 3 - set_wall_state() + update_icon() user << "You press firmly on the cover, dislodging it." return if(3) @@ -282,7 +285,7 @@ if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3) return construction_stage = 2 - set_wall_state() + update_icon() user << "You pry off the cover." return if(2) @@ -292,7 +295,7 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2) return construction_stage = 1 - set_wall_state() + update_icon() user << "You remove the bolts anchoring the support rods." return if(1) @@ -312,7 +315,7 @@ if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1) return construction_stage = 0 - set_wall_state() + update_icon() new /obj/item/stack/rods(src) user << "The support rods drop out as you cut them loose from the frame." return diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index aa7db8a0ccb..dc7874b2aaf 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -21,76 +21,59 @@ name = "[material.display_name] wall" desc = "It seems to be a section of hull plated with [material.display_name]." - set_wall_state("[material.icon_base]0") - if(material.opacity > 0.5 && !opacity) set_light(1) else if(material.opacity < 0.5 && opacity) set_light(0) + update_connections(1) update_icon() - check_relatives() -/turf/simulated/wall/proc/set_wall_state(var/new_state) - - if(!material) - return - - if(new_state) - last_state = new_state - else if(last_state) - new_state = last_state - else - return - - overlays.Cut() - damage_overlay = 0 - - if(!wall_cache["[new_state]-[material.icon_colour]"]) - var/image/I = image(icon='icons/turf/wall_masks.dmi',icon_state="[new_state]") - I.color = material.icon_colour - wall_cache["[new_state]-[material.icon_colour]"] = I - overlays |= wall_cache["[new_state]-[material.icon_colour]"] - if(reinf_material) - - var/cache_key = "[material.icon_reinf]-[reinf_material.icon_colour]" - if(!isnull(construction_stage) && construction_stage<6) - cache_key = "reinf_construct-[reinf_material.icon_colour]-[construction_stage]" - - if(!wall_cache[cache_key]) - var/image/I - if(!isnull(construction_stage) && construction_stage<6) - I = image(icon='icons/turf/wall_masks.dmi',icon_state="reinf_construct-[construction_stage]") - else - I = image(icon='icons/turf/wall_masks.dmi',icon_state="[material.icon_reinf]") - I.color = reinf_material.icon_colour - wall_cache[cache_key] = I - overlays |= wall_cache[cache_key] /turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial) material = newmaterial reinf_material = newrmaterial update_material() - check_relatives() - check_relatives(1) -/turf/simulated/wall/proc/update_icon() +/turf/simulated/wall/update_icon() if(!material) return if(!damage_overlays[1]) //list hasn't been populated generate_overlays() - if(density) - check_relatives(1) - else - set_wall_state("[material.icon_base]fwall_open") + overlays.Cut() + var/image/I - if(damage == 0) - if(damage_overlay != 0) - overlays -= damage_overlays[damage_overlay] - damage_overlay = 0 - else if(density) + if(!density) + I = image('icons/turf/wall_masks.dmi', "[material.icon_base]fwall_open") + I.color = material.icon_colour + overlays += I + return + + for(var/i = 1 to 4) + I = image('icons/turf/wall_masks.dmi', "[material.icon_base][wall_connections[i]]", dir = 1<<(i-1)) + I.color = material.icon_colour + overlays += I + + if(reinf_material) + if(construction_stage != null && construction_stage < 6) + I = image('icons/turf/wall_masks.dmi', "reinf_construct-[construction_stage]") + I.color = reinf_material.icon_colour + overlays += I + else + if("[reinf_material.icon_reinf]0" in icon_states('icons/turf/wall_masks.dmi')) + // Directional icon + for(var/i = 1 to 4) + I = image('icons/turf/wall_masks.dmi', "[reinf_material.icon_reinf][wall_connections[i]]", dir = 1<<(i-1)) + I.color = reinf_material.icon_colour + overlays += I + else + I = image('icons/turf/wall_masks.dmi', reinf_material.icon_reinf) + I.color = reinf_material.icon_colour + overlays += I + + if(damage != 0) var/integrity = material.integrity if(reinf_material) integrity += reinf_material.integrity @@ -99,12 +82,7 @@ if(overlay > damage_overlays.len) overlay = damage_overlays.len - if(damage_overlay && overlay == damage_overlay) //No need to update. - return - - if(damage_overlay) overlays -= damage_overlays[damage_overlay] overlays += damage_overlays[overlay] - damage_overlay = overlay return /turf/simulated/wall/proc/generate_overlays() @@ -116,25 +94,21 @@ img.alpha = (i * alpha_inc) - 1 damage_overlays[i] = img -//Smoothwall code. update_self for relativewall(), not for relativewall_neighbors() -/turf/simulated/wall/proc/check_relatives(var/update_self) + +/turf/simulated/wall/proc/update_connections(propagate = 0) if(!material) return - var/junction - if(update_self) - junction = 0 - for(var/checkdir in cardinal) - var/turf/simulated/wall/T = get_step(src, checkdir) - if(!istype(T) || !T.material) + var/list/dirs = list() + for(var/turf/simulated/wall/W in orange(src, 1)) + if(!W.material) continue - if(update_self) - if(can_join_with(T)) - junction |= get_dir(src,T) //Not too sure why, but using checkdir just breaks walls. - else - T.check_relatives(1) - if(!isnull(junction)) - set_wall_state("[material.icon_base][junction]") - return + if(propagate) + W.update_connections() + W.update_icon() + if(can_join_with(W)) + dirs += get_dir(src, W) + + wall_connections = dirs_to_corner_states(dirs) /turf/simulated/wall/proc/can_join_with(var/turf/simulated/wall/W) if(material && W.material && material.icon_base == W.material.icon_base) diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm index 9a154919905..46498d9be56 100644 --- a/code/game/turfs/simulated/wall_types.dm +++ b/code/game/turfs/simulated/wall_types.dm @@ -41,3 +41,5 @@ ..(newloc,"voxalloy") /turf/simulated/wall/voxshuttle/attackby() return +/turf/simulated/wall/titanium/New(var/newloc) + ..(newloc,"titanium") diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index cdcab2eb39f..8c79f20403c 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -1,5 +1,3 @@ -var/list/global/wall_cache = list() - /turf/simulated/wall name = "wall" desc = "A huge chunk of metal used to seperate rooms." @@ -21,6 +19,13 @@ var/list/global/wall_cache = list() var/last_state var/construction_stage + var/list/wall_connections = list("0", "0", "0", "0") + +// Walls always hide the stuff below them. +/turf/simulated/wall/levelupdate() + for(var/obj/O in src) + O.hide(1) + /turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype) ..(newloc) icon_state = "blank" @@ -49,12 +54,10 @@ var/list/global/wall_cache = list() else if(istype(Proj,/obj/item/projectile/ion)) burn(500) - // Tasers and stuff? No thanks. Also no clone or tox damage crap. - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return + var/proj_damage = Proj.get_structure_damage() //cap the amount of damage, so that things like emitters can't destroy walls in one hit. - var/damage = min(Proj.damage, 100) + var/damage = min(proj_damage, 100) take_damage(damage) return @@ -171,14 +174,14 @@ var/list/global/wall_cache = list() clear_plants() material = get_material_by_name("placeholder") reinf_material = null - check_relatives() + update_connections(1) ChangeTurf(/turf/simulated/floor/plating) /turf/simulated/wall/ex_act(severity) switch(severity) if(1.0) - src.ChangeTurf(/turf/space) + src.ChangeTurf(get_base_turf(src.z)) return if(2.0) if(prob(75)) @@ -190,10 +193,6 @@ var/list/global/wall_cache = list() else return -/turf/simulated/wall/blob_act() - take_damage(rand(75, 125)) - return - // Wall-rot effect, a nasty fungus that destroys walls. /turf/simulated/wall/proc/rot() if(locate(/obj/effect/overlay/wallrot) in src) @@ -232,16 +231,6 @@ var/list/global/wall_cache = list() // F.sd_LumReset() //TODO: ~Carn return -/turf/simulated/wall/meteorhit(obj/M as obj) - var/rotting = (locate(/obj/effect/overlay/wallrot) in src) - if (prob(15) && !rotting) - dismantle_wall() - else if(prob(70) && !rotting) - ChangeTurf(/turf/simulated/floor/plating) - else - ReplaceWithLattice() - return 0 - /turf/simulated/wall/proc/radiate() var/total_radiation = material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0) if(!total_radiation) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index da3b772006c..76be9e556ec 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -1,7 +1,3 @@ -//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there. -//(Exceptions: extended, sandbox and nuke) -Errorage -var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = 60) - /turf/space icon = 'icons/turf/space.dmi' name = "\proper space" @@ -19,6 +15,14 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = update_starlight() ..() +/turf/space/is_space() + return 1 + +// override for space turfs, since they should never hide anything +/turf/space/levelupdate() + for(var/obj/O in src) + O.hide(0) + /turf/space/proc/update_starlight() if(!config.starlight) return @@ -35,24 +39,24 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = return var/obj/item/stack/rods/R = C if (R.use(1)) - user << "\blue Constructing support lattice ..." + user << "Constructing support lattice ..." playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) ReplaceWithLattice() return - if (istype(C, /obj/item/stack/tile/steel)) + if (istype(C, /obj/item/stack/tile/floor)) var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) if(L) - var/obj/item/stack/tile/steel/S = C + var/obj/item/stack/tile/floor/S = C if (S.get_amount() < 1) return qdel(L) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - S.build(src) S.use(1) + ChangeTurf(/turf/simulated/floor/airless) return else - user << "\red The plating is going to need some support." + user << "The plating is going to need some support." return @@ -60,7 +64,7 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = /turf/space/Entered(atom/movable/A as mob|obj) if(movement_disabled) - usr << "\red Movement is admin-disabled." //This is to identify lag problems + usr << "Movement is admin-disabled." //This is to identify lag problems return ..() if ((!(A) || src != A.loc)) return @@ -69,77 +73,10 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = if(ticker && ticker.mode) - 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)) - 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. - qdel(A) //The disk's Destroy() proc ensures a new one is created - return - if(config.use_overmap) - overmap_spacetravel(src,A) - return - var/list/disk_search = A.search_contents_for(/obj/item/weapon/disk/nuclear) - if(!isemptylist(disk_search)) - if(istype(A, /mob/living)) - var/mob/living/MM = A - if(MM.client && !MM.stat) - MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is." - if(MM.x <= TRANSITIONEDGE) - MM.inertia_dir = 4 - else if(MM.x >= world.maxx -TRANSITIONEDGE) - MM.inertia_dir = 8 - else if(MM.y <= TRANSITIONEDGE) - MM.inertia_dir = 1 - else if(MM.y >= world.maxy -TRANSITIONEDGE) - MM.inertia_dir = 2 - else - for(var/obj/item/weapon/disk/nuclear/N in disk_search) - 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) - qdel(N)//Make the disk respawn if it is floating on its own - return - - var/move_to_z = src.z - var/safety = 1 - - while(move_to_z == src.z) - var/move_to_z_str = pickweight(accessible_z_levels) - move_to_z = text2num(move_to_z_str) - safety++ - if(safety > 10) - break - - if(!move_to_z) - return - - A.z = move_to_z - - if(src.x <= TRANSITIONEDGE) - A.x = world.maxx - TRANSITIONEDGE - 2 - A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2) - - else if (A.x >= (world.maxx - TRANSITIONEDGE - 1)) - A.x = TRANSITIONEDGE + 1 - A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2) - - else if (src.y <= TRANSITIONEDGE) - A.y = world.maxy - TRANSITIONEDGE -2 - A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) - - else if (A.y >= (world.maxy - TRANSITIONEDGE - 1)) - A.y = TRANSITIONEDGE + 1 - A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) - - - - - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) + // Okay, so let's make it so that people can travel z levels but not nuke disks! + // if(ticker.mode.name == "mercenary") return + if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE + 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE + 1)) + A.touch_map_edge() /turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj) var/cur_x diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a8c938920f0..175344d9390 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -1,11 +1,9 @@ /turf icon = 'icons/turf/floors.dmi' - level = 1.0 + level = 1 + var/holy = 0 - //for floors, use is_plating(), is_steel_floor() and is_light_floor() - var/intact = 1 - - //Properties for open tiles (/floor) + // Initial air contents (in moles) var/oxygen = 0 var/carbon_dioxide = 0 var/nitrogen = 0 @@ -16,26 +14,18 @@ var/heat_capacity = 1 //Properties for both - var/temperature = T20C + var/temperature = T20C // Initial turf temperature. + var/blocks_air = 0 // Does this turf contain air/let air through? - var/blocks_air = 0 + // General properties. var/icon_old = null - var/pathweight = 1 - - //Mining resource generation stuff. - var/has_resources - var/list/resources + var/pathweight = 1 // How much does it cost to pathfind over this turf? + var/blessed = 0 // Has the turf been blessed? + var/dynamic_lighting = 1 // Does the turf use dynamic lighting? var/footstep_sound = null - // Flick animation - var/atom/movable/overlay/c_animation = null - - // holy water - var/holy = 0 - - var/dynamic_lighting = 1 - luminosity = 1 + var/list/decals /turf/New() ..() @@ -45,6 +35,14 @@ return turfs |= src + if(dynamic_lighting) + luminosity = 0 + else + luminosity = 1 + +/turf/proc/update_icon() + return + /turf/Destroy() turfs -= src ..() @@ -52,6 +50,12 @@ /turf/ex_act(severity) return 0 +/turf/proc/is_space() + return 0 + +/turf/proc/is_intact() + return 0 + /turf/attack_hand(mob/user) if(!(user.canmove) || user.restrained() || !(user.pulling)) return 0 @@ -71,12 +75,14 @@ /turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) if(movement_disabled && usr.ckey != movement_disabled_exception) - usr << "\red Movement is admin-disabled." //This is to identify lag problems + usr << "Movement is admin-disabled." //This is to identify lag problems return + + ..() + if (!mover || !isturf(mover.loc)) return 1 - //First, check objects to block exit that are not on the border for(var/obj/obstacle in mover.loc) if(!(obstacle.flags & ON_BORDER) && (mover != obstacle) && (forget != obstacle)) @@ -111,29 +117,19 @@ return 0 return 1 //Nothing found to block so return success! - +var/const/enterloopsanity = 100 /turf/Entered(atom/atom as mob|obj) + if(movement_disabled) - usr << "\red Movement is admin-disabled." //This is to identify lag problems + usr << "Movement is admin-disabled." //This is to identify lag problems return ..() -//vvvvv Infared beam stuff vvvvv - - if ((atom && atom.density && !( istype(atom, /obj/effect/beam) ))) - for(var/obj/effect/beam/i_beam/I in src) - spawn( 0 ) - if (I) - I.hit() - break - -//^^^^^ Infared beam stuff ^^^^^ if(!istype(atom, /atom/movable)) return var/atom/movable/A = atom - var/loopsanity = 100 if(ismob(A)) var/mob/M = A if(!M.lastarea) @@ -162,13 +158,15 @@ M.make_floating(0) ..() var/objects = 0 - for(var/atom/O as mob|obj|turf|area in range(1)) - if(objects > loopsanity) break - objects++ - spawn( 0 ) - if ((O && A)) - O.HasProximity(A, 1) - return + if(A && (A.flags & PROXMOVE)) + for(var/atom/movable/thing in range(1)) + if(objects > enterloopsanity) break + objects++ + spawn(0) + if(A) + A.HasProximity(thing, 1) + if ((thing && A) && (thing.flags & PROXMOVE)) + thing.HasProximity(A, 1) return /turf/proc/adjacent_fire_act(turf/simulated/floor/source, temperature, volume) @@ -176,20 +174,6 @@ /turf/proc/is_plating() return 0 -/turf/proc/is_asteroid_floor() - return 0 -/turf/proc/is_steel_floor() - return 0 -/turf/proc/is_light_floor() - return 0 -/turf/proc/is_grass_floor() - return 0 -/turf/proc/is_wood_floor() - return 0 -/turf/proc/is_carpet_floor() - return 0 -/turf/proc/return_siding_icon_state() //used for grass floors, which have siding. - return 0 /turf/proc/inertial_drift(atom/movable/A as mob|obj) if(!(A.last_move)) return @@ -209,178 +193,7 @@ /turf/proc/levelupdate() for(var/obj/O in src) - if(O.level == 1) - O.hide(src.intact) - -// override for space turfs, since they should never hide anything -/turf/space/levelupdate() - for(var/obj/O in src) - if(O.level == 1) - O.hide(0) - -// Removes all signs of lattice on the pos of the turf -Donkieyo -/turf/proc/RemoveLattice() - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - qdel(L) - -//Creates a new turf -/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0) - if (!N) - return - -///// Z-Level Stuff ///// This makes sure that turfs are not changed to space when one side is part of a zone - if(N == /turf/space) - var/turf/controller = locate(1, 1, src.z) - for(var/obj/effect/landmark/zcontroller/c in controller) - if(c.down) - var/turf/below = locate(src.x, src.y, c.down_target) - if((air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && !istype(below, /turf/space)) // dont make open space into space, its pointless and makes people drop out of the station - var/turf/W = src.ChangeTurf(/turf/simulated/floor/open) - var/list/temp = list() - temp += W - c.add(temp,3,1) // report the new open space to the zcontroller - return W -///// Z-Level Stuff - - var/obj/fire/old_fire = fire - var/old_opacity = opacity - var/old_dynamic_lighting = dynamic_lighting - var/list/old_affecting_lights = affecting_lights - var/old_lighting_overlay = lighting_overlay - - //world << "Replacing [src.type] with [N]" - - if(connections) connections.erase_all() - - if(istype(src,/turf/simulated)) - //Yeah, we're just going to rebuild the whole thing. - //Despite this being called a bunch during explosions, - //the zone will only really do heavy lifting once. - var/turf/simulated/S = src - if(S.zone) S.zone.rebuild() - - if(ispath(N, /turf/simulated/floor)) - var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) - if(old_fire) - fire = old_fire - - if (istype(W,/turf/simulated/floor)) - W.RemoveLattice() - - if(tell_universe) - universe.OnTurfChange(W) - - if(air_master) - 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() - - W.levelupdate() - . = W - - else - - var/turf/W = new N( locate(src.x, src.y, src.z) ) - - if(old_fire) - old_fire.RemoveFire() - - if(tell_universe) - universe.OnTurfChange(W) - - if(air_master) - air_master.mark_for_update(src) - - for(var/turf/space/S in range(W,1)) - S.update_starlight() - - W.levelupdate() - . = W - - lighting_overlay = old_lighting_overlay - affecting_lights = old_affecting_lights - if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting) || force_lighting_update) - reconsider_lights() - if(dynamic_lighting != old_dynamic_lighting) - if(dynamic_lighting) - lighting_build_overlays() - else - lighting_clear_overlays() - - -//Commented out by SkyMarshal 5/10/13 - If you are patching up space, it should be vacuum. -// If you are replacing a wall, you have increased the volume of the room without increasing the amount of gas in it. -// As such, this will no longer be used. - -//////Assimilate Air////// -/* -/turf/simulated/proc/Assimilate_Air() - var/aoxy = 0//Holders to assimilate air from nearby turfs - var/anitro = 0 - var/aco = 0 - var/atox = 0 - var/atemp = 0 - var/turf_count = 0 - - for(var/direction in cardinal)//Only use cardinals to cut down on lag - var/turf/T = get_step(src,direction) - if(istype(T,/turf/space))//Counted as no air - turf_count++//Considered a valid turf for air calcs - continue - else if(istype(T,/turf/simulated/floor)) - var/turf/simulated/S = T - if(S.air)//Add the air's contents to the holders - aoxy += S.air.oxygen - anitro += S.air.nitrogen - aco += S.air.carbon_dioxide - atox += S.air.toxins - atemp += S.air.temperature - turf_count ++ - air.oxygen = (aoxy/max(turf_count,1))//Averages contents of the turfs, ignoring walls and the like - air.nitrogen = (anitro/max(turf_count,1)) - air.carbon_dioxide = (aco/max(turf_count,1)) - air.toxins = (atox/max(turf_count,1)) - air.temperature = (atemp/max(turf_count,1))//Trace gases can get bant - air.update_values() - - //cael - duplicate the averaged values across adjacent turfs to enforce a seamless atmos change - for(var/direction in cardinal)//Only use cardinals to cut down on lag - var/turf/T = get_step(src,direction) - if(istype(T,/turf/space))//Counted as no air - continue - else if(istype(T,/turf/simulated/floor)) - var/turf/simulated/S = T - if(S.air)//Add the air's contents to the holders - S.air.oxygen = air.oxygen - S.air.nitrogen = air.nitrogen - S.air.carbon_dioxide = air.carbon_dioxide - S.air.toxins = air.toxins - S.air.temperature = air.temperature - S.air.update_values() -*/ - - -/turf/proc/ReplaceWithLattice() - src.ChangeTurf(/turf/space) - 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. - for(var/mob/living/M in src) - if(M==U) continue//Will not harm U. Since null != M, can be excluded to kill everyone. - spawn(0) - M.gib() - for(var/obj/mecha/M in src)//Mecha are not gibbed but are damaged. - spawn(0) - M.take_damage(100, "brute") - -/turf/proc/Bless() - if(flags & NOJAUNT) - return - flags |= NOJAUNT + O.hide(O.hides_under_flooring() && !is_plating()) /turf/proc/AdjacentTurfs() var/L[] = new() @@ -389,6 +202,14 @@ if(!LinkBlocked(src, t) && !TurfBlockedNonWindow(t)) L.Add(t) return L + +/turf/proc/CardinalTurfs() + var/L[] = new() + for(var/turf/simulated/T in AdjacentTurfs()) + if(T.x == src.x || T.y == src.y) + L.Add(T) + return L + /turf/proc/Distance(turf/t) if(get_dist(src,t) == 1) var/cost = (src.x - t.x) * (src.x - t.x) + (src.y - t.y) * (src.y - t.y) @@ -396,6 +217,7 @@ return cost else return get_dist(src,t) + /turf/proc/AdjacentTurfsSpace() var/L[] = new() for(var/turf/t in oview(src,1)) diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm new file mode 100644 index 00000000000..10ffb3a8cc4 --- /dev/null +++ b/code/game/turfs/turf_changing.dm @@ -0,0 +1,87 @@ +/turf/proc/ReplaceWithLattice() + src.ChangeTurf(get_base_turf_by_area(src)) + spawn() + new /obj/structure/lattice( locate(src.x, src.y, src.z) ) + +// Removes all signs of lattice on the pos of the turf -Donkieyo +/turf/proc/RemoveLattice() + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + qdel(L) + +//Creates a new turf +/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0) + if (!N) + return + + // This makes sure that turfs are not changed to space when one side is part of a zone + if(N == /turf/space) + var/turf/below = GetBelow(src) + if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src))) + N = /turf/simulated/open + + var/obj/fire/old_fire = fire + var/old_opacity = opacity + var/old_dynamic_lighting = dynamic_lighting + var/list/old_affecting_lights = affecting_lights + var/old_lighting_overlay = lighting_overlay + + //world << "Replacing [src.type] with [N]" + + if(connections) connections.erase_all() + + if(istype(src,/turf/simulated)) + //Yeah, we're just going to rebuild the whole thing. + //Despite this being called a bunch during explosions, + //the zone will only really do heavy lifting once. + var/turf/simulated/S = src + if(S.zone) S.zone.rebuild() + + if(ispath(N, /turf/simulated/floor)) + var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) + if(old_fire) + fire = old_fire + + if (istype(W,/turf/simulated/floor)) + W.RemoveLattice() + + if(tell_universe) + universe.OnTurfChange(W) + + if(air_master) + 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() + + W.levelupdate() + . = W + + else + + var/turf/W = new N( locate(src.x, src.y, src.z) ) + + if(old_fire) + old_fire.RemoveFire() + + if(tell_universe) + universe.OnTurfChange(W) + + if(air_master) + air_master.mark_for_update(src) + + for(var/turf/space/S in range(W,1)) + S.update_starlight() + + W.levelupdate() + . = W + + lighting_overlay = old_lighting_overlay + affecting_lights = old_affecting_lights + if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting) || force_lighting_update) + reconsider_lights() + if(dynamic_lighting != old_dynamic_lighting) + if(dynamic_lighting) + lighting_build_overlays() + else + lighting_clear_overlays() \ No newline at end of file diff --git a/code/game/turfs/turf_flick_animations.dm b/code/game/turfs/turf_flick_animations.dm index 9bcd5caaa94..94f5fec4c58 100644 --- a/code/game/turfs/turf_flick_animations.dm +++ b/code/game/turfs/turf_flick_animations.dm @@ -1,26 +1,4 @@ -/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 - -proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,flick_anim as text,sleeptime = 0,direction as num) +/proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,flick_anim as text,sleeptime = 0,direction as num) //This proc throws up either an icon or an animation for a specified amount of time. //The variables should be apparent enough. if(!location && target) diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index 178b69b2868..bd85fe8be81 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -1,5 +1,4 @@ /turf/unsimulated - intact = 1 name = "command" oxygen = MOLES_O2STANDARD nitrogen = MOLES_N2STANDARD \ No newline at end of file diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index ca422c46cd6..12d4d3fadc3 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -10,11 +10,5 @@ icon_state = "fakewindows" opacity = 0 -turf/unsimulated/wall/splashscreen - name = "Space Station 13" - icon = 'icons/misc/fullscreen.dmi' - icon_state = "title" - layer = FLY_LAYER - /turf/unsimulated/wall/other icon_state = "r_wall" \ No newline at end of file diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 4e55c9ff25f..867d73d0408 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -4,7 +4,7 @@ set category = "OOC" if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." return if(!mob) return @@ -16,7 +16,7 @@ if(!msg) return if(!(prefs.toggles & CHAT_OOC)) - src << "\red You have OOC muted." + src << "You have OOC muted." return if(!holder) @@ -71,19 +71,23 @@ set category = "OOC" if(say_disabled) //This is here to try to identify lag problems - usr << "\red Speech is currently admin-disabled." + usr << "Speech is currently admin-disabled." + return + + if(!mob) return - if(!mob) return if(IsGuestKey(key)) src << "Guests may not use OOC." return msg = sanitize(msg) - if(!msg) return + msg = process_chat_markup(msg, list("*")) + if(!msg) + return if(!(prefs.toggles & CHAT_LOOC)) - src << "\red You have LOOC muted." + src << "You have LOOC muted." return if(!holder) @@ -96,7 +100,7 @@ if(prefs.muted & MUTE_OOC) src << "You cannot use OOC (muted)." return - if(handle_spam_prevention(msg,MUTE_OOC)) + if(handle_spam_prevention(msg, MUTE_OOC)) return if(findtext(msg, "byond://")) src << "Advertising other servers is not allowed." diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm.back similarity index 96% rename from code/game/verbs/suicide.dm rename to code/game/verbs/suicide.dm.back index a2ea099fca7..13a565b5c80 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm.back @@ -1,182 +1,182 @@ -/mob/var/suiciding = 0 - -/mob/living/carbon/human/verb/suicide() - set hidden = 1 - - if (stat == DEAD) - src << "You're already dead!" - return - - if (!ticker) - src << "You can't commit suicide before the game starts!" - return - - if(!player_is_antag(mind)) - message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1) - src << "No. Adminhelp if there is a legitimate reason." - return - - if (suiciding) - src << "You're already committing suicide! Be patient!" - return - - var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") - - if(confirm == "Yes") - if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide - src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))" - return - suiciding = 1 - var/obj/item/held_item = get_active_hand() - if(held_item) - var/damagetype = held_item.suicide_act(src) - if(damagetype) - log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]") - var/damage_mod = 1 - switch(damagetype) //Sorry about the magic numbers. - //brute = 1, burn = 2, tox = 4, oxy = 8 - if(15) //4 damage types - damage_mod = 4 - - if(6, 11, 13, 14) //3 damage types - damage_mod = 3 - - if(3, 5, 7, 9, 10, 12) //2 damage types - damage_mod = 2 - - if(1, 2, 4, 8) //1 damage type - damage_mod = 1 - - else //This should not happen, but if it does, everything should still work - damage_mod = 1 - - //Do 175 damage divided by the number of damage types applied. - if(damagetype & BRUTELOSS) - adjustBruteLoss(30/damage_mod) //hack to prevent gibbing - adjustOxyLoss(145/damage_mod) - - if(damagetype & FIRELOSS) - adjustFireLoss(175/damage_mod) - - if(damagetype & TOXLOSS) - adjustToxLoss(175/damage_mod) - - if(damagetype & OXYLOSS) - adjustOxyLoss(175/damage_mod) - - //If something went wrong, just do normal oxyloss - if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS)) - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - updatehealth() - return - - log_and_message_admins("[key_name(src)] commited suicide") - viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ - "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ - "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ - "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.") - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - updatehealth() - -/mob/living/carbon/brain/verb/suicide() - set hidden = 1 - - if (stat == 2) - src << "You're already dead!" - return - - if (!ticker) - src << "You can't commit suicide before the game starts!" - return - - if (suiciding) - src << "You're already committing suicide! Be patient!" - return - - var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") - - if(confirm == "Yes") - suiciding = 1 - viewers(loc) << "\red [src]'s brain is growing dull and lifeless. It looks like it's lost the will to live." - spawn(50) - death(0) - suiciding = 0 - -/mob/living/silicon/ai/verb/suicide() - set hidden = 1 - - if (stat == 2) - src << "You're already dead!" - return - - if (suiciding) - src << "You're already committing suicide! Be patient!" - return - - var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") - - if(confirm == "Yes") - suiciding = 1 - viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." - //put em at -175 - adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - updatehealth() - -/mob/living/silicon/robot/verb/suicide() - set hidden = 1 - - if (stat == 2) - src << "You're already dead!" - return - - if (suiciding) - src << "You're already committing suicide! Be patient!" - return - - var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") - - if(confirm == "Yes") - suiciding = 1 - viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." - //put em at -175 - adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - updatehealth() - -/mob/living/silicon/pai/verb/suicide() - set category = "pAI Commands" - set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)" - set name = "pAI Suicide" - var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No") - if(answer == "Yes") -// var/obj/item/device/paicard/card = loc //why? This was causing runtime errors.. - card.removePersonality() - if(src.loc != card) - close_up() - var/turf/T = get_turf_or_move(card.loc) - for (var/mob/M in viewers(T)) - M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2) - death(0) - else - src << "Aborting suicide attempt." - -/mob/living/carbon/slime/verb/suicide() - set hidden = 1 - if (stat == 2) - src << "You're already dead!" - return - - if (suiciding) - src << "You're already committing suicide! Be patient!" - return - - var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") - - if(confirm == "Yes") - suiciding = 1 - setOxyLoss(100) - adjustBruteLoss(100 - getBruteLoss()) - setToxLoss(100) - setCloneLoss(100) - - updatehealth() +/mob/var/suiciding = 0 + +/mob/living/carbon/human/verb/suicide() + set hidden = 1 + + if (stat == DEAD) + src << "You're already dead!" + return + + if (!ticker) + src << "You can't commit suicide before the game starts!" + return + + if(!player_is_antag(mind)) + message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1) + src << "No. Adminhelp if there is a legitimate reason." + return + + if (suiciding) + src << "You're already committing suicide! Be patient!" + return + + var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(confirm == "Yes") + if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide + src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))" + return + suiciding = 1 + var/obj/item/held_item = get_active_hand() + if(held_item) + var/damagetype = held_item.suicide_act(src) + if(damagetype) + log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]") + var/damage_mod = 1 + switch(damagetype) //Sorry about the magic numbers. + //brute = 1, burn = 2, tox = 4, oxy = 8 + if(15) //4 damage types + damage_mod = 4 + + if(6, 11, 13, 14) //3 damage types + damage_mod = 3 + + if(3, 5, 7, 9, 10, 12) //2 damage types + damage_mod = 2 + + if(1, 2, 4, 8) //1 damage type + damage_mod = 1 + + else //This should not happen, but if it does, everything should still work + damage_mod = 1 + + //Do 175 damage divided by the number of damage types applied. + if(damagetype & BRUTELOSS) + adjustBruteLoss(30/damage_mod) //hack to prevent gibbing + adjustOxyLoss(145/damage_mod) + + if(damagetype & FIRELOSS) + adjustFireLoss(175/damage_mod) + + if(damagetype & TOXLOSS) + adjustToxLoss(175/damage_mod) + + if(damagetype & OXYLOSS) + adjustOxyLoss(175/damage_mod) + + //If something went wrong, just do normal oxyloss + if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS)) + adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + + updatehealth() + return + + log_and_message_admins("[key_name(src)] commited suicide") + viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ + "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ + "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ + "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.") + adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + updatehealth() + +/mob/living/carbon/brain/verb/suicide() + set hidden = 1 + + if (stat == 2) + src << "You're already dead!" + return + + if (!ticker) + src << "You can't commit suicide before the game starts!" + return + + if (suiciding) + src << "You're already committing suicide! Be patient!" + return + + var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(confirm == "Yes") + suiciding = 1 + viewers(loc) << "\red [src]'s brain is growing dull and lifeless. It looks like it's lost the will to live." + spawn(50) + death(0) + suiciding = 0 + +/mob/living/silicon/ai/verb/suicide() + set hidden = 1 + + if (stat == 2) + src << "You're already dead!" + return + + if (suiciding) + src << "You're already committing suicide! Be patient!" + return + + var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(confirm == "Yes") + suiciding = 1 + viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." + //put em at -175 + adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + updatehealth() + +/mob/living/silicon/robot/verb/suicide() + set hidden = 1 + + if (stat == 2) + src << "You're already dead!" + return + + if (suiciding) + src << "You're already committing suicide! Be patient!" + return + + var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(confirm == "Yes") + suiciding = 1 + viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." + //put em at -175 + adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + updatehealth() + +/mob/living/silicon/pai/verb/suicide() + set category = "pAI Commands" + set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)" + set name = "pAI Suicide" + var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No") + if(answer == "Yes") +// var/obj/item/device/paicard/card = loc //why? This was causing runtime errors.. + card.removePersonality() + if(src.loc != card) + close_up() + var/turf/T = get_turf_or_move(card.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2) + death(0) + else + src << "Aborting suicide attempt." + +/mob/living/carbon/slime/verb/suicide() + set hidden = 1 + if (stat == 2) + src << "You're already dead!" + return + + if (suiciding) + src << "You're already committing suicide! Be patient!" + return + + var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(confirm == "Yes") + suiciding = 1 + setOxyLoss(100) + adjustBruteLoss(100 - getBruteLoss()) + setToxLoss(100) + setCloneLoss(100) + + updatehealth() diff --git a/code/global.dm b/code/global.dm index a77d05a5858..b916ed959a3 100644 --- a/code/global.dm +++ b/code/global.dm @@ -3,8 +3,9 @@ #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 +var/global/datum/datacore/data_core = null var/global/list/all_areas = list() var/global/list/machines = list() var/global/list/processing_objects = list() @@ -15,101 +16,37 @@ var/global/list/med_hud_users = list() // List of all entities using var/global/list/sec_hud_users = list() // List of all entities using a security HUD. var/global/list/hud_icon_reference = list() -// Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them. -var/list/restricted_camera_networks = list("thunder","ERT","NUKE","Secret") var/global/list/global_mutations = list() // List of hidden mutation things. -var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called manually after an event. - -// The resulting sector map looks like: -// ___ ___ -// | 1 | 4 | -// ---+--- -// | 5 | 3 | -// --- --- -// -// 1: SS13. -// 4: Derelict. -// 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)) // Noises made when hit while typing. var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF") -var/list/paper_tag_whitelist = list( - "center", "p", "div", "span", "pre", "h1", "h2", "h3", "h4", "h5", "h6", "br", "hr", - "big", "small", "font", "i", "u", "b", "s", "sub", "sup", "tt", "ol", "ul", "li", - "caption", "col", "table", "td", "th", "tr" -) -var/list/paper_blacklist = list( - "java", "onblur", "onchange", "onclick", "ondblclick", "onselect", "onfocus", - "onsubmit", "onreset", "onload", "onunload", "onkeydown", "onkeyup", "onkeypress", - "onmousedown", "onmouseup", "onmousemove", "onmouseout", "onmouseover", -) -// The way blocks are handled badly needs a rewrite, this is horrible. -// Too much of a project to handle at the moment, TODO for later. -var/BLINDBLOCK = 0 -var/DEAFBLOCK = 0 -var/HULKBLOCK = 0 -var/TELEBLOCK = 0 -var/FIREBLOCK = 0 -var/XRAYBLOCK = 0 -var/CLUMSYBLOCK = 0 -var/FAKEBLOCK = 0 -var/COUGHBLOCK = 0 -var/GLASSESBLOCK = 0 -var/EPILEPSYBLOCK = 0 -var/TWITCHBLOCK = 0 -var/NERVOUSBLOCK = 0 -var/MONKEYBLOCK = 27 - -var/BLOCKADD = 0 -var/DIFFMUT = 0 - -var/HEADACHEBLOCK = 0 -var/NOBREATHBLOCK = 0 -var/REMOTEVIEWBLOCK = 0 -var/REGENERATEBLOCK = 0 -var/INCREASERUNBLOCK = 0 -var/REMOTETALKBLOCK = 0 -var/MORPHBLOCK = 0 -var/BLENDBLOCK = 0 -var/HALLUCINATIONBLOCK = 0 -var/NOPRINTSBLOCK = 0 -var/SHOCKIMMUNITYBLOCK = 0 -var/SMALLSIZEBLOCK = 0 - -var/skipupdate = 0 - -var/eventchance = 10 // Percent chance per 5 minutes. -var/event = 0 -var/hadevent = 0 -var/blobevent = 0 - -var/diary = null +var/diary = null var/diary_runtime = null var/diary_date_string = null -var/href_logfile = null -var/station_name = "NSS Exodus" -var/commstation_name = "NTCC Odin" -var/game_version = "Baystation12" -var/changelog_hash = "" -var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 442) +var/href_logfile = null +var/station_name = "NSS Exodus" +var/station_short = "Exodus" +var/const/dock_name = "NTCC Odin" +var/const/boss_name = "Central Command" +var/const/boss_short = "Centcomm" +var/const/company_name = "NanoTrasen" +var/const/company_short = "NT" +var/game_version = "Baystation12" +var/changelog_hash = "" +var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544) -var/going = 1.0 +var/round_progressing = 1 var/master_mode = "extended" // "extended" var/secret_force_mode = "secret" // if this is anything but "secret", the secret rotation will forceably choose this mode. -var/host = null -var/shuttle_frozen = 0 -var/shuttle_left = 0 -var/shuttlecoming = 0 +var/host = null //only here until check @ code\modules\ghosttrap\trap.dm:112 is fixed var/list/jobMax = list() var/list/bombers = list() @@ -117,18 +54,6 @@ var/list/admin_log = list() var/list/lastsignalers = list() // Keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]" var/list/lawchanges = list() // Stores who uploaded laws to which silicon-based lifeform, and what the law was. var/list/reg_dna = list() -//var/list/traitobj = list() - -var/mouse_respawn_time = 5 // Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes. - -var/CELLRATE = 0.002 // Multiplier for watts per tick <> cell storage (e.g., 0.02 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) - // It's a conversion constant. power_used*CELLRATE = charge_provided, or charge_used/CELLRATE = power_provided -var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (0.01 means cellcharge is capped to 1% per second) - -var/shuttle_z = 2 // Default. -var/airtunnel_start = 68 // Default. -var/airtunnel_stop = 68 // Default. -var/airtunnel_bottom = 72 // Default. var/list/monkeystart = list() var/list/wizardstart = list() @@ -143,18 +68,16 @@ var/list/latejoin_cyborg = list() var/list/prisonwarp = list() // Prisoners go to these var/list/holdingfacility = list() // Captured people go here var/list/xeno_spawn = list() // Aliens spawn at at these. -//var/list/mazewarp = list() var/list/tdome1 = list() var/list/tdome2 = list() var/list/tdomeobserve = list() var/list/tdomeadmin = list() var/list/prisonsecuritywarp = list() // Prison security goes to these. var/list/prisonwarped = list() // List of players already warped. -var/list/blobstart = list() var/list/ninjastart = list() -//var/list/traitors = list() // Traitor list. var/list/cardinal = list(NORTH, SOUTH, EAST, WEST) +var/list/cornerdirs = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) var/list/alldirs = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) var/list/reverse_dir = list( // reverse_dir[dir] = reverse of dir 2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15, 32, 34, 33, 35, 40, 42, @@ -162,7 +85,6 @@ var/list/reverse_dir = list( // reverse_dir[dir] = reverse of dir 23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63 ) -var/datum/station_state/start_state = null var/datum/configuration/config = null var/datum/sun/sun = null @@ -173,13 +95,11 @@ var/list/adminlog = list() var/list/powernets = list() -var/Debug = 0 // Global debug switch. var/Debug2 = 0 var/datum/debug/debugobj var/datum/moduletypes/mods = new() -var/wavesecret = 0 var/gravity_is_on = 1 var/datum/server_greeting/server_greeting = null @@ -205,12 +125,6 @@ var/DBConnection/dbcon // Added for Xenoarchaeology, might be useful for other stuff. var/global/list/alphabet_uppercase = list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") -// Chemistry lists. -var/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglycerin", "thirteenloko", "nicotine") // Increase heart rate. -var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") // Decrease heart rate. -var/list/heartstopper = list("potassium_chlorophoride", "zombie_powder") // This stops the heart. -var/list/cheartstopper = list("potassium_chloride") // This stops the heart when overdose is met. -- c = conditional - // Used by robots and robot preferences. var/list/robot_module_types = list( "Standard", "Engineering", "Construction", "Medical", "Rescue", diff --git a/code/hub.dm b/code/hub.dm index 6c38b00143f..176e3cc5cb4 100644 --- a/code/hub.dm +++ b/code/hub.dm @@ -1,13 +1,14 @@ /world - hub = "Exadv1.spacestation13" - hub_password = "SORRYNOPASSWORD" name = "Space Station 13" -/* This is for any host that would like their server to appear on the main SS13 hub. -To use it, simply replace the password above, with the password found below, and it should work. -If not, let us know on the main tgstation IRC channel of irc.rizon.net #tgstation13 we can help you there. - - hub = "Exadv1.spacestation13" +#ifdef HUB_ENABLED hub_password = "kMZy3U5jJHSiBQjr" - name = "Space Station 13" -*/ \ No newline at end of file +#else + hub_password = "SORRYNOPASSWORD" +#endif + + +/* This is for any host that would like their server to appear on the main SS13 hub. + * To use it, simply replace the password above, with the password found below, and it should work. + * If not, let us know on the main tgstation IRC channel of irc.rizon.net #tgstation13 we can help you there. + */ diff --git a/code/js/view_variables.js b/code/js/view_variables.js new file mode 100644 index 00000000000..86ca8cadc69 --- /dev/null +++ b/code/js/view_variables.js @@ -0,0 +1,33 @@ +function updateSearch() { + var filter_text = document.getElementById('filter'); + var filter = filter_text.value.toLowerCase(); + + var vars_ol = document.getElementById('vars'); + var lis = vars_ol.children; + // the above line can be changed to vars_ol.getElementsByTagName("li") to filter child lists too + // potential todo: implement a per-admin toggle for this + + for(var i = 0; i < lis.length; i++) { + var li = lis[i]; + if(filter == "" || li.innerText.toLowerCase().indexOf(filter) != -1) { + li.style.display = "block"; + } else { + li.style.display = "none"; + } + } +} + +function selectTextField() { + var filter_text = document.getElementById('filter'); + filter_text.focus(); + filter_text.select(); +} + +function loadPage(list) { + if(list.options[list.selectedIndex].value == "") { + return; + } + + location.href=list.options[list.selectedIndex].value; + list.selectedIndex = 0; +} diff --git a/code/modules/acting/acting_items.dm b/code/modules/acting/acting_items.dm new file mode 100644 index 00000000000..fb229de764e --- /dev/null +++ b/code/modules/acting/acting_items.dm @@ -0,0 +1,37 @@ +/obj/machinery/acting/wardrobe + name = "wardrobe dispenser" + desc = "A machine that dispenses holo-clothing for those in need." + icon = 'icons/obj/vending.dmi' + icon_state = "cart" + anchored = 1 + density = 1 + var/active = 1 + +/obj/machinery/acting/wardrobe/attack_hand(var/mob/user as mob) + user.show_message("You push a button and watch patiently as the machine begins to hum.") + if(active) + active = 0 + spawn(30) + new /obj/item/weapon/storage/box/syndie_kit/chameleon(src.loc) + src.visible_message("\The [src] beeps, dispensing a small box onto the floor.", "You hear a beeping sound followed by a thumping noise of some kind.") + active = 1 + +/obj/machinery/acting/changer + name = "Quickee's Plastic Surgeon" + desc = "For when you need to be someone else right now." + icon = 'icons/obj/surgery.dmi' + icon_state = "bioprinter" + anchored = 1 + density = 1 + +/obj/machinery/acting/changer/attack_hand(var/mob/user as mob) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.change_appearance(APPEARANCE_ALL, H.loc, H, H.generate_valid_species(), state = z_state) + var/getName = sanitize(input(H, "Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN) + if(getName) + H.real_name = getName + H.name = getName + H.dna.real_name = getName + if(H.mind) + H.mind.name = H.name diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 816e24e3cd2..be0fe6a417d 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -455,9 +455,9 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) if("TEMPBAN") typedesc = "TEMPBAN
      ([duration] minutes) [(unbanned || auto) ? "" : "(Edit)"]
      Expires [expiration]
      " if("JOB_PERMABAN") - typedesc = "JOBBAN
      ([job])" + typedesc = "JOBBAN
      ([job])" if("JOB_TEMPBAN") - typedesc = "TEMP JOBBAN
      ([job])
      ([duration] minutes)
      Expires [expiration]" + typedesc = "TEMP JOBBAN
      ([job])
      ([duration] minutes
      Expires [expiration]
      " output += "" output += "[typedesc]" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 06531cbcf5a..d59051c6f64 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -58,7 +58,7 @@ proc/admin_notice(var/message, var/rights) TP - PM - SM - - JMP\]

      + [admin_jump_link(M, src)]\]
      Mob type = [M.type]

      Kick | Warn | @@ -364,7 +364,7 @@ proc/admin_notice(var/message, var/rights) dat+={"
      Feed Security functions:

      [(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue
      Censor Feed Stories -
      Mark Feed Channel with Nanotrasen D-Notice (disables and locks the channel. +
      Mark Feed Channel with [company_name] D-Notice (disables and locks the channel.

      The newscaster recognises you as:
      [src.admincaster_signature]
      "} if(1) @@ -430,7 +430,7 @@ proc/admin_notice(var/message, var/rights) dat+="[src.admincaster_feed_channel.channel_name]: \[created by: [src.admincaster_feed_channel.author]\]
      " if(src.admincaster_feed_channel.censored) dat+={" - ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
      + ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a [company_name] D-Notice.
      No further feed story additions are allowed while the D-Notice is in effect.


      "} else @@ -451,7 +451,7 @@ proc/admin_notice(var/message, var/rights) "} if(10) dat+={" - Nanotrasen Feed Censorship Tool
      + [company_name] Feed Censorship Tool
      NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
      Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.

      Select Feed channel to get Stories from:
      @@ -464,7 +464,7 @@ proc/admin_notice(var/message, var/rights) dat+="
      Cancel" if(11) dat+={" - Nanotrasen D-Notice Handler
      + [company_name] D-Notice Handler
      A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.
      @@ -497,7 +497,7 @@ proc/admin_notice(var/message, var/rights) "} if(src.admincaster_feed_channel.censored) dat+={" - ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
      + ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a [company_name] D-Notice.
      No further feed story additions are allowed while the D-Notice is in effect.


      "} else @@ -615,110 +615,17 @@ proc/admin_notice(var/message, var/rights) if(!check_rights(0)) return var/dat = "The first rule of adminbuse is: you don't talk about the adminbuse.
      " - - if(check_rights(R_ADMIN,0)) - dat += {" - Admin Secrets
      -
      - Bombing List
      - Show current traitors and objectives
      - Show last [length(lastsignalers)] signalers
      - Show last [lawchanges.len] law change\s
      - Show AI Laws
      - Show Game Mode
      - Show Crew Manifest
      - List DNA (Blood)
      - List Fingerprints

      -
      - "} - - if(check_rights(R_FUN,0)) - dat += {" - 'Random' Events
      -
      - Toggle station artificial gravity
      - Spawn a wave of meteors (aka lagocolyptic shower)
      - Spawn a gravitational anomaly (aka lagitational anomolag)
      - Spawn wormholes
      - Spawn blob
      - Trigger a Xenomorph infestation
      - Trigger a Cortical Borer infestation
      - Spawn an Alien silently
      - Trigger a Spider infestation
      - Send in a space ninja
      - Send in a strike team
      - Trigger an Carp migration
      - Irradiate the station
      - Trigger a Prison Break
      - Trigger a Virus Outbreak
      - Spawn an Immovable Rod
      - Toggle a "lights out" event
      - Spawn an Ion Storm
      - Spawn Space-Vines
      - Trigger a communication blackout
      -
      - Fun Secrets
      -
      - Remove 'internal' clothing
      - Remove ALL clothing
      - Turn all humans into monkeys
      - Remove firesuits, grilles, and pods
      - Make all areas powered
      - Make all areas unpowered
      - Power all SMES
      - Toggle Prison Shuttle Status(Use with S/R)
      - Send Prison Shuttle
      - Return Prison Shuttle
      - Warp all Players to Prison
      - Triple AI mode (needs to be used in the lobby)
      - Everyone is the traitor
      - There can only be one!
      - Ghost Mode
      - Make all players retarded
      - Make all items look like guns
      - Paintball Mode
      - Japanese Animes Mode
      - Egalitarian Station Mode
      - Launch a shuttle
      - Force launch a shuttle
      - Jump a shuttle
      - Move a shuttle
      - Break all lights
      - Fix all lights
      - Best Friend AI
      - The floor is lava! (DANGEROUS: extremely lame)
      - "} - - 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|R_DEV,0)) - dat += {" - Security Level Elevated
      -
      - Change all maintenance doors to engie/brig access only
      - Change all maintenance doors to brig access only
      - Remove cap on security officers
      -
      - Coder Secrets
      -
      - Show Job Debug
      - Admin Log
      -
      - "} - + for(var/datum/admin_secret_category/category in admin_secrets.categories) + if(!category.can_view(usr)) + continue + dat += "[category.name]
      " + if(category.desc) + dat += "[category.desc]
      " + for(var/datum/admin_secret_item/item in category.items) + if(!item.can_view(usr)) + continue + dat += "[item.name()]
      " + dat += "
      " usr << browse(dat, "window=secrets") return @@ -738,7 +645,7 @@ proc/admin_notice(var/message, var/rights) if(confirm == "Cancel") return if(confirm == "Yes") - world << "\red Restarting world! \blue Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!" + world << "Restarting world! Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!" log_admin("[key_name(usr)] initiated a reboot.") feedback_set_details("end_error","admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]") @@ -829,6 +736,22 @@ proc/admin_notice(var/message, var/rights) message_admins("[key_name_admin(usr)] toggled Dead OOC.", 1) feedback_add_details("admin_verb","TDOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/admins/proc/togglehubvisibility() + set category = "Server" + set desc="Globally Toggles Hub Visibility" + set name="Toggle Hub Visibility" + + if(!check_rights(R_ADMIN)) + return + + world.visibility = !(world.visibility) + var/long_message = " toggled hub visibility. The server is now [world.visibility ? "visible" : "invisible"] ([world.visibility])." + + discord_bot.send_to_admins("[key_name(src)]" + long_message) + message_admins("[key_name_admin(usr)]" + long_message, 1) + log_admin("[key_name(usr)] toggled hub visibility.") + feedback_add_details("admin_verb","THUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc + /datum/admins/proc/toggletraitorscaling() set category = "Server" set desc="Toggle traitor scaling" @@ -925,8 +848,8 @@ proc/admin_notice(var/message, var/rights) log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) return //alert("Round end delayed", null, null, null, null, null) - going = !( going ) - if (!( going )) + round_progressing = !round_progressing + if (!round_progressing) world << "The game start has been delayed." log_admin("[key_name(usr)] delayed the game.") else @@ -1301,15 +1224,15 @@ proc/admin_notice(var/message, var/rights) if(2) //Admins var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)](?) (PP) (VV) (SM) (JMP) (CA)" + return "[key_name(C, link, name, highlight_special)](?) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (CA)" if(3) //Undibbsed var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)](?) (DIBS) (PP) (JMP)" + return "[key_name(C, link, name, highlight_special)](?) (DIBS) (PP) ([admin_jump_link(M, src)])" if(4) //Mentors var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)] (?) (PP) (VV) (SM) (JMP)" + return "[key_name(C, link, name, highlight_special)] (?) (PP) (VV) (SM) ([admin_jump_link(M, src)])" // //ALL DONE diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index 967a4375da7..dd49331a7e0 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -1,8 +1,12 @@ /mob/var/lastattacker = null /mob/var/lastattacked = null -/mob/var/attack_log = list( ) +/mob/var/attack_log = list() + +proc/log_and_message_admins(var/message as text, var/mob/user = usr, var/turf/location) + var/turf/T = location ? location : (user ? get_turf(user) : null) + if(T) + message = message + " (JMP)" -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_admin(user)] [message]" : "EVENT [message]") diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm index b0f43741d02..9bc1c91ef3f 100644 --- a/code/modules/admin/admin_report.dm +++ b/code/modules/admin/admin_report.dm @@ -1,180 +1,180 @@ -// Reports are a way to notify admins of wrongdoings that happened -// while no admin was present. They work a bit similar to news, but -// they can only be read by admins and moderators. - -// a single admin report -datum/admin_report/var - ID // the ID of the report - body // the content of the report - author // key of the author - date // date on which this was created - done // whether this was handled - - offender_key // store the key of the offender - offender_cid // store the cid of the offender - -datum/report_topic_handler - Topic(href,href_list) - ..() - var/client/C = locate(href_list["client"]) - if(href_list["action"] == "show_reports") - C.display_admin_reports() - else if(href_list["action"] == "remove") - C.mark_report_done(text2num(href_list["ID"])) - else if(href_list["action"] == "edit") - C.edit_report(text2num(href_list["ID"])) - -var/datum/report_topic_handler/report_topic_handler - -world/New() - ..() - report_topic_handler = new - -// add a new news datums -proc/make_report(body, author, okey, cid) - var/savefile/Reports = new("data/reports.sav") - var/list/reports - var/lastID - - Reports["reports"] >> reports - Reports["lastID"] >> lastID - - if(!reports) reports = list() - if(!lastID) lastID = 0 - - var/datum/admin_report/created = new() - created.ID = ++lastID - created.body = body - created.author = author - created.date = world.realtime - created.done = 0 - created.offender_key = okey - created.offender_cid = cid - - reports.Insert(1, created) - - Reports["reports"] << reports - Reports["lastID"] << lastID - -// load the reports from disk -proc/load_reports() - var/savefile/Reports = new("data/reports.sav") - var/list/reports - - Reports["reports"] >> reports - - if(!reports) reports = list() - - return reports - -// check if there are any unhandled reports -client/proc/unhandled_reports() - if(!src.holder) return 0 - var/list/reports = load_reports() - - for(var/datum/admin_report/N in reports) - if(N.done) - continue - else return 1 - - return 0 - -// checks if the player has an unhandled report against him -client/proc/is_reported() - var/list/reports = load_reports() - - for(var/datum/admin_report/N in reports) if(!N.done) - if(N.offender_key == src.key) - return 1 - - return 0 - -// display only the reports that haven't been handled -client/proc/display_admin_reports() - set category = "Admin" - set name = "Display Admin Reports" - if(!src.holder) return - - var/list/reports = load_reports() - - var/output = "" - if(unhandled_reports()) - // load the list of unhandled reports - for(var/datum/admin_report/N in reports) - if(N.done) - continue - output += "Reported player: [N.offender_key](CID: [N.offender_cid])
      " - output += "Offense:[N.body]
      " - output += "Occured at [time2text(N.date,"MM/DD hh:mm:ss")]
      " - output += "authored by [N.author]
      " - output += " Flag as Handled" - if(src.key == N.author) - output += " Edit" - output += "
      " - output += "
      " - else - output += "Whoops, no reports!" - - usr << browse(output, "window=news;size=600x400") - - -client/proc/Report(mob/M as mob in world) - set category = "Admin" - if(!src.holder) - return - - var/CID = "Unknown" - if(M.client) - CID = M.client.computer_id - - var/body = input(src.mob, "Describe in detail what you're reporting [M] for", "Report") as null|text - if(!body) return - - - make_report(body, key, M.key, CID) - - spawn(1) - display_admin_reports() - -client/proc/mark_report_done(ID as num) - if(!src.holder || src.holder.level < 0) - return - - var/savefile/Reports = new("data/reports.sav") - var/list/reports - - Reports["reports"] >> reports - - var/datum/admin_report/found - for(var/datum/admin_report/N in reports) - if(N.ID == ID) - found = N - if(!found) src << "* An error occured, sorry." - - found.done = 1 - - Reports["reports"] << reports - - -client/proc/edit_report(ID as num) - if(!src.holder || src.holder.level < 0) - src << "You tried to modify the news, but you're not an admin!" - return - - var/savefile/Reports = new("data/reports.sav") - var/list/reports - - Reports["reports"] >> reports - - var/datum/admin_report/found - for(var/datum/admin_report/N in reports) - if(N.ID == ID) - found = N - if(!found) src << "* An error occured, sorry." - - var/body = input(src.mob, "Enter a body for the news", "Body") as null|message - if(!body) return - - found.body = body - - Reports["reports"] << reports +// Reports are a way to notify admins of wrongdoings that happened +// while no admin was present. They work a bit similar to news, but +// they can only be read by admins and moderators. + +// a single admin report +datum/admin_report/var + ID // the ID of the report + body // the content of the report + author // key of the author + date // date on which this was created + done // whether this was handled + + offender_key // store the key of the offender + offender_cid // store the cid of the offender + +datum/report_topic_handler + Topic(href,href_list) + ..() + var/client/C = locate(href_list["client"]) + if(href_list["action"] == "show_reports") + C.display_admin_reports() + else if(href_list["action"] == "remove") + C.mark_report_done(text2num(href_list["ID"])) + else if(href_list["action"] == "edit") + C.edit_report(text2num(href_list["ID"])) + +var/datum/report_topic_handler/report_topic_handler + +world/New() + ..() + report_topic_handler = new + +// add a new news datums +proc/make_report(body, author, okey, cid) + var/savefile/Reports = new("data/reports.sav") + var/list/reports + var/lastID + + Reports["reports"] >> reports + Reports["lastID"] >> lastID + + if(!reports) reports = list() + if(!lastID) lastID = 0 + + var/datum/admin_report/created = new() + created.ID = ++lastID + created.body = body + created.author = author + created.date = world.realtime + created.done = 0 + created.offender_key = okey + created.offender_cid = cid + + reports.Insert(1, created) + + Reports["reports"] << reports + Reports["lastID"] << lastID + +// load the reports from disk +proc/load_reports() + var/savefile/Reports = new("data/reports.sav") + var/list/reports + + Reports["reports"] >> reports + + if(!reports) reports = list() + + return reports + +// check if there are any unhandled reports +client/proc/unhandled_reports() + if(!src.holder) return 0 + var/list/reports = load_reports() + + for(var/datum/admin_report/N in reports) + if(N.done) + continue + else return 1 + + return 0 + +// checks if the player has an unhandled report against him +client/proc/is_reported() + var/list/reports = load_reports() + + for(var/datum/admin_report/N in reports) if(!N.done) + if(N.offender_key == src.key) + return 1 + + return 0 + +// display only the reports that haven't been handled +client/proc/display_admin_reports() + set category = "Admin" + set name = "Display Admin Reports" + if(!src.holder) return + + var/list/reports = load_reports() + + var/output = "" + if(unhandled_reports()) + // load the list of unhandled reports + for(var/datum/admin_report/N in reports) + if(N.done) + continue + output += "Reported player: [N.offender_key](CID: [N.offender_cid])
      " + output += "Offense:[N.body]
      " + output += "Occured at [time2text(N.date,"MM/DD hh:mm:ss")]
      " + output += "authored by [N.author]
      " + output += " Flag as Handled" + if(src.key == N.author) + output += " Edit" + output += "
      " + output += "
      " + else + output += "Whoops, no reports!" + + usr << browse(output, "window=news;size=600x400") + + +client/proc/Report(mob/M as mob in mob_list) + set category = "Admin" + if(!src.holder) + return + + var/CID = "Unknown" + if(M.client) + CID = M.client.computer_id + + var/body = input(src.mob, "Describe in detail what you're reporting [M] for", "Report") as null|text + if(!body) return + + + make_report(body, key, M.key, CID) + + spawn(1) + display_admin_reports() + +client/proc/mark_report_done(ID as num) + if(!src.holder || src.holder.level < 0) + return + + var/savefile/Reports = new("data/reports.sav") + var/list/reports + + Reports["reports"] >> reports + + var/datum/admin_report/found + for(var/datum/admin_report/N in reports) + if(N.ID == ID) + found = N + if(!found) src << "* An error occured, sorry." + + found.done = 1 + + Reports["reports"] << reports + + +client/proc/edit_report(ID as num) + if(!src.holder || src.holder.level < 0) + src << "You tried to modify the news, but you're not an admin!" + return + + var/savefile/Reports = new("data/reports.sav") + var/list/reports + + Reports["reports"] >> reports + + var/datum/admin_report/found + for(var/datum/admin_report/N in reports) + if(N.ID == ID) + found = N + if(!found) src << "* An error occured, sorry." + + var/body = input(src.mob, "Enter a body for the news", "Body") as null|message + if(!body) return + + found.body = body + + Reports["reports"] << reports diff --git a/code/modules/admin/admin_secrets.dm b/code/modules/admin/admin_secrets.dm new file mode 100644 index 00000000000..0dbc8d5efc7 --- /dev/null +++ b/code/modules/admin/admin_secrets.dm @@ -0,0 +1,110 @@ +var/datum/admin_secrets/admin_secrets = new() + +/datum/admin_secrets + var/list/datum/admin_secret_category/categories + var/list/datum/admin_secret_item/items + +/datum/admin_secrets/New() + ..() + categories = init_subtypes(/datum/admin_secret_category) + items = list() + var/list/category_assoc = list() + for(var/datum/admin_secret_category/category in categories) + category_assoc[category.type] = category + + for(var/item_type in (typesof(/datum/admin_secret_item) - /datum/admin_secret_item)) + var/datum/admin_secret_item/secret_item = item_type + if(!initial(secret_item.name)) + continue + + var/datum/admin_secret_item/item = new item_type() + var/datum/admin_secret_category/category = category_assoc[item.category] + dd_insertObjectList(category.items, item) + items += item + +/datum/admin_secret_category + var/name = "" + var/desc = "" + var/list/datum/admin_secret_item/items + +/datum/admin_secret_category + ..() + items = list() + +/datum/admin_secret_category/proc/can_view(var/mob/user) + for(var/datum/admin_secret_item/item in items) + if(item.can_view(user)) + return 1 + return 0 + +/datum/admin_secret_item + var/name = "" + var/category = null + var/log = 1 + var/feedback = 1 + var/permissions = R_ADMIN + var/warn_before_use = 0 + +/datum/admin_secret_item/dd_SortValue() + return "[name]" + +/datum/admin_secret_item/proc/name() + return name + +/datum/admin_secret_item/proc/can_view(var/mob/user) + return check_rights(permissions, 0, user) + +/datum/admin_secret_item/proc/can_execute(var/mob/user) + if(can_view(user)) + if(!warn_before_use || alert("Execute the command '[name]'?", name, "No","Yes") == "Yes") + return 1 + return 0 + +/datum/admin_secret_item/proc/execute(var/mob/user) + if(!can_execute(user)) + return 0 + + if(log) + log_and_message_admins("used secret '[name]'", user) + if(feedback) + feedback_inc("admin_secrets_used",1) + feedback_add_details("admin_secrets_used","[name]") + return 1 + +/************************* +* Pre-defined categories * +*************************/ +/datum/admin_secret_category/admin_secrets + name = "Admin Secrets" + +/datum/admin_secret_category/random_events + name = "'Random' Events" + +/datum/admin_secret_category/fun_secrets + name = "Fun Secrets" + +/datum/admin_secret_category/final_solutions + name = "Final Solutions" + desc = "(Warning, these will end the round!)" + +/************************* +* Pre-defined base items * +*************************/ +/datum/admin_secret_item/admin_secret + category = /datum/admin_secret_category/admin_secrets + log = 0 + permissions = R_ADMIN + +/datum/admin_secret_item/random_event + category = /datum/admin_secret_category/random_events + permissions = R_FUN + warn_before_use = 1 + +/datum/admin_secret_item/fun_secret + category = /datum/admin_secret_category/fun_secrets + permissions = R_FUN + warn_before_use = 1 + +/datum/admin_secret_item/final_solution + category = /datum/admin_secret_category/final_solutions + permissions = R_FUN|R_SERVER|R_ADMIN diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9ace60e9af4..56be3304b8e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,6 +1,6 @@ //admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless var/list/admin_verbs_default = list( - /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ + /datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, /client/proc/player_panel, /client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/ /client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/ @@ -37,18 +37,18 @@ var/list/admin_verbs_admin = list( /client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/ // /client/proc/sendmob, /*sends a mob somewhere*/ -Removed due to it needing two sorting procs to work, which were executed every time an admin right-clicked. ~Errorage /client/proc/Jump, - /client/proc/jumptokey, /*allows us to jump to the location of a mob with a certain ckey*/ - /client/proc/jumptomob, /*allows us to jump to a specific mob*/ - /client/proc/jumptoturf, /*allows us to jump to a specific turf*/ - /client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/ - /client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcomm*/ - /client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/ - /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ + /client/proc/jumptokey, //allows us to jump to the location of a mob with a certain ckey, + /client/proc/jumptomob, //allows us to jump to a specific mob, + /client/proc/jumptoturf, //allows us to jump to a specific turf, + /client/proc/admin_call_shuttle, //allows us to call the emergency shuttle, + /client/proc/admin_cancel_shuttle, //allows us to cancel the emergency shuttle, sending it back to centcomm, + /client/proc/cmd_admin_direct_narrate, //send text directly to a player with no padding. Useful for narratives and fluff-text, + /client/proc/cmd_admin_world_narrate, //sends text to all players with no padding, /client/proc/cmd_admin_create_centcom_report, - /client/proc/check_words, /*displays cult-words*/ - /client/proc/check_ai_laws, /*shows AI and borg laws*/ - /client/proc/rename_silicon, /*properly renames silicons*/ - /client/proc/manage_silicon_laws, /* Allows viewing and editing silicon laws. */ + /client/proc/check_words, //displays cult-words, + /client/proc/check_ai_laws, //shows AI and borg laws, + /client/proc/rename_silicon, //properly renames silicons, + /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , /client/proc/check_antagonists, /client/proc/admin_memo_control, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ @@ -57,16 +57,17 @@ var/list/admin_verbs_admin = list( /client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/ /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*/ - /client/proc/cmd_admin_say, /*admin-only ooc chat*/ + /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, + /client/proc/cmd_admin_say, //admin-only ooc chat, + /datum/admins/proc/togglehubvisibility, //toggles visibility on the BYOND Hub, /datum/admins/proc/PlayerNotes, /client/proc/cmd_mod_say, /datum/admins/proc/show_player_info, - /client/proc/free_slot, /*frees slot for chosen job*/ + /client/proc/free_slot, //frees slot for chosen job, /client/proc/cmd_admin_change_custom_event, /client/proc/cmd_admin_rejuvenate, /client/proc/toggleattacklogs, @@ -77,15 +78,15 @@ var/list/admin_verbs_admin = list( /client/proc/check_customitem_activity, /client/proc/man_up, /client/proc/global_man_up, - /client/proc/response_team, // Response Teams admin verb + /client/proc/response_team, // Response Teams admin verb, /client/proc/toggle_antagHUD_use, /client/proc/toggle_antagHUD_restrictions, - /client/proc/allow_character_respawn, /* Allows a ghost to respawn */ + /client/proc/allow_character_respawn, // Allows a ghost to respawn , /client/proc/event_manager_panel, /client/proc/empty_ai_core_toggle_latejoin, /client/proc/aooc, - /client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */ - /client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */ + /client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs , + /client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance , /client/proc/change_security_level, /client/proc/view_chemical_reaction_logs, /client/proc/makePAI, @@ -113,7 +114,7 @@ var/list/admin_verbs_fun = list( /client/proc/cmd_admin_dress, /client/proc/cmd_admin_gib_self, /client/proc/drop_bomb, - /client/proc/everyone_random, + /client/proc/everyone_random, /client/proc/cinematic, /datum/admins/proc/toggle_aliens, /datum/admins/proc/toggle_space_ninja, @@ -123,19 +124,23 @@ var/list/admin_verbs_fun = list( /client/proc/toggle_random_events, /client/proc/editappear, /client/proc/roll_dices, - /datum/admins/proc/create_admin_fax + /datum/admins/proc/create_admin_fax, + /datum/admins/proc/call_supply_drop, + /datum/admins/proc/call_drop_pod ) + var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_fruit, /datum/admins/proc/spawn_custom_item, /datum/admins/proc/check_custom_items, /datum/admins/proc/spawn_plant, - /datum/admins/proc/spawn_atom, /*allows us to spawn instances*/ + /datum/admins/proc/spawn_atom, // allows us to spawn instances, /client/proc/respawn_character, /client/proc/virus2_editor, /client/proc/spawn_chemdisp_cartridge ) var/list/admin_verbs_server = list( + /datum/admins/proc/capture_map, /client/proc/Set_Holiday, /client/proc/ToRban, /datum/admins/proc/startnow, @@ -146,7 +151,7 @@ var/list/admin_verbs_server = list( /datum/admins/proc/immreboot, /client/proc/everyone_random, /datum/admins/proc/toggleAI, - /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/ + /client/proc/cmd_admin_delete, // delete an instance/object/mob/etc, /client/proc/cmd_debug_del_all, /datum/admins/proc/adrev, /datum/admins/proc/adspawn, @@ -159,7 +164,7 @@ var/list/admin_verbs_server = list( /client/proc/admin_edit_motd ) var/list/admin_verbs_debug = list( - /client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/ + /client/proc/getruntimelog, // allows us to access runtime logs to somebody, /client/proc/cmd_admin_list_open_jobs, /client/proc/Debug2, /client/proc/kill_air, @@ -178,9 +183,13 @@ var/list/admin_verbs_debug = list( /client/proc/restart_controller, /client/proc/print_random_map, /client/proc/create_random_map, + /client/proc/apply_random_map, + /client/proc/overlay_random_map, + /client/proc/delete_random_map, /client/proc/show_plant_genes, /client/proc/enable_debug_verbs, /client/proc/callproc, + /client/proc/callproc_target, /client/proc/toggledebuglogs, /client/proc/SDQL_query, /client/proc/SDQL2_query, @@ -192,6 +201,7 @@ var/list/admin_verbs_debug = list( var/list/admin_verbs_paranoid_debug = list( /client/proc/callproc, + /client/proc/callproc_target, /client/proc/debug_controller ) @@ -261,6 +271,7 @@ var/list/admin_verbs_hideable = list( /client/proc/restart_controller, /client/proc/cmd_admin_list_open_jobs, /client/proc/callproc, + /client/proc/callproc_target, /client/proc/Debug2, /client/proc/reload_admins, /client/proc/kill_air, @@ -278,12 +289,12 @@ var/list/admin_verbs_hideable = list( /proc/release ) var/list/admin_verbs_mod = list( - /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ - /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ - /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/ + /client/proc/cmd_admin_pm_context, // right-click adminPM interface, + /client/proc/cmd_admin_pm_panel, // admin-pm list, + /client/proc/debug_variables, // allows us to -see- the variables of any instance in the game., /client/proc/toggledebuglogs, /datum/admins/proc/PlayerNotes, - /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ + /client/proc/admin_ghost, // allows us to ghost/reenter body at will, /client/proc/cmd_mod_say, /datum/admins/proc/show_player_info, /client/proc/player_panel_new, @@ -540,7 +551,7 @@ var/list/admin_verbs_cciaa = list( prefs.ooccolor = input(src, "Please select your OOC colour.", "OOC colour") as color else if(response == "Reset to default") prefs.ooccolor = initial(prefs.ooccolor) - prefs.handle_preferences_save(src) + prefs.save_preferences() feedback_add_details("admin_verb","OC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -634,7 +645,7 @@ var/list/admin_verbs_cciaa = list( log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].", 1) -/client/proc/make_sound(var/obj/O in world) // -- TLE +/client/proc/make_sound(var/obj/O in range(world.view)) // -- TLE set category = "Special Verbs" set name = "Make Sound" set desc = "Display a message to everyone who can hear the target" @@ -697,7 +708,7 @@ var/list/admin_verbs_cciaa = list( set category = "Admin" if(holder) - if(alert("Confirm self-deadmin for the round? You can't re-admin yourself without someont promoting you.",,"Yes","No") == "Yes") + if(alert("Confirm self-deadmin for the round? You can re-admin yourself at any time.",,"Yes","No") == "Yes") log_admin("[src] deadmined themself.") message_admins("[src] deadmined themself.", 1) deadmin() @@ -747,7 +758,7 @@ var/list/admin_verbs_cciaa = list( var/mob/living/silicon/S = input("Select silicon.", "Manage Silicon Laws") as null|anything in silicon_mob_list if(!S) return - var/obj/nano_module/law_manager/L = new(S) + var/datum/nano_module/law_manager/L = new(S) L.ui_interact(usr, state = admin_state) 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! @@ -909,7 +920,7 @@ var/list/admin_verbs_cciaa = list( usr << "You now will get attack log messages" else usr << "You now won't get attack log messages" - prefs.handle_preferences_save(src) + prefs.save_preferences() /client/proc/toggleghostwriters() diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm new file mode 100644 index 00000000000..41b8998c30a --- /dev/null +++ b/code/modules/admin/callproc/callproc.dm @@ -0,0 +1,152 @@ + +/client/proc/callproc() + set category = "Debug" + set name = "Advanced ProcCall" + + if(!check_rights(R_DEBUG)) return + if(config.debugparanoid && !check_rights(R_ADMIN)) return + + var/target = null + var/targetselected = 0 + + switch(alert("Proc owned by something?",, "Yes", "No", "Cancel")) + if("Yes") + targetselected=1 + switch(input("Proc owned by...", "Owner", null) as null|anything in list("Obj", "Mob", "Area or Turf", "Client")) + if("Obj") + target = input("Select target:", "Target") as null|obj in world + if("Mob") + target = input("Select target:", "Target", usr) as null|mob in world + if("Area or Turf") + target = input("Select target:", "Target", get_turf(usr)) as null|area|turf in world + if("Client") + target = input("Select target:", "Target", usr.client) as null|anything in clients + else + return + if(!target) + usr << "Proc call cancelled." + return + if("Cancel") + return + if("No") + ; // do nothing + + callproc_targetpicked(targetselected, target) + +/client/proc/callproc_target(atom/A in range(world.view)) + set category = "Debug" + set name = "Advanced ProcCall Target" + + if(!check_rights(R_DEBUG)) return + if(config.debugparanoid && !check_rights(R_ADMIN)) return + + callproc_targetpicked(1, A) + +/client/proc/callproc_targetpicked(hastarget, datum/target) + + // this needs checking again here because VV's 'Call Proc' option directly calls this proc with the target datum + if(!check_rights(R_DEBUG)) return + if(config.debugparanoid && !check_rights(R_ADMIN)) return + + var/returnval = null + + var/procname = input("Proc name", "Proc") as null|text + if(!procname) return + + if(hastarget) + if(!target) + usr << "Your callproc target no longer exists." + return + if(!hascall(target, procname)) + usr << "\The [target] has no call [procname]()" + return + + var/list/arguments = list() + var/done = 0 + var/current = null + + while(!done) + if(hastarget && !target) + usr << "Your callproc target no longer exists." + return + switch(input("Type of [arguments.len+1]\th variable", "argument [arguments.len+1]") as null|anything in list( + "finished", "null", "text", "num", "type", "obj reference", "mob reference", + "area/turf reference", "icon", "file", "client", "mob's area", "marked datum")) + if(null) + return + + if("finished") + done = 1 + + if("null") + current = null + + if("text") + current = input("Enter text for [arguments.len+1]\th argument") as null|text + if(isnull(current)) return + + if("num") + current = input("Enter number for [arguments.len+1]\th argument") as null|num + if(isnull(current)) return + + if("type") + current = input("Select type for [arguments.len+1]\th argument") as null|anything in typesof(/obj, /mob, /area, /turf) + if(isnull(current)) return + + if("obj reference") + current = input("Select object for [arguments.len+1]\th argument") as null|obj in world + if(isnull(current)) return + + if("mob reference") + current = input("Select mob for [arguments.len+1]\th argument") as null|mob in world + if(isnull(current)) return + + if("area/turf reference") + current = input("Select area/turf for [arguments.len+1]\th argument") as null|area|turf in world + if(isnull(current)) return + + if("icon") + current = input("Provide icon for [arguments.len+1]\th argument") as null|icon + if(isnull(current)) return + + if("client") + current = input("Select client for [arguments.len+1]\th argument") as null|anything in clients + if(isnull(current)) return + + if("mob's area") + var/mob/M = input("Select mob to take area for [arguments.len+1]\th argument") as null|mob in world + if(!M) return + current = get_area(M) + if(!current) + switch(alert("\The [M] appears to not have an area; do you want to pass null instead?",, "Yes", "Cancel")) + if("Yes") + ; // do nothing + if("Cancel") + return + + if("marked datum") + current = holder.marked_datum + if(!current) + switch(alert("You do not currently have a marked datum; do you want to pass null instead?",, "Yes", "Cancel")) + if("Yes") + ; // do nothing + if("Cancel") + return + if(!done) + arguments += current + + if(hastarget) + if(!target) + usr << "Your callproc target no longer exists." + return + log_admin("[key_name(src)] called [target]'s [procname]() with [arguments.len ? "the arguments [list2params(arguments)]" : "no arguments"].") + if(arguments.len) + returnval = call(target, procname)(arglist(arguments)) + else + returnval = call(target, procname)() + else + log_admin("[key_name(src)] called [procname]() with [arguments.len ? "the arguments [list2params(arguments)]" : "no arguments"].") + returnval = call(procname)(arglist(arguments)) + + usr << "[procname]() returned: [isnull(returnval) ? "null" : returnval]" + feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index ef3b35b45c3..0b294e8e2eb 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -20,7 +20,7 @@ var/list/admin_datums = list() error("Admin datum created without a ckey argument. Datum has been deleted") qdel(src) return - admincaster_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" + admincaster_signature = "[company_name] Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" rank = initial_rank rights = initial_rights admin_datums[ckey] = src diff --git a/code/modules/admin/map_capture.dm b/code/modules/admin/map_capture.dm new file mode 100644 index 00000000000..1930ae8d672 --- /dev/null +++ b/code/modules/admin/map_capture.dm @@ -0,0 +1,26 @@ +/datum/admins/proc/capture_map(tx as null|num, ty as null|num, tz as null|num, range as null|num) + set category = "Server" + set name = "Capture Map Part" + set desc = "Usage: Capture-Map-Part target_x_cord target_y_cord target_z_cord range (captures part of a map originating from bottom left corner)" + + if(!check_rights(R_ADMIN|R_DEBUG|R_SERVER)) + usr << "You are not allowed to use this command" + return + + if(isnull(tx) || isnull(ty) || isnull(tz) || isnull(range)) + usr << "Capture Map Part, captures part of a map using camara like rendering." + usr << "Usage: Capture-Map-Part target_x_cord target_y_cord target_z_cord range" + usr << "Target coordinates specify bottom left corner of the capture, range defines render distance to opposite corner." + return + + if(range > 32 || range <= 0) + usr << "Capturing range is incorrect, it must be within 1-32." + return + + if(locate(tx,ty,tz)) + var/cap = generate_image(tx ,ty ,tz ,range, CAPTURE_MODE_PARTIAL, null, 1, 1) + var/file_name = "map_capture_x[tx]_y[ty]_z[tz]_r[range].png" + usr << "Saved capture in cache as [file_name]." + usr << browse_rsc(cap, file_name) + else + usr << "Target coordinates are incorrect." diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 1af56750311..6c10ec96ff7 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -33,7 +33,7 @@ output += "" output += "[adm_ckey] \[-\]" output += "[rank]" - output += "[rights]
      " + output += "[rights]" output += "" output += {" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index ee5907eb65b..7313109e73d 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -291,7 +291,7 @@ - [M_name] - [M_rname] - [M_key] ([M_job]) + [M_name] - [M_rname] - [M_key] ([M_job])
      diff --git a/code/modules/admin/secrets/admin_secrets/admin_logs.dm b/code/modules/admin/secrets/admin_secrets/admin_logs.dm new file mode 100644 index 00000000000..d2664f1e2be --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/admin_logs.dm @@ -0,0 +1,13 @@ +/datum/admin_secret_item/admin_secret/admin_logs + name = "Admin Logs" + +/datum/admin_secret_item/admin_secret/admin_logs/execute(var/mob/user) + . = ..() + if(!.) + return + var/dat = "Admin Log
      " + for(var/l in admin_log) + dat += "
    3. [l]
    4. " + if(!admin_log.len) + dat += "No-one has done anything this round!" + user << browse(dat, "window=admin_log") diff --git a/code/modules/admin/secrets/admin_secrets/alter_narsie.dm b/code/modules/admin/secrets/admin_secrets/alter_narsie.dm new file mode 100644 index 00000000000..75281adca8f --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/alter_narsie.dm @@ -0,0 +1,14 @@ +/datum/admin_secret_item/admin_secret/alter_narise + name = "Alter Nar-Sie" + +/datum/admin_secret_item/admin_secret/alter_narise/execute(var/mob/user) + . = ..() + if(!.) + return + var/choice = input(user, "How do you wish for Nar-Sie to interact with its surroundings?") as null|anything in list("CultStation13", "Nar-Singulo") + if(choice == "CultStation13") + log_and_message_admins("has set narsie's behaviour to \"CultStation13\".", user) + narsie_behaviour = choice + if(choice == "Nar-Singulo") + log_and_message_admins("has set narsie's behaviour to \"Nar-Singulo\".", user) + narsie_behaviour = choice diff --git a/code/modules/admin/secrets/admin_secrets/bombing_list.dm b/code/modules/admin/secrets/admin_secrets/bombing_list.dm new file mode 100644 index 00000000000..f94af7e569a --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/bombing_list.dm @@ -0,0 +1,12 @@ +/datum/admin_secret_item/admin_secret/bombing_list + name = "Bombing List" + +/datum/admin_secret_item/admin_secret/bombing_list/execute(var/mob/user) + . = ..() + if(!.) + return + + var/dat = "Bombing List" + for(var/l in bombers) + dat += text("[l]
      ") + user << browse(dat, "window=bombers") diff --git a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm new file mode 100644 index 00000000000..4097632aa30 --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm @@ -0,0 +1,36 @@ +/datum/admin_secret_item/admin_secret/jump_shuttle + name = "Jump a Shuttle" + +/datum/admin_secret_item/admin_secret/jump_shuttle/can_execute(var/mob/user) + if(!shuttle_controller) return 0 + return ..() + +/datum/admin_secret_item/admin_secret/jump_shuttle/execute(var/mob/user) + . = ..() + if(!.) + return + var/shuttle_tag = input(user, "Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles + if (!shuttle_tag) return + + var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag] + + var/origin_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world + if (!origin_area) return + + var/destination_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world + if (!destination_area) return + + var/long_jump = alert(user, "Is there a transition area for this jump?","", "Yes", "No") + if (long_jump == "Yes") + var/transition_area = input(user, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world + if (!transition_area) return + + var/move_duration = input(user, "How many seconds will this jump take?") as num + + S.long_jump(origin_area, destination_area, transition_area, move_duration) + message_admins("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle", 1) + log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle") + else + S.short_jump(origin_area, destination_area) + message_admins("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle", 1) + log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle") diff --git a/code/modules/admin/secrets/admin_secrets/launch_shuttle.dm b/code/modules/admin/secrets/admin_secrets/launch_shuttle.dm new file mode 100644 index 00000000000..9d6ce44a2d2 --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/launch_shuttle.dm @@ -0,0 +1,26 @@ +/datum/admin_secret_item/admin_secret/launch_shuttle + name = "Launch a Shuttle" + +/datum/admin_secret_item/admin_secret/launch_shuttle/can_execute(var/mob/user) + if(!shuttle_controller) return 0 + return ..() + +/datum/admin_secret_item/admin_secret/launch_shuttle/execute(var/mob/user) + . = ..() + if(!.) + return + var/list/valid_shuttles = list() + for (var/shuttle_tag in shuttle_controller.shuttles) + if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry)) + valid_shuttles += shuttle_tag + + var/shuttle_tag = input(user, "Which shuttle do you want to launch?") as null|anything in valid_shuttles + if (!shuttle_tag) + return + + var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag] + if (S.can_launch()) + S.launch(user) + log_and_message_admins("launched the [shuttle_tag] shuttle", user) + else + alert(user, "The [shuttle_tag] shuttle cannot be launched at this time. It's probably busy.") diff --git a/code/modules/admin/secrets/admin_secrets/launch_shuttle_forced.dm b/code/modules/admin/secrets/admin_secrets/launch_shuttle_forced.dm new file mode 100644 index 00000000000..d1a86fec98d --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/launch_shuttle_forced.dm @@ -0,0 +1,26 @@ +/datum/admin_secret_item/admin_secret/launch_shuttle_forced + name = "Launch a Shuttle (Forced)" + +/datum/admin_secret_item/admin_secret/launch_shuttle_forced/can_execute(var/mob/user) + if(!shuttle_controller) return 0 + return ..() + +/datum/admin_secret_item/admin_secret/launch_shuttle_forced/execute(var/mob/user) + . = ..() + if(!.) + return + var/list/valid_shuttles = list() + for (var/shuttle_tag in shuttle_controller.shuttles) + if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry)) + valid_shuttles += shuttle_tag + + var/shuttle_tag = input(user, "Which shuttle's launch do you want to force?") as null|anything in valid_shuttles + if (!shuttle_tag) + return + + var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag] + if (S.can_force()) + S.force_launch(user) + log_and_message_admins("forced the [shuttle_tag] shuttle", user) + else + alert(user, "The [shuttle_tag] shuttle launch cannot be forced at this time. It's busy, or hasn't been launched yet.") diff --git a/code/modules/admin/secrets/admin_secrets/list_dna.dm b/code/modules/admin/secrets/admin_secrets/list_dna.dm new file mode 100644 index 00000000000..f1c49f48972 --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/list_dna.dm @@ -0,0 +1,14 @@ +/datum/admin_secret_item/admin_secret/list_dna + name = "List DNA (Blood)" + +/datum/admin_secret_item/admin_secret/list_dna/execute(var/mob/user) + . = ..() + if(!.) + return + var/dat = "Showing DNA from blood.
      " + dat += "" + for(var/mob/living/carbon/human/H in mob_list) + if(H.dna && H.ckey) + dat += "" + dat += "
      NameDNABlood Type
      [H][H.dna.unique_enzymes][H.b_type]
      " + user << browse(dat, "window=DNA;size=440x410") diff --git a/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm b/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm new file mode 100644 index 00000000000..03cb9701c41 --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/list_fingerprints.dm @@ -0,0 +1,19 @@ +/datum/admin_secret_item/admin_secret/list_fingerprints + name = "List Fingerprints" + +/datum/admin_secret_item/admin_secret/list_fingerprints/execute(var/mob/user) + . = ..() + if(!.) + return + var/dat = "Showing Fingerprints.
      " + dat += "" + for(var/mob/living/carbon/human/H in mob_list) + if(H.ckey) + if(H.dna && H.dna.uni_identity) + dat += "" + else if(H.dna && !H.dna.uni_identity) + dat += "" + else if(!H.dna) + dat += "" + dat += "
      NameFingerprints
      [H][md5(H.dna.uni_identity)]
      [H]H.dna.uni_identity = null
      [H]H.dna = null
      " + user << browse(dat, "window=fingerprints;size=440x410") diff --git a/code/modules/admin/secrets/admin_secrets/move_shuttle.dm b/code/modules/admin/secrets/admin_secrets/move_shuttle.dm new file mode 100644 index 00000000000..5772bbed54c --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/move_shuttle.dm @@ -0,0 +1,28 @@ +/datum/admin_secret_item/admin_secret/move_shuttle + name = "Move a Shuttle" + +/datum/admin_secret_item/admin_secret/move_shuttle/can_execute(var/mob/user) + if(!shuttle_controller) return 0 + return ..() + +/datum/admin_secret_item/admin_secret/move_shuttle/execute(var/mob/user) + . = ..() + if(!.) + return + var/confirm = alert(user, "This command directly moves a shuttle from one area to another. DO NOT USE THIS UNLESS YOU ARE DEBUGGING A SHUTTLE AND YOU KNOW WHAT YOU ARE DOING.", "Are you sure?", "Ok", "Cancel") + if (confirm == "Cancel") + return + + var/shuttle_tag = input(user, "Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles + if (!shuttle_tag) return + + var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag] + + var/origin_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world + if (!origin_area) return + + var/destination_area = input(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world + if (!destination_area) return + + S.move(origin_area, destination_area) + log_and_message_admins("moved the [shuttle_tag] shuttle", user) diff --git a/code/modules/admin/secrets/admin_secrets/prison_warp.dm b/code/modules/admin/secrets/admin_secrets/prison_warp.dm new file mode 100644 index 00000000000..eec85c2f04b --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/prison_warp.dm @@ -0,0 +1,38 @@ +/datum/admin_secret_item/admin_secret/prison_warp + name = "Prison Warp" + +/datum/admin_secret_item/admin_secret/prison_warp/can_execute(var/mob/user) + if(!ticker) return 0 + return ..() + +/datum/admin_secret_item/admin_secret/prison_warp/execute(var/mob/user) + . = ..() + if(!.) + return + for(var/mob/living/carbon/human/H in mob_list) + var/turf/T = get_turf(H) + var/security = 0 + if((T && T in config.admin_levels) || prisonwarped.Find(H)) + //don't warp them if they aren't ready or are already there + continue + H.Paralyse(5) + if(H.wear_id) + var/obj/item/weapon/card/id/id = H.get_idcard() + for(var/A in id.access) + if(A == access_security) + security++ + if(!security) + //strip their stuff before they teleport into a cell :downs: + for(var/obj/item/weapon/W in H) + if(istype(W, /obj/item/organ/external)) + continue + //don't strip organs + H.drop_from_inventory(W) + //teleport person to cell + H.loc = pick(prisonwarp) + H.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes) + else + //teleport security person + H.loc = pick(prisonsecuritywarp) + prisonwarped += H diff --git a/code/modules/admin/secrets/admin_secrets/show_ai_laws.dm b/code/modules/admin/secrets/admin_secrets/show_ai_laws.dm new file mode 100644 index 00000000000..c76ff2d9c18 --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/show_ai_laws.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/admin_secret/show_ai_laws + name = "Show AI laws" + +/datum/admin_secret_item/admin_secret/show_ai_laws/execute(var/mob/user) + . = ..() + if(.) + user.client.holder.output_ai_laws() diff --git a/code/modules/admin/secrets/admin_secrets/show_crew_manifest.dm b/code/modules/admin/secrets/admin_secrets/show_crew_manifest.dm new file mode 100644 index 00000000000..f4bb82224ba --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/show_crew_manifest.dm @@ -0,0 +1,12 @@ +/datum/admin_secret_item/admin_secret/show_crew_manifest + name = "Show Crew Manifest" + +/datum/admin_secret_item/admin_secret/show_crew_manifest/execute(var/mob/user) + . = ..() + if(!.) + return + var/dat + dat += "

      Crew Manifest

      " + dat += data_core.get_manifest() + + user << browse(dat, "window=manifest;size=370x420;can_close=1") diff --git a/code/modules/admin/secrets/admin_secrets/show_game_mode.dm b/code/modules/admin/secrets/admin_secrets/show_game_mode.dm new file mode 100644 index 00000000000..b586e108466 --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/show_game_mode.dm @@ -0,0 +1,14 @@ +/datum/admin_secret_item/admin_secret/show_game_mode + name = "Show Game Mode" + +/datum/admin_secret_item/admin_secret/show_game_mode/can_execute(var/mob/user) + if(!ticker) + return 0 + return ..() + +/datum/admin_secret_item/admin_secret/show_game_mode/execute(var/mob/user) + . = ..() + if(!.) + return + if (ticker.mode) alert("The game mode is [ticker.mode.name]") + else alert("For some reason there's a ticker, but not a game mode") diff --git a/code/modules/admin/secrets/admin_secrets/show_law_changes.dm b/code/modules/admin/secrets/admin_secrets/show_law_changes.dm new file mode 100644 index 00000000000..877e2c217de --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/show_law_changes.dm @@ -0,0 +1,15 @@ +/datum/admin_secret_item/admin_secret/show_law_changes + name = "Show law changes" + +/datum/admin_secret_item/admin_secret/show_law_changes/name() + return "Show Last [length(lawchanges)] Law change\s" + +/datum/admin_secret_item/admin_secret/show_law_changes/execute(var/mob/user) + . = ..() + if(!.) + return + + var/dat = "Showing last [length(lawchanges)] law changes.
      " + for(var/sig in lawchanges) + dat += "[sig]
      " + user << browse(dat, "window=lawchanges;size=800x500") diff --git a/code/modules/admin/secrets/admin_secrets/show_signalers.dm b/code/modules/admin/secrets/admin_secrets/show_signalers.dm new file mode 100644 index 00000000000..32a77cbef2e --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/show_signalers.dm @@ -0,0 +1,15 @@ +/datum/admin_secret_item/admin_secret/show_signalers + name = "Show Last Signalers" + +/datum/admin_secret_item/admin_secret/show_signalers/name() + return "Show Last [length(lastsignalers)] Signaler\s" + +/datum/admin_secret_item/admin_secret/show_signalers/execute(var/mob/user) + . = ..() + if(!.) + return + + var/dat = "Showing last [length(lastsignalers)] signalers.
      " + for(var/sig in lastsignalers) + dat += "[sig]
      " + user << browse(dat, "window=lastsignalers;size=800x500") diff --git a/code/modules/admin/secrets/admin_secrets/traitors_and_objectives.dm b/code/modules/admin/secrets/admin_secrets/traitors_and_objectives.dm new file mode 100644 index 00000000000..591c13bd3fb --- /dev/null +++ b/code/modules/admin/secrets/admin_secrets/traitors_and_objectives.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/admin_secret/traitors_and_objectives + name = "Show current traitors and objectives" + +/datum/admin_secret_item/admin_secret/traitors_and_objectives/execute(var/mob/user) + . = ..() + if(.) + user.client.holder.check_antagonists() diff --git a/code/modules/admin/secrets/final_solutions/summon_narsie.dm b/code/modules/admin/secrets/final_solutions/summon_narsie.dm new file mode 100644 index 00000000000..8062f767526 --- /dev/null +++ b/code/modules/admin/secrets/final_solutions/summon_narsie.dm @@ -0,0 +1,11 @@ +/datum/admin_secret_item/final_solution/summon_narsie + name = "Summon Nar-Sie" + +/datum/admin_secret_item/final_solution/summon_narsie/execute(var/mob/user) + . = ..() + if(!.) + return + var/choice = input(user, "You sure you want to end the round and summon Nar-Sie at your location? Misuse of this could result in removal of flags or hilarity.") in list("PRAISE SATAN", "Cancel") + if(choice == "PRAISE SATAN") + new /obj/singularity/narsie/large(get_turf(user)) + log_and_message_admins("has summoned Nar-Sie and brought about a new realm of suffering.", user) diff --git a/code/modules/admin/secrets/final_solutions/supermatter_cascade.dm b/code/modules/admin/secrets/final_solutions/supermatter_cascade.dm new file mode 100644 index 00000000000..a50596985c1 --- /dev/null +++ b/code/modules/admin/secrets/final_solutions/supermatter_cascade.dm @@ -0,0 +1,13 @@ +/datum/admin_secret_item/final_solution/supermatter_cascade + name = "Supermatter Cascade" + +/datum/admin_secret_item/final_solution/supermatter_cascade/execute(var/mob/user) + . = ..() + if(!.) + return + var/choice = input(user, "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 hilarity.") in list("NO TIME TO EXPLAIN", "Cancel") + if(choice == "NO TIME TO EXPLAIN") + explosion(get_turf(user), 8, 16, 24, 32, 1) + new /turf/unsimulated/wall/supermatter(get_turf(user)) + SetUniversalState(/datum/universal_state/supermatter_cascade) + message_admins("[key_name_admin(user)] has managed to destroy the universe with a supermatter cascade. Good job, [key_name_admin(user)]") diff --git a/code/modules/admin/secrets/fun_secrets/break_all_lights.dm b/code/modules/admin/secrets/fun_secrets/break_all_lights.dm new file mode 100644 index 00000000000..ea54952a7e1 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/break_all_lights.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/fun_secret/break_all_lights + name = "Break All Lights" + +/datum/admin_secret_item/fun_secret/break_all_lights/execute(var/mob/user) + . = ..() + if(.) + lightsout(0,0) diff --git a/code/modules/admin/secrets/fun_secrets/break_some_lights.dm b/code/modules/admin/secrets/fun_secrets/break_some_lights.dm new file mode 100644 index 00000000000..0c9aae1b166 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/break_some_lights.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/fun_secret/break_some_lights + name = "Break Some Lights" + +/datum/admin_secret_item/fun_secret/break_some_lights/execute(var/mob/user) + . = ..() + if(.) + lightsout(1,2) diff --git a/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm b/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm new file mode 100644 index 00000000000..387f6d3ce72 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm @@ -0,0 +1,10 @@ +/datum/admin_secret_item/fun_secret/fix_all_lights + name = "Fix All Lights" + +/datum/admin_secret_item/fun_secret/fix_all_lights/execute(var/mob/user) + . = ..() + if(!.) + return + + for(var/obj/machinery/light/L in world) + L.fix() diff --git a/code/modules/admin/secrets/fun_secrets/ghost_mode.dm b/code/modules/admin/secrets/fun_secrets/ghost_mode.dm new file mode 100644 index 00000000000..dfa84e4cf6a --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/ghost_mode.dm @@ -0,0 +1,48 @@ +/datum/admin_secret_item/fun_secret/ghost_mode + name = "Ghost Mode" + var/list/affected_mobs + +/datum/admin_secret_item/fun_secret/ghost_mode/New() + ..() + affected_mobs = list() + +/datum/admin_secret_item/fun_secret/ghost_mode/execute(var/mob/user) + . = ..() + if(!.) + return + + var/list/affected_areas = list() + for(var/mob/M in living_mob_list) + if(M.stat == CONSCIOUS && !(M in affected_mobs)) + affected_mobs |= M + switch(rand(1,4)) + if(1) + M.show_message(text("You shudder as if cold..."), 1) + if(2) + M.show_message(text("You feel something gliding across your back..."), 1) + if(3) + M.show_message(text("Your eyes twitch, you feel like something you can't see is here..."), 1) + if(4) + M.show_message(text("You notice something moving out of the corner of your eye, but nothing is there..."), 1) + + for(var/obj/W in orange(5,M)) + if(prob(25) && !W.anchored) + step_rand(W) + + var/area/A = get_area(M) + if(A.requires_power && !A.always_unpowered && A.power_light && (A.z in config.player_levels)) + affected_areas |= get_area(M) + + affected_mobs |= user + for(var/area/AffectedArea in affected_areas) + AffectedArea.power_light = 0 + AffectedArea.power_change() + spawn(rand(25,50)) + AffectedArea.power_light = 1 + AffectedArea.power_change() + + sleep(100) + for(var/mob/M in affected_mobs) + M.show_message(text("The chilling wind suddenly stops..."), 1) + affected_mobs.Cut() + affected_areas.Cut() diff --git a/code/modules/admin/secrets/fun_secrets/make_all_areas_powered.dm b/code/modules/admin/secrets/fun_secrets/make_all_areas_powered.dm new file mode 100644 index 00000000000..33091900289 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/make_all_areas_powered.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/fun_secret/make_all_areas_powered + name = "Make All Areas Powered" + +/datum/admin_secret_item/fun_secret/make_all_areas_powered/execute(var/mob/user) + . = ..() + if(.) + power_restore() diff --git a/code/modules/admin/secrets/fun_secrets/make_all_areas_unpowered.dm b/code/modules/admin/secrets/fun_secrets/make_all_areas_unpowered.dm new file mode 100644 index 00000000000..a840006a23c --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/make_all_areas_unpowered.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/fun_secret/make_all_areas_unpowered + name = "Make All Areas Unpowered" + +/datum/admin_secret_item/fun_secret/make_all_areas_unpowered/execute(var/mob/user) + . = ..() + if(.) + power_failure() diff --git a/code/modules/admin/secrets/fun_secrets/only_one.dm b/code/modules/admin/secrets/fun_secrets/only_one.dm new file mode 100644 index 00000000000..bc0c962b29b --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/only_one.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/fun_secret/only_one + name = "There Can Be Only One" + +/datum/admin_secret_item/fun_secret/only_one/execute(var/mob/user) + . = ..() + if(.) + only_one() diff --git a/code/modules/admin/secrets/fun_secrets/paintball_mode.dm b/code/modules/admin/secrets/fun_secrets/paintball_mode.dm new file mode 100644 index 00000000000..8225b96b296 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/paintball_mode.dm @@ -0,0 +1,14 @@ +/datum/admin_secret_item/fun_secret/paintbal_mode + name = "Paintball Mode" + +/datum/admin_secret_item/fun_secret/paintbal_mode/execute(var/mob/user) + . = ..() + if(!.) + return + + for(var/species in all_species) + var/datum/species/S = all_species[species] + S.blood_color = "rainbow" + for(var/obj/effect/decal/cleanable/blood/B in world) + B.basecolor = "rainbow" + B.update_icon() diff --git a/code/modules/admin/secrets/fun_secrets/power_all_smes.dm b/code/modules/admin/secrets/fun_secrets/power_all_smes.dm new file mode 100644 index 00000000000..277edd5a438 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/power_all_smes.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/fun_secret/power_all_smes + name = "Power All SMES" + +/datum/admin_secret_item/fun_secret/power_all_smes/execute(var/mob/user) + . = ..() + if(.) + power_restore_quick() diff --git a/code/modules/admin/secrets/fun_secrets/remove_all_clothing.dm b/code/modules/admin/secrets/fun_secrets/remove_all_clothing.dm new file mode 100644 index 00000000000..28e9497f53f --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/remove_all_clothing.dm @@ -0,0 +1,10 @@ +/datum/admin_secret_item/fun_secret/remove_all_clothing + name = "Remove ALL Clothing" + +/datum/admin_secret_item/fun_secret/remove_all_clothing/execute(var/mob/user) + . = ..() + if(!.) + return + + for(var/obj/item/clothing/O in world) + qdel(O) diff --git a/code/modules/admin/secrets/fun_secrets/remove_internal_clothing.dm b/code/modules/admin/secrets/fun_secrets/remove_internal_clothing.dm new file mode 100644 index 00000000000..73dba4ce4f9 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/remove_internal_clothing.dm @@ -0,0 +1,10 @@ +/datum/admin_secret_item/fun_secret/remove_internal_clothing + name = "Remove 'Internal' Clothing" + +/datum/admin_secret_item/fun_secret/remove_internal_clothing/execute(var/mob/user) + . = ..() + if(!.) + return + + for(var/obj/item/clothing/under/O in world) + qdel(O) diff --git a/code/modules/admin/secrets/fun_secrets/send_strike_team.dm b/code/modules/admin/secrets/fun_secrets/send_strike_team.dm new file mode 100644 index 00000000000..3ec1bacb2c0 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/send_strike_team.dm @@ -0,0 +1,11 @@ +/datum/admin_secret_item/fun_secret/send_strike_team + name = "Send Strike Team" + +/datum/admin_secret_item/fun_secret/send_strike_team/can_execute(var/mob/user) + if(!ticker) return 0 + return ..() + +/datum/admin_secret_item/fun_secret/send_strike_team/execute(var/mob/user) + . = ..() + if(.) + return user.client.strike_team() diff --git a/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm b/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm new file mode 100644 index 00000000000..33ba8a861ce --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm @@ -0,0 +1,21 @@ +/datum/admin_secret_item/fun_secret/toggle_bomb_cap + name = "Toggle Bomb Cap" + permissions = R_SERVER + +/datum/admin_secret_item/fun_secret/toggle_bomb_cap/execute(var/mob/user) + . = ..() + if(!.) + return + + switch(max_explosion_range) + if(14) max_explosion_range = 16 + if(16) max_explosion_range = 20 + if(20) max_explosion_range = 28 + if(28) max_explosion_range = 56 + if(56) max_explosion_range = 128 + if(128) max_explosion_range = 14 + var/range_dev = max_explosion_range *0.25 + var/range_high = max_explosion_range *0.5 + var/range_low = max_explosion_range + message_admins("[key_name_admin(user)] changed the bomb cap to [range_dev], [range_high], [range_low]", 1) + log_admin("[key_name_admin(user)] changed the bomb cap to [max_explosion_range]") diff --git a/code/modules/admin/secrets/fun_secrets/triple_ai_mode.dm b/code/modules/admin/secrets/fun_secrets/triple_ai_mode.dm new file mode 100644 index 00000000000..81b77eabb64 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/triple_ai_mode.dm @@ -0,0 +1,13 @@ +/datum/admin_secret_item/fun_secret/triple_ai_mode + name = "Triple AI Mode" + +/datum/admin_secret_item/fun_secret/triple_ai_mode/can_execute(var/mob/user) + if(ticker && ticker.current_state > GAME_STATE_PREGAME) + return 0 + + return ..() + +/datum/admin_secret_item/admin_secret/triple_ai_mode/execute(var/mob/user) + . = ..() + if(.) + user.client.triple_ai() diff --git a/code/modules/admin/secrets/fun_secrets/turn_humans_into_corgies.dm b/code/modules/admin/secrets/fun_secrets/turn_humans_into_corgies.dm new file mode 100644 index 00000000000..ae6f36a1ac1 --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/turn_humans_into_corgies.dm @@ -0,0 +1,11 @@ +/datum/admin_secret_item/fun_secret/turn_humans_into_corgies + name = "Turn All Humans Into Corgies" + +/datum/admin_secret_item/fun_secret/turn_humans_into_corgies/execute(var/mob/user) + . = ..() + if(!.) + return + + for(var/mob/living/carbon/human/H in mob_list) + spawn(0) + H.corgize() diff --git a/code/modules/admin/secrets/fun_secrets/turn_humans_into_monkeys.dm b/code/modules/admin/secrets/fun_secrets/turn_humans_into_monkeys.dm new file mode 100644 index 00000000000..99b1573adef --- /dev/null +++ b/code/modules/admin/secrets/fun_secrets/turn_humans_into_monkeys.dm @@ -0,0 +1,11 @@ +/datum/admin_secret_item/fun_secret/turn_humans_into_monkeys + name = "Turn All Humans Into Monkeys" + +/datum/admin_secret_item/fun_secret/turn_humans_into_monkeys/execute(var/mob/user) + . = ..() + if(!.) + return + + for(var/mob/living/carbon/human/H in mob_list) + spawn(0) + H.monkeyize() diff --git a/code/modules/admin/secrets/random_events/gravity.dm b/code/modules/admin/secrets/random_events/gravity.dm new file mode 100644 index 00000000000..8d4cad49604 --- /dev/null +++ b/code/modules/admin/secrets/random_events/gravity.dm @@ -0,0 +1,31 @@ +/********** +* Gravity * +**********/ +/datum/admin_secret_item/random_event/gravity + name = "Toggle Station Artificial Gravity" + +/datum/admin_secret_item/random_event/gravity/can_execute(var/mob/user) + if(!(ticker && ticker.mode)) + return 0 + + return ..() + +/datum/admin_secret_item/random_event/gravity/execute(var/mob/user) + . = ..() + if(!.) + return + + gravity_is_on = !gravity_is_on + for(var/area/A in world) + A.gravitychange(gravity_is_on,A) + + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","Grav") + if(gravity_is_on) + log_admin("[key_name(user)] toggled gravity on.", 1) + message_admins("[key_name_admin(user)] toggled gravity on.", 1) + command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.") + else + log_admin("[key_name(user)] toggled gravity off.", 1) + message_admins("[key_name_admin(usr)] toggled gravity off.", 1) + command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.") diff --git a/code/modules/admin/secrets/random_events/trigger_cordical_borer_infestation.dm b/code/modules/admin/secrets/random_events/trigger_cordical_borer_infestation.dm new file mode 100644 index 00000000000..f96004565d8 --- /dev/null +++ b/code/modules/admin/secrets/random_events/trigger_cordical_borer_infestation.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/random_event/trigger_cordical_borer_infestation + name = "Trigger a Cortical Borer infestation" + +/datum/admin_secret_item/random_event/trigger_cordical_borer_infestation/execute(var/mob/user) + . = ..() + if(.) + return borers.attempt_random_spawn() diff --git a/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm b/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm new file mode 100644 index 00000000000..11dad2e84c6 --- /dev/null +++ b/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm @@ -0,0 +1,7 @@ +/datum/admin_secret_item/random_event/trigger_xenomorph_infestation + name = "Trigger a Xenomorph Infestation" + +/datum/admin_secret_item/random_event/trigger_xenomorph_infestation/execute(var/mob/user) + . = ..() + if(.) + return xenomorphs.attempt_random_spawn() diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 12df8fd630e..6d25063b768 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1176,16 +1176,6 @@ log_admin("[key_name(usr)] AIized [key_name(H)]") H.AIize() - 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 used on instances of type /mob/living/carbon/human" - return - - usr.client.cmd_admin_alienize(H) - else if(href_list["makeslime"]) if(!check_rights(R_SPAWN)) return @@ -1309,7 +1299,7 @@ src.owner << "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];" src.owner << "Location = [location_description];" src.owner << "[special_role_description]" - src.owner << "(PM) (PP) (VV) (SM) (JMP) (CA)" + src.owner << "(PM) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (CA)" else if(href_list["adminspawncookie"]) if(!check_rights(R_ADMIN|R_FUN)) return @@ -1391,7 +1381,7 @@ 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.isMobAI()) + if(!isAI(L)) 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." @@ -1688,739 +1678,9 @@ log_and_message_admins("created [number] [english_list(paths)]") return - else if(href_list["secretsfun"]) - if(!check_rights(R_FUN)) return - - var/ok = 0 - switch(href_list["secretsfun"]) - if("sec_clothes") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","SC") - for(var/obj/item/clothing/under/O in world) - 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) - 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) - qdel(O) - for(var/obj/structure/grille/O in world) - 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 - qdel(O) - ok = 1*/ - if("monkey") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","M") - for(var/mob/living/carbon/human/H in mob_list) - spawn(0) - H.monkeyize() - ok = 1 - if("corgi") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","M") - for(var/mob/living/carbon/human/H in mob_list) - spawn(0) - H.corgize() - ok = 1 - if("striketeam") - if(usr.client.strike_team()) - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","Strike") - if("tripleAI") - usr.client.triple_ai() - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","TriAI") - if("gravity") - if(!(ticker && ticker.mode)) - usr << "Please wait until the game starts! Not sure how it will work otherwise." - return - gravity_is_on = !gravity_is_on - for(var/area/A in world) - A.gravitychange(gravity_is_on,A) - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","Grav") - if(gravity_is_on) - log_admin("[key_name(usr)] toggled gravity on.", 1) - message_admins("\blue [key_name_admin(usr)] toggled gravity on.", 1) - command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.") - else - log_admin("[key_name(usr)] toggled gravity off.", 1) - message_admins("\blue [key_name_admin(usr)] toggled gravity off.", 1) - command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artifical gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.") - if("wave") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","Meteor") - log_admin("[key_name(usr)] spawned a meteor wave", 1) - message_admins("\blue [key_name_admin(usr)] spawned a meteor wave.", 1) - new /datum/event/meteor_wave - if("goblob") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","Blob") - log_admin("[key_name(usr)] spawned a blob", 1) - message_admins("\blue [key_name_admin(usr)] spawned a blob.", 1) - new /datum/event/blob - - if("aliens") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","Aliens") - log_admin("[key_name(usr)] spawned an alien infestation", 1) - message_admins("\blue [key_name_admin(usr)] attempted an alien infestation", 1) - xenomorphs.attempt_random_spawn() - if("borers") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","Borers") - log_admin("[key_name(usr)] spawned a cortical borer infestation.", 1) - message_admins("\blue [key_name_admin(usr)] spawned a cortical borer infestation.", 1) - borers.attempt_random_spawn() - - if("power") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","P") - log_admin("[key_name(usr)] made all areas powered", 1) - message_admins("\blue [key_name_admin(usr)] made all areas powered", 1) - power_restore() - if("unpower") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","UP") - log_admin("[key_name(usr)] made all areas unpowered", 1) - message_admins("\blue [key_name_admin(usr)] made all areas unpowered", 1) - power_failure() - if("quickpower") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","QP") - log_admin("[key_name(usr)] made all SMESs powered", 1) - message_admins("\blue [key_name_admin(usr)] made all SMESs powered", 1) - power_restore_quick() - if("activateprison") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","AP") - world << "\blue Transit signature detected." - world << "\blue Incoming shuttle." - /* - var/A = locate(/area/shuttle_prison) - for(var/atom/movable/AM as mob|obj in A) - AM.z = 1 - AM.Move() - */ - message_admins("\blue [key_name_admin(usr)] sent the prison shuttle to the station.", 1) - if("deactivateprison") - /* - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","DP") - var/A = locate(/area/shuttle_prison) - for(var/atom/movable/AM as mob|obj in A) - AM.z = 2 - AM.Move() - */ - message_admins("\blue [key_name_admin(usr)] sent the prison shuttle back.", 1) - if("toggleprisonstatus") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","TPS") - for(var/obj/machinery/computer/prison_shuttle/PS in world) - PS.allowedtocall = !(PS.allowedtocall) - message_admins("\blue [key_name_admin(usr)] toggled status of prison shuttle to [PS.allowedtocall].", 1) - if("prisonwarp") - if(!ticker) - alert("The game hasn't started yet!", null, null, null, null, null) - return - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","PW") - message_admins("\blue [key_name_admin(usr)] teleported all players to the prison station.", 1) - for(var/mob/living/carbon/human/H in mob_list) - var/turf/loc = find_loc(H) - var/security = 0 - if(loc.z > 1 || prisonwarped.Find(H)) -//don't warp them if they aren't ready or are already there - continue - H.Paralyse(5) - if(H.wear_id) - var/obj/item/weapon/card/id/id = H.get_idcard() - for(var/A in id.access) - if(A == access_security) - security++ - if(!security) - //strip their stuff before they teleport into a cell :downs: - for(var/obj/item/weapon/W in H) - if(istype(W, /obj/item/organ/external)) - continue - //don't strip organs - H.drop_from_inventory(W) - //teleport person to cell - H.loc = pick(prisonwarp) - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes) - else - //teleport security person - H.loc = pick(prisonsecuritywarp) - prisonwarped += H - if("launchshuttle") - if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created. - - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","ShL") - - var/list/valid_shuttles = list() - for (var/shuttle_tag in shuttle_controller.shuttles) - if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry)) - valid_shuttles += shuttle_tag - - var/shuttle_tag = input("Which shuttle do you want to launch?") as null|anything in valid_shuttles - - if (!shuttle_tag) - return - - var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag] - if (S.can_launch()) - S.launch(usr) - message_admins("\blue [key_name_admin(usr)] launched the [shuttle_tag] shuttle", 1) - log_admin("[key_name(usr)] launched the [shuttle_tag] shuttle") - else - alert("The [shuttle_tag] shuttle cannot be launched at this time. It's probably busy.") - - if("forcelaunchshuttle") - if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created. - - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","ShFL") - - var/list/valid_shuttles = list() - for (var/shuttle_tag in shuttle_controller.shuttles) - if (istype(shuttle_controller.shuttles[shuttle_tag], /datum/shuttle/ferry)) - valid_shuttles += shuttle_tag - - var/shuttle_tag = input("Which shuttle's launch do you want to force?") as null|anything in valid_shuttles - - if (!shuttle_tag) - return - - var/datum/shuttle/ferry/S = shuttle_controller.shuttles[shuttle_tag] - if (S.can_force()) - S.force_launch(usr) - message_admins("\blue [key_name_admin(usr)] has forced the [shuttle_tag] shuttle launch", 1) - log_admin("[key_name(usr)] has forced the [shuttle_tag] shuttle launch") - else - alert("The [shuttle_tag] shuttle launch cannot be forced at this time. It's busy, or hasn't been launched yet.") - - if("jumpshuttle") - if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created. - - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","ShJ") - - var/shuttle_tag = input("Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles - if (!shuttle_tag) return - - var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag] - - var/origin_area = input("Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world - if (!origin_area) return - - var/destination_area = input("Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world - if (!destination_area) return - - var/long_jump = alert("Is there a transition area for this jump?","", "Yes", "No") - if (long_jump == "Yes") - var/transition_area = input("Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world - if (!transition_area) return - - var/move_duration = input("How many seconds will this jump take?") as num - - S.long_jump(origin_area, destination_area, transition_area, move_duration) - message_admins("\blue [key_name_admin(usr)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle", 1) - log_admin("[key_name_admin(usr)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle") - else - S.short_jump(origin_area, destination_area) - message_admins("\blue [key_name_admin(usr)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle", 1) - log_admin("[key_name_admin(usr)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle") - - if("moveshuttle") - - if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created. - - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","ShM") - - var/confirm = alert("This command directly moves a shuttle from one area to another. DO NOT USE THIS UNLESS YOU ARE DEBUGGING A SHUTTLE AND YOU KNOW WHAT YOU ARE DOING.", "Are you sure?", "Ok", "Cancel") - if (confirm == "Cancel") - return - - var/shuttle_tag = input("Which shuttle do you want to jump?") as null|anything in shuttle_controller.shuttles - if (!shuttle_tag) return - - var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag] - - var/origin_area = input("Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world - if (!origin_area) return - - var/destination_area = input("Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)") as null|area in world - if (!destination_area) return - - S.move(origin_area, destination_area) - message_admins("\blue [key_name_admin(usr)] moved the [shuttle_tag] shuttle", 1) - log_admin("[key_name(usr)] moved the [shuttle_tag] shuttle") - - if("togglebombcap") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","BC") - switch(max_explosion_range) - if(14) max_explosion_range = 16 - if(16) max_explosion_range = 20 - if(20) max_explosion_range = 28 - if(28) max_explosion_range = 56 - if(56) max_explosion_range = 128 - if(128) max_explosion_range = 14 - var/range_dev = max_explosion_range *0.25 - var/range_high = max_explosion_range *0.5 - var/range_low = max_explosion_range - message_admins("\red [key_name_admin(usr)] changed the bomb cap to [range_dev], [range_high], [range_low]", 1) - log_admin("[key_name_admin(usr)] changed the bomb cap to [max_explosion_range]") - - if("flicklights") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","FL") - while(!usr.stat) -//knock yourself out to stop the ghosts - for(var/mob/M in player_list) - if(M.stat != 2 && prob(25)) - var/area/AffectedArea = get_area(M) - if(AffectedArea.name != "Space" && AffectedArea.name != "Engine Walls" && AffectedArea.name != "Chemical Lab Test Chamber" && AffectedArea.name != "Escape Shuttle" && AffectedArea.name != "Arrival Area" && AffectedArea.name != "Arrival Shuttle" && AffectedArea.name != "start area" && AffectedArea.name != "Engine Combustion Chamber") - AffectedArea.power_light = 0 - AffectedArea.power_change() - spawn(rand(55,185)) - AffectedArea.power_light = 1 - AffectedArea.power_change() - var/Message = rand(1,4) - switch(Message) - if(1) - M.show_message(text("\blue You shudder as if cold..."), 1) - if(2) - M.show_message(text("\blue You feel something gliding across your back..."), 1) - if(3) - M.show_message(text("\blue Your eyes twitch, you feel like something you can't see is here..."), 1) - if(4) - M.show_message(text("\blue You notice something moving out of the corner of your eye, but nothing is there..."), 1) - for(var/obj/W in orange(5,M)) - if(prob(25) && !W.anchored) - step_rand(W) - sleep(rand(100,1000)) - for(var/mob/M in player_list) - if(M.stat != 2) - M.show_message(text("\blue The chilling wind suddenly stops..."), 1) -/* if("shockwave") - ok = 1 - world << "\red ALERT: STATION STRESS CRITICAL" - sleep(60) - world << "\red ALERT: STATION STRESS CRITICAL. TOLERABLE LEVELS EXCEEDED!" - sleep(80) - world << "\red ALERT: STATION STRUCTURAL STRESS CRITICAL. SAFETY MECHANISMS FAILED!" - sleep(40) - for(var/mob/M in world) - shake_camera(M, 400, 1) - for(var/obj/structure/window/W in world) - spawn(0) - sleep(rand(10,400)) - W.ex_act(rand(2,1)) - for(var/obj/structure/grille/G in world) - spawn(0) - sleep(rand(20,400)) - G.ex_act(rand(2,1)) - for(var/obj/machinery/door/D in world) - spawn(0) - sleep(rand(20,400)) - D.ex_act(rand(2,1)) - for(var/turf/station/floor/Floor in world) - spawn(0) - sleep(rand(30,400)) - Floor.ex_act(rand(2,1)) - for(var/obj/structure/cable/Cable in world) - spawn(0) - sleep(rand(30,400)) - Cable.ex_act(rand(2,1)) - for(var/obj/structure/closet/Closet in world) - spawn(0) - sleep(rand(30,400)) - Closet.ex_act(rand(2,1)) - for(var/obj/machinery/Machinery in world) - spawn(0) - sleep(rand(30,400)) - Machinery.ex_act(rand(1,3)) - for(var/turf/station/wall/Wall in world) - spawn(0) - sleep(rand(30,400)) - Wall.ex_act(rand(2,1)) */ - if("wave") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","MW") - new /datum/event/meteor_wave - - if("gravanomalies") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","GA") - command_announcement.Announce("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert", 'sound/AI/granomalies.ogg') - var/turf/T = pick(blobstart) - var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 ) - spawn(rand(100, 600)) - qdel(bh) - - if("timeanomalies") //dear god this code was awful :P Still needs further optimisation - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","STA") - //moved to its own dm so I could split it up and prevent the spawns copying variables over and over - //can be found in code\game\game_modes\events\wormholes.dm - wormhole_event() - - if("goblob") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","BL") - mini_blob_event() - message_admins("[key_name_admin(usr)] has spawned blob", 1) - if("aliens") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","AL") - if(xenomorphs.attempt_random_spawn()) - message_admins("[key_name_admin(usr)] has spawned aliens", 1) - if("spiders") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","SL") - new /datum/event/spider_infestation - message_admins("[key_name_admin(usr)] has spawned spiders", 1) - if("comms_blackout") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","CB") - var/answer = alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No") - if(answer == "Yes") - communications_blackout(0) - else - communications_blackout(1) - message_admins("[key_name_admin(usr)] triggered a communications blackout.", 1) - if("carp") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","C") - var/choice = input("You sure you want to spawn carp?") in list("Badmin", "Cancel") - if(choice == "Badmin") - message_admins("[key_name_admin(usr)] has spawned carp.", 1) - new /datum/event/carp_migration - if("radiation") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","R") - message_admins("[key_name_admin(usr)] has has irradiated the station", 1) - new /datum/event/radiation_storm - if("immovable") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","IR") - message_admins("[key_name_admin(usr)] has sent an immovable rod to the station", 1) - immovablerod() - if("prison_break") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","PB") - message_admins("[key_name_admin(usr)] has allowed a prison break", 1) - prison_break() - if("lightout") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","LO") - message_admins("[key_name_admin(usr)] has broke a lot of lights", 1) - lightsout(1,2) - if("blackout") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","BO") - message_admins("[key_name_admin(usr)] broke all lights", 1) - lightsout(0,0) - if("whiteout") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","WO") - for(var/obj/machinery/light/L in world) - L.fix() - message_admins("[key_name_admin(usr)] fixed all lights", 1) - if("friendai") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","FA") - for(var/mob/eye/aiEye/aE in mob_list) - aE.icon_state = "ai_friend" - for(var/obj/machinery/M in machines) - if(istype(M, /obj/machinery/ai_status_display)) - var/obj/machinery/ai_status_display/A = M - A.emotion = "Friend Computer" - else if(istype(M, /obj/machinery/status_display)) - var/obj/machinery/status_display/A = M - A.friendc = 1 - message_admins("[key_name_admin(usr)] turned all AIs into best friends.", 1) - if("floorlava") - if(floorIsLava) - usr << "The floor is lava already." - return - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","LF") - - //Options - var/length = input(usr, "How long will the lava last? (in seconds)", "Length", 180) as num - length = min(abs(length), 1200) - - var/damage = input(usr, "How deadly will the lava be?", "Damage", 2) as num - damage = min(abs(damage), 100) - - var/sure = alert(usr, "Are you sure you want to do this?", "Confirmation", "YES!", "Nah") - if(sure == "Nah") - return - floorIsLava = 1 - - message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.", 1) - - for(var/turf/simulated/floor/F in world) - if(F.z in config.station_levels) - F.name = "lava" - F.desc = "The floor is LAVA!" - F.overlays += "lava" - F.lava = 1 - - spawn(0) - for(var/i = i, i < length, i++) // 180 = 3 minutes - if(damage) - for(var/mob/living/carbon/L in living_mob_list) - if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?! - var/turf/simulated/floor/F = L.loc - if(F.lava) - var/safe = 0 - for(var/obj/structure/O in F.contents) - if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! - safe = 1 - break - if(!safe) - L.adjustFireLoss(damage) - - - sleep(10) - - for(var/turf/simulated/floor/F in world) // Reset everything. - if(F.z in config.station_levels) - F.name = initial(F.name) - F.desc = initial(F.desc) - F.overlays.Cut() - F.lava = 0 - F.update_icon() - floorIsLava = 0 - return - if("virus") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","V") - var/answer = alert("Do you want this to be a greater disease or a lesser one?",,"Greater","Lesser") - if(answer=="Lesser") - virus2_lesser_infection() - message_admins("[key_name_admin(usr)] has triggered a lesser virus outbreak.", 1) - else - virus2_greater_infection() - message_admins("[key_name_admin(usr)] has triggered a greater virus outbreak.", 1) - if("retardify") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","RET") - for(var/mob/living/carbon/human/H in player_list) - H << "\red You suddenly feel stupid." - H.setBrainLoss(60) - message_admins("[key_name_admin(usr)] made everybody retarded") - if("fakeguns") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","FG") - for(var/obj/item/W in world) - if(istype(W, /obj/item/clothing) || istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/weapon/disk) || istype(W, /obj/item/weapon/tank)) - continue - W.icon = 'icons/obj/gun.dmi' - W.icon_state = "revolver" - W.item_state = "gun" - message_admins("[key_name_admin(usr)] made every item look like a gun") - if("schoolgirl") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","SG") - for(var/obj/item/clothing/under/W in world) - W.icon_state = "schoolgirl" - W.item_state = "w_suit" - message_admins("[key_name_admin(usr)] activated Japanese Animes mode") - world << sound('sound/AI/animes.ogg') - if("paintball") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","PB") - for(var/species in all_species) - var/datum/species/S = all_species[species] - S.blood_color = "rainbow" - for(var/obj/effect/decal/cleanable/blood/B in world) - B.basecolor = "rainbow" - B.update_icon() - message_admins("[key_name_admin(usr)] activated Paintball mode") - if("eagles")//SCRAW - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","EgL") - for(var/obj/machinery/door/airlock/W in world) - if(W.z in config.station_levels && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) - W.req_access = list() - message_admins("[key_name_admin(usr)] activated Egalitarian Station mode") - command_announcement.Announce("Centcomm airlock control override activated. Please take this time to get acquainted with your coworkers.", new_sound = 'sound/AI/commandreport.ogg') - if("dorf") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","DF") - for(var/mob/living/carbon/human/B in mob_list) - B.f_style = "Dward Beard" - B.update_hair() - message_admins("[key_name_admin(usr)] activated dorf mode") - if("ionstorm") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","I") - IonStorm() - message_admins("[key_name_admin(usr)] triggered an ion storm") - var/show_log = alert(usr, "Show ion message?", "Message", "Yes", "No") - if(show_log == "Yes") - command_announcement.Announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", new_sound = 'sound/AI/ionstorm.ogg') - if("onlyone") - feedback_inc("admin_secrets_fun_used",1) - 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 hilarity.") 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 hilarity.") 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) - world << text("A secret has been activated by []!", usr.key) - - else if(href_list["secretsadmin"]) - if(!check_rights(R_ADMIN)) return - - var/ok = 0 - switch(href_list["secretsadmin"]) - if("clear_bombs") - //I do nothing - if("list_bombers") - var/dat = "Bombing List
      " - for(var/l in bombers) - dat += text("[l]
      ") - usr << browse(dat, "window=bombers") - if("list_signalers") - var/dat = "Showing last [length(lastsignalers)] signalers.
      " - for(var/sig in lastsignalers) - dat += "[sig]
      " - usr << browse(dat, "window=lastsignalers;size=800x500") - if("list_lawchanges") - var/dat = "Showing last [lawchanges.len] law change\s.
      " - for(var/sig in lawchanges) - dat += "[sig]
      " - usr << browse(dat, "window=lawchanges;size=800x500") - if("list_job_debug") - var/dat = "Job Debug info.
      " - if(job_master) - for(var/line in job_master.job_debug) - dat += "[line]
      " - dat+= "*******

      " - for(var/datum/job/job in job_master.occupations) - if(!job) continue - dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions]
      " - usr << browse(dat, "window=jobdebug;size=600x500") - if("showailaws") - output_ai_laws() - if("showgm") - if(!ticker) - alert("The game hasn't started yet!") - else if (ticker.mode) - alert("The game mode is [ticker.mode.name]") - else alert("For some reason there's a ticker, but not a game mode") - if("manifest") - var/dat = "Showing Crew Manifest.
      " - dat += "" - for(var/mob/living/carbon/human/H in mob_list) - if(H.ckey) - dat += text("", H.name, H.get_assignment()) - dat += "
      NamePosition
      [][]
      " - usr << browse(dat, "window=manifest;size=440x410") - if("check_antagonist") - check_antagonists() - if("DNA") - var/dat = "Showing DNA from blood.
      " - dat += "" - for(var/mob/living/carbon/human/H in mob_list) - if(H.dna && H.ckey) - dat += "" - dat += "
      NameDNABlood Type
      [H][H.dna.unique_enzymes][H.b_type]
      " - usr << browse(dat, "window=DNA;size=440x410") - if("fingerprints") - var/dat = "Showing Fingerprints.
      " - dat += "" - for(var/mob/living/carbon/human/H in mob_list) - if(H.ckey) - if(H.dna && H.dna.uni_identity) - dat += "" - else if(H.dna && !H.dna.uni_identity) - dat += "" - else if(!H.dna) - dat += "" - dat += "
      NameFingerprints
      [H][md5(H.dna.uni_identity)]
      [H]H.dna.uni_identity = null
      [H]H.dna = null
      " - usr << browse(dat, "window=fingerprints;size=440x410") - else - if (usr) - log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]") - if (ok) - world << text("A secret has been activated by []!", usr.key) - - else if(href_list["secretscoder"]) - if(!check_rights(R_DEBUG|R_DEV)) return - - switch(href_list["secretscoder"]) - if("spawn_objects") - var/dat = "Admin Log
      " - for(var/l in admin_log) - dat += "
    5. [l]
    6. " - if(!admin_log.len) - dat += "No-one has done anything this round!" - usr << browse(dat, "window=admin_log") - if("maint_access_brig") - for(var/obj/machinery/door/airlock/maintenance/M in world) - if (access_maint_tunnels in M.req_access) - M.req_access = list(access_brig) - message_admins("[key_name_admin(usr)] made all maint doors brig access-only.") - if("maint_access_engiebrig") - for(var/obj/machinery/door/airlock/maintenance/M in world) - if (access_maint_tunnels in M.req_access) - M.req_access = list() - M.req_one_access = list(access_brig,access_engine) - message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.") - if("infinite_sec") - var/datum/job/J = job_master.GetJob("Security Officer") - if(!J) return - J.total_positions = -1 - J.spawn_positions = -1 - message_admins("[key_name_admin(usr)] has removed the cap on security officers.") + else if(href_list["admin_secrets"]) + var/datum/admin_secret_item/item = locate(href_list["admin_secrets"]) in admin_secrets.items + item.execute(usr) else if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster. @@ -2749,3 +2009,25 @@ mob/living/carbon/human/can_centcom_reply() mob/living/silicon/ai/can_centcom_reply() return common_radio != null && !check_unable(2) + +/atom/proc/extra_admin_link() + return + +/mob/extra_admin_link(var/source) + if(client && eyeobj) + return "|EYE" + +/mob/dead/observer/extra_admin_link(var/source) + if(mind && mind.current) + return "|BDY" + +/proc/admin_jump_link(var/atom/target, var/source) + if(!target) return + // The way admin jump links handle their src is weirdly inconsistent... + if(istype(source, /datum/admins)) + source = "src=\ref[source]" + else + source = "_src_=holder" + + . = "JMP" + . += target.extra_admin_link(source) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 6d45b622910..ae1be18570c 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -2,7 +2,7 @@ return /mob/dead/observer/on_mob_jump() - following = null + stop_following() /client/proc/Jump(var/area/A in return_sorted_areas()) set name = "Jump to Area" @@ -21,7 +21,7 @@ else alert("Admin jumping disabled") -/client/proc/jumptoturf(var/turf/T in world) +/client/proc/jumptoturf(var/turf/T in turfs) set name = "Jump to Turf" set category = "Admin" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV)) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index c23da53f453..ecb71aee2c6 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -12,7 +12,7 @@ if(check_rights(R_ADMIN,0)) for(var/client/C in admins) if(R_ADMIN & C.holder.rights) - C << "" + create_text_tag("admin", "ADMIN:", C) + " [key_name(usr, 1)](JMP): [msg]" + C << "" + create_text_tag("admin", "ADMIN:", C) + " [key_name(usr, 1)]([admin_jump_link(mob, src)]): [msg]" feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/bluespacetech.dm b/code/modules/admin/verbs/bluespacetech.dm index a1616d0e778..302f2808275 100644 --- a/code/modules/admin/verbs/bluespacetech.dm +++ b/code/modules/admin/verbs/bluespacetech.dm @@ -89,7 +89,7 @@ bst.add_language("Siik'maas") bst.add_language("Skrellian") bst.add_language("Vox-pidgin") - bst.add_language("Rootsong") + bst.add_language(LANGUAGE_ROOTSPEAK) bst.add_language("Ceti Basic") bst.add_language("Sol Common") bst.add_language("Tradeband") @@ -124,7 +124,7 @@ binarycheck() return 1 - suicide() +/* suicide() if(key && species.name != "Human") switch(species.name) if("Tajara") @@ -157,7 +157,7 @@ ghost.real_name = "[ghost.key] BSTech" ghost.voice_name = "[ghost.key] BSTech" qdel(src) - return + return*/ proc/bsc() //because we all have our unrealistic snowflakes right? if(set_species("Tajara")) @@ -177,7 +177,7 @@ else ghostize(0) key = null - suicide() + //suicide() proc/bsb() if(set_species("Machine")) @@ -196,7 +196,7 @@ else ghostize(0) key = null - suicide() + //suicide() proc/bsd() if(set_species("Diona")) @@ -214,7 +214,7 @@ else ghostize(0) key = null - suicide() + //suicide() proc/bsu() if(set_species("Unathi")) @@ -233,7 +233,7 @@ else ghostize(0) key = null - suicide() + //suicide() proc/bss() if(set_species("Skrell")) @@ -253,7 +253,7 @@ else ghostize(0) key = null - suicide() + // suicide() say(var/message) var/verb = "says in a subdued tone" @@ -297,12 +297,12 @@ var/client/C = src.client if(C.holder && C.holder.original_mob) if(C.holder.original_mob.key)//Thanks for kicking Tish off the Server Meow, wouldn't have spotted this otherwise. - suicide() + //suicide() return C.holder.original_mob.key = key C.holder.original_mob = null - suicide() + // suicide() //Equipment. All should have canremove set to 0 //All items with a /bst need the attack_hand() proc overrided to stop people getting overpowered items. diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 6160668b8d9..a413c225524 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -14,140 +14,9 @@ feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +// callproc moved to code/modules/admin/callproc -/* 21st Sept 2010 -Updated by Skie -- Still not perfect but better! -Stuff you can't do: -Call proc /mob/proc/make_dizzy() for some player -Because if you select a player mob as owner it tries to do the proc for -/mob/living/carbon/human/ instead. And that gives a run-time error. -But you can call procs that are of type /mob/living/carbon/human/proc/ for that player. -*/ - -/client/proc/callproc() - set category = "Debug" - set name = "Advanced ProcCall" - - if(!check_rights(R_DEBUG)) return - if(config.debugparanoid && !check_rights(R_ADMIN)) return - - spawn(0) - var/target = null - var/targetselected = 0 - var/lst[] // List reference - lst = new/list() // Make the list - var/returnval = null - var/class = null - - switch(alert("Proc owned by something?",,"Yes","No")) - if("Yes") - targetselected = 1 - class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client") - switch(class) - if("Obj") - target = input("Enter target:","Target",usr) as obj in world - if("Mob") - target = input("Enter target:","Target",usr) as mob in world - if("Area or Turf") - target = input("Enter target:","Target",usr.loc) as area|turf in world - if("Client") - var/list/keys = list() - for(var/client/C) - keys += C - target = input("Please, select a player!", "Selection", null, null) as null|anything in keys - else - return - if("No") - target = null - targetselected = 0 - - var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null - if(!procname) return - - if(targetselected) - if(!target) - usr << "Your target no longer exists." - return - if(!hascall(target,procname)) - usr << "Error: callproc(): target has no such call [procname]." - return - else - if(copytext(procname, 1, 7) == "/proc/") - // nothing - else if(copytext(procname, 1, 6) == "proc/") - procname = "/[procname]" - else if(copytext(procname, 1, 2) == "/") - procname = "/proc[procname]" - else - procname = "/proc/[procname]" - // Procs have the strange property that text2path will return non-null, but ispath() will return false. - var/path = text2path(procname) - if(!path || ispath(path)) - usr << "Invalid proc [procname]" - return - - var/argnum = input("Number of arguments","Number:",0) as num|null - if(!argnum && (argnum!=0)) return - - lst.len = argnum // Expand to right length - //TODO: make a list to store whether each argument was initialised as null. - //Reason: So we can abort the proccall if say, one of our arguments was a mob which no longer exists - //this will protect us from a fair few errors ~Carn - - var/i - for(i=1, iError: callproc(): owner of proc no longer exists.
      " - return - log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc - else - log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc - - usr << "[procname] returned: [returnval ? returnval : "null"]" - feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - /client/proc/Cell() set category = "Debug" set name = "Cell" @@ -240,7 +109,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that alert("Invalid mob") /* -/client/proc/cmd_admin_monkeyize(var/mob/M in world) +/client/proc/cmd_admin_monkeyize(var/mob/M in mob_list) set category = "Fun" set name = "Make Monkey" @@ -255,7 +124,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that else alert("Invalid mob") -/client/proc/cmd_admin_changelinginize(var/mob/M in world) +/client/proc/cmd_admin_changelinginize(var/mob/M in mob_list) set category = "Fun" set name = "Make Changeling" @@ -273,7 +142,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that alert("Invalid mob") */ /* -/client/proc/cmd_admin_abominize(var/mob/M in world) +/client/proc/cmd_admin_abominize(var/mob/M in mob_list) set category = null set name = "Make Abomination" @@ -290,7 +159,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that */ /* -/client/proc/make_cultist(var/mob/M in world) // -- TLE, modified by Urist +/client/proc/make_cultist(var/mob/M in mob_list) // -- TLE, modified by Urist set category = "Fun" set name = "Make Cultist" set desc = "Makes target a cultist" @@ -378,11 +247,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/device/pda/pda = H.wear_id id = pda.id id.icon_state = "gold" - id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() + id.access = get_all_accesses() else var/obj/item/weapon/card/id/id = new/obj/item/weapon/card/id(M); id.icon_state = "gold" - id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() + id.access = get_all_accesses() id.registered_name = H.real_name id.assignment = "Captain" id.name = "[id.registered_name]'s ID Card ([id.assignment])" @@ -597,9 +466,9 @@ 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/under/det(M), slot_w_uniform) 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/suit/storage/det_trench(M), slot_wear_suit) 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/clothing/head/det(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) @@ -632,13 +501,13 @@ 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/weapon/grenade/chem_grenade/cleaner(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/steel(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack) if ("pirate") M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) @@ -674,7 +543,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/weapon/card/id/W = new(M) W.name = "[M.real_name]'s ID Card" - W.access = get_all_accesses() + W.access = get_all_station_access() W.assignment = "Tunnel Clown!" W.registered_name = M.real_name M.equip_to_slot_or_del(W, slot_wear_id) @@ -731,7 +600,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/weapon/card/id/syndicate/W = new(M) W.name = "[M.real_name]'s ID Card" - W.access = get_all_accesses() + W.access = get_all_station_access() W.assignment = "Reaper" W.registered_name = M.real_name M.equip_to_slot_or_del(W, slot_wear_id) @@ -761,7 +630,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that W.name = "[M.real_name]'s ID Card" W.icon_state = "centcom" W.item_state = "id_inv" - W.access = get_all_accesses() + W.access = get_all_station_access() W.access += list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer") W.assignment = "NanoTrasen Navy Representative" W.registered_name = M.real_name @@ -785,7 +654,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/weapon/card/id/centcom/W = new(M) W.name = "[M.real_name]'s ID Card" - W.access = get_all_accesses() + W.access = get_all_station_access() W.access += get_all_centcom_access() W.assignment = "NanoTrasen Navy Officer" W.registered_name = M.real_name @@ -810,7 +679,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/weapon/card/id/centcom/W = new(M) W.name = "[M.real_name]'s ID Card" - W.access = get_all_accesses() + W.access = get_all_station_access() W.access += get_all_centcom_access() W.assignment = "NanoTrasen Navy Captain" W.registered_name = M.real_name @@ -828,7 +697,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/weapon/card/id/W = new(M) W.name = "[M.real_name]'s ID Card" W.icon_state = "centcom" - W.access = get_all_accesses() + W.access = get_all_station_access() W.access += get_all_centcom_access() W.assignment = "Emergency Response Team" W.registered_name = M.real_name @@ -850,7 +719,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/weapon/card/id/W = new(M) W.name = "[M.real_name]'s ID Card" W.icon_state = "centcom" - W.access = get_all_accesses() + W.access = get_all_station_access() W.access += get_all_centcom_access() W.assignment = "Special Operations Officer" W.registered_name = M.real_name @@ -904,7 +773,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/obj/item/weapon/card/id/W = new(M) W.name = "[M.real_name]'s ID Card" W.icon_state = "centcom" - W.access = get_all_accesses() + W.access = get_all_station_access() W.access += get_all_centcom_access() W.assignment = "Admiral" W.registered_name = M.real_name @@ -967,89 +836,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(SMES.anchored) SMES.input_attempt = 1 -/client/proc/setup_supermatter_engine() - set category = "Debug" - set name = "Setup supermatter" - set desc = "Sets up the supermatter engine" - - if(!check_rights(R_DEBUG|R_ADMIN)) return - - var/response = alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Setup Completely","Setup except coolant","No") - - if(response == "No") - return - - var/found_the_pump = 0 - var/obj/machinery/power/supermatter/SM - - for(var/obj/machinery/M in world) - if(!M) - continue - if(!M.loc) - continue - if(!M.loc.loc) - continue - - if(istype(M.loc.loc,/area/engineering/engine_room)) - if(istype(M,/obj/machinery/power/rad_collector)) - var/obj/machinery/power/rad_collector/Rad = M - Rad.anchored = 1 - Rad.connect_to_network() - - var/obj/item/weapon/tank/phoron/Phoron = new/obj/item/weapon/tank/phoron(Rad) - - Phoron.air_contents.gas["phoron"] = 29.1154 //This is a full tank if you filled it from a canister - Rad.P = Phoron - - Phoron.loc = Rad - - if(!Rad.active) - Rad.toggle_power() - Rad.update_icon() - - else if(istype(M,/obj/machinery/atmospherics/binary/pump)) //Turning on every pump. - var/obj/machinery/atmospherics/binary/pump/Pump = M - if(Pump.name == "Engine Feed" && response == "Setup Completely") - found_the_pump = 1 - Pump.air2.gas["nitrogen"] = 3750 //The contents of 2 canisters. - Pump.air2.temperature = 50 - Pump.air2.update_values() - Pump.use_power=1 - Pump.target_pressure = 4500 - Pump.update_icon() - - else if(istype(M,/obj/machinery/power/supermatter)) - SM = M - spawn(50) - SM.power = 320 - - else if(istype(M,/obj/machinery/power/smes)) //This is the SMES inside the engine room. We don't need much power. - var/obj/machinery/power/smes/SMES = M - SMES.input_attempt = 1 - SMES.input_level = 200000 - SMES.output_level = 75000 - - else if(istype(M.loc.loc,/area/engineering/engine_smes)) //Set every SMES to charge and spit out 300,000 power between the 4 of them. - if(istype(M,/obj/machinery/power/smes)) - var/obj/machinery/power/smes/SMES = M - SMES.input_attempt = 1 - SMES.input_level = 200000 - SMES.output_level = 75000 - - if(!found_the_pump && response == "Setup Completely") - src << "\red Unable to locate air supply to fill up with coolant, adding some coolant around the supermatter" - var/turf/simulated/T = SM.loc - T.zone.air.gas["nitrogen"] += 450 - T.zone.air.temperature = 50 - T.zone.air.update_values() - - - log_admin("[key_name(usr)] setup the supermatter engine [response == "Setup except coolant" ? "without coolant" : ""]") - message_admins("\blue [key_name_admin(usr)] setup the supermatter engine [response == "Setup except coolant" ? "without coolant": ""]", 1) - return - - - /client/proc/cmd_debug_mob_lists() set category = "Debug" set name = "Debug Mob Lists" diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 6499d5c5308..64f5d759769 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -160,7 +160,7 @@ var/list/debug_verbs = list ( ,/client/proc/hide_debug_verbs ,/client/proc/testZAScolors ,/client/proc/testZAScolors_remove - ,/client/proc/setup_supermatter_engine + ,/datum/admins/proc/setup_supermatter ,/client/proc/atmos_toggle_debug ,/client/proc/spawn_tanktransferbomb ) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 74fe4bc0457..9fa64ba6885 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -5,8 +5,12 @@ var/list/forbidden_varedit_object_types = list( /datum/discord_bot //Nope.jpg. Stop it. ) +var/list/VVlocked = list("vars", "holder", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "bound_x", "bound_y", "step_x", "step_y", "force_ending") +var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays") +var/list/VVckey_edit = list("key", "ckey") + /* -/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world) +/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world) // Acceptable 'in world', as VV would be incredibly hampered otherwise set category = "Debug" set name = "Edit Variables" set desc="(target) Edit a target item's variables" @@ -45,7 +49,7 @@ var/list/forbidden_varedit_object_types = list( switch(class) if("text") - var_value = input("Enter new text:","Text") as null|text//todo: sanitize ??? + var_value = input("Enter new text:","Text") as null|text if("num") var_value = input("Enter new number:","Num") as null|num @@ -73,7 +77,7 @@ var/list/forbidden_varedit_object_types = list( return var_value -/client/proc/mod_list_add(var/list/L) +/client/proc/mod_list_add(var/list/L, atom/O, original_name, objectvar) var/class = "text" if(src.holder && src.holder.marked_datum) @@ -94,7 +98,7 @@ var/list/forbidden_varedit_object_types = list( switch(class) if("text") - var_value = input("Enter new text:","Text") as text//todo: sanitize ??? + var_value = input("Enter new text:","Text") as text if("num") var_value = input("Enter new number:","Num") as num @@ -125,30 +129,58 @@ var/list/forbidden_varedit_object_types = list( L[var_value] = mod_list_add_ass() //haha if("No") L += var_value + world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: ADDED=[var_value]" + log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]") + message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]") -/client/proc/mod_list(var/list/L) +/client/proc/mod_list(var/list/L, atom/O, original_name, objectvar) if(!check_rights(R_VAREDIT|R_DEV)) return - if(!istype(L,/list)) src << "Not a List." - var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine", "poo", "icon", "icon_state") - var/list/names = sortList(L) + if(L.len > 1000) + var/confirm = alert(src, "The list you're trying to edit is very long, continuing may crash the server.", "Warning", "Continue", "Abort") + if(confirm != "Continue") + return - var/variable = input("Which var?","Var") as null|anything in names + "(ADD VAR)" + var/assoc = 0 + if(L.len > 0) + var/a = L[1] + if(istext(a) && L[a] != null) + assoc = 1 //This is pretty weak test but i can't think of anything else + usr << "List appears to be associative." + + var/list/names = null + if(!assoc) + names = sortList(L) + + var/variable + var/assoc_key + if(assoc) + variable = input("Which var?","Var") as null|anything in L + "(ADD VAR)" + else + variable = input("Which var?","Var") as null|anything in names + "(ADD VAR)" if(variable == "(ADD VAR)") - mod_list_add(L) + mod_list_add(L, O, original_name, objectvar) return - if(!variable) + if(assoc) + assoc_key = variable + variable = L[assoc_key] + + if(!assoc && !variable || assoc && !assoc_key) return var/default var/dir - if(variable in locked) + if(variable in VVlocked) if(!check_rights(R_DEBUG|R_DEV)) return + if(variable in VVckey_edit) + if(!check_rights(R_SPAWN|R_DEBUG|R_DEV)) return + if(variable in VVicon_edit_lock) + if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return if(isnull(variable)) usr << "Unable to determine variable type." @@ -213,14 +245,12 @@ var/list/forbidden_varedit_object_types = list( usr << "If a direction, direction is: [dir]" var/class = "text" - var/list/choices = list("text","num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default") if(src.holder && src.holder.marked_datum) - choices += "marked datum ([holder.marked_datum.type])" - if(!isnull(default) && default != "num") - choices += "edit associated variable" - choices += "DELETE FROM LIST" - - class = input("What kind of variable?","Variable Type",default) as null|anything in choices + class = input("What kind of variable?","Variable Type",default) as null|anything in list("text", + "num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default","marked datum ([holder.marked_datum.type])", "DELETE FROM LIST") + else + class = input("What kind of variable?","Variable Type",default) as null|anything in list("text", + "num","type","reference","mob reference", "icon","file","list","edit referenced object","restore to default", "DELETE FROM LIST") if(!class) return @@ -228,61 +258,107 @@ var/list/forbidden_varedit_object_types = list( if(holder.marked_datum && class == "marked datum ([holder.marked_datum.type])") class = "marked datum" + var/original_var + if(assoc) + original_var = L[assoc_key] + else + original_var = L[L.Find(variable)] + + var/new_var switch(class) //Spits a runtime error if you try to modify an entry in the contents list. Dunno how to fix it, yet. if("list") - mod_list(variable) + mod_list(variable, O, original_name, objectvar) if("restore to default") - L[L.Find(variable)]=initial(variable) + new_var = initial(variable) + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var if("edit referenced object") modify_variables(variable) if("DELETE FROM LIST") + world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[variable]")]" + log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[variable]") + message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[variable]") L -= variable return if("text") - L[L.Find(variable)] = input("Enter new text:","Text") as text//todo: sanitize ??? + new_var = input("Enter new text:","Text") as text + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var if("num") - L[L.Find(variable)] = input("Enter new number:","Num") as num + new_var = input("Enter new number:","Num") as num + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var if("type") - L[L.Find(variable)] = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf) + new_var = input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf) + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var if("reference") - L[L.Find(variable)] = input("Select reference:","Reference") as mob|obj|turf|area in world + new_var = input("Select reference:","Reference") as mob|obj|turf|area in world + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var if("mob reference") - L[L.Find(variable)] = input("Select reference:","Reference") as mob in world + new_var = input("Select reference:","Reference") as mob in world + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var if("file") - L[L.Find(variable)] = input("Pick file:","File") as file + new_var = input("Pick file:","File") as file + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var if("icon") - L[L.Find(variable)] = input("Pick icon:","Icon") as icon + new_var = input("Pick icon:","Icon") as icon + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var if("marked datum") - L[L.Find(variable)] = holder.marked_datum - - if("edit associated variable") - var/temp_var = mod_list_add_ass() - if(temp_var) - L[variable] = temp_var + new_var = holder.marked_datum + if(assoc) + L[assoc_key] = new_var + else + L[L.Find(variable)] = new_var + world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: [original_var]=[new_var]" + log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]") + message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[new_var]") /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) if(!check_rights(R_VAREDIT|R_DEV)) return - var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "cuffed", "ka", "last_eaten", "icon", "icon_state") - for(var/p in forbidden_varedit_object_types) if( istype(O,p) ) - usr << "\red It is forbidden to edit this object's variables." + usr << "It is forbidden to edit this object's variables." return + if(istype(O, /client) && (param_var_name == "ckey" || param_var_name == "key")) + usr << "You cannot edit ckeys on client objects." + return + var/class var/variable var/var_value @@ -292,8 +368,12 @@ var/list/forbidden_varedit_object_types = list( src << "A variable with this name ([param_var_name]) doesn't exist in this atom ([O])" return - if(param_var_name == "holder" || (param_var_name in locked)) - if(!check_rights(R_DEBUG|R_DEV|R_FUN)) return + if(param_var_name in VVlocked) + if(!check_rights(R_DEBUG|R_DEV)) return + if(param_var_name in VVckey_edit) + if(!check_rights(R_SPAWN|R_DEBUG|R_DEV)) return + if(param_var_name in VVicon_edit_lock) + if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return variable = param_var_name @@ -350,8 +430,12 @@ var/list/forbidden_varedit_object_types = list( if(!variable) return var_value = O.vars[variable] - if(variable == "holder" || (variable in locked)) - if(!check_rights(R_DEBUG|R_DEV)) return + if(variable in VVlocked) + if(!check_rights(R_DEBUG|R_DEV)) return + if(variable in VVckey_edit) + if(!check_rights(R_SPAWN|R_DEBUG|R_DEV)) return + if(variable in VVicon_edit_lock) + if(!check_rights(R_FUN|R_DEBUG|R_DEV)) return if(!autodetect_class) @@ -441,7 +525,7 @@ var/list/forbidden_varedit_object_types = list( switch(class) if("list") - mod_list(O.vars[variable]) + mod_list(O.vars[variable], O, original_name, variable) return if("restore to default") @@ -451,7 +535,7 @@ var/list/forbidden_varedit_object_types = list( return .(O.vars[variable]) if("text") - var/var_new = input("Enter new text:","Text",O.vars[variable]) as null|text//todo: sanitize ??? + var/var_new = input("Enter new text:","Text",O.vars[variable]) as null|text if(var_new==null) return O.vars[variable] = var_new @@ -505,4 +589,4 @@ var/list/forbidden_varedit_object_types = list( world.log << "### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]" log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]") - message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]", 1) + message_admins("[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]") diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 6de30853ce6..a9787261004 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -1,4 +1,4 @@ -/proc/possess(obj/O as obj in world) +/proc/possess(obj/O as obj in range(world.view)) set name = "Possess Obj" set category = "Object" @@ -26,7 +26,7 @@ usr.control_object = O feedback_add_details("admin_verb","PO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/proc/release(obj/O as obj in world) +/proc/release(obj/O as obj in range(world.view)) set name = "Release Obj" set category = "Object" //usr.loc = get_turf(usr) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index a810afd5b50..19dec0a7d86 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,7 +17,7 @@ return var/image/cross = image('icons/obj/storage.dmi',"bible") - msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" + msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) @@ -31,9 +31,9 @@ /proc/Centcomm_announce(var/msg, var/mob/Sender, var/iamessage) discord_bot.send_to_cciaa("Emergency message from the station: `[msg]`, sent by [Sender]!") - var/msg_cciaa = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (RPLY): [msg]" - msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + var/msg_cciaa = "\blue [uppertext(boss_short)][iamessage ? " IA" : ""]:[key_name(Sender, 1)] (RPLY): [msg]" + msg = "\blue [uppertext(boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) C << msg @@ -41,7 +41,7 @@ C << msg_cciaa /proc/Syndicate_announce(var/msg, var/mob/Sender) - msg = "\blue ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + msg = "\blue ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) C << msg diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index bd736a129b9..691c952a67b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -461,7 +461,7 @@ Traitors and the like can also be revived with the previous role mostly intact. data_core.manifest_inject(new_character) if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes") - call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role) + call(/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role) message_admins("\blue [admin] has respawned [player_key] as [new_character.real_name].", 1) @@ -582,14 +582,14 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Yes") command_announcement.Announce("[reportbody]", reporttitle, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1); if("No") - world << "\red New NanoTrasen Update available at all communication consoles." + world << "\red New [company_name] Update available at all communication consoles." world << sound('sound/AI/commandreport.ogg') log_admin("[key_name(src)] has created a command report: [reportbody]") message_admins("[key_name_admin(src)] has created a command report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view()) +/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in range(world.view)) set category = "Admin" set name = "Delete" @@ -619,7 +619,7 @@ Traitors and the like can also be revived with the previous role mostly intact. src << "[job.title]: [job.total_positions]" feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in range(world.view)) set category = "Special Verbs" set name = "Explosion" @@ -647,7 +647,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else return -/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in range(world.view)) set category = "Special Verbs" set name = "EM Pulse" @@ -922,7 +922,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.", 1) if(notifyplayers == "Yes") - world << "\blue Admin [usr.key] has forced the players to have completely random identities!" + world << "\blue Admin [usr.key] has forced the players to have completely random identities!" usr << "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet." diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm new file mode 100644 index 00000000000..44d524e06d3 --- /dev/null +++ b/code/modules/admin/view_variables/helpers.dm @@ -0,0 +1,93 @@ + +// Keep these two together, they *must* be defined on both +// If /client ever becomes /datum/client or similar, they can be merged +/client/proc/get_view_variables_header() + return "[src]" +/datum/proc/get_view_variables_header() + return "[src]" + +/atom/get_view_variables_header() + return {" + [src] +
      + << + [dir2text(dir)] + >> + + "} + +/mob/living/get_view_variables_header() + return {" + [src] +
      << [dir2text(dir)] >> +
      [ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"] +
      + BRUTE:[getBruteLoss()] + FIRE:[getFireLoss()] + TOXIN:[getToxLoss()] + OXY:[getOxyLoss()] + CLONE:[getCloneLoss()] + BRAIN:[getBrainLoss()] +
      + "} + +// Same for these as for get_view_variables_header() above +/client/proc/get_view_variables_options() + return "" +/datum/proc/get_view_variables_options() + return "" + +/mob/get_view_variables_options() + return ..() + {" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "} + +/mob/living/carbon/human/get_view_variables_options() + return ..() + {" + + + + + + + "} + +/obj/get_view_variables_options() + return ..() + {" + + + + "} + +/turf/get_view_variables_options() + return ..() + {" + + + "} diff --git a/code/datums/datumvars.dm b/code/modules/admin/view_variables/topic.dm similarity index 50% rename from code/datums/datumvars.dm rename to code/modules/admin/view_variables/topic.dm index b9eb3e08a3b..580e45a2fed 100644 --- a/code/datums/datumvars.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -1,416 +1,4 @@ -// 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 += "
    7. (E) (C) (M) " - else - html += "
    8. " - - 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 += "
        " - var/index = 1 - for (var/entry in L) - if(istext(entry)) - html += debug_variable(entry, L[entry], level + 1) - //html += debug_variable("[index]", L[index], level + 1) - else - html += debug_variable(index, L[index], level + 1) - index++ - html += "
      " - - else - html += "[name] = [value]" - - html += "
    9. " - - 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 ) @@ -602,8 +190,8 @@ client 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) ") + log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted)") + message_admins("[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) @@ -613,8 +201,8 @@ client 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) ") + log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") + message_admins("[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 @@ -690,20 +278,6 @@ client 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 @@ -941,14 +515,18 @@ client 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] ") + log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L]") + message_admins("[key_name(usr)] dealt [amount] amount of [Text] damage to [L]") href_list["datumrefresh"] = href_list["mobToDamage"] + else if(href_list["call_proc"]) + var/datum/D = locate(href_list["call_proc"]) + if(istype(D) || istype(D, /client)) // can call on clients too, not just datums + callproc_targetpicked(1, D) + if(href_list["datumrefresh"]) var/datum/DAT = locate(href_list["datumrefresh"]) - if(!istype(DAT, /datum)) - return - src.debug_variables(DAT) + if(istype(DAT, /datum) || istype(DAT, /client)) + debug_variables(DAT) return diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm new file mode 100644 index 00000000000..b20b2481d3e --- /dev/null +++ b/code/modules/admin/view_variables/view_variables.dm @@ -0,0 +1,167 @@ + +// Variables to not even show in the list. +// step_* and bound_* are here because they literally break the game and do nothing else. +// parent_type is here because it's pointless to show in VV. +/var/list/view_variables_hide_vars = list("bound_x", "bound_y", "bound_height", "bound_width", "bounds", "parent_type", "step_x", "step_y", "step_size") +// Variables not to expand the lists of. Vars is pointless to expand, and overlays/underlays cannot be expanded. +/var/list/view_variables_dont_expand = list("overlays", "underlays", "vars") +// Variables that runtime if you try to test associativity of the lists they contain by indexing +/var/list/view_variables_no_assoc = list("verbs", "contents") + +// Acceptable 'in world', as VV would be incredibly hampered otherwise +/client/proc/debug_variables(datum/D in world) + set category = "Debug" + set name = "View Variables" + + if(!check_rights(0)) + return + + if(!D) + return + + var/icon/sprite + if(istype(D, /atom)) + var/atom/A = D + if(A.icon && A.icon_state) + sprite = icon(A.icon, A.icon_state) + usr << browse_rsc(sprite, "view_vars_sprite.png") + + usr << browse_rsc('code/js/view_variables.js', "view_variables.js") + + var/html = {" + + + + [D] (\ref[D] - [D.type]) + + + +
      + + + +
      + + [sprite ? "" : ""] + +
      [D.get_view_variables_header()]
      +
      + [replacetext("[D.type]", "/", "/")] + [holder.marked_datum == D ? "
      Marked Object" : ""] +
      +
      +
      + Refresh +
      + +
      +
      +
      +
      +
      + + E - Edit, tries to determine the variable type by itself.
      + C - Change, asks you for the var type first.
      + M - Mass modify: changes this variable for all objects of this type.
      +
      +
      + + + +
      +
      + Search: +
      +
      + +
      +
      +
        + [make_view_variables_var_list(D)] +
      + + + "} + + usr << browse(html, "window=variables\ref[D];size=475x650") + + +/proc/make_view_variables_var_list(datum/D) + . = "" + var/list/variables = list() + for(var/x in D.vars) + if(x in view_variables_hide_vars) + continue + variables += x + variables = sortList(variables) + for(var/x in variables) + . += make_view_variables_var_entry(D, x, D.vars[x]) + +/proc/make_view_variables_value(value, varname = "*") + var/vtext = "" + var/extra = list() + if(isnull(value)) + vtext = "null" + else if(istext(value)) + vtext = "\"[value]\"" + else if(isicon(value)) + vtext = "[value]" + else if(isfile(value)) + vtext = "'[value]'" + else if(istype(value, /datum)) + var/datum/DA = value + if("[DA]" == "[DA.type]" || !"[DA]") + vtext = "\ref[DA] - [DA.type]" + else + vtext = "\ref[DA] - [DA] ([DA.type])" + else if(istype(value, /client)) + var/client/C = value + vtext = "\ref[C] - [C] ([C.type])" + else if(islist(value)) + var/list/L = value + vtext = "/list ([L.len])" + if(!(varname in view_variables_dont_expand) && L.len > 0 && L.len < 100) + extra += "
        " + for (var/index = 1 to L.len) + var/entry = L[index] + if(!isnum(entry) && !isnull(entry) && !(varname in view_variables_no_assoc) && L[entry] != null) + extra += "
      • [index]: [make_view_variables_value(entry)] -> [make_view_variables_value(L[entry])]
      • " + else + extra += "
      • [index]: [make_view_variables_value(entry)]
      • " + extra += "
      " + else + vtext = "[value]" + + return "[vtext][list2text(extra)]" + +/proc/make_view_variables_var_entry(datum/D, varname, value, level=0) + var/ecm = null + + if(D) + ecm = {" + (E) + (C) + (M) + "} + + var/valuestr = make_view_variables_value(value, varname) + + return "
    10. [ecm][varname] = [valuestr]
    11. " diff --git a/code/modules/alarm/alarm.dm b/code/modules/alarm/alarm.dm index aa88e170bf2..d0a6a8be4c2 100644 --- a/code/modules/alarm/alarm.dm +++ b/code/modules/alarm/alarm.dm @@ -76,9 +76,9 @@ /datum/alarm/proc/cameras() // reset camera cache - if(camera_cache_id != cache_id) + if(camera_repository.camera_cache_id != cache_id) cameras = null - cache_id = camera_cache_id + cache_id = camera_repository.camera_cache_id // If the alarm origin has changed area, for example a borg containing an alarming camera, reset the list of cameras else if(cameras && (last_camera_area != alarm_area())) cameras = null diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm index 47b7f7b5719..9cf52add77b 100644 --- a/code/modules/alarm/alarm_handler.dm +++ b/code/modules/alarm/alarm_handler.dm @@ -50,6 +50,11 @@ /datum/alarm_handler/proc/major_alarms() return alarms +/datum/alarm_handler/proc/has_major_alarms() + if(alarms && alarms.len) + return 1 + return 0 + /datum/alarm_handler/proc/minor_alarms() return alarms @@ -86,10 +91,10 @@ /turf/get_alarm_origin() return get_area(src) -/datum/alarm_handler/proc/register(var/object, var/procName) +/datum/alarm_handler/proc/register_alarm(var/object, var/procName) listeners[object] = procName -/datum/alarm_handler/proc/unregister(var/object) +/datum/alarm_handler/proc/unregister_alarm(var/object) listeners -= object /datum/alarm_handler/proc/notify_listeners(var/alarm, var/was_raised) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index e73856b85fc..09b15fe7750 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -9,7 +9,7 @@ throwforce = 2 throw_speed = 3 throw_range = 10 - origin_tech = "magnets=1" + origin_tech = list(TECH_MAGNET = 1) var/secured = 1 var/list/attached_overlays = null diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index ba071d7c724..a78126bedc5 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -6,7 +6,7 @@ w_class = 3.0 throw_speed = 2 throw_range = 4 - flags = CONDUCT //Copied this from old code, so this may or may not be necessary + flags = CONDUCT | PROXMOVE var/status = 0 //0 - not readied //1 - bomb finished with welder var/obj/item/device/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device var/obj/item/weapon/tank/bombtank = null //the second part of the bomb is a phoron tank diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index a8a3d246c82..021216f2181 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/assemblies/new_assemblies.dmi' icon_state = "holder" item_state = "assembly" - flags = CONDUCT + flags = CONDUCT | PROXMOVE throwforce = 5 w_class = 2.0 throw_speed = 3 diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index d44f45fa97f..fc34669f3df 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -2,8 +2,8 @@ name = "igniter" desc = "A small electronic device able to ignite combustable substances." icon_state = "igniter" - matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) - origin_tech = "magnets=1" + origin_tech = list(TECH_MAGNET = 1) + matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) secured = 1 wires = WIRE_RECEIVE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index b1dc44a5037..b28b0f46b46 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -4,8 +4,8 @@ name = "infrared emitter" desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted." icon_state = "infrared" + origin_tech = list(TECH_MAGNET = 2) matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, "waste" = 100) - origin_tech = "magnets=2" wires = WIRE_PULSE @@ -171,9 +171,7 @@ /obj/effect/beam/i_beam/proc/hit() - //world << "beam \ref[src]: hit" if(master) - //world << "beam hit \ref[src]: calling master \ref[master].hit" master.trigger_beam() qdel(src) return @@ -189,13 +187,10 @@ return /obj/effect/beam/i_beam/process() - //world << "i_beam \ref[src] : process" - if((loc.density || !(master))) - // world << "beam hit loc [loc] or no master [master], deleting" + if((loc && loc.density) || !master) qdel(src) return - //world << "proccess: [src.left] left" if(left > 0) left-- diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 32f87bf4b0f..a78a1b29271 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -2,8 +2,8 @@ name = "mousetrap" desc = "A handy little spring-loaded trap for catching pesty rodents." icon_state = "mousetrap" - matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10) - origin_tech = "combat=1" + origin_tech = list(TECH_COMBAT = 1) + matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10) var/armed = 0 diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index cf9f2a26732..e0e2b0dbe6d 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -2,9 +2,9 @@ name = "proximity sensor" desc = "Used for scanning and alerting when someone enters a certain proximity." icon_state = "prox" + origin_tech = list(TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50) - origin_tech = "magnets=1" - + flags = PROXMOVE wires = WIRE_PULSE secured = 0 @@ -40,6 +40,9 @@ HasProximity(atom/movable/AM as mob|obj) + if(!istype(AM)) + log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).") + return if (istype(AM, /obj/effect/beam)) return if (AM.move_speed < 12) sense() return diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index fe1464a5933..3fc26cb2a94 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -3,8 +3,8 @@ desc = "Used to remotely activate devices." icon_state = "signaller" item_state = "signaler" + origin_tech = list(TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100) - origin_tech = "magnets=1" wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE secured = 1 @@ -79,8 +79,8 @@ if (href_list["freq"]) var/new_frequency = (frequency + text2num(href_list["freq"])) - if(new_frequency < 1200 || new_frequency > 1600) - new_frequency = sanitize_frequency(new_frequency) + if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ) + new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) set_frequency(new_frequency) if(href_list["code"]) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index b4901155989..565a8ea160d 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -2,8 +2,8 @@ name = "timer" desc = "Used to time things. Works well with contraptions which has to count down. Tick tock." icon_state = "timer" - matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) - origin_tech = "magnets=1" + origin_tech = list(TECH_MAGNET = 1) + matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) wires = WIRE_PULSE diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index ca33f9d106b..7e8c89cc796 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -2,8 +2,8 @@ name = "voice analyzer" desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." icon_state = "voice" + origin_tech = list(TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) - origin_tech = "magnets=1" var/listening = 0 var/recorded //the activation message diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index f36a2e21fa1..d94ca0c4b38 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -26,7 +26,7 @@ dat += "Locked on
      " dat += "Charge progress: [reload]/180:
      " dat += "Open Fire
      " - dat += "Deployment of weapon authorized by
      Nanotrasen Naval Command

      Remember, friendly fire is grounds for termination of your contract and life.
      " + dat += "Deployment of weapon authorized by
      [company_name] Naval Command

      Remember, friendly fire is grounds for termination of your contract and life.
      " user << browse(dat, "window=scroll") onclose(user, "scroll") return diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index b6415f22b53..09fd236be0d 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -59,7 +59,6 @@ M.equip_to_slot_or_del(new src.corpseback(M), slot_back) if(src.corpseid == 1) var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card" var/datum/job/jobdatum for(var/jobtype in typesof(/datum/job)) var/datum/job/J = new jobtype @@ -75,7 +74,7 @@ W.access = list() if(corpseidjob) W.assignment = corpseidjob - W.registered_name = M.real_name + M.set_id_info(W) M.equip_to_slot_or_del(W, slot_wear_id) qdel(src) diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm index 7699d653833..3c285a20c25 100644 --- a/code/modules/awaymissions/exile.dm +++ b/code/modules/awaymissions/exile.dm @@ -18,7 +18,7 @@ get_data() var/dat = {" Implant Specifications:
      -Name: Nanotrasen Employee Exile Implant
      +Name: [company_name] Employee Exile Implant
      Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant
      "} return dat diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm index d3d2f3a07b1..a7fae7b5508 100644 --- a/code/modules/awaymissions/pamphlet.dm +++ b/code/modules/awaymissions/pamphlet.dm @@ -1,18 +1,18 @@ /obj/item/weapon/paper/pamphlet name = "pamphlet" icon_state = "pamphlet" - info = "Welcome to the Nanotrasen Gateway project...
      \ + info = "Welcome to the Gateway project...
      \ Congratulations! If you're reading this, you and your superiors have decided that you're \ ready to commit to a life spent colonising the rolling hills of far away worlds. You \ must be ready for a lifetime of adventure, a little bit of hard work, and an award \ - winning dental plan- but that's not all the Nanotrasen Gateway project has to offer.
      \ + winning dental plan- but that's not all the Gateway project has to offer.
      \
      Because we care about you, we feel it is only fair to make sure you know the risks \ - before you commit to joining the Nanotrasen Gateway project. All away destinations have \ - been fully scanned by a Nanotrasen expeditionary team, and are certified to be 100% safe. \ + before you commit to joining the Gateway project. All away destinations have \ + been fully scanned by a expeditionary team, and are certified to be 100% safe. \ We've even left a case of space beer along with the basic materials you'll need to expand \ - Nanotrasen's operational area and start your new life.

      \ + the Project's operational area and start your new life.

      \ Gateway Operation Basics
      \ - All Nanotrasen approved Gateways operate on the same basic principals. They operate off \ + All approved Gateways operate on the same basic principals. They operate off \ area equipment power as you would expect, but they also require a backup wire with at least \ 128, 000 Watts of power running through it. Without this supply, it cannot safely function \ and will reject all attempts at operation.

      \ @@ -29,7 +29,7 @@ number of cases, the Gateway they have established may not be immediately obvious. \ Do not panic if you cannot locate the return Gateway. Begin colonisation of the destination. \

      A New World
      \ - As a participant in the Nanotrasen Gateway Project, you will be on the frontiers of space. \ + As a participant in the Gateway Project, you will be on the frontiers of space. \ Though complete safety is assured, participants are advised to prepare for inhospitable \ environs." diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm new file mode 100644 index 00000000000..ee7f89d5256 --- /dev/null +++ b/code/modules/blob/blob.dm @@ -0,0 +1,214 @@ +//I will need to recode parts of this but I am way too tired atm +/obj/effect/blob + name = "blob" + icon = 'icons/mob/blob.dmi' + icon_state = "blob" + light_range = 3 + desc = "Some blob creature thingy" + density = 1 + opacity = 0 + anchored = 1 + mouse_opacity = 2 + + var/maxHealth = 30 + var/health + var/brute_resist = 4 + var/fire_resist = 1 + var/expandType = /obj/effect/blob + +/obj/effect/blob/New(loc) + health = maxHealth + update_icon() + return ..(loc) + +/obj/effect/blob/CanPass(var/atom/movable/mover, vra/turf/target, var/height = 0, var/air_group = 0) + if(air_group || height == 0) + return 1 + return 0 + +/obj/effect/blob/ex_act(var/severity) + switch(severity) + if(1) + take_damage(rand(100, 120) / brute_resist) + if(2) + take_damage(rand(60, 100) / brute_resist) + if(3) + take_damage(rand(20, 60) / brute_resist) + +/obj/effect/blob/update_icon() + if(health > maxHealth / 2) + icon_state = "blob" + else + icon_state = "blob_damaged" + +/obj/effect/blob/proc/take_damage(var/damage) + health -= damage + if(health < 0) + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + qdel(src) + else + update_icon() + +/obj/effect/blob/proc/regen() + health = min(health + 1, maxHealth) + update_icon() + +/obj/effect/blob/proc/expand(var/turf/T) + if(istype(T, /turf/unsimulated/) || istype(T, /turf/space) || (istype(T, /turf/simulated/mineral) && T.density)) + return + if(istype(T, /turf/simulated/wall)) + var/turf/simulated/wall/SW = T + SW.take_damage(80) + return + var/obj/structure/girder/G = locate() in T + if(G) + if(prob(40)) + G.dismantle() + return + var/obj/structure/window/W = locate() in T + if(W) + W.shatter() + return + var/obj/structure/grille/GR = locate() in T + if(GR) + qdel(GR) + return + for(var/obj/machinery/door/D in T) // There can be several - and some of them can be open, locate() is not suitable + if(D.density) + D.ex_act(2) + return + var/obj/structure/foamedmetal/F = locate() in T + if(F) + qdel(F) + return + var/obj/structure/inflatable/I = locate() in T + if(I) + I.deflate(1) + return + + var/obj/vehicle/V = locate() in T + if(V) + V.ex_act(2) + return + var/obj/machinery/bot/B = locate() in T + if(B) + B.ex_act(2) + return + var/obj/mecha/M = locate() in T + if(M) + M.visible_message("The blob attacks \the [M]!") + M.take_damage(40) + return + + // Above things, we destroy completely and thus can use locate. Mobs are different. + for(var/mob/living/L in T) + if(L.stat == DEAD) + continue + L.visible_message("The blob attacks \the [L]!", "The blob attacks you!") + playsound(loc, 'sound/effects/attackblob.ogg', 50, 1) + L.take_organ_damage(rand(30, 40)) + return + new expandType(T, min(health, 30)) + +/obj/effect/blob/proc/pulse(var/forceLeft, var/list/dirs) + regen() + sleep(5) + var/pushDir = pick(dirs) + var/turf/T = get_step(src, pushDir) + var/obj/effect/blob/B = (locate() in T) + if(!B) + if(prob(health)) + expand(T) + return + if(forceLeft) + B.pulse(forceLeft - 1, dirs) + +/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj) + if(!Proj) + return + + switch(Proj.damage_type) + if(BRUTE) + take_damage(Proj.damage / brute_resist) + if(BURN) + take_damage(Proj.damage / fire_resist) + return 0 + +/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + playsound(loc, 'sound/effects/attackblob.ogg', 50, 1) + visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") + var/damage = 0 + switch(W.damtype) + if("fire") + damage = (W.force / fire_resist) + if(istype(W, /obj/item/weapon/weldingtool)) + playsound(loc, 'sound/items/Welder.ogg', 100, 1) + if("brute") + damage = (W.force / brute_resist) + + take_damage(damage) + return + +/obj/effect/blob/core + name = "blob core" + icon = 'icons/mob/blob.dmi' + icon_state = "blob_core" + maxHealth = 200 + brute_resist = 2 + fire_resist = 2 + + expandType = /obj/effect/blob/shield + var/blob_may_process = 1 + +/obj/effect/blob/core/update_icon() + return + +/obj/effect/blob/core/New(loc) + processing_objects.Add(src) + return ..(loc) + +/obj/effect/blob/core/Destroy() + processing_objects.Remove(src) + return ..() + +/obj/effect/blob/core/process() + set waitfor = 0 + if(!blob_may_process) + return + blob_may_process = 0 + sleep(0) + pulse(20, list(NORTH, EAST)) + pulse(20, list(NORTH, WEST)) + pulse(20, list(SOUTH, EAST)) + pulse(20, list(SOUTH, WEST)) + blob_may_process = 1 + +/obj/effect/blob/shield + name = "strong blob" + icon = 'icons/mob/blob.dmi' + icon_state = "blob_idle" + desc = "Some blob creature thingy" + maxHealth = 60 + brute_resist = 1 + fire_resist = 2 + +/obj/effect/blob/shield/New() + ..() + update_nearby_tiles() + +/obj/effect/blob/shield/Destroy() + density = 0 + update_nearby_tiles() + ..() + +/obj/effect/blob/shield/update_icon() + if(health > maxHealth * 2 / 3) + icon_state = "blob_idle" + else if(health > maxHealth / 3) + icon_state = "blob" + else + icon_state = "blob_damaged" + +/obj/effect/blob/shield/CanPass(var/atom/movable/mover, var/turf/target, var/height = 0, var/air_group = 0) + return !density diff --git a/code/modules/cargo/randomstock.dm b/code/modules/cargo/randomstock.dm index 12986ab945b..98850620b7f 100644 --- a/code/modules/cargo/randomstock.dm +++ b/code/modules/cargo/randomstock.dm @@ -176,7 +176,6 @@ var/list/global/random_stock_uncommon = list( "crimekit" = 1, "carpet" = 2, "gift" = 4, - "lightfloor" = 2, "linenbin" = 1, "coatrack" = 1, "riotshield" = 2, @@ -1219,8 +1218,6 @@ var/list/global/random_stock_large = list( new /obj/item/stack/tile/carpet(L, 50) if ("gift") new /obj/item/weapon/a_gift(L) - if ("lightfloor") - new /obj/item/stack/tile/light(L, 50) if ("linenbin") new /obj/structure/bedsheetbin(get_turf(L)) if ("coatrack") @@ -1262,10 +1259,9 @@ var/list/global/random_stock_large = list( L = U break var/mob/living/bot/newbot = new type(L) - + newbot.on = 0//Deactivated if (prob(10)) - newbot.Emag(null) - newbot.turn_off() + newbot.emag_act(9999,null) if ("latexb") new /obj/item/latexballon(L) @@ -1931,6 +1927,3 @@ var/list/global/random_stock_large = list( exosuit.pr_manage_warnings.process(exosuit) else log_debug("ERROR: Random cargo spawn failed for [stock]") - - - diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 08ebcbc2a2d..665a005b99c 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -17,7 +17,7 @@ var/moving = null var/adminobs = null var/area = null - var/time_died_as_mouse = null //when the client last died as a mouse + var/time_died_as_mouse = 0 var/adminhelped = 0 diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 33fb624ab93..43c43973f1f 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -278,9 +278,6 @@ del(src) return 0 - if( (world.address == address || !address) && !host ) - host = key - world.update_status() if(holder) add_admin_verbs() @@ -474,6 +471,12 @@ // Something went wrong, client is usually kicked or transfered to a new mob at this point return 0 +/client/verb/character_setup() + set name = "Character Setup" + set category = "Preferences" + if(prefs) + prefs.ShowChoices(usr) + //I honestly can't find a good place for this atm. //If the webint interaction gets more features, I'll move it. - Skull132 /client/verb/view_linking_requests() diff --git a/code/modules/client/movement.dm b/code/modules/client/movement.dm new file mode 100644 index 00000000000..efcf51c02ee --- /dev/null +++ b/code/modules/client/movement.dm @@ -0,0 +1,15 @@ + +/client/New() + ..() + dir = NORTH + +/client/verb/spinleft() + set name = "Spin View CCW" + set category = "OOC" + dir = turn(dir, 90) + +/client/verb/spinright() + set name = "Spin View CW" + set category = "OOC" + dir = turn(dir, -90) + diff --git a/code/modules/client/preference_setup/antagonism/01_candidacy.dm b/code/modules/client/preference_setup/antagonism/01_candidacy.dm new file mode 100644 index 00000000000..8909069f3d4 --- /dev/null +++ b/code/modules/client/preference_setup/antagonism/01_candidacy.dm @@ -0,0 +1,97 @@ +/datum/category_item/player_setup_item/antagonism/candidacy + name = "Candidacy" + sort_order = 1 + +/datum/category_item/player_setup_item/antagonism/candidacy/load_character(var/savefile/S) + S["be_special"] >> pref.be_special_role + +/datum/category_item/player_setup_item/antagonism/candidacy/save_character(var/savefile/S) + S["be_special"] << pref.be_special_role + +/datum/category_item/player_setup_item/antagonism/candidacy/gather_load_query() + return list("ss13_characters" = list("vars" = list("be_special_role"), "args" = list("id"))) + +/datum/category_item/player_setup_item/antagonism/candidacy/gather_load_parameters() + return list(":id" = pref.current_character) + +/datum/category_item/player_setup_item/antagonism/candidacy/gather_save_query() + return list("ss13_characters" = list("be_special_role", "id" = 1)) + +/datum/category_item/player_setup_item/antagonism/candidacy/gather_save_parameters() + return list(":be_special_role" = list2params(pref.be_special_role), ":id" = pref.current_character) + +/datum/category_item/player_setup_item/antagonism/candidacy/sanitize_character(var/sql_load = 0) + if (sql_load) + if (pref.be_special_role) + pref.be_special_role = params2list(pref.be_special_role) + + if (!istype(pref.be_special_role)) + pref.be_special_role = list() + + for (var/role in pref.be_special_role) + if (!(role in valid_special_roles())) + pref.be_special_role -= role + +/datum/category_item/player_setup_item/antagonism/candidacy/content(var/mob/user) + . += "Special Role Availability:
      " + . += "" + for(var/antag_type in all_antag_types) + var/datum/antagonist/antag = all_antag_types[antag_type] + . += "" + + var/list/ghost_traps = get_ghost_traps() + for(var/ghost_trap_key in ghost_traps) + var/datum/ghosttrap/ghost_trap = ghost_traps[ghost_trap_key] + if(!ghost_trap.list_as_special_role) + continue + + . += "" + . += "
      [antag.role_text]: " + if(jobban_isbanned(preference_mob(), antag.bantype)) + . += "\[BANNED\]
      " + else if(antag.role_type in pref.be_special_role) + . += "Yes / No
      " + else + . += "Yes / No
      " + . += "
      [(ghost_trap.ghost_trap_role)]: " + if(banned_from_ghost_role(preference_mob(), ghost_trap)) + . += "\[BANNED\]
      " + else if(ghost_trap.pref_check in pref.be_special_role) + . += "Yes / No
      " + else + . += "Yes / No
      " + . += "
      " + +/datum/category_item/player_setup_item/proc/banned_from_ghost_role(var/mob, var/datum/ghosttrap/ghost_trap) + for(var/ban_type in ghost_trap.ban_checks) + if(jobban_isbanned(mob, ban_type)) + return 1 + return 0 + +/datum/category_item/player_setup_item/antagonism/candidacy/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["add_special"]) + if(!(href_list["add_special"] in valid_special_roles())) + return TOPIC_HANDLED + pref.be_special_role |= href_list["add_special"] + return TOPIC_REFRESH + + if(href_list["del_special"]) + pref.be_special_role -= href_list["del_special"] + return TOPIC_REFRESH + + return ..() + +/datum/category_item/player_setup_item/antagonism/candidacy/proc/valid_special_roles() + var/list/private_valid_special_roles = list() + for(var/antag_type in all_antag_types) + var/datum/antagonist/antag = all_antag_types[antag_type] + private_valid_special_roles += antag.role_type + + var/list/ghost_traps = get_ghost_traps() + for(var/ghost_trap_key in ghost_traps) + var/datum/ghosttrap/ghost_trap = ghost_traps[ghost_trap_key] + if(!ghost_trap.list_as_special_role) + continue + private_valid_special_roles += ghost_trap.pref_check + + return private_valid_special_roles diff --git a/code/modules/client/preference_setup/antagonism/02_setup.dm b/code/modules/client/preference_setup/antagonism/02_setup.dm new file mode 100644 index 00000000000..59e06d2b3dc --- /dev/null +++ b/code/modules/client/preference_setup/antagonism/02_setup.dm @@ -0,0 +1,52 @@ +var/global/list/uplink_locations = list("PDA", "Headset", "None") + +/datum/category_item/player_setup_item/antagonism/basic + name = "Setup" + sort_order = 2 + +/datum/category_item/player_setup_item/antagonism/basic/load_character(var/savefile/S) + S["uplinklocation"] >> pref.uplinklocation + S["exploit_record"] >> pref.exploit_record + +/datum/category_item/player_setup_item/antagonism/basic/save_character(var/savefile/S) + S["uplinklocation"] << pref.uplinklocation + S["exploit_record"] << pref.exploit_record + +/datum/category_item/player_setup_item/antagonism/basic/gather_load_query() + return list("ss13_characters_flavour" = list("vars" = list("records_exploit" = "exploit_record"), "args" = list("char_id")), + "ss13_characters" = list("vars" = list("uplink_location" = "uplinklocation"), "args" = list("id"))) + +/datum/category_item/player_setup_item/antagonism/basic/gather_load_parameters() + return list(":char_id" = pref.current_character, ":id" = pref.current_character) + +/datum/category_item/player_setup_item/antagonism/basic/gather_save_query() + return list("ss13_characters_flavour" = list("records_exploit", "char_id" = 1), + "ss13_characters" = list("uplink_location", "id" = 1)) + +/datum/category_item/player_setup_item/antagonism/basic/gather_save_parameters() + return list(":records_exploit" = pref.exploit_record, ":char_id" = pref.current_character, ":uplink_location" = pref.uplinklocation, ":id" = pref.current_character) + +/datum/category_item/player_setup_item/antagonism/basic/sanitize_character() + pref.uplinklocation = sanitize_inlist(pref.uplinklocation, uplink_locations, initial(pref.uplinklocation)) + +/datum/category_item/player_setup_item/antagonism/basic/content(var/mob/user) + . +="Antag Setup:
      " + . +="Uplink Type: [pref.uplinklocation]
      " + . +="Exploitable information:
      " + if(jobban_isbanned(user, "Records")) + . += "You are banned from using character records.
      " + else + . +="[TextPreview(pref.exploit_record,40)]
      " + +/datum/category_item/player_setup_item/antagonism/basic/OnTopic(var/href,var/list/href_list, var/mob/user) + if (href_list["antagtask"]) + pref.uplinklocation = next_in_list(pref.uplinklocation, uplink_locations) + return TOPIC_REFRESH + + if(href_list["exploitable_record"]) + var/exploitmsg = sanitize(input(user,"Set exploitable information about you here.","Exploitable Information", html_decode(pref.exploit_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0) + if(!isnull(exploitmsg) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) + pref.exploit_record = exploitmsg + return TOPIC_REFRESH + + return ..() diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm new file mode 100644 index 00000000000..b6d89103870 --- /dev/null +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -0,0 +1,118 @@ +/datum/category_item/player_setup_item/general/basic + name = "Basic" + sort_order = 1 + var/static/list/valid_player_genders = list(MALE, FEMALE) + +/datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S) + S["real_name"] >> pref.real_name + S["name_is_always_random"] >> pref.be_random_name + S["gender"] >> pref.gender + S["age"] >> pref.age + S["spawnpoint"] >> pref.spawnpoint + S["OOC_Notes"] >> pref.metadata + +/datum/category_item/player_setup_item/general/basic/save_character(var/savefile/S) + S["real_name"] << pref.real_name + S["name_is_always_random"] << pref.be_random_name + S["gender"] << pref.gender + S["age"] << pref.age + S["spawnpoint"] << pref.spawnpoint + S["OOC_Notes"] << pref.metadata + +/datum/category_item/player_setup_item/general/basic/gather_load_query() + return list("ss13_characters" = list("vars" = list("name" = "real_name", + "random_name" = "be_random_name", + "gender", + "age", + "metadata", + "spawnpoint",), + "args" = list("id"))) + +/datum/category_item/player_setup_item/general/basic/gather_load_parameters() + return list(":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/basic/gather_save_query() + return list("ss13_characters" = list("name", + "random_name", + "gender", + "age", + "metadata", + "spawnpoint", + "id" = 1)) + +/datum/category_item/player_setup_item/general/basic/gather_save_parameters() + return list(":name" = pref.real_name, + ":random_name" = pref.be_random_name, + ":gender" = pref.gender, + ":age" = pref.age, + ":metadata" = pref.metadata, + ":spawnpoint" = pref.spawnpoint, + ":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/basic/sanitize_character() + pref.age = sanitize_integer(text2num(pref.age), AGE_MIN, AGE_MAX, initial(pref.age)) + pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders)) + pref.real_name = sanitize_name(pref.real_name, pref.species) + if(!pref.real_name) + pref.real_name = random_name(pref.gender, pref.species) + pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint)) + pref.be_random_name = sanitize_integer(text2num(pref.be_random_name), 0, 1, initial(pref.be_random_name)) + +/datum/category_item/player_setup_item/general/basic/content() + . = "Name: " + . += "[pref.real_name]
      " + . += "(Random Name) " + . += "(Always Random Name: [pref.be_random_name ? "Yes" : "No"])" + . += "
      " + . += "Gender: [capitalize(lowertext(pref.gender))]
      " + . += "Age: [pref.age]
      " + . += "Spawn Point: [pref.spawnpoint]
      " + if(config.allow_Metadata) + . += "OOC Notes: Edit
      " + +/datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["rename"]) + var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null + if (!isnull(raw_name) && CanUseTopic(user)) + var/new_name = sanitize_name(raw_name, pref.species) + if(new_name) + pref.real_name = new_name + return TOPIC_REFRESH + else + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + return TOPIC_NOACTION + + else if(href_list["random_name"]) + pref.real_name = random_name(pref.gender, pref.species) + return TOPIC_REFRESH + + else if(href_list["always_random_name"]) + pref.be_random_name = !pref.be_random_name + return TOPIC_REFRESH + + else if(href_list["gender"]) + pref.gender = next_in_list(pref.gender, valid_player_genders) + return TOPIC_REFRESH + + else if(href_list["age"]) + var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference", pref.age) as num|null + if(new_age && CanUseTopic(user)) + pref.age = max(min(round(text2num(new_age)), AGE_MAX), AGE_MIN) + return TOPIC_REFRESH + + else if(href_list["spawnpoint"]) + var/list/spawnkeys = list() + for(var/S in spawntypes) + spawnkeys += S + var/choice = input(user, "Where would you like to spawn when late-joining?") as null|anything in spawnkeys + if(!choice || !spawntypes[choice] || !CanUseTopic(user)) return TOPIC_NOACTION + pref.spawnpoint = choice + return TOPIC_REFRESH + + else if(href_list["metadata"]) + var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , pref.metadata)) as message|null + if(new_metadata && CanUseTopic(user)) + pref.metadata = sanitize(new_metadata) + return TOPIC_REFRESH + + return ..() diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm new file mode 100644 index 00000000000..14e1ae99233 --- /dev/null +++ b/code/modules/client/preference_setup/general/02_language.dm @@ -0,0 +1,78 @@ +/datum/category_item/player_setup_item/general/language + name = "Language" + sort_order = 2 + +/datum/category_item/player_setup_item/general/language/load_character(var/savefile/S) + S["language"] >> pref.alternate_languages + +/datum/category_item/player_setup_item/general/language/save_character(var/savefile/S) + S["language"] << pref.alternate_languages + +/datum/category_item/player_setup_item/general/language/gather_load_query() + return list("ss13_characters" = list("vars" = list("language" = "alternate_languages"), "args" = list("id"))) + +/datum/category_item/player_setup_item/general/language/gather_load_parameters() + return list(":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/language/gather_save_query() + return list("ss13_characters" = list("language", + "id" = 1)) + +/datum/category_item/player_setup_item/general/language/gather_save_parameters() + return list(":language" = list2params(pref.alternate_languages), + ":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/language/sanitize_character(var/sql_load = 0) + if (sql_load) + pref.alternate_languages = params2list(pref.alternate_languages) + + if(!islist(pref.alternate_languages)) + pref.alternate_languages = list() + +/datum/category_item/player_setup_item/general/language/content() + . += "Languages
      " + var/datum/species/S = all_species[pref.species] + if(S.language) + . += "- [S.language]
      " + if(S.default_language && S.default_language != S.language) + . += "- [S.default_language]
      " + if(S.num_alternate_languages) + if(pref.alternate_languages.len) + for(var/i = 1 to pref.alternate_languages.len) + var/lang = pref.alternate_languages[i] + . += "- [lang] - remove
      " + + if(pref.alternate_languages.len < S.num_alternate_languages) + . += "- add ([S.num_alternate_languages - pref.alternate_languages.len] remaining)
      " + else + . += "- [pref.species] cannot choose secondary languages.
      " + +/datum/category_item/player_setup_item/general/language/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["remove_language"]) + var/index = text2num(href_list["remove_language"]) + pref.alternate_languages.Cut(index, index+1) + return TOPIC_REFRESH + else if(href_list["add_language"]) + var/datum/species/S = all_species[pref.species] + if(pref.alternate_languages.len >= S.num_alternate_languages) + alert(user, "You have already selected the maximum number of alternate languages for this species!") + else + var/list/available_languages = S.secondary_langs.Copy() + for(var/L in all_languages) + var/datum/language/lang = all_languages[L] + if(!(lang.flags & RESTRICTED) && (!config.usealienwhitelist || is_alien_whitelisted(user, L) || !(lang.flags & WHITELISTED))) + available_languages |= L + + // make sure we don't let them waste slots on the default languages + available_languages -= S.language + available_languages -= S.default_language + available_languages -= pref.alternate_languages + + if(!available_languages.len) + alert(user, "There are no additional languages available to select.") + else + var/new_lang = input(user, "Select an additional language", "Character Generation", null) as null|anything in available_languages + if(new_lang) + pref.alternate_languages |= new_lang + return TOPIC_REFRESH + return ..() diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm new file mode 100644 index 00000000000..75f04ed3fa7 --- /dev/null +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -0,0 +1,581 @@ +var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-") + +/datum/category_item/player_setup_item/general/body + name = "Body" + sort_order = 3 + +/datum/category_item/player_setup_item/general/body/load_character(var/savefile/S) + S["species"] >> pref.species + S["hair_red"] >> pref.r_hair + S["hair_green"] >> pref.g_hair + S["hair_blue"] >> pref.b_hair + S["facial_red"] >> pref.r_facial + S["facial_green"] >> pref.g_facial + S["facial_blue"] >> pref.b_facial + S["skin_tone"] >> pref.s_tone + S["skin_red"] >> pref.r_skin + S["skin_green"] >> pref.g_skin + S["skin_blue"] >> pref.b_skin + S["hair_style_name"] >> pref.h_style + S["facial_style_name"] >> pref.f_style + S["eyes_red"] >> pref.r_eyes + S["eyes_green"] >> pref.g_eyes + S["eyes_blue"] >> pref.b_eyes + S["b_type"] >> pref.b_type + S["disabilities"] >> pref.disabilities + S["organ_data"] >> pref.organ_data + S["rlimb_data"] >> pref.rlimb_data + +/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S) + S["species"] << pref.species + S["hair_red"] << pref.r_hair + S["hair_green"] << pref.g_hair + S["hair_blue"] << pref.b_hair + S["facial_red"] << pref.r_facial + S["facial_green"] << pref.g_facial + S["facial_blue"] << pref.b_facial + S["skin_tone"] << pref.s_tone + S["skin_red"] << pref.r_skin + S["skin_green"] << pref.g_skin + S["skin_blue"] << pref.b_skin + S["hair_style_name"] << pref.h_style + S["facial_style_name"] << pref.f_style + S["eyes_red"] << pref.r_eyes + S["eyes_green"] << pref.g_eyes + S["eyes_blue"] << pref.b_eyes + S["b_type"] << pref.b_type + S["disabilities"] << pref.disabilities + S["organ_data"] << pref.organ_data + S["rlimb_data"] << pref.rlimb_data + +/datum/category_item/player_setup_item/general/body/gather_load_query() + return list("ss13_characters" = list("vars" = list("species", + "hair_colour", + "facial_colour", + "skin_tone" = "s_tone", + "skin_colour", + "hair_style" = "h_style", + "facial_style" = "f_style", + "eyes_colour", + "b_type", + "disabilities", + "organs_data" = "organ_data", + "organs_robotic" = "rlimb_data"), + "args" = list("id"))) + +/datum/category_item/player_setup_item/general/body/gather_load_parameters() + return list(":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/body/gather_save_query() + return list("ss13_characters" = list("species", + "hair_colour", + "facial_colour", + "skin_tone", + "skin_colour", + "hair_style", + "facial_style", + "eyes_colour", + "b_type", + "disabilities", + "organs_data", + "organs_robotic", + "id" = 1)) + +/datum/category_item/player_setup_item/general/body/gather_save_parameters() + return list(":species" = pref.species, + ":hair_colour" = "#" + num2hex(pref.r_hair) + num2hex(pref.g_hair) + num2hex(pref.b_hair), + ":facial_colour" = "#" + num2hex(pref.r_facial) + num2hex(pref.g_facial) + num2hex(pref.b_facial), + ":skin_tone" = pref.s_tone, + ":skin_colour" = "#" + num2hex(pref.r_skin) + num2hex(pref.g_skin) + num2hex(pref.b_skin), + ":hair_style" = pref.h_style, + ":facial_style" = pref.f_style, + ":eyes_colour" = "#" + num2hex(pref.r_eyes) + num2hex(pref.g_eyes) + num2hex(pref.b_eyes), + ":b_type" = pref.b_type, + ":disabilities" = pref.disabilities, + ":organs_data" = list2params(pref.organ_data), + ":organs_robotic"= list2params(pref.rlimb_data), + ":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/body/sanitize_character(var/sql_load = 0) + if(!pref.species || !(pref.species in playable_species)) + pref.species = "Human" + + if (sql_load) + pref.hair_colour = sanitize_hexcolor(pref.hair_colour) + pref.r_hair = GetRedPart(pref.hair_colour) + pref.g_hair = GetGreenPart(pref.hair_colour) + pref.b_hair = GetBluePart(pref.hair_colour) + + pref.facial_colour = sanitize_hexcolor(pref.facial_colour) + pref.r_facial = GetRedPart(pref.facial_colour) + pref.g_facial = GetGreenPart(pref.facial_colour) + pref.b_facial = GetBluePart(pref.facial_colour) + + pref.s_tone = text2num(pref.s_tone) + + pref.skin_colour = sanitize_hexcolor(pref.skin_colour) + pref.r_skin = GetRedPart(pref.skin_colour) + pref.g_skin = GetGreenPart(pref.skin_colour) + pref.b_skin = GetBluePart(pref.skin_colour) + + pref.skin_colour = sanitize_hexcolor(pref.skin_colour) + pref.r_eyes = GetRedPart(pref.eyes_colour) + pref.g_eyes = GetGreenPart(pref.eyes_colour) + pref.b_eyes = GetBluePart(pref.eyes_colour) + + pref.disabilities = text2num(pref.disabilities) + + if (pref.organ_data) + pref.organ_data = params2list(pref.organ_data) + if (pref.rlimb_data) + pref.rlimb_data = params2list(pref.rlimb_data) + + pref.r_hair = sanitize_integer(pref.r_hair, 0, 255, initial(pref.r_hair)) + pref.g_hair = sanitize_integer(pref.g_hair, 0, 255, initial(pref.g_hair)) + pref.b_hair = sanitize_integer(pref.b_hair, 0, 255, initial(pref.b_hair)) + pref.r_facial = sanitize_integer(pref.r_facial, 0, 255, initial(pref.r_facial)) + pref.g_facial = sanitize_integer(pref.g_facial, 0, 255, initial(pref.g_facial)) + pref.b_facial = sanitize_integer(pref.b_facial, 0, 255, initial(pref.b_facial)) + pref.s_tone = sanitize_integer(pref.s_tone, -185, 34, initial(pref.s_tone)) + pref.r_skin = sanitize_integer(pref.r_skin, 0, 255, initial(pref.r_skin)) + pref.g_skin = sanitize_integer(pref.g_skin, 0, 255, initial(pref.g_skin)) + pref.b_skin = sanitize_integer(pref.b_skin, 0, 255, initial(pref.b_skin)) + pref.h_style = sanitize_inlist(pref.h_style, hair_styles_list, initial(pref.h_style)) + pref.f_style = sanitize_inlist(pref.f_style, facial_hair_styles_list, initial(pref.f_style)) + pref.r_eyes = sanitize_integer(pref.r_eyes, 0, 255, initial(pref.r_eyes)) + pref.g_eyes = sanitize_integer(pref.g_eyes, 0, 255, initial(pref.g_eyes)) + pref.b_eyes = sanitize_integer(pref.b_eyes, 0, 255, initial(pref.b_eyes)) + pref.b_type = sanitize_text(pref.b_type, initial(pref.b_type)) + + pref.disabilities = sanitize_integer(pref.disabilities, 0, 65535, initial(pref.disabilities)) + if (!pref.organ_data || !islist(pref.organ_data)) + pref.organ_data = list() + if (!pref.rlimb_data || !islist(pref.rlimb_data)) + pref.rlimb_data = list() + +/datum/category_item/player_setup_item/general/body/content(var/mob/user) + pref.update_preview_icon() + if(pref.preview_icon_front && pref.preview_icon_side) + user << browse_rsc(pref.preview_icon_front, "previewicon.png") + user << browse_rsc(pref.preview_icon_side, "previewicon2.png") + + var/mob_species = all_species[pref.species] + . += "
      Body " + . += "(®)" + . += "
      " + . += "Species: [pref.species]
      " + . += "Blood Type: [pref.b_type]
      " + if(has_flag(mob_species, HAS_SKIN_TONE)) + . += "Skin Tone: [-pref.s_tone + 35]/220
      " + . += "Needs Glasses: [pref.disabilities & NEARSIGHTED ? "Yes" : "No"]
      " + . += "Limbs: Adjust
      " + . += "Internal Organs: Adjust
      " + + //display limbs below + var/ind = 0 + for(var/name in pref.organ_data) + var/status = pref.organ_data[name] + var/organ_name = null + switch(name) + if("l_arm") + organ_name = "left arm" + if("r_arm") + organ_name = "right arm" + if("l_leg") + organ_name = "left leg" + if("r_leg") + organ_name = "right leg" + if("l_foot") + organ_name = "left foot" + if("r_foot") + organ_name = "right foot" + if("l_hand") + organ_name = "left hand" + if("r_hand") + organ_name = "right hand" + if("heart") + organ_name = "heart" + if("eyes") + organ_name = "eyes" + + if(status == "cyborg") + ++ind + if(ind > 1) + . += ", " + var/datum/robolimb/R + if(pref.rlimb_data[name] && all_robolimbs[pref.rlimb_data[name]]) + R = all_robolimbs[pref.rlimb_data[name]] + else + R = basic_robolimb + . += "\t[R.company] [organ_name] prothesis" + else if(status == "amputated") + ++ind + if(ind > 1) + . += ", " + . += "\tAmputated [organ_name]" + else if(status == "mechanical") + ++ind + if(ind > 1) + . += ", " + . += "\tMechanical [organ_name]" + else if(status == "assisted") + ++ind + if(ind > 1) + . += ", " + switch(organ_name) + if("heart") + . += "\tPacemaker-assisted [organ_name]" + if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements + . += "\tSurgically altered [organ_name]" + if("eyes") + . += "\tRetinal overlayed [organ_name]" + else + . += "\tMechanically assisted [organ_name]" + if(!ind) + . += "\[...\]

      " + else + . += "

      " + + . += "
      Preview
      " + . += "
      " + + . += "Hair
      " + if(has_flag(mob_species, HAS_HAIR_COLOR)) + . += "Change Color
      __
      " + . += " Style: [pref.h_style]
      " + + . += "
      Facial
      " + if(has_flag(mob_species, HAS_HAIR_COLOR)) + . += "Change Color
      __
      " + . += " Style: [pref.f_style]
      " + + if(has_flag(mob_species, HAS_EYE_COLOR)) + . += "
      Eyes
      " + . += "Change Color
      __

      " + + if(has_flag(mob_species, HAS_SKIN_COLOR)) + . += "
      Body Color
      " + . += "Change Color
      __

      " + +/datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag) + return mob_species && (mob_species.appearance_flags & flag) + +/datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user) + var/datum/species/mob_species = all_species[pref.species] + + if(href_list["random"]) + pref.randomize_appearance_for() + return TOPIC_REFRESH + + else if(href_list["blood_type"]) + var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in valid_bloodtypes + if(new_b_type && CanUseTopic(user)) + pref.b_type = new_b_type + return TOPIC_REFRESH + + else if(href_list["show_species"]) + // Actual whitelist checks are handled elsewhere, this is just for accessing the preview window. + var/choice = input("Which species would you like to look at?") as null|anything in playable_species + if(!choice) return + pref.species_preview = choice + SetSpecies(preference_mob()) + pref.alternate_languages.Cut() // Reset their alternate languages. Todo: attempt to just fix it instead? + return TOPIC_HANDLED + + else if(href_list["set_species"]) + user << browse(null, "window=species") + if(!pref.species_preview || !(pref.species_preview in all_species)) + return TOPIC_NOACTION + + var/prev_species = pref.species + pref.species = href_list["set_species"] + if(prev_species != pref.species) + mob_species = all_species[pref.species] + + //grab one of the valid hair styles for the newly chosen species + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(pref.gender == MALE && S.gender == FEMALE) + continue + if(pref.gender == FEMALE && S.gender == MALE) + continue + if(!(mob_species.get_bodytype() in S.species_allowed)) + continue + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + + if(valid_hairstyles.len) + pref.h_style = pick(valid_hairstyles) + else + //this shouldn't happen + pref.h_style = hair_styles_list["Bald"] + + //grab one of the valid facial hair styles for the newly chosen species + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(pref.gender == MALE && S.gender == FEMALE) + continue + if(pref.gender == FEMALE && S.gender == MALE) + continue + if(!(mob_species.get_bodytype() in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + if(valid_facialhairstyles.len) + pref.f_style = pick(valid_facialhairstyles) + else + //this shouldn't happen + pref.f_style = facial_hair_styles_list["Shaved"] + + //reset hair colour and skin colour + pref.r_hair = 0//hex2num(copytext(new_hair, 2, 4)) + pref.g_hair = 0//hex2num(copytext(new_hair, 4, 6)) + pref.b_hair = 0//hex2num(copytext(new_hair, 6, 8)) + pref.s_tone = 0 + + return TOPIC_REFRESH + + else if(href_list["hair_color"]) + if(!has_flag(mob_species, HAS_HAIR_COLOR)) + return TOPIC_NOACTION + var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference", rgb(pref.r_hair, pref.g_hair, pref.b_hair)) as color|null + if(new_hair && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user)) + pref.r_hair = hex2num(copytext(new_hair, 2, 4)) + pref.g_hair = hex2num(copytext(new_hair, 4, 6)) + pref.b_hair = hex2num(copytext(new_hair, 6, 8)) + return TOPIC_REFRESH + + else if(href_list["hair_style"]) + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(!(mob_species.get_bodytype() in S.species_allowed)) + continue + + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + + var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference", pref.h_style) as null|anything in valid_hairstyles + if(new_h_style && CanUseTopic(user)) + pref.h_style = new_h_style + return TOPIC_REFRESH + + else if(href_list["facial_color"]) + if(!has_flag(mob_species, HAS_HAIR_COLOR)) + return TOPIC_NOACTION + var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(pref.r_facial, pref.g_facial, pref.b_facial)) as color|null + if(new_facial && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user)) + pref.r_facial = hex2num(copytext(new_facial, 2, 4)) + pref.g_facial = hex2num(copytext(new_facial, 4, 6)) + pref.b_facial = hex2num(copytext(new_facial, 6, 8)) + return TOPIC_REFRESH + + else if(href_list["eye_color"]) + if(!has_flag(mob_species, HAS_EYE_COLOR)) + return TOPIC_NOACTION + var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(pref.r_eyes, pref.g_eyes, pref.b_eyes)) as color|null + if(new_eyes && has_flag(mob_species, HAS_EYE_COLOR) && CanUseTopic(user)) + pref.r_eyes = hex2num(copytext(new_eyes, 2, 4)) + pref.g_eyes = hex2num(copytext(new_eyes, 4, 6)) + pref.b_eyes = hex2num(copytext(new_eyes, 6, 8)) + return TOPIC_REFRESH + + else if(href_list["skin_tone"]) + if(!has_flag(mob_species, HAS_SKIN_TONE)) + return TOPIC_NOACTION + var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35) as num|null + if(new_s_tone && has_flag(mob_species, HAS_SKIN_TONE) && CanUseTopic(user)) + pref.s_tone = 35 - max(min( round(new_s_tone), 220),1) + return TOPIC_REFRESH + + else if(href_list["skin_color"]) + if(!has_flag(mob_species, HAS_SKIN_COLOR)) + return TOPIC_NOACTION + var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(pref.r_skin, pref.g_skin, pref.b_skin)) as color|null + if(new_skin && has_flag(mob_species, HAS_SKIN_COLOR) && CanUseTopic(user)) + pref.r_skin = hex2num(copytext(new_skin, 2, 4)) + pref.g_skin = hex2num(copytext(new_skin, 4, 6)) + pref.b_skin = hex2num(copytext(new_skin, 6, 8)) + return TOPIC_REFRESH + + else if(href_list["facial_style"]) + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(pref.gender == MALE && S.gender == FEMALE) + continue + if(pref.gender == FEMALE && S.gender == MALE) + continue + if(!(mob_species.get_bodytype() in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference", pref.f_style) as null|anything in valid_facialhairstyles + if(new_f_style && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user)) + pref.f_style = new_f_style + return TOPIC_REFRESH + + else if(href_list["limbs"]) + var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") + if(!limb_name && !CanUseTopic(user)) return TOPIC_NOACTION + + var/limb = null + var/second_limb = null // if you try to change the arm, the hand should also change + var/third_limb = null // if you try to unchange the hand, the arm should also change + switch(limb_name) + if("Left Leg") + limb = "l_leg" + second_limb = "l_foot" + if("Right Leg") + limb = "r_leg" + second_limb = "r_foot" + if("Left Arm") + limb = "l_arm" + second_limb = "l_hand" + if("Right Arm") + limb = "r_arm" + second_limb = "r_hand" + if("Left Foot") + limb = "l_foot" + third_limb = "l_leg" + if("Right Foot") + limb = "r_foot" + third_limb = "r_leg" + if("Left Hand") + limb = "l_hand" + third_limb = "l_arm" + if("Right Hand") + limb = "r_hand" + third_limb = "r_arm" + + var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in list("Normal","Amputated","Prothesis") + if(!new_state && !CanUseTopic(user)) return TOPIC_NOACTION + + switch(new_state) + if("Normal") + pref.organ_data[limb] = null + pref.rlimb_data[limb] = null + if(third_limb) + pref.organ_data[third_limb] = null + pref.rlimb_data[third_limb] = null + if("Amputated") + pref.organ_data[limb] = "amputated" + pref.rlimb_data[limb] = null + if(second_limb) + pref.organ_data[second_limb] = "amputated" + pref.rlimb_data[second_limb] = null + + if("Prothesis") + var/tmp_species = pref.species ? pref.species : "Human" + var/list/usable_manufacturers = list() + for(var/company in chargen_robolimbs) + var/datum/robolimb/M = chargen_robolimbs[company] + if(tmp_species in M.species_cannot_use) + continue + usable_manufacturers[company] = M + if(!usable_manufacturers.len) + return + var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in usable_manufacturers + if(!choice) + return + pref.rlimb_data[limb] = choice + pref.organ_data[limb] = "cyborg" + if(second_limb) + pref.rlimb_data[second_limb] = choice + pref.organ_data[second_limb] = "cyborg" + if(third_limb && pref.organ_data[third_limb] == "amputated") + pref.organ_data[third_limb] = null + return TOPIC_REFRESH + + else if(href_list["organs"]) + var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") + if(!organ_name) return + + var/organ = null + switch(organ_name) + if("Heart") + organ = "heart" + if("Eyes") + organ = "eyes" + + var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") + if(!new_state) return + + switch(new_state) + if("Normal") + pref.organ_data[organ] = null + if("Assisted") + pref.organ_data[organ] = "assisted" + if("Mechanical") + pref.organ_data[organ] = "mechanical" + return TOPIC_REFRESH + + else if(href_list["disabilities"]) + var/disability_flag = text2num(href_list["disabilities"]) + pref.disabilities ^= disability_flag + return TOPIC_REFRESH + + return ..() + +/datum/category_item/player_setup_item/general/body/proc/SetSpecies(mob/user) + if(!pref.species_preview || !(pref.species_preview in all_species)) + pref.species_preview = "Human" + var/datum/species/current_species = all_species[pref.species_preview] + var/dat = "" + dat += "

      [current_species.name] \[change\]


      " + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
      [current_species.blurb]" + if("preview" in icon_states(current_species.icobase)) + usr << browse_rsc(icon(current_species.icobase,"preview"), "species_preview_[current_species.name].png") + dat += "

      " + dat += "Language: [current_species.language]
      " + dat += "" + if(current_species.spawn_flags & CAN_JOIN) + dat += "
      Often present on human stations." + if(current_species.spawn_flags & IS_WHITELISTED) + dat += "
      Whitelist restricted." + if(current_species.flags & NO_BLOOD) + dat += "
      Does not have blood." + if(current_species.flags & NO_BREATHE) + dat += "
      Does not breathe." + if(current_species.flags & NO_SCAN) + dat += "
      Does not have DNA." + if(current_species.flags & NO_PAIN) + dat += "
      Does not feel pain." + if(current_species.flags & NO_SLIP) + dat += "
      Has excellent traction." + if(current_species.flags & NO_POISON) + dat += "
      Immune to most poisons." + if(current_species.appearance_flags & HAS_SKIN_TONE) + dat += "
      Has a variety of skin tones." + if(current_species.appearance_flags & HAS_SKIN_COLOR) + dat += "
      Has a variety of skin colours." + if(current_species.appearance_flags & HAS_EYE_COLOR) + dat += "
      Has a variety of eye colours." + if(current_species.flags & IS_PLANT) + dat += "
      Has a plantlike physiology." + dat += "

      " + + var/restricted = 0 + if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! + if(!(current_species.spawn_flags & CAN_JOIN)) + restricted = 2 + else if((current_species.spawn_flags & IS_WHITELISTED) && !is_alien_whitelisted(preference_mob(),current_species)) + restricted = 1 + + if(restricted) + if(restricted == 1) + dat += "You cannot play as this species.
      If you wish to be whitelisted, you can make an application post on the forums.

      " + else if(restricted == 2) + dat += "You cannot play as this species.
      This species is not available for play as a station race..

      " + if(!restricted || check_rights(R_ADMIN, 0)) + dat += "\[select\]" + dat += "
      " + + user << browse(dat, "window=species;size=700x400") diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm new file mode 100644 index 00000000000..a4297812471 --- /dev/null +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -0,0 +1,146 @@ +/datum/category_item/player_setup_item/general/equipment + name = "Equipment" + sort_order = 4 + +/datum/category_item/player_setup_item/general/equipment/load_character(var/savefile/S) + S["underwear"] >> pref.underwear + S["undershirt"] >> pref.undershirt + S["backbag"] >> pref.backbag + S["gear"] >> pref.gear + +/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S) + S["underwear"] << pref.underwear + S["undershirt"] << pref.undershirt + S["backbag"] << pref.backbag + S["gear"] << pref.gear + +/datum/category_item/player_setup_item/general/equipment/gather_load_query() + return list("ss13_characters" = list("vars" = list("underwear", "undershirt", "backbag", "gear"), "args" = list("id"))) + +/datum/category_item/player_setup_item/general/equipment/gather_load_parameters() + return list(":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/equipment/gather_save_query() + return list("ss13_characters" = list("underwear", "undershirt", "backbag", "gear", "id" = 1)) + +/datum/category_item/player_setup_item/general/equipment/gather_save_parameters() + return list(":underwear" = pref.underwear, ":undershirt" = pref.undershirt, ":backbag" = pref.backbag, ":gear" = list2params(pref.gear), ":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/equipment/sanitize_character(var/sql_load = 0) + if (sql_load) + pref.backbag = text2num(pref.backbag) + pref.gear = params2list(pref.gear) + + pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag)) + + if (!islist(pref.gear)) + pref.gear = list() + + var/undies = get_undies() + if(!get_key_by_value(undies, pref.underwear)) + pref.underwear = undies[1] + if(!get_key_by_value(undershirt_t, pref.undershirt)) + pref.undershirt = undershirt_t[1] + + var/total_cost = 0 + for(var/gear_name in pref.gear) + if(!gear_datums[gear_name]) + pref.gear -= gear_name + else if(!(gear_name in valid_gear_choices())) + pref.gear -= gear_name + else + var/datum/gear/G = gear_datums[gear_name] + if(total_cost + G.cost > MAX_GEAR_COST) + pref.gear -= gear_name + else + total_cost += G.cost + +/datum/category_item/player_setup_item/general/equipment/content() + . += "Equipment Loadout:
      " + . += "Underwear: [get_key_by_value(get_undies(),pref.underwear)]
      " + . += "Undershirt: [get_key_by_value(undershirt_t,pref.undershirt)]
      " + . += "Backpack Type: [backbaglist[pref.backbag]]
      " + + . += "
      Custom Loadout:
      " + var/total_cost = 0 + + if(pref.gear && pref.gear.len) + for(var/i = 1; i <= pref.gear.len; i++) + var/datum/gear/G = gear_datums[pref.gear[i]] + if(G) + total_cost += G.cost + . += "[pref.gear[i]] ([G.cost] points) Remove
      " + + . += "Used: [total_cost] points." + else + . += "None." + + if(total_cost < MAX_GEAR_COST) + . += " Add" + if(pref.gear && pref.gear.len) + . += " Clear" + . += "
      " + +/datum/category_item/player_setup_item/general/equipment/proc/get_undies() + return pref.gender == MALE ? underwear_m : underwear_f + +/datum/category_item/player_setup_item/general/equipment/proc/valid_gear_choices(var/max_cost) + var/list/valid_gear_choices = list() + for(var/gear_name in gear_datums) + var/datum/gear/G = gear_datums[gear_name] + if(G.whitelisted && !is_alien_whitelisted(preference_mob(), G.whitelisted)) + continue + if(max_cost && G.cost > max_cost) + continue + valid_gear_choices += gear_name + return valid_gear_choices + +/datum/category_item/player_setup_item/general/equipment/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["change_underwear"]) + var/underwear_options = get_undies() + var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference", get_key_by_value(get_undies(),pref.underwear)) as null|anything in underwear_options + if(!isnull(new_underwear) && CanUseTopic(user)) + pref.underwear = underwear_options[new_underwear] + return TOPIC_REFRESH + + else if(href_list["change_undershirt"]) + var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference", get_key_by_value(undershirt_t,pref.undershirt)) as null|anything in undershirt_t + if(!isnull(new_undershirt) && CanUseTopic(user)) + pref.undershirt = undershirt_t[new_undershirt] + return TOPIC_REFRESH + + else if(href_list["change_backpack"]) + var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference", backbaglist[pref.backbag]) as null|anything in backbaglist + if(!isnull(new_backbag) && CanUseTopic(user)) + pref.backbag = backbaglist.Find(new_backbag) + return TOPIC_REFRESH + + else if(href_list["add_loadout"]) + var/total_cost = 0 + for(var/gear_name in pref.gear) + if(gear_datums[gear_name]) + var/datum/gear/G = gear_datums[gear_name] + total_cost += G.cost + + var/choice = input(user, "Select gear to add:", "Character Preference") as null|anything in valid_gear_choices(MAX_GEAR_COST - total_cost) + if(choice && gear_datums[choice] && CanUseTopic(user)) + var/datum/gear/C = gear_datums[choice] + total_cost += C.cost + if(C && total_cost <= MAX_GEAR_COST) + pref.gear += choice + user << "Added \the '[choice]' for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)." + else + user << "Adding \the '[choice]' will exceed the maximum loadout cost of [MAX_GEAR_COST] points." + return TOPIC_REFRESH + + else if(href_list["remove_loadout"]) + var/i_remove = text2num(href_list["remove_loadout"]) + if(i_remove < 1 || i_remove > pref.gear.len) return TOPIC_NOACTION + pref.gear.Cut(i_remove, i_remove + 1) + return TOPIC_REFRESH + + else if(href_list["clear_loadout"]) + pref.gear.Cut() + return TOPIC_REFRESH + + return ..() diff --git a/code/modules/client/preference_setup/general/05_background.dm b/code/modules/client/preference_setup/general/05_background.dm new file mode 100644 index 00000000000..7fe7a7be13e --- /dev/null +++ b/code/modules/client/preference_setup/general/05_background.dm @@ -0,0 +1,157 @@ +/datum/category_item/player_setup_item/general/background + name = "Background" + sort_order = 5 + +/datum/category_item/player_setup_item/general/background/load_character(var/savefile/S) + S["med_record"] >> pref.med_record + S["sec_record"] >> pref.sec_record + S["gen_record"] >> pref.gen_record + S["home_system"] >> pref.home_system + S["citizenship"] >> pref.citizenship + S["faction"] >> pref.faction + S["religion"] >> pref.religion + S["nanotrasen_relation"] >> pref.nanotrasen_relation + +/datum/category_item/player_setup_item/general/background/save_character(var/savefile/S) + S["med_record"] << pref.med_record + S["sec_record"] << pref.sec_record + S["gen_record"] << pref.gen_record + S["home_system"] << pref.home_system + S["citizenship"] << pref.citizenship + S["faction"] << pref.faction + S["religion"] << pref.religion + S["nanotrasen_relation"] << pref.nanotrasen_relation + +/datum/category_item/player_setup_item/general/background/gather_load_query() + return list("ss13_characters_flavour" = list("vars" = list("records_employment" = "gen_record", + "records_medical" = "med_record", + "records_security" = "sec_record"), + "args" = list("char_id")), + "ss13_characters" = list("vars" = list("home_system", "citizenship", "faction", "religion"), "args" = list("id"))) + +/datum/category_item/player_setup_item/general/background/gather_load_parameters() + return list(":id" = pref.current_character, ":char_id" = pref.current_character) + +/datum/category_item/player_setup_item/general/background/gather_save_query() + return list("ss13_characters_flavour" = list("records_employment", + "records_medical", + "records_security", + "char_id" = 1), + "ss13_characters" = list("home_system", "citizenship", "faction", "religion", "id" = 1)) + +/datum/category_item/player_setup_item/general/background/gather_save_parameters() + return list(":records_employment" = pref.gen_record, + ":records_medical" = pref.med_record, + ":records_security" = pref.sec_record, + ":char_id" = pref.current_character, + ":home_system" = pref.home_system, + ":citizenship" = pref.citizenship, + ":faction" = pref.faction, + ":religion" = pref.religion, + ":id" = pref.current_character) + +/datum/category_item/player_setup_item/general/background/sanitize_character() + if(!pref.home_system) + pref.home_system = "Unset" + if(!pref.citizenship) + pref.citizenship = "None" + if(!pref.faction) + pref.faction = "None" + if(!pref.religion) + pref.religion = "None" + + pref.nanotrasen_relation = sanitize_inlist(pref.nanotrasen_relation, COMPANY_ALIGNMENTS, initial(pref.nanotrasen_relation)) + +/datum/category_item/player_setup_item/general/background/content(var/mob/user) + . += "Background Information
      " + . += "[company_name] Relation: [pref.nanotrasen_relation]
      " + . += "Home System: [pref.home_system]
      " + . += "Citizenship: [pref.citizenship]
      " + . += "Faction: [pref.faction]
      " + . += "Religion: [pref.religion]
      " + + . += "
      Records:
      " + if(jobban_isbanned(user, "Records")) + . += "You are banned from using character records.
      " + else + . += "Medical Records:
      " + . += "[TextPreview(pref.med_record,40)]

      " + . += "Employment Records:
      " + . += "[TextPreview(pref.gen_record,40)]

      " + . += "Security Records:
      " + . += "[TextPreview(pref.sec_record,40)]
      " + +/datum/category_item/player_setup_item/general/background/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["nt_relation"]) + var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference", pref.nanotrasen_relation) as null|anything in COMPANY_ALIGNMENTS + if(new_relation && CanUseTopic(user)) + pref.nanotrasen_relation = new_relation + return TOPIC_REFRESH + + else if(href_list["home_system"]) + var/choice = input(user, "Please choose a home system.", "Character Preference", pref.home_system) as null|anything in home_system_choices + list("Unset","Other") + if(!choice || !CanUseTopic(user)) + return TOPIC_NOACTION + if(choice == "Other") + var/raw_choice = sanitize(input(user, "Please enter a home system.", "Character Preference") as text|null, MAX_NAME_LEN) + if(raw_choice && CanUseTopic(user)) + pref.home_system = raw_choice + else + pref.home_system = choice + return TOPIC_REFRESH + + else if(href_list["citizenship"]) + var/choice = input(user, "Please choose your current citizenship.", "Character Preference", pref.citizenship) as null|anything in citizenship_choices + list("None","Other") + if(!choice || !CanUseTopic(user)) + return TOPIC_NOACTION + if(choice == "Other") + var/raw_choice = sanitize(input(user, "Please enter your current citizenship.", "Character Preference") as text|null, MAX_NAME_LEN) + if(raw_choice && CanUseTopic(user)) + pref.citizenship = raw_choice + else + pref.citizenship = choice + return TOPIC_REFRESH + + else if(href_list["faction"]) + var/choice = input(user, "Please choose a faction to work for.", "Character Preference", pref.faction) as null|anything in faction_choices + list("None","Other") + if(!choice || !CanUseTopic(user)) + return TOPIC_NOACTION + if(choice == "Other") + var/raw_choice = sanitize(input(user, "Please enter a faction.", "Character Preference") as text|null, MAX_NAME_LEN) + if(raw_choice) + pref.faction = raw_choice + else + pref.faction = choice + return TOPIC_REFRESH + + else if(href_list["religion"]) + var/choice = input(user, "Please choose a religion.", "Character Preference", pref.religion) as null|anything in religion_choices + list("None","Other") + if(!choice || !CanUseTopic(user)) + return TOPIC_NOACTION + if(choice == "Other") + var/raw_choice = sanitize(input(user, "Please enter a religon.", "Character Preference") as text|null, MAX_NAME_LEN) + if(raw_choice) + pref.religion = sanitize(raw_choice) + else + pref.religion = choice + return TOPIC_REFRESH + + else if(href_list["set_medical_records"]) + var/new_medical = sanitize(input(user,"Enter medical information here.","Character Preference", html_decode(pref.med_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0) + if(!isnull(new_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) + pref.med_record = new_medical + return TOPIC_REFRESH + + else if(href_list["set_general_records"]) + var/new_general = sanitize(input(user,"Enter employment information here.","Character Preference", html_decode(pref.gen_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0) + if(!isnull(new_general) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) + pref.gen_record = new_general + return TOPIC_REFRESH + + else if(href_list["set_security_records"]) + var/sec_medical = sanitize(input(user,"Enter security information here.","Character Preference", html_decode(pref.sec_record)) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0) + if(!isnull(sec_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) + pref.sec_record = sec_medical + return TOPIC_REFRESH + + return ..() diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm new file mode 100644 index 00000000000..020f5ec8278 --- /dev/null +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -0,0 +1,182 @@ +/datum/category_item/player_setup_item/general/flavor + name = "Flavor" + sort_order = 6 + +/datum/category_item/player_setup_item/general/flavor/load_character(var/savefile/S) + S["flavor_texts_general"] >> pref.flavor_texts["general"] + S["flavor_texts_head"] >> pref.flavor_texts["head"] + S["flavor_texts_face"] >> pref.flavor_texts["face"] + S["flavor_texts_eyes"] >> pref.flavor_texts["eyes"] + S["flavor_texts_torso"] >> pref.flavor_texts["torso"] + S["flavor_texts_arms"] >> pref.flavor_texts["arms"] + S["flavor_texts_hands"] >> pref.flavor_texts["hands"] + S["flavor_texts_legs"] >> pref.flavor_texts["legs"] + S["flavor_texts_feet"] >> pref.flavor_texts["feet"] + + //Flavour text for robots. + S["flavour_texts_robot_Default"] >> pref.flavour_texts_robot["Default"] + for(var/module in robot_module_types) + S["flavour_texts_robot_[module]"] >> pref.flavour_texts_robot[module] + +/datum/category_item/player_setup_item/general/flavor/save_character(var/savefile/S) + S["flavor_texts_general"] << pref.flavor_texts["general"] + S["flavor_texts_head"] << pref.flavor_texts["head"] + S["flavor_texts_face"] << pref.flavor_texts["face"] + S["flavor_texts_eyes"] << pref.flavor_texts["eyes"] + S["flavor_texts_torso"] << pref.flavor_texts["torso"] + S["flavor_texts_arms"] << pref.flavor_texts["arms"] + S["flavor_texts_hands"] << pref.flavor_texts["hands"] + S["flavor_texts_legs"] << pref.flavor_texts["legs"] + S["flavor_texts_feet"] << pref.flavor_texts["feet"] + + S["flavour_texts_robot_Default"] << pref.flavour_texts_robot["Default"] + for(var/module in robot_module_types) + S["flavour_texts_robot_[module]"] << pref.flavour_texts_robot[module] + +/datum/category_item/player_setup_item/general/flavor/gather_load_query() + var/list/var_list = list("flavour_general" = "flavor_texts/general", + "flavour_head" = "flavor_texts/head", + "flavour_face" = "flavor_texts/face", + "flavour_eyes" = "flavor_texts/eyes", + "flavour_torso" = "flavor_texts/torso", + "flavour_arms" = "flavor_texts/arms", + "flavour_hands" = "flavor_texts/hands", + "flavour_legs" = "flavor_texts/legs", + "flavour_feet" = "flavor_texts/feet", + "robot_default" = "flavour_texts_robot/default") + + for (var/module in robot_module_types) + var_list["robot_[module]"] = "flavour_texts_robot/[module]" + + return list("ss13_characters_flavour" = list("vars" = var_list, "args" = list("char_id"))) + +/datum/category_item/player_setup_item/general/flavor/gather_load_parameters() + return list(":char_id" = pref.current_character) + +/datum/category_item/player_setup_item/general/flavor/gather_save_query() + var/list/var_list = list("flavour_general", + "flavour_head", + "flavour_face", + "flavour_eyes", + "flavour_torso", + "flavour_arms", + "flavour_hands", + "flavour_legs", + "flavour_feet", + "robot_default", + "char_id" = 1) + + for (var/module in robot_module_types) + var_list += "robot_[module]" + + return list("ss13_characters_flavour" = var_list) + +/datum/category_item/player_setup_item/general/flavor/gather_save_parameters() + var/list/var_list = list(":char_id" = pref.current_character, + ":flavour_head" = pref.flavor_texts["head"], + ":flavour_face" = pref.flavor_texts["face"], + ":flavour_eyes" = pref.flavor_texts["eyes"], + ":flavour_torso" = pref.flavor_texts["torso"], + ":flavour_arms" = pref.flavor_texts["arms"], + ":flavour_hands" = pref.flavor_texts["hands"], + ":flavour_legs" = pref.flavor_texts["legs"], + ":flavour_feet" = pref.flavor_texts["feet"], + ":robot_default" = pref.flavour_texts_robot["default"]) + + for (var/module in robot_module_types) + var_list[":robot_[module]"] += pref.flavour_texts_robot[module] + + return var_list + +/datum/category_item/player_setup_item/general/flavor/sanitize_character() + return + +/datum/category_item/player_setup_item/general/flavor/content(var/mob/user) + . += "Flavor:
      " + . += "Set Flavor Text
      " + . += "Set Robot Flavor Text
      " + +/datum/category_item/player_setup_item/general/flavor/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["flavor_text"]) + switch(href_list["flavor_text"]) + if("open") + if("general") + var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing, and may include OOC notes and preferences.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) + if(CanUseTopic(user)) + pref.flavor_texts[href_list["flavor_text"]] = msg + else + var/msg = sanitize(input(usr,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) + if(CanUseTopic(user)) + pref.flavor_texts[href_list["flavor_text"]] = msg + SetFlavorText(user) + return TOPIC_HANDLED + + else if(href_list["flavour_text_robot"]) + switch(href_list["flavour_text_robot"]) + if("open") + if("Default") + var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0) + if(CanUseTopic(user)) + pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg + else + var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])) as message, extra = 0) + if(CanUseTopic(user)) + pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg + SetFlavourTextRobot(user) + return TOPIC_HANDLED + + return ..() + +/datum/category_item/player_setup_item/general/flavor/proc/SetFlavorText(mob/user) + var/HTML = "" + HTML += "
      " + HTML += "Set Flavour Text
      " + HTML += "
      " + HTML += "General: " + HTML += TextPreview(pref.flavor_texts["general"]) + HTML += "
      " + HTML += "Head: " + HTML += TextPreview(pref.flavor_texts["head"]) + HTML += "
      " + HTML += "Face: " + HTML += TextPreview(pref.flavor_texts["face"]) + HTML += "
      " + HTML += "Eyes: " + HTML += TextPreview(pref.flavor_texts["eyes"]) + HTML += "
      " + HTML += "Body: " + HTML += TextPreview(pref.flavor_texts["torso"]) + HTML += "
      " + HTML += "Arms: " + HTML += TextPreview(pref.flavor_texts["arms"]) + HTML += "
      " + HTML += "Hands: " + HTML += TextPreview(pref.flavor_texts["hands"]) + HTML += "
      " + HTML += "Legs: " + HTML += TextPreview(pref.flavor_texts["legs"]) + HTML += "
      " + HTML += "Feet: " + HTML += TextPreview(pref.flavor_texts["feet"]) + HTML += "
      " + HTML += "
      " + HTML += "" + user << browse(HTML, "window=flavor_text;size=430x300") + return + +/datum/category_item/player_setup_item/general/flavor/proc/SetFlavourTextRobot(mob/user) + var/HTML = "" + HTML += "
      " + HTML += "Set Robot Flavour Text
      " + HTML += "
      " + HTML += "Default: " + HTML += TextPreview(pref.flavour_texts_robot["Default"]) + HTML += "
      " + for(var/module in robot_module_types) + HTML += "[module]: " + HTML += TextPreview(pref.flavour_texts_robot[module]) + HTML += "
      " + HTML += "
      " + HTML += "" + user << browse(HTML, "window=flavour_text_robot;size=430x300") + return diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm new file mode 100644 index 00000000000..0585039cad7 --- /dev/null +++ b/code/modules/client/preference_setup/global/01_ui.dm @@ -0,0 +1,86 @@ +/datum/category_item/player_setup_item/player_global/ui + name = "UI" + sort_order = 1 + +/datum/category_item/player_setup_item/player_global/ui/load_preferences(var/savefile/S) + S["UI_style"] >> pref.UI_style + S["UI_style_color"] >> pref.UI_style_color + S["UI_style_alpha"] >> pref.UI_style_alpha + S["ooccolor"] >> pref.ooccolor + +/datum/category_item/player_setup_item/player_global/ui/save_preferences(var/savefile/S) + S["UI_style"] << pref.UI_style + S["UI_style_color"] << pref.UI_style_color + S["UI_style_alpha"] << pref.UI_style_alpha + S["ooccolor"] << pref.ooccolor + +/datum/category_item/player_setup_item/player_global/ui/gather_load_query() + return list("ss13_player_preferences" = list("vars" = list("UI_style", "UI_style_color", "UI_style_alpha", "ooccolor"), "args" = list("ckey"))) + +/datum/category_item/player_setup_item/player_global/ui/gather_load_parameters() + return list(":ckey" = pref.client.ckey) + +/datum/category_item/player_setup_item/player_global/ui/gather_save_query() + return list("ss13_player_preferences" = list("UI_style", "UI_style_color", "UI_style_alpha", "ooccolor", "ckey" = 1)) + +/datum/category_item/player_setup_item/player_global/ui/gather_save_parameters() + return list(":ckey" = pref.client.ckey, ":UI_style" = pref.UI_style, ":UI_style_alpha" = pref.UI_style_alpha, ":UI_style_color" = pref.UI_style_color, ":ooccolor" = pref.ooccolor) + +/datum/category_item/player_setup_item/player_global/ui/sanitize_preferences() + pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_styles, initial(pref.UI_style)) + pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color)) + pref.UI_style_alpha = sanitize_integer(text2num(pref.UI_style_alpha), 0, 255, initial(pref.UI_style_alpha)) + pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor)) + +/datum/category_item/player_setup_item/player_global/ui/content(var/mob/user) + . += "UI Settings
      " + . += "UI Style: [pref.UI_style]
      " + . += "Custom UI (recommended for White UI):
      " + . += "-Color: [pref.UI_style_color]�
      __
      �reset
      " + . += "-Alpha(transparency): [pref.UI_style_alpha]�reset
      " + if(can_select_ooc_color(user)) + . += "OOC Color:�" + if(pref.ooccolor == initial(pref.ooccolor)) + . += "Using Default
      " + else + . += "[pref.ooccolor]
      __
      �reset
      " + +/datum/category_item/player_setup_item/player_global/ui/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["select_style"]) + var/UI_style_new = input(user, "Choose UI style.", "Character Preference", pref.UI_style) as null|anything in all_ui_styles + if(!UI_style_new || !CanUseTopic(user)) return TOPIC_NOACTION + pref.UI_style = UI_style_new + return TOPIC_REFRESH + + else if(href_list["select_color"]) + var/UI_style_color_new = input(user, "Choose UI color, dark colors are not recommended!", "Global Preference", pref.UI_style_color) as color|null + if(isnull(UI_style_color_new) || !CanUseTopic(user)) return TOPIC_NOACTION + pref.UI_style_color = UI_style_color_new + return TOPIC_REFRESH + + else if(href_list["select_alpha"]) + var/UI_style_alpha_new = input(user, "Select UI alpha (transparency) level, between 50 and 255.", "Global Preference", pref.UI_style_alpha) as num|null + if(isnull(UI_style_alpha_new) || (UI_style_alpha_new < 50 || UI_style_alpha_new > 255) || !CanUseTopic(user)) return TOPIC_NOACTION + pref.UI_style_alpha = UI_style_alpha_new + return TOPIC_REFRESH + + else if(href_list["select_ooc_color"]) + var/new_ooccolor = input(user, "Choose OOC color:", "Global Preference") as color|null + if(new_ooccolor && can_select_ooc_color(user) && CanUseTopic(user)) + pref.ooccolor = new_ooccolor + return TOPIC_REFRESH + + else if(href_list["reset"]) + switch(href_list["reset"]) + if("ui") + pref.UI_style_color = initial(pref.UI_style_color) + if("alpha") + pref.UI_style_alpha = initial(pref.UI_style_alpha) + if("ooc") + pref.ooccolor = initial(pref.ooccolor) + return TOPIC_REFRESH + + return ..() + +/datum/category_item/player_setup_item/player_global/ui/proc/can_select_ooc_color(var/mob/user) + return config.allow_admin_ooccolor && check_rights(R_ADMIN, 0, user) diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm new file mode 100644 index 00000000000..332e6bdd0a5 --- /dev/null +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -0,0 +1,68 @@ +/datum/category_item/player_setup_item/player_global/settings + name = "Settings" + sort_order = 2 + +/datum/category_item/player_setup_item/player_global/settings/load_preferences(var/savefile/S) + S["lastchangelog"] >> pref.lastchangelog + S["default_slot"] >> pref.default_slot + S["toggles"] >> pref.toggles + S["asfx_togs"] >> pref.asfx_togs + S["motd_hash"] >> pref.motd_hash + S["memo_hash"] >> pref.memo_hash + +/datum/category_item/player_setup_item/player_global/settings/save_preferences(var/savefile/S) + S["lastchangelog"] << pref.lastchangelog + S["default_slot"] << pref.default_slot + S["toggles"] << pref.toggles + S["asfx_togs"] << pref.asfx_togs + S["motd_hash"] << pref.motd_hash + S["memo_hash"] << pref.memo_hash + +/datum/category_item/player_setup_item/player_global/settings/gather_load_query() + return list("ss13_player_preferences" = list("vars" = list("lastchangelog", "current_character", "toggles", "asfx_toggles" = "asfx_togs", "motd_hash", "memo_hash"), "args" = list("ckey"))) + +/datum/category_item/player_setup_item/player_global/settings/gather_load_parameters() + return list(":ckey" = pref.client.ckey) + +/datum/category_item/player_setup_item/player_global/settings/gather_save_query() + return list("ss13_player_preferences" = list("lastchangelog", "current_character", "toggles", "asfx_toggles", "motd_hash", "memo_hash", "ckey" = 1)) + +/datum/category_item/player_setup_item/player_global/settings/gather_save_parameters() + return list(":ckey" = pref.client.ckey, + ":lastchangelog" = pref.lastchangelog, + ":current_character" = pref.current_character, + ":toggles" = pref.toggles, + ":asfx_toggles" = pref.asfx_togs, + ":motd_hash" = pref.motd_hash, + ":memo_hash" = pref.memo_hash) + +/datum/category_item/player_setup_item/player_global/settings/sanitize_preferences(var/sql_load = 0) + if (sql_load) + pref.current_character = text2num(pref.current_character) + + pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) + pref.default_slot = sanitize_integer(text2num(pref.default_slot), 1, config.character_slots, initial(pref.default_slot)) + pref.toggles = sanitize_integer(text2num(pref.toggles), 0, 65535, initial(pref.toggles)) + pref.asfx_togs = sanitize_integer(text2num(pref.asfx_togs), 0, 65535, initial(pref.toggles)) + pref.motd_hash = sanitize_text(pref.motd_hash, initial(pref.motd_hash)) + pref.memo_hash = sanitize_text(pref.memo_hash, initial(pref.memo_hash)) + +/datum/category_item/player_setup_item/player_global/settings/content(var/mob/user) + . += "Play admin midis: [(pref.toggles & SOUND_MIDI) ? "Yes" : "No"]
      " + . += "Play lobby music: [(pref.toggles & SOUND_LOBBY) ? "Yes" : "No"]
      " + . += "Ghost ears: [(pref.toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
      " + . += "Ghost sight: [(pref.toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
      " + . += "Ghost radio: [(pref.toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
      " + +/datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["toggle"]) + var/toggle_flag = text2num(href_list["toggle"]) + pref.toggles ^= toggle_flag + if(toggle_flag == SOUND_LOBBY && isnewplayer(user)) + if(pref.toggles & SOUND_LOBBY) + user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) + else + user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) + return TOPIC_REFRESH + + return ..() diff --git a/code/modules/client/preference_setup/global/03_language.dm b/code/modules/client/preference_setup/global/03_language.dm new file mode 100644 index 00000000000..c5f8a7d1164 --- /dev/null +++ b/code/modules/client/preference_setup/global/03_language.dm @@ -0,0 +1,69 @@ +/datum/category_item/player_setup_item/player_global/language + name = "Language" + sort_order = 3 + +/datum/category_item/player_setup_item/player_global/language/load_preferences(var/savefile/S) + S["language_prefixes"] >> pref.language_prefixes + +/datum/category_item/player_setup_item/player_global/language/save_preferences(var/savefile/S) + S["language_prefixes"] << pref.language_prefixes + +/datum/category_item/player_setup_item/player_global/language/gather_load_query() + return list("ss13_player_preferences" = list("vars" = list("language_prefixes"), "args" = list("ckey"))) + +/datum/category_item/player_setup_item/player_global/language/gather_load_parameters() + return list(":ckey" = pref.client.ckey) + +/datum/category_item/player_setup_item/player_global/ui/gather_save_query() + return list("ss13_player_preferences" = list("language_prefixes", "ckey" = 1)) + +/datum/category_item/player_setup_item/player_global/language/gather_save_parameters() + return list(":ckey" = pref.client.ckey, ":language_prefixes" = list2params(pref.language_prefixes)) + +/datum/category_item/player_setup_item/player_global/language/sanitize_preferences(var/sql_load = 0) + if (sql_load && pref.language_prefixes) + pref.language_prefixes = params2list(pref.language_prefixes) + + if (isnull(pref.language_prefixes) || !pref.language_prefixes.len) + pref.language_prefixes = config.language_prefixes.Copy() + +/datum/category_item/player_setup_item/player_global/language/content(var/mob/user) + . += "Language Keys
      " + . += " [english_list(pref.language_prefixes, and_text = " ", comma_text = " ")] Change Reset
      " + +/datum/category_item/player_setup_item/player_global/language/OnTopic(var/href, var/list/href_list, var/mob/user) + if(href_list["change_prefix"]) + var/char + var/keys[0] + do + char = input("Enter a single special character.\nYou may re-select the same characters.\nThe following characters are already in use by radio: ; : .\nThe following characters are already in use by special say commands: ! * ^", "Enter Character - [3 - keys.len] remaining") as null|text + if(char) + if(length(char) > 1) + alert(user, "Only single characters allowed.", "Error", "Ok") + else if(char in list(";", ":", ".")) + alert(user, "Radio character. Rejected.", "Error", "Ok") + else if(char in list("!","*", "^")) + alert(user, "Say character. Rejected.", "Error", "Ok") + else if(contains_az09(char)) + alert(user, "Non-special character. Rejected.", "Error", "Ok") + else + keys.Add(char) + while(char && keys.len < 3) + + if(keys.len == 3) + pref.language_prefixes = keys + return TOPIC_REFRESH + + else if(href_list["reset_prefix"]) + pref.language_prefixes = config.language_prefixes.Copy() + return TOPIC_REFRESH + + return ..() + + +/datum/category_item/player_setup_item/player_global/language/update_setup(var/savefile/preferences, var/savefile/character) + if(preferences["version"] == 11) + var/list/prefixes = character["language_prefixes"] + if(istype(prefixes) && prefixes.len) + preferences["language_prefixes"] = prefixes.Copy() + return 1 diff --git a/code/modules/client/preference_setup/global/04_pai.dm b/code/modules/client/preference_setup/global/04_pai.dm new file mode 100644 index 00000000000..529a751f335 --- /dev/null +++ b/code/modules/client/preference_setup/global/04_pai.dm @@ -0,0 +1,59 @@ +/datum/category_item/player_setup_item/player_global/pai + name = "pAI" + sort_order = 4 + + var/datum/paiCandidate/candidate + +/datum/category_item/player_setup_item/player_global/pai/load_preferences(var/savefile/S) + if(!candidate) + candidate = new() + + if(!preference_mob()) + return + + candidate.savefile_load(preference_mob()) + +// #TODO-MERGE: Figure out how to handle pAI saving on SQL. + +/datum/category_item/player_setup_item/player_global/pai/save_preferences(var/savefile/S) + if(!candidate) + return + + if(!preference_mob()) + return + + candidate.savefile_save(preference_mob()) + +/datum/category_item/player_setup_item/player_global/pai/content(var/mob/user) + if(!candidate) + candidate = new() + + . += "pAI:
      " + . += "Name: [candidate.name ? candidate.name : "None Set"]
      " + . += "Description: [candidate.description ? TextPreview(candidate.description, 40) : "None Set"]
      " + . += "Role: [candidate.role ? TextPreview(candidate.role, 40) : "None Set"]
      " + . += "OOC Comments: [candidate.comments ? TextPreview(candidate.comments, 40) : "None Set"]
      " + +/datum/category_item/player_setup_item/player_global/pai/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["option"]) + var/t + switch(href_list["option"]) + if("name") + t = sanitizeName(input(user, "Enter a name for your pAI", "Global Preference", candidate.name) as text|null, MAX_NAME_LEN, 1) + if(t && CanUseTopic(user)) + candidate.name = t + if("desc") + t = input(user, "Enter a description for your pAI", "Global Preference", html_decode(candidate.description)) as message|null + if(!isnull(t) && CanUseTopic(user)) + candidate.description = sanitize(t) + if("role") + t = input(user, "Enter a role for your pAI", "Global Preference", html_decode(candidate.role)) as text|null + if(!isnull(t) && CanUseTopic(user)) + candidate.role = sanitize(t) + if("ooc") + t = input(user, "Enter any OOC comments", "Global Preference", html_decode(candidate.comments)) as message + if(!isnull(t) && CanUseTopic(user)) + candidate.comments = sanitize(t) + return TOPIC_REFRESH + + return ..() diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm new file mode 100644 index 00000000000..0a9fa071a61 --- /dev/null +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -0,0 +1,330 @@ +//used for pref.alternate_option +#define GET_RANDOM_JOB 0 +#define BE_ASSISTANT 1 +#define RETURN_TO_LOBBY 2 + +/datum/category_item/player_setup_item/occupation + name = "Occupation" + sort_order = 1 + +/datum/category_item/player_setup_item/occupation/load_character(var/savefile/S) + S["alternate_option"] >> pref.alternate_option + S["job_civilian_high"] >> pref.job_civilian_high + S["job_civilian_med"] >> pref.job_civilian_med + S["job_civilian_low"] >> pref.job_civilian_low + S["job_medsci_high"] >> pref.job_medsci_high + S["job_medsci_med"] >> pref.job_medsci_med + S["job_medsci_low"] >> pref.job_medsci_low + S["job_engsec_high"] >> pref.job_engsec_high + S["job_engsec_med"] >> pref.job_engsec_med + S["job_engsec_low"] >> pref.job_engsec_low + S["player_alt_titles"] >> pref.player_alt_titles + +/datum/category_item/player_setup_item/occupation/save_character(var/savefile/S) + S["alternate_option"] << pref.alternate_option + S["job_civilian_high"] << pref.job_civilian_high + S["job_civilian_med"] << pref.job_civilian_med + S["job_civilian_low"] << pref.job_civilian_low + S["job_medsci_high"] << pref.job_medsci_high + S["job_medsci_med"] << pref.job_medsci_med + S["job_medsci_low"] << pref.job_medsci_low + S["job_engsec_high"] << pref.job_engsec_high + S["job_engsec_med"] << pref.job_engsec_med + S["job_engsec_low"] << pref.job_engsec_low + S["player_alt_titles"] << pref.player_alt_titles + +/datum/category_item/player_setup_item/occupation/gather_load_query() + return list("ss13_characters" = list("vars" = list("jobs" = "unsanitized_jobs", "alternate_option", "alternate_titles" = "player_alt_titles"), "args" = list("id"))) + +/datum/category_item/player_setup_item/occupation/gather_load_parameters() + return list(":id" = pref.current_character) + +/datum/category_item/player_setup_item/occupation/gather_save_query() + return list("ss13_characters" = list("jobs", "alternate_option", "alternate_titles", "id" = 1)) + +/datum/category_item/player_setup_item/occupation/gather_save_parameters() + var/list/compiled_jobs = list("job_civilian_high" = pref.job_civilian_high, + "job_civilian_med" = pref.job_civilian_med, + "job_civilian_low" = pref.job_civilian_low, + "job_medsci_high" = pref.job_medsci_high, + "job_medsci_med" = pref.job_medsci_med, + "job_medsci_low" = pref.job_medsci_low, + "job_engsec_high" = pref.job_engsec_high, + "job_engsec_med" = pref.job_engsec_med, + "job_engsec_low" = pref.job_engsec_low) + + return list(":jobs" = list2params(compiled_jobs), ":alternate_option" = pref.alternate_option, ":alternate_titles" = list2params(pref.player_alt_titles), ":id" = pref.current_character) + +/datum/category_item/player_setup_item/occupation/sanitize_character(var/sql_load = 0) + if (sql_load) + pref.alternate_option = text2num(pref.alternate_option) + + var/list/jobs = params2list(pref.unsanitized_jobs) + + for (var/preference in jobs) + try + pref.vars[preference] = text2num(jobs[preference]) + catch(var/exception/e) + log_debug("LOADING: Bad job preference key: [preference].") + log_debug(e.desc) + + pref.alternate_option = sanitize_integer(text2num(pref.alternate_option), 0, 2, initial(pref.alternate_option)) + pref.job_civilian_high = sanitize_integer(text2num(pref.job_civilian_high), 0, 65535, initial(pref.job_civilian_high)) + pref.job_civilian_med = sanitize_integer(text2num(pref.job_civilian_med), 0, 65535, initial(pref.job_civilian_med)) + pref.job_civilian_low = sanitize_integer(text2num(pref.job_civilian_low), 0, 65535, initial(pref.job_civilian_low)) + pref.job_medsci_high = sanitize_integer(text2num(pref.job_medsci_high), 0, 65535, initial(pref.job_medsci_high)) + pref.job_medsci_med = sanitize_integer(text2num(pref.job_medsci_med), 0, 65535, initial(pref.job_medsci_med)) + pref.job_medsci_low = sanitize_integer(text2num(pref.job_medsci_low), 0, 65535, initial(pref.job_medsci_low)) + pref.job_engsec_high = sanitize_integer(text2num(pref.job_engsec_high), 0, 65535, initial(pref.job_engsec_high)) + pref.job_engsec_med = sanitize_integer(text2num(pref.job_engsec_med), 0, 65535, initial(pref.job_engsec_med)) + pref.job_engsec_low = sanitize_integer(text2num(pref.job_engsec_low), 0, 65535, initial(pref.job_engsec_low)) + + if (!pref.player_alt_titles) + pref.player_alt_titles = new() + + if(!job_master) + return + + for(var/datum/job/job in job_master.occupations) + var/alt_title = pref.player_alt_titles[job.title] + if(alt_title && !(alt_title in job.alt_titles)) + pref.player_alt_titles -= job.title + +/datum/category_item/player_setup_item/occupation/content(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer")) + if(!job_master) + return + + . += "
      " + . += "Choose occupation chances
      Unavailable occupations are crossed out.
      " + . += "
      " // Table within a table for alignment, also allows you to easily add more colomns. + . += "" + var/index = -1 + + //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. + var/datum/job/lastJob + if (!job_master) return + for(var/datum/job/job in job_master.occupations) + + index += 1 + if((index >= limit) || (job.title in splitJobs)) + if((index < limit) && (lastJob != null)) + //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with + //the last job's selection color. Creating a rather nice effect. + for(var/i = 0, i < (limit - index), i += 1) + . += "" + . += "
        
      " + index = 0 + + . += "" + continue + if(!job.player_old_enough(user.client)) + var/available_in_days = job.available_in_days(user.client) + . += "[rank]" + continue + if(job.minimum_character_age && user.client && (user.client.prefs.age < job.minimum_character_age)) + . += "[rank]" + continue + if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant")) + . += "[rank]" + continue + if((rank in command_positions) || (rank == "AI"))//Bold head jobs + . += "[rank]" + else + . += "[rank]" + + . += "" + . += "" + continue + + if(pref.GetJobDepartment(job, 1) & job.flag) + . += " \[High]" + else if(pref.GetJobDepartment(job, 2) & job.flag) + . += " \[Medium]" + else if(pref.GetJobDepartment(job, 3) & job.flag) + . += " \[Low]" + else + . += " \[NEVER]" + if(job.alt_titles) + . += "" + . += "" + + . += "
      " + var/rank = job.title + lastJob = job + if(jobban_isbanned(user, rank)) + . += "[rank] \[BANNED]
      \[IN [(available_in_days)] DAYS]
      \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]
      " + + . += "" + + if(rank == "Assistant")//Assistant is special + if(pref.job_civilian_low & ASSISTANT) + . += " \[Yes]" + else + . += " \[No]" + if(job.alt_titles) //Blatantly cloned from a few lines down. + . += "
       \[[pref.GetPlayerAltTitle(job)]\]
       \[[pref.GetPlayerAltTitle(job)]\]
      " + + . += "
      " + + switch(pref.alternate_option) + if(GET_RANDOM_JOB) + . += "

      Get random job if preferences unavailable

      " + if(BE_ASSISTANT) + . += "

      Be assistant if preference unavailable

      " + if(RETURN_TO_LOBBY) + . += "

      Return to lobby if preference unavailable

      " + + . += "
      \[Reset\]
      " + . += "
      " + +/datum/category_item/player_setup_item/occupation/OnTopic(href, href_list, user) + if(href_list["reset_jobs"]) + ResetJobs() + return TOPIC_REFRESH + + else if(href_list["job_alternative"]) + if(pref.alternate_option == GET_RANDOM_JOB || pref.alternate_option == BE_ASSISTANT) + pref.alternate_option += 1 + else if(pref.alternate_option == RETURN_TO_LOBBY) + pref.alternate_option = 0 + return TOPIC_REFRESH + + else if(href_list["select_alt_title"]) + var/datum/job/job = locate(href_list["select_alt_title"]) + if (job) + var/choices = list(job.title) + job.alt_titles + var/choice = input("Choose an title for [job.title].", "Choose Title", pref.GetPlayerAltTitle(job)) as anything in choices|null + if(choice && CanUseTopic(user)) + SetPlayerAltTitle(job, choice) + return TOPIC_REFRESH + + else if(href_list["set_job"]) + if(SetJob(user, href_list["set_job"])) return TOPIC_REFRESH + + return ..() + +/datum/category_item/player_setup_item/occupation/proc/SetPlayerAltTitle(datum/job/job, new_title) + // remove existing entry + pref.player_alt_titles -= job.title + // add one if it's not default + if(job.title != new_title) + pref.player_alt_titles[job.title] = new_title + +/datum/category_item/player_setup_item/occupation/proc/SetJob(mob/user, role) + var/datum/job/job = job_master.GetJob(role) + if(!job) + return 0 + + if(role == "Assistant") + if(pref.job_civilian_low & job.flag) + pref.job_civilian_low &= ~job.flag + else + pref.job_civilian_low |= job.flag + return 1 + + if(pref.GetJobDepartment(job, 1) & job.flag) + SetJobDepartment(job, 1) + else if(pref.GetJobDepartment(job, 2) & job.flag) + SetJobDepartment(job, 2) + else if(pref.GetJobDepartment(job, 3) & job.flag) + SetJobDepartment(job, 3) + else//job = Never + SetJobDepartment(job, 4) + + return 1 + +/datum/category_item/player_setup_item/occupation/proc/SetJobDepartment(var/datum/job/job, var/level) + if(!job || !level) return 0 + switch(level) + if(1)//Only one of these should ever be active at once so clear them all here + pref.job_civilian_high = 0 + pref.job_medsci_high = 0 + pref.job_engsec_high = 0 + return 1 + if(2)//Set current highs to med, then reset them + pref.job_civilian_med |= pref.job_civilian_high + pref.job_medsci_med |= pref.job_medsci_high + pref.job_engsec_med |= pref.job_engsec_high + pref.job_civilian_high = 0 + pref.job_medsci_high = 0 + pref.job_engsec_high = 0 + + switch(job.department_flag) + if(CIVILIAN) + switch(level) + if(2) + pref.job_civilian_high = job.flag + pref.job_civilian_med &= ~job.flag + if(3) + pref.job_civilian_med |= job.flag + pref.job_civilian_low &= ~job.flag + else + pref.job_civilian_low |= job.flag + if(MEDSCI) + switch(level) + if(2) + pref.job_medsci_high = job.flag + pref.job_medsci_med &= ~job.flag + if(3) + pref.job_medsci_med |= job.flag + pref.job_medsci_low &= ~job.flag + else + pref.job_medsci_low |= job.flag + if(ENGSEC) + switch(level) + if(2) + pref.job_engsec_high = job.flag + pref.job_engsec_med &= ~job.flag + if(3) + pref.job_engsec_med |= job.flag + pref.job_engsec_low &= ~job.flag + else + pref.job_engsec_low |= job.flag + return 1 + +/datum/category_item/player_setup_item/occupation/proc/ResetJobs() + pref.job_civilian_high = 0 + pref.job_civilian_med = 0 + pref.job_civilian_low = 0 + + pref.job_medsci_high = 0 + pref.job_medsci_med = 0 + pref.job_medsci_low = 0 + + pref.job_engsec_high = 0 + pref.job_engsec_med = 0 + pref.job_engsec_low = 0 + + pref.player_alt_titles.Cut() + +/datum/preferences/proc/GetPlayerAltTitle(datum/job/job) + return (job.title in player_alt_titles) ? player_alt_titles[job.title] : job.title + +/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level) + if(!job || !level) return 0 + switch(job.department_flag) + if(CIVILIAN) + switch(level) + if(1) + return job_civilian_high + if(2) + return job_civilian_med + if(3) + return job_civilian_low + if(MEDSCI) + switch(level) + if(1) + return job_medsci_high + if(2) + return job_medsci_med + if(3) + return job_medsci_low + if(ENGSEC) + switch(level) + if(1) + return job_engsec_high + if(2) + return job_engsec_med + if(3) + return job_engsec_low + return 0 diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm new file mode 100644 index 00000000000..b4a1a008346 --- /dev/null +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -0,0 +1,292 @@ +// These are not flags, binary operations not intended +#define TOPIC_NOACTION 0 +#define TOPIC_HANDLED 1 +#define TOPIC_REFRESH 2 + +#define SQL_CHARACTER 1 +#define SQL_PREFERENCES 2 + +/datum/category_group/player_setup_category/general_preferences + name = "General" + sort_order = 1 + category_item_type = /datum/category_item/player_setup_item/general + +/datum/category_group/player_setup_category/skill_preferences + name = "Skills" + sort_order = 2 + category_item_type = /datum/category_item/player_setup_item/skills + +/datum/category_group/player_setup_category/occupation_preferences + name = "Occupation" + sort_order = 3 + category_item_type = /datum/category_item/player_setup_item/occupation + +/datum/category_group/player_setup_category/appearance_preferences + name = "Roles" + sort_order = 4 + category_item_type = /datum/category_item/player_setup_item/antagonism + +/datum/category_group/player_setup_category/global_preferences + name = "Global" + sort_order = 5 + category_item_type = /datum/category_item/player_setup_item/player_global + sql_role = SQL_PREFERENCES + +/**************************** +* Category Collection Setup * +****************************/ +/datum/category_collection/player_setup_collection + category_group_type = /datum/category_group/player_setup_category + var/datum/preferences/preferences + var/datum/category_group/player_setup_category/selected_category = null + +/datum/category_collection/player_setup_collection/New(var/datum/preferences/preferences) + src.preferences = preferences + ..() + selected_category = categories[1] + +/datum/category_collection/player_setup_collection/Destroy() + preferences = null + selected_category = null + return ..() + +/datum/category_collection/player_setup_collection/proc/sanitize_setup() + for(var/datum/category_group/player_setup_category/PS in categories) + PS.sanitize_setup() + +/datum/category_collection/player_setup_collection/proc/load_character(var/savefile/S) + for(var/datum/category_group/player_setup_category/PS in categories) + PS.load_character(S) + +/datum/category_collection/player_setup_collection/proc/save_character(var/savefile/S) + for(var/datum/category_group/player_setup_category/PS in categories) + PS.save_character(S) + +/datum/category_collection/player_setup_collection/proc/load_preferences(var/savefile/S) + for(var/datum/category_group/player_setup_category/PS in categories) + PS.load_preferences(S) + +/datum/category_collection/player_setup_collection/proc/save_preferences(var/savefile/S) + for(var/datum/category_group/player_setup_category/PS in categories) + PS.save_preferences(S) + +/datum/category_collection/player_setup_collection/proc/update_setup(var/savefile/preferences, var/savefile/character) + for(var/datum/category_group/player_setup_category/PS in categories) + . = . || PS.update_setup(preferences, character) + +/datum/category_collection/player_setup_collection/proc/header() + var/dat = "" + for(var/datum/category_group/player_setup_category/PS in categories) + if(PS == selected_category) + dat += "[PS.name] " // TODO: Check how to properly mark a href/button selected in a classic browser window + else + dat += "[PS.name] " + return dat + +/datum/category_collection/player_setup_collection/proc/content(var/mob/user) + if(selected_category) + return selected_category.content(user) + +/datum/category_collection/player_setup_collection/Topic(var/href,var/list/href_list) + if(..()) + return 1 + var/mob/user = usr + if(!user.client) + return 1 + + if(href_list["category"]) + var/category = locate(href_list["category"]) + if(category && category in categories) + selected_category = category + . = 1 + + if(.) + user.client.prefs.ShowChoices(user) + +/************************** +* Category Category Setup * +**************************/ +/datum/category_group/player_setup_category + var/sort_order = 0 + var/sql_role = SQL_CHARACTER + var/modified = 0 + +/datum/category_group/player_setup_category/dd_SortValue() + return sort_order + +/datum/category_group/player_setup_category/proc/sanitize_setup() + for(var/datum/category_item/player_setup_item/PI in items) + PI.sanitize_preferences() + for(var/datum/category_item/player_setup_item/PI in items) + PI.sanitize_character() + +/datum/category_group/player_setup_category/proc/load_character(var/savefile/S) + // Load all data, then sanitize it. + // Need due to, for example, the 01_basic module relying on species having been loaded to sanitize correctly but that isn't loaded until module 03_body. + if (!config.sql_saves || !establish_db_connection(dbcon)) + for(var/datum/category_item/player_setup_item/PI in items) + PI.load_character(S) + else + // Load every category minus the global + handle_sql_loading(SQL_CHARACTER) + + for(var/datum/category_item/player_setup_item/PI in items) + PI.sanitize_character(config.sql_saves) + +/datum/category_group/player_setup_category/proc/save_character(var/savefile/S) + // Sanitize all data, then save it + for (var/datum/category_item/player_setup_item/PI in items) + PI.sanitize_character() + + if (!config.sql_saves || !establish_db_connection(dbcon)) + for (var/datum/category_item/player_setup_item/PI in items) + PI.save_character(S) + else + if (modified && sql_role == SQL_CHARACTER) + handle_sql_saving(SQL_CHARACTER) + modified = 0 + +/datum/category_group/player_setup_category/proc/load_preferences(var/savefile/S) + if (!config.sql_saves || !establish_db_connection(dbcon)) + for (var/datum/category_item/player_setup_item/PI in items) + PI.load_preferences(S) + else + handle_sql_loading(SQL_PREFERENCES) + + for (var/datum/category_item/player_setup_item/PI in items) + PI.sanitize_preferences(config.sql_saves) + +/datum/category_group/player_setup_category/proc/save_preferences(var/savefile/S) + for (var/datum/category_item/player_setup_item/PI in items) + PI.sanitize_preferences() + + if (!config.sql_saves || !establish_db_connection(dbcon)) + for (var/datum/category_item/player_setup_item/PI in items) + PI.save_preferences(S) + else + handle_sql_saving(SQL_PREFERENCES) + +/datum/category_group/player_setup_category/proc/update_setup(var/savefile/preferences, var/savefile/character) + for(var/datum/category_item/player_setup_item/PI in items) + . = . || PI.update_setup(preferences, character) + +/datum/category_group/player_setup_category/proc/content(var/mob/user) + . = "
      " + var/current = 0 + var/halfway = items.len / 2 + for(var/datum/category_item/player_setup_item/PI in items) + if(halfway && current++ >= halfway) + halfway = 0 + . += "" + . += "[PI.content(user)]
      " + . += "
      " + +/datum/category_group/player_setup_category/occupation_preferences/content(var/mob/user) + for(var/datum/category_item/player_setup_item/PI in items) + . += "[PI.content(user)]
      " + +/********************** +* Category Item Setup * +**********************/ +/datum/category_item/player_setup_item + var/sort_order = 0 + var/datum/preferences/pref + +/datum/category_item/player_setup_item/New() + ..() + var/datum/category_collection/player_setup_collection/psc = category.collection + pref = psc.preferences + +/datum/category_item/player_setup_item/Destroy() + pref = null + return ..() + +/datum/category_item/player_setup_item/dd_SortValue() + return sort_order + +/* +* Called when the item is asked to load per character settings +*/ +/datum/category_item/player_setup_item/proc/load_character(var/savefile/S) + return + +/* +* Called when the item is asked to save per character settings +*/ +/datum/category_item/player_setup_item/proc/save_character(var/savefile/S) + return + +/* +* Called when the item is asked to load user/global settings +*/ +/datum/category_item/player_setup_item/proc/load_preferences(var/savefile/S) + return + +/* +* Called when the item is asked to save user/global settings +*/ +/datum/category_item/player_setup_item/proc/save_preferences(var/savefile/S) + return + +/* +* Called when the item is asked to update user/global settings +*/ +/datum/category_item/player_setup_item/proc/update_setup(var/savefile/preferences, var/savefile/character) + return 0 + +/* +* Called when the owner category is composing its load query +*/ +/datum/category_item/player_setup_item/proc/gather_load_query() + return list() + +/* +* Called when the owner category is composing its insert query +*/ +/datum/category_item/player_setup_item/proc/gather_save_query() + return list() + +/* +* Called when the owner category is composing its query parameters for loading. +*/ +/datum/category_item/player_setup_item/proc/gather_load_parameters() + return list() + +/* +* Called when the owner category is composing its query parameters for inserting a new record. +*/ +/datum/category_item/player_setup_item/proc/gather_save_parameters() + return list() + +/datum/category_item/player_setup_item/proc/content() + return + +/datum/category_item/player_setup_item/proc/sanitize_character(var/sql_load = 0) + return + +/datum/category_item/player_setup_item/proc/sanitize_preferences(var/sql_load = 0) + return + +/datum/category_item/player_setup_item/Topic(var/href,var/list/href_list) + if(..()) + return 1 + var/mob/user = usr + if (!user.client) + return 1 + + . = OnTopic(href, href_list, user) + if (. != TOPIC_NOACTION) + var/datum/category_group/player_setup_category/cat = category + cat.modified = 1 + if (. == TOPIC_REFRESH) + user.client.prefs.ShowChoices(user) + +/datum/category_item/player_setup_item/CanUseTopic(var/mob/user) + return 1 + +/datum/category_item/player_setup_item/proc/OnTopic(var/href,var/list/href_list, var/mob/user) + return TOPIC_NOACTION + +/datum/category_item/player_setup_item/proc/preference_mob() + if(pref && pref.client && pref.client.mob) + return pref.client.mob diff --git a/code/modules/client/preference_setup/preferences_sql.dm b/code/modules/client/preference_setup/preferences_sql.dm new file mode 100644 index 00000000000..590b06f9c85 --- /dev/null +++ b/code/modules/client/preference_setup/preferences_sql.dm @@ -0,0 +1,203 @@ +/* + * A proc for dynamically loading a character from the database. + * See the category items for procs on what pieces are given. + * + * Each query is cached as well, after generation. Only things recompiled are the arguments and the finalized query text (with arguments in it). + */ +/datum/category_group/player_setup_category/proc/handle_sql_loading(var/role_type) + var/static/list/query_cache + + // We aren't loading this category. Bye. + if (role_type && sql_role != role_type) + return + + if (isnull(query_cache)) + query_cache = list() + + // This handles the generation of queries. One per category, total of 5 UNLESS one category wants to query more than one table. + // It uses like, 3+ levels of lists. But it works, and is only run once per category in the global sense. So technically, efficient! + // :D - Skull132 + if (!query_cache.len || isnull(query_cache[type])) + query_cache[type] = list() + var/list/tables = list() + + // First, consolidate the different lists into one. + for (var/datum/category_item/player_setup_item/PI in items) + var/list/pi_tables = PI.gather_load_query() + // Expected layout: list("table A name" = list("vars" = list("column name" = "var name"), "args" = list()), + // "table B name" = list("vars" = list(), "args" = list())) + + for (var/table in pi_tables) + var/list/A = pi_tables[table] + if (isnull(tables[table])) + tables[table] = list("vars" = list(), "args" = list()) + + tables[table]["vars"] |= A["vars"] + tables[table]["args"] |= A["args"] + + // Second, create the queries and save them. + for (var/table in tables) + var/query = "SELECT " + var/list/var_names = tables[table]["vars"] + var/count = var_names.len + + // Process the variables and rows we want. + var/i = 1 + for (var/name in var_names) + query += name + + if (!isnull(var_names[name])) + var/new_name = var_names[name] + var_names.Remove(name) + var_names.Insert(i, new_name) + + if (i != count) + query += ", " + else + query += " " + + i++ + + query += "FROM [table] WHERE " + + // Process the args. + var/list/arg_names = tables[table]["args"] + count = arg_names.len + for (i = 1, i <= count, i++) + query += "[arg_names[i]] = :[arg_names[i]]" + arg_names[i] = ":[arg_names[i]]" + + if (i != count) + query += " AND " + else + query += ";" + + // Save it. + query_cache[type][query] = var_names + + // Need to typecast due to reasons. + var/datum/category_collection/player_setup_collection/cc = collection + + // Actually utilize the queries. + var/list/arg_list = gather_load_parameters() + for (var/query_text in query_cache[type]) + var/DBQuery/query = dbcon.NewQuery(query_text) + query.Execute(arg_list, 1) + if (query.ErrorMsg()) + error("Error loading character from SQL: [query.ErrorMsg()]") + + // Each query should only return exactly 1 row. + var/list/var_names = query_cache[type][query_text] + if (query.NextRow()) + for (var/i = 1, i <= var_names.len, i++) + var/list/layers = splittext(var_names[i], "/") + try + if (layers.len == 1) + cc.preferences.vars[var_names[i]] = query.item[i] + else + cc.preferences.vars[layers[1]][layers[2]] = query.item[i] + catch(var/exception/e) + error("Error loading character from SQL: [e.name]") + log_debug("SQL Saves: [e.name]") + log_debug("SQL Saves: [e.desc]") + +/datum/category_group/player_setup_category/proc/gather_load_parameters() + var/list/arg_list = list() + for (var/datum/category_item/player_setup_item/PI in items) + arg_list |= PI.gather_load_parameters() + + return arg_list + +/* + * A proc for dynamically inserting new character and preference records into the database. + * See the category items for procs on what pieces are given. + * + * Each query is cached as well, after generation. Only things recompiled are the arguments and the finalized query text (with arguments in it). + */ +/datum/category_group/player_setup_category/proc/handle_sql_saving(var/role_type) + var/static/list/query_cache + + // We aren't loading this category. Bye. + if (role_type && sql_role != role_type) + return + + if (isnull(query_cache)) + query_cache = list() + + // This handles the generation of queries. One per category, total of 5 UNLESS one category wants to query more than one table. + // It uses like, 3+ levels of lists. But it works, and is only run once per category in the global sense. So technically, efficient! + // :D - Skull132 + if (!query_cache.len || isnull(query_cache[type])) + query_cache[type] = list() + var/list/tables = list() + + // First, consolidate the different lists into one. + for (var/datum/category_item/player_setup_item/PI in items) + var/list/pi_tables = PI.gather_save_query() + // Expected layout: list("table A name" = list("var1" = 1, "var2" = 0, "var3" = 1), + // "table B name" = list("var4" = 0, "var5" = 0, "var6" = 0)) + + for (var/table in pi_tables) + var/list/A = pi_tables[table] + if (isnull(tables[table])) + tables[table] = list() + + tables[table] |= A + + // Second, create the queries and save them. + for (var/table in tables) + var/query = "INSERT INTO [table] (" + var/list/var_names = tables[table] + + query += "[jointext(var_names, ", ")]) VALUES (" + + // Process the args. + var/list/arg_names = list() + for (var/variable in var_names) + arg_names += ":[variable]" + + query += "[jointext(arg_names, ", ")]) ON DUPLICATE KEY UPDATE" + + var/i = 1 + for (var/variable in var_names) + if (isnull(var_names[variable])) + query += " [variable] = [arg_names[i]]" + + i++ + + // Save it. + query_cache[type] += query + + // Actually utilize the queries. + var/list/arg_list = gather_save_parameters() + + // Typecast the collection so we can access its preferences var. + var/datum/category_collection/player_setup_collection/cc = collection + for (var/query_text in query_cache[type]) + var/DBQuery/query = dbcon.NewQuery(query_text) + query.Execute(arg_list, 1) + + if (query.ErrorMsg()) + error("Error saving character to SQL: [query.ErrorMsg()]") + + if (role_type == SQL_CHARACTER && !cc.preferences.current_character) + // No current character, means we're doing insert queries. + // Quickly nab the new ID and substitute it within the args. + query = dbcon.NewQuery("SELECT LAST_INSERT_ID() AS new_id") + query.Execute() + + if (query.NextRow()) + arg_list[":id"] = text2num(query.item[1]) + arg_list[":char_id"] = text2num(query.item[1]) + cc.preferences.current_character = text2num(query.item[1]) + else + error("Error inserting character to SQL: New ID was not recovered.") + if (query.ErrorMsg()) + error("Error retreiving new character ID: [query.ErrorMsg()]") + +/datum/category_group/player_setup_category/proc/gather_save_parameters() + var/list/arg_list = list() + for (var/datum/category_item/player_setup_item/PI in items) + arg_list |= PI.gather_save_parameters() + + return arg_list diff --git a/code/modules/client/preference_setup/skills/skills.dm b/code/modules/client/preference_setup/skills/skills.dm new file mode 100644 index 00000000000..1cb25641828 --- /dev/null +++ b/code/modules/client/preference_setup/skills/skills.dm @@ -0,0 +1,95 @@ +/datum/category_item/player_setup_item/skills + name = "Skills" + sort_order = 1 + +/datum/category_item/player_setup_item/skills/load_character(var/savefile/S) + S["skills"] >> pref.skills + S["used_skillpoints"] >> pref.used_skillpoints + S["skill_specialization"] >> pref.skill_specialization + +/datum/category_item/player_setup_item/skills/save_character(var/savefile/S) + S["skills"] << pref.skills + S["used_skillpoints"] << pref.used_skillpoints + S["skill_specialization"] << pref.skill_specialization + +/datum/category_item/player_setup_item/skills/gather_load_query() + return list("ss13_characters" = list("vars" = list("skills", "skill_specialization"), "args" = list("id"))) + +/datum/category_item/player_setup_item/skills/gather_load_parameters() + return list(":id" = pref.current_character) + +/datum/category_item/player_setup_item/skills/gather_save_query() + return list("ss13_characters" = list("skills", "skill_specialization", "id" = 1)) + +/datum/category_item/player_setup_item/skills/gather_save_parameters() + return list(":skills" = list2params(pref.skills), ":skill_specialization" = pref.skill_specialization, ":id" = pref.current_character) + +/datum/category_item/player_setup_item/skills/sanitize_character(var/sql_load = 0) + if (SKILLS == null) + setup_skills() + if (!pref.skills) + pref.skills = list() + if (sql_load) + pref.skills = params2list(pref.skills) + if (!pref.skills.len) + pref.ZeroSkills() + if (pref.used_skillpoints < 0) + pref.used_skillpoints = 0 + +/datum/category_item/player_setup_item/skills/content() + . += "Select your Skills
      " + . += "Current skill level: [pref.GetSkillClass(pref.used_skillpoints)] ([pref.used_skillpoints])
      " + . += "Use preconfigured skillset
      " + . += "" + for(var/V in SKILLS) + . += "" + for(var/datum/skill/S in SKILLS[V]) + var/level = pref.skills[S.ID] + . += "" + . += "" + . += "" + // secondary skills don't have an amateur level + if(S.secondary) + . += "" + else + . += "" + . += "" + . += "" + . += "" + . += "
      [V]" + . += "
      [S.name]\[Untrained\]\[Amateur\]\[Trained\]\[Professional\]
      " + +/datum/category_item/player_setup_item/skills/OnTopic(href, href_list, user) + if(href_list["skillinfo"]) + var/datum/skill/S = locate(href_list["skillinfo"]) + var/HTML = "[S.name]
      [S.desc]" + user << browse(HTML, "window=\ref[user]skillinfo") + return TOPIC_HANDLED + + else if(href_list["setskill"]) + var/datum/skill/S = locate(href_list["setskill"]) + var/value = text2num(href_list["newvalue"]) + pref.skills[S.ID] = value + pref.CalculateSkillPoints() + return TOPIC_REFRESH + + else if(href_list["preconfigured"]) + var/selected = input(user, "Select a skillset", "Skillset") as null|anything in SKILL_PRE + if(!selected && !CanUseTopic(user)) return + + pref.ZeroSkills(1) + for(var/V in SKILL_PRE[selected]) + if(V == "field") + pref.skill_specialization = SKILL_PRE[selected]["field"] + continue + pref.skills[V] = SKILL_PRE[selected][V] + pref.CalculateSkillPoints() + + return TOPIC_REFRESH + + else if(href_list["setspecialization"]) + pref.skill_specialization = href_list["setspecialization"] + pref.CalculateSkillPoints() + return TOPIC_REFRESH + + return ..() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 3a182540088..11857790540 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2,33 +2,6 @@ var/list/preferences_datums = list() -var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm --rastaf -//REALLY keep synced. The ordering of this list is critical, it must match the order of the BE_* defines --Nanako -//some autodetection here. -// TODO: Update to new antagonist system. - "traitor" = IS_MODE_COMPILED("traitor"), // 0 - "operative" = IS_MODE_COMPILED("nuclear"), // 1 - "changeling" = IS_MODE_COMPILED("changeling"), // 2 - "wizard" = IS_MODE_COMPILED("wizard"), // 3 - "malf AI" = IS_MODE_COMPILED("malfunction"), // 4 - "revolutionary" = IS_MODE_COMPILED("revolution"), // 5 - "alien candidate" = 1, //always show // 6 - "positronic brain" = 1, // 7 - "cultist" = IS_MODE_COMPILED("cult"), // 8 - "infested monkey" = IS_MODE_COMPILED("monkey"), // 9 - "ninja" = "true", // 10 - "raider" = IS_MODE_COMPILED("heist"), // 11 - "diona" = 1, // 12 - "loyalist" = IS_MODE_COMPILED("revolution"), // 13 - "personal AI" = 1, // -- TLE // 14 - "vampire" = IS_MODE_COMPILED("vampire"), // 15 -) - -//used for alternate_option -#define GET_RANDOM_JOB 0 -#define BE_ASSISTANT 1 -#define RETURN_TO_LOBBY 2 - datum/preferences //doohickeys for savefiles var/path @@ -47,7 +20,7 @@ datum/preferences //game-preferences var/lastchangelog = "" //Saved changlog filesize to detect if there was a change var/ooccolor = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color - var/be_special = 0 //Special role selection + var/list/be_special_role = list() //Special role selection var/UI_style = "Midnight" var/toggles = TOGGLES_DEFAULT var/asfx_togs = ASFX_DEFAULT @@ -67,23 +40,28 @@ datum/preferences var/undershirt //undershirt type var/backbag = 2 //backpack type var/h_style = "Bald" //Hair type + var/hair_colour = "#000000" //Hair colour hex value, for SQL loading var/r_hair = 0 //Hair color var/g_hair = 0 //Hair color var/b_hair = 0 //Hair color var/f_style = "Shaved" //Face hair type + var/facial_colour = "#000000" //Facial colour hex value, for SQL loading var/r_facial = 0 //Face hair color var/g_facial = 0 //Face hair color var/b_facial = 0 //Face hair color var/s_tone = 0 //Skin tone + var/skin_colour = "#000000" //Skin colour hex value, for SQL loading var/r_skin = 0 //Skin color var/g_skin = 0 //Skin color var/b_skin = 0 //Skin color + var/eyes_colour = "#000000" //Eye colour hex value, for SQL loading var/r_eyes = 0 //Eye color var/g_eyes = 0 //Eye color var/b_eyes = 0 //Eye color var/species = "Human" //Species datum to use. var/species_preview //Used for the species selection window. - var/language = "None" //Secondary language + var/list/alternate_languages = list() //Secondary language(s) + var/list/language_prefixes = list() //Kanguage prefix keys var/list/gear //Custom/fluff item loadout. //Some faction information. @@ -110,6 +88,9 @@ datum/preferences var/job_engsec_med = 0 var/job_engsec_low = 0 + // A text blob which temporarily houses data from the SQL. + var/unsanitized_jobs = "" + //Keeps track of preferrence for not getting any wanted jobs var/alternate_option = 0 @@ -138,40 +119,38 @@ datum/preferences var/uplinklocation = "PDA" - // OOC Metadata: + // OOC Metadata: var/metadata = "" - var/slot_name = "" + + var/client/client = null + + var/savefile/loaded_preferences + var/savefile/loaded_character + var/datum/category_collection/player_setup_collection/player_setup /datum/preferences/New(client/C) - if (config.sql_saves && C.need_saves_migrated) - var/dat = "
      The server attempted to automatically migrate your saves from the old file-system onto an SQL database.
      " - dat += "This operation was " - if (!handle_saves_migration(C)) - error("Failed migrating saves from [C.ckey] to the database!") - dat += "unsuccessful!

      " - dat += "There was most likely an error in one of the SQL commands used to handle this migration. Do not worry: your saves are still safe in the old system and retreivable. Please contact Skull132 immediately in order to have the issue resolved. Until such a time, you will have to play without your old characters.
      " - else - dat += "successful!

      " - dat += "All of your character and preference data should be now neatly housed on the SQL database. Please look over it to see if anything is wrong or otherwise messed up. If you find something like that, please contact Skull132 immediately. Your old saves are still completely safe on the old system, should anything have gone wrong!

      " - dat += "You should now immediately load a character. Otherwise you risk overriding one of your characters! Once that is done, everything shuold be fine.
      " - - C << browse(dat, "window=migrate_status") - update_migrate_status(C) - - if(istype(C)) - if(!IsGuestKey(C.key)) - load_path(C.ckey) - if(handle_preferences_load(C)) - if(handle_character_load(get_default_character(), C)) - return - - b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + player_setup = new(src) gender = pick(MALE, FEMALE) real_name = random_name(gender,species) + b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + gear = list() + if(istype(C)) + client = C + if(!IsGuestKey(C.key)) + load_path(C.ckey) + load_preferences() + load_and_update_character() + ZeroSkills(1) +/datum/preferences/proc/load_and_update_character(var/slot) + load_character(slot) + if(update_setup(loaded_preferences, loaded_character)) + save_preferences() + save_character() + /datum/preferences/proc/getMinAge(var/age_min) if(species == "Vaurca" || species == "Machine" || species == "Diona") age_min = 1 @@ -244,715 +223,27 @@ datum/preferences if(24 to 1000) return "God" -/datum/preferences/proc/SetSkills(mob/user) - if(SKILLS == null) - setup_skills() - - if(skills.len == 0) - ZeroSkills() - - - var/HTML = "" - HTML += "Select your Skills
      " - HTML += "Current skill level: [GetSkillClass(used_skillpoints)] ([used_skillpoints])
      " - HTML += "Use preconfigured skillset
      " - HTML += "" - for(var/V in SKILLS) - HTML += "" - for(var/datum/skill/S in SKILLS[V]) - var/level = skills[S.ID] - HTML += "" - HTML += "" - HTML += "" - // secondary skills don't have an amateur level - if(S.secondary) - HTML += "" - else - HTML += "" - HTML += "" - HTML += "" - HTML += "" - HTML += "
      [V]" - HTML += "
      [S.name]\[Untrained\]\[Amateur\]\[Trained\]\[Professional\]
      " - HTML += "\[Done\]" - - user << browse(null, "window=preferences") - user << browse(HTML, "window=show_skills;size=600x800") - return - /datum/preferences/proc/ShowChoices(mob/user) if(!user || !user.client) return - update_preview_icon() - if(preview_icon_front && preview_icon_side) - user << browse_rsc(preview_icon_front, "previewicon.png") - user << browse_rsc(preview_icon_side, "previewicon2.png") var/dat = "
      " - if (config.sql_saves) - dat += "
      " - dat += "Load another character - " - dat += "Save character - " - dat += "Discard changes - " - dat += "Delete Character" - dat += "
      " - else if (path) - dat += "
      " - dat += "Slot [slot_name] - " - dat += "Load slot - " - dat += "Save slot - " - dat += "Reload slot" - dat += "
      " + // #MARKER-SQLSAVE: Options and buttons. + if(path) + dat += "Slot - " + dat += "Load slot - " + dat += "Save slot - " + dat += "Reload slot" else dat += "Please create an account to save your preferences." - dat += "

      " - - dat += "Name: " - dat += "[real_name]
      " - dat += "(Random Name) " - dat += "(Always Random Name: [be_random_name ? "Yes" : "No"])" dat += "
      " + dat += player_setup.header() + dat += "

      " + dat += player_setup.content(user) - dat += "Gender: [gender == MALE ? "Male" : "Female"]
      " - dat += "Age: [age]
      " - dat += "Spawn Point: [spawnpoint]" - - dat += "
      " - dat += "UI Style: [UI_style]
      " - dat += "Custom UI(recommended for White UI):
      " - dat += "-Color: [UI_style_color]
      __

      " - dat += "-Alpha(transparency): [UI_style_alpha]
      " - dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
      " - dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
      " - dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
      " - dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
      " - dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
      " - - if(config.allow_Metadata) - dat += "OOC Notes: Edit
      " - - dat += "
      Custom Loadout: " - var/total_cost = 0 - - if(!islist(gear)) gear = list() - - if(gear && gear.len) - dat += "
      " - for(var/i = 1; i <= gear.len; i++) - var/datum/gear/G = gear_datums[gear[i]] - if(G) - total_cost += G.cost - dat += "[gear[i]] ([G.cost] points) \[remove\]
      " - - dat += "Used: [total_cost] points." - else - dat += "none." - - if(total_cost < MAX_GEAR_COST) - dat += " \[add\]" - if(gear && gear.len) - dat += " \[clear\]" - - dat += "

      Occupation Choices
      " - dat += "\tSet Preferences
      " - - dat += "
      Body " - dat += "(®)" - dat += "
      " - dat += "Species: [species]
      " - dat += "Secondary Language:
      [language]
      " - dat += "Blood Type: [b_type]
      " - dat += "Skin Tone: [-s_tone + 35]/220
      " - //dat += "Skin pattern: Adjust
      " - dat += "Needs Glasses: [disabilities == 0 ? "No" : "Yes"]
      " - dat += "Limbs: Adjust
      " - dat += "Internal Organs: Adjust
      " - - //display limbs below - var/ind = 0 - for(var/name in organ_data) - //world << "[ind] \ [organ_data.len]" - var/status = organ_data[name] - var/organ_name = null - switch(name) - if("l_arm") - organ_name = "left arm" - if("r_arm") - organ_name = "right arm" - if("l_leg") - organ_name = "left leg" - if("r_leg") - organ_name = "right leg" - if("l_foot") - organ_name = "left foot" - if("r_foot") - organ_name = "right foot" - if("l_hand") - organ_name = "left hand" - if("r_hand") - organ_name = "right hand" - if("heart") - organ_name = "heart" - if("eyes") - organ_name = "eyes" - - if(status == "cyborg") - ++ind - if(ind > 1) - dat += ", " - var/datum/robolimb/R - if(rlimb_data[name] && all_robolimbs[rlimb_data[name]]) - R = all_robolimbs[rlimb_data[name]] - else - R = basic_robolimb - dat += "\t[R.company] [organ_name] prothesis" - else if(status == "amputated") - ++ind - if(ind > 1) - dat += ", " - dat += "\tAmputated [organ_name]" - else if(status == "mechanical") - ++ind - if(ind > 1) - dat += ", " - dat += "\tMechanical [organ_name]" - else if(status == "assisted") - ++ind - if(ind > 1) - dat += ", " - switch(organ_name) - if("heart") - dat += "\tPacemaker-assisted [organ_name]" - if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements - dat += "\tSurgically altered [organ_name]" - if("eyes") - dat += "\tRetinal overlayed [organ_name]" - else - dat += "\tMechanically assisted [organ_name]" - if(!ind) - dat += "\[...\]

      " - else - dat += "

      " - - var/list/undies = gender == MALE ? underwear_m : underwear_f - - dat += "Underwear: [get_key_by_value(undies,underwear)]
      " - - dat += "Undershirt: [get_key_by_value(undershirt_t,undershirt)]
      " - - dat += "Backpack Type:
      [backbaglist[backbag]]
      " - - dat += "Nanotrasen Relation:
      [nanotrasen_relation]
      " - - dat += "
      Preview
      " - - dat += "
      " - - if(jobban_isbanned(user, "Records")) - dat += "You are banned from using character records.
      " - else - dat += "Character Records
      " - - dat += "Set Antag Options
      " - - dat += "\tSet Skills ([GetSkillClass(used_skillpoints)] [used_skillpoints > 0 ? "[used_skillpoints]" : "0"])
      " - - dat += "Set Flavor Text
      " - dat += "Set Robot Flavour Text
      " - - dat += "pAI Configuration
      " - dat += "
      " - - dat += "
      Hair
      " - dat += "Change Color
      __
      " - dat += " Style: [h_style]
      " - - dat += "
      Facial
      " - dat += "Change Color
      __
      " - dat += " Style: [f_style]
      " - - dat += "
      Eyes
      " - dat += "Change Color
      __

      " - - dat += "
      Body Color
      " - dat += "Change Color
      __
      " - - dat += "

      Background Information
      " - dat += "Home system: [home_system]
      " - dat += "Citizenship: [citizenship]
      " - dat += "Faction: [faction]
      " - dat += "Religion: [religion]
      " - - dat += "

      " - - if(jobban_isbanned(user, "Syndicate")) - dat += "You are banned from antagonist roles." - src.be_special = 0 - else - var/n = 0 - for (var/i in special_roles) - if(special_roles[i]) //if mode is available on the server - var/banned_special = 0 - switch (i) - if ("positronic brain") - banned_special = jobban_isbanned(user, "AI") && jobban_isbanned(user, "cyborg") - if ("pAI candidate") - banned_special = jobban_isbanned(user, "pAI") - else - banned_special = jobban_isbanned(user, i) - - if (banned_special) - dat += "Be [i]: \[BANNED]
      " - else - var/time = 0 - if (!isnull(config.age_restrictions[i])) - time = max(0, config.age_restrictions[i] - user.client.player_age) - - if (time) - dat += "Be [i]: \[IN [time] DAYS]
      " - else - dat += "Be [i]: [src.be_special&(1<
      " - n++ - dat += "

      " - - if(!IsGuestKey(user.key)) - if (config.sql_saves) - dat += "Save character - " - dat += "Discard changes - " - dat += "Delete Character" - else - dat += "Undo - " - dat += "Save Setup - " - dat += "Reset Setup" - dat += "
      " - - user << browse(dat, "window=preferences;size=560x736") - -/datum/preferences/proc/SetChoices(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer"), width = 550, height = 660) - if(!job_master) - return - - //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice. - //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice. - //width - Screen' width. Defaults to 550 to make it look nice. - //height - Screen's height. Defaults to 500 to make it look nice. - - - var/HTML = "" - HTML += "
      " - HTML += "Choose occupation chances
      Unavailable occupations are crossed out.

      " - HTML += "
      \[Done\]

      " // Easier to press up here. - HTML += "
      " // Table within a table for alignment, also allows you to easily add more colomns. - HTML += "" - var/index = -1 - - //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. - var/datum/job/lastJob - if (!job_master) return - for(var/datum/job/job in job_master.occupations) - - index += 1 - if((index >= limit) || (job.title in splitJobs)) - if((index < limit) && (lastJob != null)) - //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with - //the last job's selection color. Creating a rather nice effect. - for(var/i = 0, i < (limit - index), i += 1) - HTML += "" - HTML += "
        
      " - index = 0 - - HTML += "" - continue - if(!job.player_old_enough(user.client)) - var/available_in_days = job.available_in_days(user.client) - HTML += "[rank]" - continue - if((job_civilian_low & ASSISTANT) && (rank != "Assistant")) - HTML += "[rank]" - continue - if((rank in command_positions) || (rank == "AI"))//Bold head jobs - HTML += "[rank]" - else - HTML += "[rank]" - - HTML += "" - HTML += "" - continue - - if(GetJobDepartment(job, 1) & job.flag) - HTML += " \[High]" - else if(GetJobDepartment(job, 2) & job.flag) - HTML += " \[Medium]" - else if(GetJobDepartment(job, 3) & job.flag) - HTML += " \[Low]" - else - HTML += " \[NEVER]" - if(job.alt_titles) - HTML += "" - HTML += "" - - HTML += "
      " - var/rank = job.title - lastJob = job - var/banned = jobban_isbanned(user, rank) - if(banned) - if (banned != "Whitelisted Job") - banned = "\[BANNED]" - HTML += "[rank] [banned]
      \[IN [(available_in_days)] DAYS]
      " - - HTML += "" - - if(rank == "Assistant")//Assistant is special - if(job_civilian_low & ASSISTANT) - HTML += " \[Yes]" - else - HTML += " \[No]" - if(job.alt_titles) //Blatantly cloned from a few lines down. - HTML += "
       \[[GetPlayerAltTitle(job)]\]
       \[[GetPlayerAltTitle(job)]\]
      " - - HTML += "
      " - - switch(alternate_option) - if(GET_RANDOM_JOB) - HTML += "

      Get random job if preferences unavailable

      " - if(BE_ASSISTANT) - HTML += "

      Be assistant if preference unavailable

      " - if(RETURN_TO_LOBBY) - HTML += "

      Return to lobby if preference unavailable

      " - - HTML += "
      \[Reset\]
      " - HTML += "
      " - - user << browse(null, "window=preferences") - user << browse(HTML, "window=mob_occupation;size=[width]x[height]") - return - -/datum/preferences/proc/SetDisabilities(mob/user) - var/HTML = "" - HTML += "
      " - HTML += "Choose disabilities
      " - - HTML += "Need Glasses? [disabilities & (1<<0) ? "Yes" : "No"]
      " - HTML += "Seizures? [disabilities & (1<<1) ? "Yes" : "No"]
      " - HTML += "Coughing? [disabilities & (1<<2) ? "Yes" : "No"]
      " - HTML += "Tourettes/Twitching? [disabilities & (1<<3) ? "Yes" : "No"]
      " - HTML += "Nervousness? [disabilities & (1<<4) ? "Yes" : "No"]
      " - HTML += "Deafness? [disabilities & (1<<5) ? "Yes" : "No"]
      " - - HTML += "
      " - HTML += "\[Done\]" - HTML += "
      " - - user << browse(null, "window=preferences") - user << browse(HTML, "window=disabil;size=350x300") - return - -/datum/preferences/proc/SetRecords(mob/user) - var/HTML = "" - HTML += "
      " - HTML += "Set Character Records
      " - - HTML += "Medical Records
      " - - HTML += TextPreview(med_record,40) - - HTML += "

      Employment Records
      " - - HTML += TextPreview(gen_record,40) - - HTML += "

      Security Records
      " - - HTML += TextPreview(sec_record,40) - - HTML += "
      " - HTML += "\[Done\]" - HTML += "
      " - - user << browse(null, "window=preferences") - user << browse(HTML, "window=records;size=350x300") - return - -/datum/preferences/proc/SetSpecies(mob/user) - if(!species_preview || !(species_preview in all_species)) - species_preview = "Human" - var/datum/species/current_species = all_species[species_preview] - var/dat = "" - dat += "

      [current_species.name] \[change\]


      " - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "
      [current_species.blurb]" - if("preview" in icon_states(current_species.icobase)) - usr << browse_rsc(icon(current_species.icobase,"preview"), "species_preview_[current_species.name].png") - dat += "

      " - dat += "Language: [current_species.language]
      " - dat += "" - if(current_species.flags & CAN_JOIN) - dat += "
      Often present on human stations." - if(current_species.flags & IS_WHITELISTED) - dat += "
      Whitelist restricted." - if(current_species.flags & NO_BLOOD) - dat += "
      Does not have blood." - if(current_species.flags & NO_BREATHE) - dat += "
      Does not breathe." - if(current_species.flags & NO_SCAN) - dat += "
      Does not have DNA." - if(current_species.flags & NO_PAIN) - dat += "
      Does not feel pain." - if(current_species.flags & NO_SLIP) - dat += "
      Has excellent traction." - if(current_species.flags & NO_POISON) - dat += "
      Immune to most poisons." - if(current_species.flags & HAS_SKIN_TONE) - dat += "
      Has a variety of skin tones." - if(current_species.flags & HAS_SKIN_COLOR) - dat += "
      Has a variety of skin colours." - if(current_species.flags & HAS_EYE_COLOR) - dat += "
      Has a variety of eye colours." - if(current_species.flags & IS_PLANT) - dat += "
      Has a plantlike physiology." - if(current_species.flags & IS_SYNTHETIC) - dat += "
      Is machine-based." - if(current_species.flags & REGENERATES_LIMBS) - dat += "
      Has a plantlike physiology." - dat += "

      " - - var/restricted = 0 - if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! - if(!(current_species.flags & CAN_JOIN)) - restricted = 2 - else if((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(user,current_species.name)) - restricted = 1 - - if(restricted) - if(restricted == 1) - dat += "You cannot play as this species.
      If you wish to be whitelisted, you can make an application post on the forums.

      " - else if(restricted == 2) - dat += "You cannot play as this species.
      This species is not available for play as a station race..

      " - if(!restricted) - dat += "\[select\]" - dat += "
      " - - user << browse(null, "window=preferences") - user << browse(dat, "window=species;size=700x400") - -/datum/preferences/proc/SetAntagoptions(mob/user) - if(uplinklocation == "" || !uplinklocation) - uplinklocation = "PDA" - var/HTML = "" - HTML += "
      " - HTML += "Antagonist Options
      " - HTML += "
      " - HTML +="Uplink Type : [uplinklocation]" - HTML +="
      " - HTML +="Exploitable information about you : " - HTML += "
      " - if(jobban_isbanned(user, "Records")) - HTML += "You are banned from using character records.
      " - else - HTML +="[TextPreview(exploit_record,40)]" - HTML +="
      " - HTML +="
      " - HTML +="\[Done\]" - - HTML += "
      " - - user << browse(null, "window=preferences") - user << browse(HTML, "window=antagoptions") - return - -/datum/preferences/proc/SetFlavorText(mob/user) - var/HTML = "" - HTML += "
      " - HTML += "Set Flavour Text
      " - HTML += "
      " - HTML += "General: " - HTML += TextPreview(flavor_texts["general"]) - HTML += "
      " - HTML += "Head: " - HTML += TextPreview(flavor_texts["head"]) - HTML += "
      " - HTML += "Face: " - HTML += TextPreview(flavor_texts["face"]) - HTML += "
      " - HTML += "Eyes: " - HTML += TextPreview(flavor_texts["eyes"]) - HTML += "
      " - HTML += "Body: " - HTML += TextPreview(flavor_texts["torso"]) - HTML += "
      " - HTML += "Arms: " - HTML += TextPreview(flavor_texts["arms"]) - HTML += "
      " - HTML += "Hands: " - HTML += TextPreview(flavor_texts["hands"]) - HTML += "
      " - HTML += "Legs: " - HTML += TextPreview(flavor_texts["legs"]) - HTML += "
      " - HTML += "Feet: " - HTML += TextPreview(flavor_texts["feet"]) - HTML += "
      " - HTML += "
      " - HTML +="\[Done\]" - HTML += "" - user << browse(null, "window=preferences") - user << browse(HTML, "window=flavor_text;size=430x300") - return - -/datum/preferences/proc/SetFlavourTextRobot(mob/user) - var/HTML = "" - HTML += "
      " - HTML += "Set Robot Flavour Text
      " - HTML += "
      " - HTML += "Default: " - HTML += TextPreview(flavour_texts_robot["Default"]) - HTML += "
      " - for(var/module in robot_module_types) - HTML += "[module]: " - HTML += TextPreview(flavour_texts_robot[module]) - HTML += "
      " - HTML += "
      " - HTML +="\[Done\]" - HTML += "" - user << browse(null, "window=preferences") - user << browse(HTML, "window=flavour_text_robot;size=430x300") - return - -/datum/preferences/proc/GetPlayerAltTitle(datum/job/job) - return player_alt_titles.Find(job.title) > 0 \ - ? player_alt_titles[job.title] \ - : job.title - -/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title) - // remove existing entry - if(player_alt_titles.Find(job.title)) - player_alt_titles -= job.title - // add one if it's not default - if(job.title != new_title) - player_alt_titles[job.title] = new_title - -/datum/preferences/proc/SetJob(mob/user, role) - var/datum/job/job = job_master.GetJob(role) - if(!job) - user << browse(null, "window=mob_occupation") - ShowChoices(user) - return - - if(role == "Assistant") - if(job_civilian_low & job.flag) - job_civilian_low &= ~job.flag - else - job_civilian_low |= job.flag - SetChoices(user) - return 1 - - if(GetJobDepartment(job, 1) & job.flag) - SetJobDepartment(job, 1) - else if(GetJobDepartment(job, 2) & job.flag) - SetJobDepartment(job, 2) - else if(GetJobDepartment(job, 3) & job.flag) - SetJobDepartment(job, 3) - else//job = Never - SetJobDepartment(job, 4) - - SetChoices(user) - return 1 - -/datum/preferences/proc/ResetJobs() - job_civilian_high = 0 - job_civilian_med = 0 - job_civilian_low = 0 - - job_medsci_high = 0 - job_medsci_med = 0 - job_medsci_low = 0 - - job_engsec_high = 0 - job_engsec_med = 0 - job_engsec_low = 0 - - -/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level) - if(!job || !level) return 0 - switch(job.department_flag) - if(CIVILIAN) - switch(level) - if(1) - return job_civilian_high - if(2) - return job_civilian_med - if(3) - return job_civilian_low - if(MEDSCI) - switch(level) - if(1) - return job_medsci_high - if(2) - return job_medsci_med - if(3) - return job_medsci_low - if(ENGSEC) - switch(level) - if(1) - return job_engsec_high - if(2) - return job_engsec_med - if(3) - return job_engsec_low - return 0 - -/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level) - if(!job || !level) return 0 - switch(level) - if(1)//Only one of these should ever be active at once so clear them all here - job_civilian_high = 0 - job_medsci_high = 0 - job_engsec_high = 0 - return 1 - if(2)//Set current highs to med, then reset them - job_civilian_med |= job_civilian_high - job_medsci_med |= job_medsci_high - job_engsec_med |= job_engsec_high - job_civilian_high = 0 - job_medsci_high = 0 - job_engsec_high = 0 - - switch(job.department_flag) - if(CIVILIAN) - switch(level) - if(2) - job_civilian_high = job.flag - job_civilian_med &= ~job.flag - if(3) - job_civilian_med |= job.flag - job_civilian_low &= ~job.flag - else - job_civilian_low |= job.flag - if(MEDSCI) - switch(level) - if(2) - job_medsci_high = job.flag - job_medsci_med &= ~job.flag - if(3) - job_medsci_med |= job.flag - job_medsci_low &= ~job.flag - else - job_medsci_low |= job.flag - if(ENGSEC) - switch(level) - if(2) - job_engsec_high = job.flag - job_engsec_med &= ~job.flag - if(3) - job_engsec_med |= job.flag - job_engsec_low &= ~job.flag - else - job_engsec_low |= job.flag - return 1 + dat += "" + user << browse(dat, "window=preferences;size=625x736") /datum/preferences/proc/process_link(mob/user, list/href_list) if(!user) return @@ -965,757 +256,38 @@ datum/preferences else user << "The forum URL is not set in the server configuration." return + ShowChoices(usr) + return 1 - if(href_list["preference"] == "job") - switch(href_list["task"]) - if("close") - user << browse(null, "window=mob_occupation") - ShowChoices(user) - if("reset") - ResetJobs() - SetChoices(user) - if("random") - if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_ASSISTANT) - alternate_option += 1 - else if(alternate_option == RETURN_TO_LOBBY) - alternate_option = 0 - else - return 0 - SetChoices(user) - if ("alt_title") - var/datum/job/job = locate(href_list["job"]) - if (job) - var/choices = list(job.title) + job.alt_titles - var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null - if(choice) - SetPlayerAltTitle(job, choice) - SetChoices(user) - if("input") - SetJob(user, href_list["text"]) - else - SetChoices(user) - return 1 - else if(href_list["preference"] == "skills") - if(href_list["cancel"]) - user << browse(null, "window=show_skills") - ShowChoices(user) - else if(href_list["skillinfo"]) - var/datum/skill/S = locate(href_list["skillinfo"]) - var/HTML = "[S.name]
      [S.desc]" - user << browse(HTML, "window=\ref[user]skillinfo") - else if(href_list["setskill"]) - var/datum/skill/S = locate(href_list["setskill"]) - var/value = text2num(href_list["newvalue"]) - skills[S.ID] = value - CalculateSkillPoints() - SetSkills(user) - else if(href_list["preconfigured"]) - var/selected = input(user, "Select a skillset", "Skillset") as null|anything in SKILL_PRE - if(!selected) return - - ZeroSkills(1) - for(var/V in SKILL_PRE[selected]) - if(V == "field") - skill_specialization = SKILL_PRE[selected]["field"] - continue - skills[V] = SKILL_PRE[selected][V] - CalculateSkillPoints() - - SetSkills(user) - else if(href_list["setspecialization"]) - skill_specialization = href_list["setspecialization"] - CalculateSkillPoints() - SetSkills(user) - else - SetSkills(user) +/datum/preferences/Topic(href, list/href_list) + if(..()) return 1 - else if (href_list["preference"] == "loadout") - - if(href_list["task"] == "input") - - var/list/valid_gear_choices = list() - - for(var/gear_name in gear_datums) - var/datum/gear/G = gear_datums[gear_name] - if(G.whitelisted && !is_alien_whitelisted(user, G.whitelisted)) - continue - valid_gear_choices += gear_name - - var/choice = input(user, "Select gear to add: ") as null|anything in valid_gear_choices - - if(choice && gear_datums[choice]) - - var/total_cost = 0 - - if(isnull(gear) || !islist(gear)) gear = list() - - if(gear && gear.len) - for(var/gear_name in gear) - if(gear_datums[gear_name]) - var/datum/gear/G = gear_datums[gear_name] - total_cost += G.cost - - var/datum/gear/C = gear_datums[choice] - total_cost += C.cost - if(C && total_cost <= MAX_GEAR_COST) - gear += choice - user << "Added \the '[choice]' for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)." - else - user << "Adding \the '[choice]' will exceed the maximum loadout cost of [MAX_GEAR_COST] points." - - else if(href_list["task"] == "remove") - var/i_remove = text2num(href_list["gear"]) - if(i_remove < 1 || i_remove > gear.len) return - gear.Cut(i_remove, i_remove + 1) - - else if(href_list["task"] == "clear") - gear.Cut() - - else if(href_list["preference"] == "flavor_text") - switch(href_list["task"]) - if("open") - SetFlavorText(user) - return - if("done") - user << browse(null, "window=flavor_text") - ShowChoices(user) - return - if("general") - var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing, and may include OOC notes and preferences.","Flavor Text",html_decode(flavor_texts[href_list["task"]])) as message, extra = 0) - flavor_texts[href_list["task"]] = msg + if(href_list["save"]) + save_preferences() + save_character() + else if(href_list["reload"]) + load_preferences() + load_character() + else if(href_list["load"]) + if(!IsGuestKey(usr.key)) + if (config.sql_saves) + open_load_dialog_sql(usr) else - var/msg = sanitize(input(usr,"Set the flavor text for your [href_list["task"]].","Flavor Text",html_decode(flavor_texts[href_list["task"]])) as message, extra = 0) - flavor_texts[href_list["task"]] = msg - SetFlavorText(user) - return - - else if(href_list["preference"] == "flavour_text_robot") - switch(href_list["task"]) - if("open") - SetFlavourTextRobot(user) - return - if("done") - user << browse(null, "window=flavour_text_robot") - ShowChoices(user) - return - if("Default") - var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(flavour_texts_robot["Default"])) as message, extra = 0) - flavour_texts_robot[href_list["task"]] = msg - else - var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["task"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(flavour_texts_robot[href_list["task"]])) as message, extra = 0) - flavour_texts_robot[href_list["task"]] = msg - SetFlavourTextRobot(user) - return - - else if(href_list["preference"] == "pAI") - paiController.recruitWindow(user, 0) - return 1 - - else if(href_list["preference"] == "records") - if(text2num(href_list["record"]) >= 1) - SetRecords(user) - return - else - user << browse(null, "window=records") - if(href_list["task"] == "med_record") - var/medmsg = sanitize(input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) - if(medmsg != null) - med_record = medmsg - SetRecords(user) - - if(href_list["task"] == "sec_record") - var/secmsg = sanitize(input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) - if(secmsg != null) - sec_record = secmsg - SetRecords(user) - if(href_list["task"] == "gen_record") - var/genmsg = sanitize(input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) - if(genmsg != null) - gen_record = genmsg - SetRecords(user) - - if(href_list["task"] == "exploitable_record") - var/exploitmsg = sanitize(input(usr,"Set exploitable information about you here.","Exploitable Information",html_decode(exploit_record)) as message, MAX_PAPER_MESSAGE_LEN, extra = 0) - if(exploitmsg != null) - exploit_record = exploitmsg - SetAntagoptions(user) - - else if (href_list["preference"] == "antagoptions") - if(text2num(href_list["active"]) == 0) - SetAntagoptions(user) - return - if (href_list["antagtask"] == "uplinktype") - if (uplinklocation == "PDA") - uplinklocation = "Headset" - else if(uplinklocation == "Headset") - uplinklocation = "None" - else - uplinklocation = "PDA" - SetAntagoptions(user) - if (href_list["antagtask"] == "done") - user << browse(null, "window=antagoptions") - ShowChoices(user) - return 1 - - else if (href_list["preference"] == "loadout") - - if(href_list["task"] == "input") - - var/list/valid_gear_choices = list() - - for(var/gear_name in gear_datums) - var/datum/gear/G = gear_datums[gear_name] - if(G.whitelisted && !is_alien_whitelisted(user, G.whitelisted)) - continue - valid_gear_choices += gear_name - - var/choice = input(user, "Select gear to add: ") as null|anything in valid_gear_choices - - if(choice && gear_datums[choice]) - - var/total_cost = 0 - - if(isnull(gear) || !islist(gear)) gear = list() - - if(gear && gear.len) - for(var/gear_name in gear) - if(gear_datums[gear_name]) - var/datum/gear/G = gear_datums[gear_name] - total_cost += G.cost - - var/datum/gear/C = gear_datums[choice] - total_cost += C.cost - if(C && total_cost <= MAX_GEAR_COST) - gear += choice - user << "\blue Added [choice] for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)." - else - user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points." - - else if(href_list["task"] == "remove") - - if(isnull(gear) || !islist(gear)) - gear = list() - if(!gear.len) - return - - var/choice = input(user, "Select gear to remove: ") as null|anything in gear - if(!choice) - return - - for(var/gear_name in gear) - if(gear_name == choice) - gear -= gear_name - break - - switch(href_list["task"]) - if("change") - if(href_list["preference"] == "species") - // Actual whitelist checks are handled elsewhere, this is just for accessing the preview window. - var/choice = input("Which species would you like to look at?") as null|anything in playable_species - if(!choice) return - species_preview = choice - SetSpecies(user) - - if("random") - switch(href_list["preference"]) - if("name") - real_name = random_name(gender,species) - if("age") - age = rand(getMinAge(), getMaxAge()) - if("hair") - r_hair = rand(0,255) - g_hair = rand(0,255) - b_hair = rand(0,255) - if("h_style") - h_style = random_hair_style(gender, species) - if("facial") - r_facial = rand(0,255) - g_facial = rand(0,255) - b_facial = rand(0,255) - if("f_style") - f_style = random_facial_hair_style(gender, species) - if("underwear") - var/r = pick(underwear_m) - underwear = underwear_m[r] - ShowChoices(user) - if("undershirt") - var/r = pick(undershirt_t) - undershirt = undershirt_t[r] - ShowChoices(user) - if("eyes") - r_eyes = rand(0,255) - g_eyes = rand(0,255) - b_eyes = rand(0,255) - if("s_tone") - s_tone = random_skin_tone() - if("s_color") - r_skin = rand(0,255) - g_skin = rand(0,255) - b_skin = rand(0,255) - if("bag") - backbag = rand(1,5) - /*if("skin_style") - h_style = random_skin_style(gender)*/ - if("all") - randomize_appearance_for() //no params needed - if("input") - switch(href_list["preference"]) - if("name") - var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null - if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.) - var/new_name = sanitizeName(raw_name) - if(new_name) - real_name = new_name - else - user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." - - if("age") - var/new_age = input(user, "Choose your character's age:\n([getMinAge()]-[getMaxAge()])", "Character Preference") as num|null - if(new_age) - age = max(min( round(text2num(new_age)), getMaxAge()),getMinAge()) - if(age > getMaxAge()) - age = getMaxAge() - if(age < getMinAge()) - age = getMinAge() - - if("species") - user << browse(null, "window=species") - var/prev_species = species - species = href_list["newspecies"] - if(prev_species != species) - //grab one of the valid hair styles for the newly chosen species - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - - if(valid_hairstyles.len) - h_style = pick(valid_hairstyles) - else - //this shouldn't happen - h_style = hair_styles_list["Bald"] - - //grab one of the valid facial hair styles for the newly chosen species - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - - if(valid_facialhairstyles.len) - f_style = pick(valid_facialhairstyles) - else - //this shouldn't happen - f_style = facial_hair_styles_list["Shaved"] - - //reset hair colour and skin colour - r_hair = 0//hex2num(copytext(new_hair, 2, 4)) - g_hair = 0//hex2num(copytext(new_hair, 4, 6)) - b_hair = 0//hex2num(copytext(new_hair, 6, 8)) - - s_tone = 0 - - if(age > getMaxAge()) - age = getMaxAge() - if(age < getMinAge()) - age = getMinAge() - - if("language") - var/languages_available - var/list/new_languages = list("None") - var/datum/species/S = all_species[species] - - if(config.usealienwhitelist) - for(var/L in all_languages) - var/datum/language/lang = all_languages[L] - if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED ))||(S && (L in S.secondary_langs)))) - new_languages += lang - - languages_available = 1 - - if(!(languages_available)) - alert(user, "There are not currently any available secondary languages.") - else - for(var/L in all_languages) - var/datum/language/lang = all_languages[L] - if(!(lang.flags & RESTRICTED)) - new_languages += lang.name - - language = input("Please select a secondary language", "Character Generation", null) in new_languages - - if("metadata") - var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null - if(new_metadata) - metadata = sanitize(new_metadata) - - if("b_type") - var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" ) - if(new_b_type) - b_type = new_b_type - - if("hair") - if(species == "Human" || species == "Unathi" || species == "Tajara" || species == "Skrell") - var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null - if(new_hair) - r_hair = hex2num(copytext(new_hair, 2, 4)) - g_hair = hex2num(copytext(new_hair, 4, 6)) - b_hair = hex2num(copytext(new_hair, 6, 8)) - - if("h_style") - var/list/valid_hairstyles = list() - for(var/hairstyle in hair_styles_list) - var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if( !(species in S.species_allowed)) - continue - - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - - var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles - if(new_h_style) - h_style = new_h_style - - if("facial") - var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null - if(new_facial) - r_facial = hex2num(copytext(new_facial, 2, 4)) - g_facial = hex2num(copytext(new_facial, 4, 6)) - b_facial = hex2num(copytext(new_facial, 6, 8)) - - if("f_style") - var/list/valid_facialhairstyles = list() - for(var/facialhairstyle in facial_hair_styles_list) - var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] - if(gender == MALE && S.gender == FEMALE) - continue - if(gender == FEMALE && S.gender == MALE) - continue - if( !(species in S.species_allowed)) - continue - - valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] - - var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles - if(new_f_style) - f_style = new_f_style - - if("underwear") - var/list/underwear_options - if(gender == MALE) - underwear_options = underwear_m - else - underwear_options = underwear_f - - var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options - if(new_underwear) - underwear = underwear_options[new_underwear] - ShowChoices(user) - - if("undershirt") - var/list/undershirt_options - undershirt_options = undershirt_t - - var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_options - if (new_undershirt) - undershirt = undershirt_options[new_undershirt] - ShowChoices(user) - - if("eyes") - if(species == "Vaurca") - return - var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null - if(new_eyes) - r_eyes = hex2num(copytext(new_eyes, 2, 4)) - g_eyes = hex2num(copytext(new_eyes, 4, 6)) - b_eyes = hex2num(copytext(new_eyes, 6, 8)) - - if("s_tone") - if(species != "Human") - return - var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null - if(new_s_tone) - s_tone = 35 - max(min( round(new_s_tone), 220),1) - - if("skin") - if(species == "Unathi" || species == "Tajara" || species == "Skrell" || species == "Machine" || species == "Vaurca") - var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null - if(new_skin) - r_skin = hex2num(copytext(new_skin, 2, 4)) - g_skin = hex2num(copytext(new_skin, 4, 6)) - b_skin = hex2num(copytext(new_skin, 6, 8)) - if (species == "Machine") - r_hair = r_skin - g_hair = g_skin - b_hair = b_skin - - if("ooccolor") - var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") as color|null - if(new_ooccolor) - ooccolor = new_ooccolor - - if("bag") - var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist - if(new_backbag) - backbag = backbaglist.Find(new_backbag) - - if("nt_relation") - var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed") - if(new_relation) - nanotrasen_relation = new_relation - - if("disabilities") - if(text2num(href_list["disabilities"]) >= -1) - if(text2num(href_list["disabilities"]) >= 0) - disabilities ^= (1<= 50)) return - UI_style_alpha = UI_style_alpha_new - - if("be_special") - var/num = text2num(href_list["num"]) - be_special ^= (1<> savefile_version - //Conversion - if(!savefile_version || !isnum(savefile_version) || savefile_version < SAVEFILE_VERSION_MIN || savefile_version > SAVEFILE_VERSION_MAX) - if(!savefile_update()) //handles updates - savefile_version = SAVEFILE_VERSION_MAX - save_preferences() - save_character() + var/savefile/S + if (!config.sql_saves) + if (!path) return 0 + if (!fexists(path)) + return 0 + S = new /savefile(path) + if (!S) + return 0 + S.cd = "/" - //general preferences - S["ooccolor"] >> ooccolor - S["lastchangelog"] >> lastchangelog - S["UI_style"] >> UI_style - S["be_special"] >> be_special - S["default_slot"] >> default_slot - S["toggles"] >> toggles - S["UI_style_color"] >> UI_style_color - S["UI_style_alpha"] >> UI_style_alpha - S["asfx_togs"] >> asfx_togs - S["motd_hash"] >> motd_hash - S["memo_hash"] >> memo_hash + S["version"] >> savefile_version - //Sanitize - ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) - lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) - motd_hash = sanitize_text(motd_hash, initial(motd_hash)) - memo_hash = sanitize_text(memo_hash, initial(memo_hash)) - UI_style = sanitize_inlist(UI_style, list("White", "Midnight","Orange","old"), initial(UI_style)) - be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) - default_slot = sanitize_integer(default_slot, 1, config.character_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) - asfx_togs = sanitize_integer(asfx_togs, 0, 65535, initial(asfx_togs)) - UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) - UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) + player_setup.load_preferences(S) + + if (!config.sql_saves) + loaded_preferences = S return 1 /datum/preferences/proc/save_preferences() - if(!path) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" + var/savefile/S + if (!config.sql_saves) + if(!path) + return 0 + S = new /savefile(path) + if(!S) + return 0 + S.cd = "/" - S["version"] << savefile_version + S["version"] << SAVEFILE_VERSION_MAX - //general preferences - S["ooccolor"] << ooccolor - S["lastchangelog"] << lastchangelog - S["UI_style"] << UI_style - S["be_special"] << be_special - S["default_slot"] << default_slot - S["toggles"] << toggles - S["asfx_togs"] << asfx_togs - S["motd_hash"] << motd_hash - S["memo_hash"] << memo_hash + player_setup.save_preferences(S) + + if (!config.sql_saves) + loaded_preferences = S return 1 /datum/preferences/proc/load_character(slot) - if(!path) return 0 - if(!fexists(path)) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/" - if(!slot) slot = default_slot - slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot)) - if(slot != default_slot) - default_slot = slot - S["default_slot"] << slot - S.cd = "/character[slot]" + var/savefile/S + if (!config.sql_saves) + if (!path) + return 0 + if (!fexists(path)) + return 0 + S = new /savefile(path) + if (!S) + return 0 + S.cd = "/" + if (!slot) + slot = default_slot + slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot)) + if(slot != default_slot) + default_slot = slot + S["default_slot"] << slot + S.cd = "/character[slot]" + else + current_character = slot - //Character - S["OOC_Notes"] >> metadata - S["real_name"] >> real_name - S["name_is_always_random"] >> be_random_name - S["gender"] >> gender - S["age"] >> age - S["species"] >> species - S["language"] >> language - S["spawnpoint"] >> spawnpoint + player_setup.load_character(S) - //colors to be consolidated into hex strings (requires some work with dna code) - S["hair_red"] >> r_hair - S["hair_green"] >> g_hair - S["hair_blue"] >> b_hair - S["facial_red"] >> r_facial - S["facial_green"] >> g_facial - S["facial_blue"] >> b_facial - S["skin_tone"] >> s_tone - S["skin_red"] >> r_skin - S["skin_green"] >> g_skin - S["skin_blue"] >> b_skin - S["hair_style_name"] >> h_style - S["facial_style_name"] >> f_style - S["eyes_red"] >> r_eyes - S["eyes_green"] >> g_eyes - S["eyes_blue"] >> b_eyes - S["underwear"] >> underwear - S["undershirt"] >> undershirt - S["backbag"] >> backbag - S["b_type"] >> b_type - - //Jobs - S["alternate_option"] >> alternate_option - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low - - //Flavour Text - S["flavor_texts_general"] >> flavor_texts["general"] - S["flavor_texts_head"] >> flavor_texts["head"] - S["flavor_texts_face"] >> flavor_texts["face"] - S["flavor_texts_eyes"] >> flavor_texts["eyes"] - S["flavor_texts_torso"] >> flavor_texts["torso"] - S["flavor_texts_arms"] >> flavor_texts["arms"] - S["flavor_texts_hands"] >> flavor_texts["hands"] - S["flavor_texts_legs"] >> flavor_texts["legs"] - S["flavor_texts_feet"] >> flavor_texts["feet"] - - //Flavour text for robots. - S["flavour_texts_robot_Default"] >> flavour_texts_robot["Default"] - for(var/module in robot_module_types) - S["flavour_texts_robot_[module]"] >> flavour_texts_robot[module] - - //Miscellaneous - S["med_record"] >> med_record - S["sec_record"] >> sec_record - S["gen_record"] >> gen_record - S["be_special"] >> be_special - S["disabilities"] >> disabilities - S["player_alt_titles"] >> player_alt_titles - S["used_skillpoints"] >> used_skillpoints - S["skills"] >> skills - S["skill_specialization"] >> skill_specialization - S["organ_data"] >> organ_data - S["rlimb_data"] >> rlimb_data - S["gear"] >> gear - S["home_system"] >> home_system - S["citizenship"] >> citizenship - S["faction"] >> faction - S["religion"] >> religion - - S["nanotrasen_relation"] >> nanotrasen_relation - //S["skin_style"] >> skin_style - - S["uplinklocation"] >> uplinklocation - S["exploit_record"] >> exploit_record - - S["UI_style_color"] << UI_style_color - S["UI_style_alpha"] << UI_style_alpha - - //Sanitize - metadata = sanitize_text(metadata, initial(metadata)) - real_name = sanitizeName(real_name) - - if(isnull(species) || !(species in playable_species)) - species = "Human" - - if(isnum(underwear)) - var/list/undies = gender == MALE ? underwear_m : underwear_f - underwear = undies[undies[underwear]] - - if(isnum(undershirt)) - undershirt = undershirt_t[undershirt_t[undershirt]] - - if(isnull(language)) language = "None" - if(isnull(spawnpoint)) spawnpoint = "Arrivals Shuttle" - if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation) - if(!real_name) real_name = random_name(gender) - be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) - gender = sanitize_gender(gender) - age = sanitize_integer(age, getMinAge(), getMaxAge(), initial(age)) - r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) - g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) - b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) - r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) - g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) - b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) - s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) - r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) - g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) - b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) - h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) - f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) - r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) - g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) - b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) - backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) - b_type = sanitize_text(b_type, initial(b_type)) - - alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) - - if(!skills) skills = list() - if(!used_skillpoints) used_skillpoints= 0 - if(isnull(disabilities)) disabilities = 0 - if(!player_alt_titles) player_alt_titles = new() - if(!organ_data) src.organ_data = list() - if(!rlimb_data) src.rlimb_data = list() - if(!gear) src.gear = list() - //if(!skin_style) skin_style = "Default" - - if(!home_system) home_system = "Unset" - if(!citizenship) citizenship = "None" - if(!faction) faction = "None" - if(!religion) religion = "None" + if (!config.sql_saves) + loaded_character = S return 1 /datum/preferences/proc/save_character() - if(!path) return 0 - var/savefile/S = new /savefile(path) - if(!S) return 0 - S.cd = "/character[default_slot]" + var/savefile/S + if (!config.sql_saves) + if(!path) + return 0 + S = new /savefile(path) + if(!S) + return 0 + S.cd = "/character[default_slot]" - //Character - S["OOC_Notes"] << metadata - S["real_name"] << real_name - S["name_is_always_random"] << be_random_name - S["gender"] << gender - S["age"] << age - S["species"] << species - S["language"] << language - S["hair_red"] << r_hair - S["hair_green"] << g_hair - S["hair_blue"] << b_hair - S["facial_red"] << r_facial - S["facial_green"] << g_facial - S["facial_blue"] << b_facial - S["skin_tone"] << s_tone - S["skin_red"] << r_skin - S["skin_green"] << g_skin - S["skin_blue"] << b_skin - S["hair_style_name"] << h_style - S["facial_style_name"] << f_style - S["eyes_red"] << r_eyes - S["eyes_green"] << g_eyes - S["eyes_blue"] << b_eyes - S["underwear"] << underwear - S["undershirt"] << undershirt - S["backbag"] << backbag - S["b_type"] << b_type - S["spawnpoint"] << spawnpoint + S["version"] << SAVEFILE_VERSION_MAX - //Jobs - S["alternate_option"] << alternate_option - S["job_civilian_high"] << job_civilian_high - S["job_civilian_med"] << job_civilian_med - S["job_civilian_low"] << job_civilian_low - S["job_medsci_high"] << job_medsci_high - S["job_medsci_med"] << job_medsci_med - S["job_medsci_low"] << job_medsci_low - S["job_engsec_high"] << job_engsec_high - S["job_engsec_med"] << job_engsec_med - S["job_engsec_low"] << job_engsec_low + player_setup.save_character(S) - //Flavour Text - S["flavor_texts_general"] << flavor_texts["general"] - S["flavor_texts_head"] << flavor_texts["head"] - S["flavor_texts_face"] << flavor_texts["face"] - S["flavor_texts_eyes"] << flavor_texts["eyes"] - S["flavor_texts_torso"] << flavor_texts["torso"] - S["flavor_texts_arms"] << flavor_texts["arms"] - S["flavor_texts_hands"] << flavor_texts["hands"] - S["flavor_texts_legs"] << flavor_texts["legs"] - S["flavor_texts_feet"] << flavor_texts["feet"] + if (!config.sql_saves) + loaded_character = S - //Flavour text for robots. - S["flavour_texts_robot_Default"] << flavour_texts_robot["Default"] - for(var/module in robot_module_types) - S["flavour_texts_robot_[module]"] << flavour_texts_robot[module] - - //Miscellaneous - S["med_record"] << med_record - S["sec_record"] << sec_record - S["gen_record"] << gen_record - S["player_alt_titles"] << player_alt_titles - S["be_special"] << be_special - S["disabilities"] << disabilities - S["used_skillpoints"] << used_skillpoints - S["skills"] << skills - S["skill_specialization"] << skill_specialization - S["organ_data"] << organ_data - S["rlimb_data"] << rlimb_data - S["gear"] << gear - S["home_system"] << home_system - S["citizenship"] << citizenship - S["faction"] << faction - S["religion"] << religion - - S["nanotrasen_relation"] << nanotrasen_relation - //S["skin_style"] << skin_style - - S["uplinklocation"] << uplinklocation - S["exploit_record"] << exploit_record - - S["UI_style_color"] << UI_style_color - S["UI_style_alpha"] << UI_style_alpha + return S +/datum/preferences/proc/sanitize_preferences() + player_setup.sanitize_setup() return 1 +/datum/preferences/proc/update_setup(var/savefile/preferences, var/savefile/character) + if(!preferences || !character) + return 0 + return player_setup.update_setup(preferences, character) #undef SAVEFILE_VERSION_MAX #undef SAVEFILE_VERSION_MIN diff --git a/code/modules/client/preferences_sql.dm b/code/modules/client/preferences_sql.dm deleted file mode 100644 index 273b961b4cd..00000000000 --- a/code/modules/client/preferences_sql.dm +++ /dev/null @@ -1,709 +0,0 @@ -/datum/preferences/proc/load_preferences_sql(var/client/C) - if (!C) - return 0 - - var/DBQuery/query = dbcon.NewQuery({"SELECT - ooccolor, - lastchangelog, - UI_style, - current_character, - toggles, - UI_style_color, - UI_style_alpha, - be_special, - asfx_togs, - motd_hash, - memo_hash - FROM ss13_player_preferences - WHERE ckey = :ckey"}) - query.Execute(list(":ckey" = C.ckey)) - - if (!query.NextRow()) - return insert_preferences_sql(C) - - ooccolor = query.item[1] - lastchangelog = query.item[2] - UI_style = query.item[3] - current_character = text2num(query.item[4]) - toggles = text2num(query.item[5]) - UI_style_color = query.item[6] - UI_style_alpha = text2num(query.item[7]) - be_special = text2num(query.item[8]) - asfx_togs = text2num(query.item[9]) - motd_hash = query.item[10] - memo_hash = query.item[11] - - //Sanitize - ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) - lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) - motd_hash = sanitize_text(motd_hash, initial(motd_hash)) - memo_hash = sanitize_text(memo_hash, initial(memo_hash)) - UI_style = sanitize_inlist(UI_style, list("White", "Midnight","Orange","old"), initial(UI_style)) - be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) - default_slot = sanitize_integer(default_slot, 1, config.character_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) - asfx_togs = sanitize_integer(asfx_togs, 0, 65535, initial(asfx_togs)) - UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) - UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) - - return 1 - -/datum/preferences/proc/save_preferences_sql(var/client/C) - if (!C) - return 0 - - var/DBQuery/initial_query = dbcon.NewQuery("SELECT COUNT(*) AS rowsFound FROM ss13_player_preferences WHERE ckey = :ckey") - initial_query.Execute(list(":ckey" = C.ckey)) - - if (!initial_query.NextRow()) - return insert_preferences_sql(C) - - var/DBQuery/update_query = dbcon.NewQuery({"UPDATE ss13_player_preferences SET - ooccolor = :ooccolor, - lastchangelog = :lastchangelog, - UI_style = :ui_style, - current_character = :current_character, - toggles = :toggles, - UI_style_color = :ui_color, - UI_style_alpha = :ui_alpha, - be_special = :be_special, - asfx_togs = :asfx_togs, - motd_hash = :motd_hash, - memo_hash = :memo_hash - WHERE ckey = :ckey"}) - update_query.Execute(get_prefs_update_insert_params(C)) - - return 1 - -/datum/preferences/proc/insert_preferences_sql(var/client/C) - if (!C) - return 0 - - var/DBQuery/query = dbcon.NewQuery({"INSERT INTO ss13_player_preferences (ckey, ooccolor, lastchangelog, UI_style, current_character, toggles, UI_style_color, UI_style_alpha, be_special, asfx_togs, motd_hash, memo_hash) - VALUES (:ckey, :ooccolor, :lastchangelog, :ui_style, :current_character, :toggles, :ui_color, :ui_alpha, :be_special, :asfx_togs, :motd_hash, :memo_hash);"}) - query.Execute(get_prefs_update_insert_params(C)) - - return 1 - -//Helper function. -/datum/preferences/proc/get_prefs_update_insert_params(var/client/C) - var/params[] = list() - - params[":ckey"] = C.ckey - - params[":ooccolor"] = ooccolor - params[":lastchangelog"] = lastchangelog - params[":ui_style"] = UI_style - params[":current_character"] = current_character - params[":toggles"] = toggles - params[":ui_color"] = UI_style_color - params[":ui_alpha"] = UI_style_alpha - params[":be_special"] = be_special - params[":asfx_togs"] = asfx_togs - params[":motd_hash"] = motd_hash - params[":memo_hash"] = memo_hash - - return params - -/datum/preferences/proc/load_character_sql(slot, var/client/C) - if (!C) - return 0 - - if (!slot || slot == 0) - return new_character_sql(C) - - current_character = slot - - establish_db_connection(dbcon) - if (!dbcon.IsConnected()) - error("Error attempting to connect to MySQL server while loading a character.") - return 0 - - var/DBQuery/initial_query = dbcon.NewQuery("SELECT name FROM ss13_characters WHERE id = :character_id AND ckey = :ckey") - initial_query.Execute(list(":character_id" = current_character, ":ckey" = C.ckey)) - - // In case someone got themselves an invalid character ID. - if (!initial_query.NextRow()) - error("[C.ckey] attempted to load character #[current_character] and failed. No such character found.") - new_character_sql(C) - return 0 - - var/DBQuery/character_query = dbcon.NewQuery({"SELECT - dat.name, - dat.metadata, - dat.random_name, - dat.gender, - dat.age, - dat.species, - dat.language, - dat.spawnpoint, - dat.hair_colour, - dat.facial_colour, - dat.skin_tone, - dat.skin_colour, - dat.hair_style, - dat.facial_style, - dat.eyes_colour, - dat.underwear, - dat.undershirt, - dat.backbag, - dat.b_type, - dat.jobs, - dat.alternate_option, - dat.alternate_titles, - flv.flavour_general, - flv.flavour_head, - flv.flavour_face, - flv.flavour_eyes, - flv.flavour_torso, - flv.flavour_arms, - flv.flavour_hands, - flv.flavour_legs, - flv.flavour_feet, - flv.robot_default, - flv.robot_standard, - flv.robot_engineering, - flv.robot_construction, - flv.robot_medical, - flv.robot_rescue, - flv.robot_miner, - flv.robot_custodial, - flv.robot_service, - flv.robot_clerical, - flv.robot_security, - flv.robot_research, - flv.records_employment, - flv.records_medical, - flv.records_security, - flv.records_exploit, - dat.disabilities, - dat.skills, - dat.skills_specialization, - dat.home_system, - dat.citizenship, - dat.faction, - dat.religion, - dat.nt_relation, - dat.uplink_location, - dat.organs_data, - dat.organs_robotic, - dat.gear, - flv.records_ccia - FROM ss13_characters dat - JOIN ss13_characters_flavour flv ON dat.id = flv.char_id - WHERE dat.id = :char_id"}) - if (!character_query.Execute(list(":char_id" = current_character))) - error("Error loading character #[current_character]. SQL error message: '[character_query.ErrorMsg()]'.") - new_character_sql(C) - return 0 - - if (!character_query.NextRow()) - error("Error loading character #[current_character]. No such character exists.") - new_character_sql(C) - return 0 - - var/DBQuery/ccia_action_query = dbcon.NewQuery({"SELECT - act.title, - act.type, - act.issuedby, - act.details, - act.url, - act.expires_at - FROM ss13_ccia_action_char act_chr - JOIN ss13_characters chr ON act_chr.char_id = chr.id - JOIN ss13_ccia_actions act ON act_chr.action_id = act.id - WHERE - act_chr.char_id = ':char_id' AND - (act.expires_at IS NULL OR act.expires_at >= CURRENT_DATE()) AND - act.deleted_at IS NULL; - "}) - if (!ccia_action_query.Execute(list(":char_id" = current_character))) - error("Error CCIA Actions for character #[current_character]. SQL error message: '[character_query.ErrorMsg()]'.") - - while(ccia_action_query.NextRow()) - var/list/action = list( - ccia_action_query.item[1], - ccia_action_query.item[2], - ccia_action_query.item[3], - ccia_action_query.item[4], - ccia_action_query.item[5], - ccia_action_query.item[6] - ) - ccia_actions.Add(list(action)) - - var/DBQuery/char_id_update = dbcon.NewQuery("UPDATE ss13_player_preferences SET current_character = :char_id WHERE ckey = :ckey") - char_id_update.Execute(list(":char_id" = current_character, ":ckey" = C.ckey)) - - // Character - real_name = character_query.item[1] - metadata = character_query.item[2] - be_random_name = text2num(character_query.item[3]) - gender = character_query.item[4] - age = text2num(character_query.item[5]) - species = character_query.item[6] - language = character_query.item[7] - spawnpoint = character_query.item[8] - - // Other customization data - var/list/hair_rgb = length(character_query.item[9]) == 7 ? GetHexColors(character_query.item[9]) : null - if (hair_rgb) - r_hair = hair_rgb[1] - g_hair = hair_rgb[2] - b_hair = hair_rgb[3] - var/list/facial_rgb = length(character_query.item[10]) == 7 ? GetHexColors(character_query.item[10]) : null - if (facial_rgb) - r_facial = facial_rgb[1] - g_facial = facial_rgb[2] - b_facial = facial_rgb[3] - s_tone = text2num(character_query.item[11]) - var/list/skin_rgb = length(character_query.item[12]) == 7 ? GetHexColors(character_query.item[12]) : null - if (skin_rgb) - r_skin = skin_rgb[1] - g_skin = skin_rgb[2] - b_skin = skin_rgb[3] - h_style = character_query.item[13] - f_style = character_query.item[14] - var/list/eyes_rgb = length(character_query.item[15]) == 7 ? GetHexColors(character_query.item[15]) : null - if (eyes_rgb) - r_eyes = eyes_rgb[1] - g_eyes = eyes_rgb[2] - b_eyes = eyes_rgb[3] - underwear = character_query.item[16] - undershirt = character_query.item[17] - backbag = text2num(character_query.item[18]) - b_type = character_query.item[19] - - var/list/jobs_list = params2list(character_query.item[20]) - - // Job preferences + alt titles and options - if (jobs_list.len == 9) - job_civilian_high = text2num(jobs_list["civ_high"]) - job_civilian_med = text2num(jobs_list["civ_med"]) - job_civilian_low = text2num(jobs_list["civ_low"]) - job_medsci_high = text2num(jobs_list["medsci_high"]) - job_medsci_med = text2num(jobs_list["medsci_med"]) - job_medsci_low = text2num(jobs_list["medsci_low"]) - job_engsec_high = text2num(jobs_list["engsec_high"]) - job_engsec_med = text2num(jobs_list["engsec_med"]) - job_engsec_low = text2num(jobs_list["engsec_low"]) - - alternate_option = text2num(character_query.item[21]) - player_alt_titles = params2list(character_query.item[22]) - - // Flavour texts - flavor_texts["general"] = character_query.item[23] - flavor_texts["head"] = character_query.item[24] - flavor_texts["face"] = character_query.item[25] - flavor_texts["eyes"] = character_query.item[26] - flavor_texts["torso"] = character_query.item[27] - flavor_texts["arms"] = character_query.item[28] - flavor_texts["hands"] = character_query.item[29] - flavor_texts["legs"] = character_query.item[30] - flavor_texts["feet"] = character_query.item[31] - - flavour_texts_robot["Default"] = character_query.item[32] - flavour_texts_robot["Standard"] = character_query.item[33] - flavour_texts_robot["Engineering"] = character_query.item[34] - flavour_texts_robot["Construction"] = character_query.item[35] - flavour_texts_robot["Medical"] = character_query.item[36] - flavour_texts_robot["Rescue"] = character_query.item[37] - flavour_texts_robot["Miner"] = character_query.item[38] - flavour_texts_robot["Custodial"] = character_query.item[39] - flavour_texts_robot["Service"] = character_query.item[40] - flavour_texts_robot["Clerical"] = character_query.item[41] - flavour_texts_robot["Security"] = character_query.item[42] - flavour_texts_robot["Research"] = character_query.item[43] - - // Records - gen_record = character_query.item[44] - med_record = character_query.item[45] - sec_record = character_query.item[46] - exploit_record = character_query.item[47] - ccia_record = character_query.item[60] - - // Miscellaneous - disabilities = text2num(character_query.item[48]) - skills = params2list(character_query.item[49]) - - for (var/skill in skills) - if (skills[skill]) - skills[skill] = text2num(skills[skill]) - - skill_specialization = character_query.item[50] - home_system = character_query.item[51] - citizenship = character_query.item[52] - faction = character_query.item[53] - religion = character_query.item[54] - nanotrasen_relation = character_query.item[55] - - uplinklocation = character_query.item[56] - - organ_data = params2list(character_query.item[57]) - rlimb_data = params2list(character_query.item[58]) - gear = params2list(character_query.item[59]) - - // Sanitization - metadata = sanitize_text(metadata, initial(metadata)) - real_name = sanitizeName(real_name) - - if (isnull(species) || !(species in playable_species)) - species = "Human" - - if (isnum(underwear)) - var/list/undies = gender == MALE ? underwear_m : underwear_f - underwear = undies[undies[underwear]] - - if (isnum(undershirt)) - undershirt = undershirt_t[undershirt_t[undershirt]] - - if (isnull(language)) language = "None" - if (isnull(spawnpoint)) spawnpoint = "Arrivals Shuttle" - if (isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation) - if (!real_name) real_name = random_name(gender) - be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) - gender = sanitize_gender(gender) - age = sanitize_integer(age, getMinAge(), getMaxAge(), initial(age)) - r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) - g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) - b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) - r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) - g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) - b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) - s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) - r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) - g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) - b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) - h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) - f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) - r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) - g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) - b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) - backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) - b_type = sanitize_text(b_type, initial(b_type)) - - alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) - - if (!skills) ZeroSkills(1) - if (skills.len) CalculateSkillPoints() - if (!used_skillpoints) used_skillpoints = 0 - if (isnull(disabilities)) disabilities = 0 - if (!player_alt_titles) player_alt_titles = new() - if (!organ_data) organ_data = list() - if (!rlimb_data) rlimb_data = list() - if (!gear) gear = list() - - if (!home_system) home_system = "Unset" - if (!citizenship) citizenship = "None" - if (!faction) faction = "None" - if (!religion) religion = "None" - - load_character_contest(slot) - - return 1 - -/datum/preferences/proc/save_character_sql(var/client/C) - if (!C) - return 0 - - if (!current_character) - return insert_character_sql(C) - - establish_db_connection(dbcon) - if (!dbcon.IsConnected()) - error("Error attempting to connect to MySQL server while saving a character.") - return 0 - - var/DBQuery/initial_query = dbcon.NewQuery("SELECT COUNT(*) AS rowCount FROM ss13_characters WHERE id = :char_id") - initial_query.Execute(list(":char_id" = current_character)) - - if (!initial_query.NextRow()) - current_character = 0 - return insert_character_sql(C) - - var/DBQuery/update_query = dbcon.NewQuery({"UPDATE ss13_characters dat - JOIN ss13_characters_flavour flv ON dat.id = flv.char_id - SET - dat.name = :real_name, - dat.metadata = :metadata, - dat.random_name = :is_random, - dat.gender = :gender, - dat.age = :age, - dat.species = :species, - dat.language = :language, - dat.spawnpoint = :spawnpoint, - dat.hair_colour = :hair_colour, - dat.facial_colour = :facial_colour, - dat.skin_tone = :skin_tone, - dat.skin_colour = :skin_colour, - dat.hair_style = :hair_style, - dat.facial_style = :facial_style, - dat.eyes_colour = :eyes_colour, - dat.underwear = :underwear, - dat.undershirt = :undershirt, - dat.backbag = :backbag, - dat.b_type = :b_type, - dat.jobs = :jobs, - dat.alternate_option = :alternate_option, - dat.alternate_titles = :alternate_titles, - dat.disabilities = :disabilities, - dat.skills = :skills, - dat.skills_specialization = :specialization, - dat.home_system = :home_system, - dat.citizenship = :citizenship, - dat.faction = :faction, - dat.religion = :religion, - dat.nt_relation = :nt_relation, - dat.uplink_location = :uplink_loc, - dat.organs_data = :organ_data, - dat.organs_robotic = :organs_robotic, - dat.gear = :gear, - flv.flavour_general = :flv_general, - flv.flavour_head = :flv_head, - flv.flavour_face = :flv_face, - flv.flavour_eyes = :flv_eyes, - flv.flavour_torso = :flv_torso, - flv.flavour_arms = :flv_arms, - flv.flavour_hands = :flv_hands, - flv.flavour_legs = :flv_legs, - flv.flavour_feet = :flv_feet, - flv.robot_default = :robot_default, - flv.robot_standard = :robot_standard, - flv.robot_engineering = :robot_engineering, - flv.robot_construction = :robot_construction, - flv.robot_medical = :robot_medical, - flv.robot_rescue = :robot_rescue, - flv.robot_miner = :robot_miner, - flv.robot_custodial = :robot_custodial, - flv.robot_service = :robot_service, - flv.robot_clerical = :robot_clerical, - flv.robot_security = :robot_security, - flv.robot_research = :robot_research, - flv.records_medical = :med_rec, - flv.records_security = :sec_rec, - flv.records_employment = :gen_rec, - flv.records_exploit = :exploit_record - WHERE dat.id = :char_id"}) - - update_query.Execute(get_update_insert_params()) - - if (update_query.ErrorMsg()) - error("Error updating character #[current_character]: [update_query.ErrorMsg()]") - return 0 - - return 1 - -/datum/preferences/proc/insert_character_sql(var/client/C) - if (!C) - return 0 - - establish_db_connection(dbcon) - if (!dbcon.IsConnected()) - error("Error attempting to connect to MySQL server while inserting a character.") - return 0 - - var/params[] = get_update_insert_params(0, C) - - var/DBQuery/insert_query = dbcon.NewQuery({"INSERT INTO ss13_characters (id, ckey, name, metadata, random_name, gender, age, species, language, hair_colour, facial_colour, skin_tone, skin_colour, hair_style, facial_style, eyes_colour, underwear, undershirt, backbag, b_type, spawnpoint, jobs, alternate_option, alternate_titles, disabilities, skills, skills_specialization, home_system, citizenship, faction, religion, nt_relation, uplink_location, organs_data, organs_robotic, gear) - VALUES (NULL, :ckey, :real_name, :metadata, :is_random, :gender, :age, :species, :language, :hair_colour, :facial_colour, :skin_tone, :skin_colour, :hair_style, :facial_style, :eyes_colour, :underwear, :undershirt, :backbag, :b_type, :spawnpoint, :jobs, :alternate_option, :alternate_titles, :disabilities, :skills, :specialization, :home_system, :citizenship, :faction, :religion, :nt_relation, :uplink_loc, :organ_data, :organs_robotic, :gear);"}) - insert_query.Execute(params, 1) - - if (insert_query.ErrorMsg()) - return 0 - - var/DBQuery/get_query = dbcon.NewQuery("SELECT id FROM ss13_characters WHERE ckey = :ckey AND name = :real_name ORDER BY id DESC LIMIT 1;") - get_query.Execute(list(":ckey" = C.ckey, ":real_name" = real_name)) - - if (get_query.NextRow()) - current_character = text2num(get_query.item[1]) - params[":char_id"] = current_character - - insert_query = dbcon.NewQuery({"INSERT INTO ss13_characters_flavour (char_id, records_employment, records_medical, records_security, records_exploit, flavour_general, flavour_head, flavour_face, flavour_eyes, flavour_torso, flavour_arms, flavour_hands, flavour_legs, flavour_feet, robot_default, robot_standard, robot_engineering, robot_construction, robot_medical, robot_rescue, robot_miner, robot_custodial, robot_service, robot_clerical, robot_security, robot_research) - VALUES (:char_id, :gen_rec, :med_rec, :sec_rec, :exploit_record, :flv_general, :flv_head, :flv_face, :flv_eyes, :flv_torso, :flv_arms, :flv_hands, :flv_legs, :flv_feet, :robot_default, :robot_standard, :robot_engineering, :robot_construction, :robot_medical, :robot_rescue, :robot_miner, :robot_custodial, :robot_service, :robot_clerical, :robot_security, :robot_research);"}) - insert_query.Execute(params, 1) - - if (insert_query.ErrorMsg()) - return 0 - - return 1 - -// Helper function. -// Returns an array to be used in save_character_sql and insert_character_sql. -/datum/preferences/proc/get_update_insert_params(var/include_id = 1, var/client/C = null) - var/hair_hex = "#" + num2hex(r_hair) + num2hex(g_hair) + num2hex(b_hair) - var/facial_hex = "#" + num2hex(r_facial) + num2hex(g_facial) + num2hex(b_facial) - var/eyes_hex = "#" + num2hex(r_eyes) + num2hex(g_eyes) + num2hex(b_eyes) - var/skin_hex = "#" + num2hex(r_skin) + num2hex(g_skin) + num2hex(b_skin) - - var/language_string = "None" - if (!istext(language)) - if (istype(language, /datum/language)) - for (var/L in all_languages) - if (language == all_languages[L]) - language_string = L - break - else - language_string = language - - var/jobs_list[] = list() - jobs_list["civ_high"] = job_civilian_high - jobs_list["civ_med"] = job_civilian_med - jobs_list["civ_low"] = job_civilian_low - jobs_list["medsci_high"] = job_medsci_high - jobs_list["medsci_med"] = job_medsci_med - jobs_list["medsci_low"] = job_medsci_low - jobs_list["engsec_high"] = job_engsec_high - jobs_list["engsec_med"] = job_engsec_med - jobs_list["engsec_low"] = job_engsec_low - - var/params[] = list() - - params[":real_name"] = real_name - params[":metadata"] = metadata - params[":is_random"] = be_random_name - params[":gender"] = gender - params[":age"] = age - params[":species"] = species - params[":language"] = language_string - params[":spawnpoint"] = spawnpoint - params[":hair_colour"] = hair_hex - params[":facial_colour"] = facial_hex - params[":skin_tone"] = s_tone - params[":skin_colour"] = skin_hex - - if (istext(h_style)) - params[":hair_style"] = h_style - else if (istype(h_style, /datum/sprite_accessory/hair)) - var/datum/sprite_accessory/hair/current_h = h_style - params[":hair_style"] = current_h.name - else - params[":hair_style"] = "Bald" - - if (istext(f_style)) - params[":facial_style"] = f_style - else if (istype(h_style, /datum/sprite_accessory/facial_hair)) - var/datum/sprite_accessory/facial_hair/current_f = f_style - params[":facial_style"] = current_f.name - else - params[":facial_style"] = "Shaved" - - params[":eyes_colour"] = eyes_hex - params[":underwear"] = underwear - params[":undershirt"] = undershirt - params[":backbag"] = backbag - params[":b_type"] = b_type - - params[":alternate_option"] = alternate_option - params[":jobs"] = list2params(jobs_list) - params[":alternate_titles"] = list2params(player_alt_titles) - - params[":flv_general"] = flavor_texts["general"] - params[":flv_head"] = flavor_texts["head"] - params[":flv_face"] = flavor_texts["face"] - params[":flv_eyes"] = flavor_texts["eyes"] - params[":flv_torso"] = flavor_texts["torso"] - params[":flv_arms"] = flavor_texts["arms"] - params[":flv_hands"] = flavor_texts["hands"] - params[":flv_legs"] = flavor_texts["legs"] - params[":flv_feet"] = flavor_texts["feet"] - params[":robot_default"] = flavour_texts_robot["Default"] - params[":robot_standard"] = flavour_texts_robot["Standard"] - params[":robot_engineering"] = flavour_texts_robot["Engineering"] - params[":robot_construction"] = flavour_texts_robot["Construction"] - params[":robot_medical"] = flavour_texts_robot["Medical"] - params[":robot_rescue"] = flavour_texts_robot["Rescue"] - params[":robot_miner"] = flavour_texts_robot["Miner"] - params[":robot_custodial"] = flavour_texts_robot["Custodial"] - params[":robot_service"] = flavour_texts_robot["Service"] - params[":robot_clerical"] = flavour_texts_robot["Clerical"] - params[":robot_security"] = flavour_texts_robot["Security"] - params[":robot_research"] = flavour_texts_robot["Research"] - - params[":med_rec"] = med_record - params[":sec_rec"] = sec_record - params[":gen_rec"] = gen_record - params[":disabilities"] = disabilities - params[":skills"] = list2params(skills) - params[":specialization"] = skill_specialization - params[":home_system"] = home_system - params[":citizenship"] = citizenship - params[":faction"] = faction - params[":religion"] = religion - params[":nt_relation"] = nanotrasen_relation - params[":uplink_loc"] = uplinklocation - params[":exploit_record"] = exploit_record - params[":organ_data"] = list2params(organ_data) - params[":organs_robotic"] = list2params(rlimb_data) - params[":gear"] = list2params(gear) - - if (include_id) - params[":char_id"] = current_character - - if (C) - params[":ckey"] = C.ckey - - return params - -/datum/preferences/proc/new_character_sql(var/client/C) - if (!C) - return 0 - - current_character = 0 - - var/DBQuery/char_id_update = dbcon.NewQuery("UPDATE ss13_player_preferences SET current_character = '0' WHERE ckey = :ckey") - char_id_update.Execute(list(":ckey" = C.ckey)) - - species = "Human" - language = "None" - spawnpoint = "Arrivals Shuttle" - nanotrasen_relation = initial(nanotrasen_relation) - - gender = pick(MALE, FEMALE) - real_name = random_name(gender, species) - gear = list() - - b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") - return 1 - -/datum/preferences/proc/delete_character_sql(var/client/C) - if (!C) - return 0 - - if (!current_character) - return 0 - - if (alert(C.mob, "This will permanently delete the character. Are you sure you wish to do this?", "Delete Character" ,"Yes", "No") == "No") - return 0 - - establish_db_connection(dbcon) - if (!dbcon.IsConnected()) - error("Error attempting to connect to MySQL server while deleting a character.") - return 0 - - var/DBQuery/query = dbcon.NewQuery("SELECT COUNT(*) AS rowCount FROM ss13_characters WHERE id = :char_id AND ckey = :ckey") - query.Execute(list(":char_id" = current_character, ":ckey" = C.ckey)) - - if (!query.NextRow()) - return 0 - - var/DBQuery/delete_query = dbcon.NewQuery("UPDATE ss13_characters SET deleted_at = NOW() WHERE id = :id") - delete_query.Execute(list(":id" = current_character)) - - var/DBQuery/select_query = dbcon.NewQuery("SELECT id FROM ss13_characters WHERE ckey = :ckey AND deleted_at IS NULL ORDER BY id ASC LIMIT 1") - select_query.Execute(list(":ckey" = C.ckey)) - - if (select_query.NextRow()) - load_character_sql(text2num(select_query.item[1]), C) - else - new_character_sql(C) - - C << "Your character has been deleted from the database." - return 1 diff --git a/code/modules/client/preferences_system_control.dm b/code/modules/client/preferences_system_control.dm deleted file mode 100644 index 62d317849da..00000000000 --- a/code/modules/client/preferences_system_control.dm +++ /dev/null @@ -1,35 +0,0 @@ -/* - * These procs manage the calling of savefile or SQL oriented save and load procs for characters and preference data. - * This way of doing it is necessary for migration to be possible without a huge load of hacks. - * Will also ensure in neat and modular compatibility between the two systems, and the potential introduction of further systems. - */ - -/datum/preferences/proc/handle_preferences_load(var/client/C) - if (config.sql_saves) - return load_preferences_sql(C) - else - return load_preferences() - -/datum/preferences/proc/handle_preferences_save(var/client/C) - if (config.sql_saves) - return save_preferences_sql(C) - else - return save_preferences() - -/datum/preferences/proc/handle_character_load(var/slot = 0, var/client/C) - if (config.sql_saves) - return load_character_sql(slot, C) - else - return load_character(slot) - -/datum/preferences/proc/handle_character_save(var/client/C) - if (config.sql_saves) - return save_character_sql(C) - else - return save_character() - -/datum/preferences/proc/get_default_character() - if (config.sql_saves) - return current_character - else - return default_slot diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 9fe2e94dc5a..b2d0958dbd5 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -5,7 +5,7 @@ set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs" prefs.toggles ^= CHAT_GHOSTEARS src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"]." - prefs.handle_preferences_save(src) + prefs.save_preferences() feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_sight() @@ -14,7 +14,7 @@ set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs" prefs.toggles ^= CHAT_GHOSTSIGHT src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"]." - prefs.handle_preferences_save(src) + prefs.save_preferences() feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_radio() @@ -23,7 +23,7 @@ set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers" prefs.toggles ^= CHAT_GHOSTRADIO src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"]." - prefs.handle_preferences_save(src) + prefs.save_preferences() feedback_add_details("admin_verb","TGR") /client/proc/toggle_hear_radio() @@ -32,7 +32,7 @@ set desc = "Toggle seeing radiochatter from radios and speakers" if(!holder) return prefs.toggles ^= CHAT_RADIO - prefs.handle_preferences_save(src) + prefs.save_preferences() usr << "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers" feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -42,7 +42,7 @@ set desc = "Toggle hearing a notification when admin PMs are recieved" if(!holder) return prefs.toggles ^= SOUND_ADMINHELP - prefs.handle_preferences_save(src) + prefs.save_preferences() usr << "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive." feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -51,7 +51,7 @@ set category = "Preferences" set desc ="Toggles seeing deadchat" prefs.toggles ^= CHAT_DEAD - prefs.handle_preferences_save(src) + prefs.save_preferences() if(src.holder) src << "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat." @@ -65,7 +65,7 @@ set category = "Preferences" set desc = "Toggles seeing prayers" prefs.toggles ^= CHAT_PRAYER - prefs.handle_preferences_save(src) + prefs.save_preferences() src << "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat." feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -74,7 +74,7 @@ set category = "Preferences" set desc = "Toggles hearing the GameLobby music" prefs.toggles ^= SOUND_LOBBY - prefs.handle_preferences_save(src) + prefs.save_preferences() if(prefs.toggles & SOUND_LOBBY) src << "You will now hear music in the game lobby." if(istype(mob, /mob/new_player)) @@ -90,7 +90,7 @@ set category = "Preferences" set desc = "Toggles hearing sounds uploaded by admins" prefs.toggles ^= SOUND_MIDI - prefs.handle_preferences_save(src) + prefs.save_preferences() if(prefs.toggles & SOUND_MIDI) src << "You will now hear any sounds uploaded by admins." var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777) @@ -105,7 +105,7 @@ set category = "Preferences" set desc = "Toggles seeing OutOfCharacter chat" prefs.toggles ^= CHAT_OOC - prefs.handle_preferences_save(src) + prefs.save_preferences() src << "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel." feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -115,7 +115,7 @@ set category = "Preferences" set desc = "Toggles seeing Local OutOfCharacter chat" prefs.toggles ^= CHAT_LOOC - prefs.handle_preferences_save(src) + prefs.save_preferences() src << "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel." feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -126,7 +126,7 @@ set category = "Preferences" set desc = "Toggles seeing chat tags/icons" prefs.toggles ^= CHAT_NOICONS - prefs.handle_preferences_save(src) + prefs.save_preferences() src << "You will [!(prefs.toggles & CHAT_NOICONS) ? "now" : "no longer"] see chat tag icons." feedback_add_details("admin_verb","TCTAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -137,7 +137,7 @@ set category = "Preferences" set desc = "Toggles hearing ambient sound effects" prefs.toggles ^= SOUND_AMBIENCE - prefs.handle_preferences_save(src) + prefs.save_preferences() if(prefs.toggles & SOUND_AMBIENCE) src << "You will now hear ambient sounds." else @@ -145,53 +145,3 @@ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -//be special -/client/verb/toggle_be_special(role in be_special_flags) - set name = "Toggle SpecialRole Candidacy" - set category = "Preferences" - set desc = "Toggles which special roles you would like to be a candidate for, during events." - var/role_flag = be_special_flags[role] - if(!role_flag) return - prefs.be_special ^= role_flag - prefs.handle_preferences_save(src) - src << "You will [(prefs.be_special & role_flag) ? "now" : "no longer"] be considered for [role] events (where possible)." - feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/verb/change_ui() - set name = "Change UI" - set category = "Preferences" - set desc = "Configure your user interface" - - if(!ishuman(usr)) - usr << "This only for human" - return - - var/UI_style_new = input(usr, "Select a style, we recommend White for customization") in list("White", "Midnight", "Orange", "old") - if(!UI_style_new) return - - var/UI_style_alpha_new = input(usr, "Select a new alpha(transparence) parametr for UI, between 50 and 255") as num - if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return - - var/UI_style_color_new = input(usr, "Choose your UI color, dark colors are not recommended!") as color|null - if(!UI_style_color_new) return - - //update UI - var/list/icons = usr.hud_used.adding + usr.hud_used.other +usr.hud_used.hotkeybuttons - icons.Add(usr.zone_sel) - - for(var/obj/screen/I in icons) - if(I.name in list(I_HELP, I_HURT, I_DISARM, I_GRAB)) continue - I.icon = ui_style2icon(UI_style_new) - I.color = UI_style_color_new - I.alpha = UI_style_alpha_new - - - - if(alert("Like it? Save changes?",,"Yes", "No") == "Yes") - prefs.UI_style = UI_style_new - prefs.UI_style_alpha = UI_style_alpha_new - prefs.UI_style_color = UI_style_color_new - prefs.handle_preferences_save(src) - usr << "UI was saved" diff --git a/code/modules/client/ui_style.dm b/code/modules/client/ui_style.dm new file mode 100644 index 00000000000..2802d25e60b --- /dev/null +++ b/code/modules/client/ui_style.dm @@ -0,0 +1,57 @@ + + +/var/all_ui_styles = list( + "Midnight" = 'icons/mob/screen/midnight.dmi', + "Orange" = 'icons/mob/screen/orange.dmi', + "old" = 'icons/mob/screen/old.dmi', + "White" = 'icons/mob/screen/white.dmi', + "old-noborder" = 'icons/mob/screen/old-noborder.dmi' + ) + +/proc/ui_style2icon(ui_style) + if(ui_style in all_ui_styles) + return all_ui_styles[ui_style] + return all_ui_styles["White"] + + +/client/verb/change_ui() + set name = "Change UI" + set category = "Preferences" + set desc = "Configure your user interface" + + if(!ishuman(usr)) + usr << "You must be human to use this verb." + return + + var/UI_style_new = input(usr, "Select a style. White is recommended for customization") as null|anything in all_ui_styles + if(!UI_style_new) return + + var/UI_style_alpha_new = input(usr, "Select a new alpha (transparency) parameter for your UI, between 50 and 255") as null|num + if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return + + var/UI_style_color_new = input(usr, "Choose your UI color. Dark colors are not recommended!") as color|null + if(!UI_style_color_new) return + + //update UI + var/list/icons = usr.hud_used.adding + usr.hud_used.other + usr.hud_used.hotkeybuttons + icons.Add(usr.zone_sel) + icons.Add(usr.gun_setting_icon) + icons.Add(usr.item_use_icon) + icons.Add(usr.gun_move_icon) + icons.Add(usr.radio_use_icon) + + var/icon/ic = all_ui_styles[UI_style_new] + + for(var/obj/screen/I in icons) + if(I.name in list(I_HELP, I_HURT, I_DISARM, I_GRAB)) continue + I.icon = ic + I.color = UI_style_color_new + I.alpha = UI_style_alpha_new + + + if(alert("Like it? Save changes?",,"Yes", "No") == "Yes") + prefs.UI_style = UI_style_new + prefs.UI_style_alpha = UI_style_alpha_new + prefs.UI_style_color = UI_style_color_new + prefs.save_preferences() + usr << "UI was saved" diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm new file mode 100644 index 00000000000..f6eda831da3 --- /dev/null +++ b/code/modules/clothing/chameleon.dm @@ -0,0 +1,411 @@ +//***************** +//**Cham Jumpsuit** +//***************** + +/obj/item/proc/disguise(var/newtype) + //this is necessary, unfortunately, as initial() does not play well with list vars + var/obj/item/copy = new newtype(null) //so that it is GCed once we exit + + desc = copy.desc + name = copy.name + icon_state = copy.icon_state + item_state = copy.item_state + body_parts_covered = copy.body_parts_covered + flags_inv = copy.flags_inv + + if(copy.item_icons) + item_icons = copy.item_icons.Copy() + if(copy.sprite_sheets) + sprite_sheets = copy.sprite_sheets.Copy() + //copying sprite_sheets_obj should be unnecessary as chameleon items are not refittable. + + return copy //for inheritance + +/proc/generate_chameleon_choices(var/basetype, var/blacklist=list()) + . = list() + + var/i = 1 //in case there is a collision with both name AND icon_state + for(var/typepath in typesof(basetype) - blacklist) + var/obj/O = typepath + if(initial(O.icon) && initial(O.icon_state)) + var/name = initial(O.name) + if(name in .) + name += " ([initial(O.icon_state)])" + if(name in .) + name += " \[[i++]\]" + .[name] = typepath + +/obj/item/clothing/under/chameleon +//starts off as black + name = "black jumpsuit" + icon_state = "black" + item_state = "bl_suit" + worn_state = "black" + desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." + origin_tech = list(TECH_ILLEGAL = 3) + var/global/list/clothing_choices + +/obj/item/clothing/under/chameleon/New() + ..() + if(!clothing_choices) + var/blocked = list(src.type, /obj/item/clothing/under/cloud, /obj/item/clothing/under/gimmick)//Prevent infinite loops and bad jumpsuits. + clothing_choices = generate_chameleon_choices(/obj/item/clothing/under, blocked) + +/obj/item/clothing/under/chameleon/emp_act(severity) + name = "psychedelic" + desc = "Groovy!" + icon_state = "psyche" + item_state_slots[slot_w_uniform_str] = "psyche" + update_icon() + update_clothing_icon() + +/obj/item/clothing/under/chameleon/verb/change(picked in clothing_choices) + set name = "Change Jumpsuit Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + update_clothing_icon() //so our overlays update. + +//***************** +//**Chameleon Hat** +//***************** + +/obj/item/clothing/head/chameleon + name = "grey cap" + icon_state = "greysoft" + 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 = list(TECH_ILLEGAL = 3) + body_parts_covered = 0 + var/global/list/clothing_choices + +/obj/item/clothing/head/chameleon/New() + ..() + if(!clothing_choices) + var/blocked = list(src.type, /obj/item/clothing/head/justice,)//Prevent infinite loops and bad hats. + clothing_choices = generate_chameleon_choices(/obj/item/clothing/head, blocked) + +/obj/item/clothing/head/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon_state = "greysoft" + update_icon() + update_clothing_icon() + +/obj/item/clothing/head/chameleon/verb/change(picked in clothing_choices) + set name = "Change Hat/Helmet Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + update_clothing_icon() //so our overlays update. + +//****************** +//**Chameleon Suit** +//****************** + +/obj/item/clothing/suit/chameleon + name = "armor" + icon_state = "armor" + item_state = "armor" + desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change it's appearance, but offering no protection.. It seems to have a small dial inside." + origin_tech = list(TECH_ILLEGAL = 3) + var/global/list/clothing_choices + +/obj/item/clothing/suit/chameleon/New() + ..() + if(!clothing_choices) + var/blocked = list(src.type, /obj/item/clothing/suit/cyborg_suit, /obj/item/clothing/suit/justice, /obj/item/clothing/suit/greatcoat) + clothing_choices = generate_chameleon_choices(/obj/item/clothing/suit, blocked) + +/obj/item/clothing/suit/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. + name = "armor" + desc = "An armored vest that protects against some damage." + icon_state = "armor" + update_icon() + update_clothing_icon() + +/obj/item/clothing/suit/chameleon/verb/change(picked in clothing_choices) + set name = "Change Oversuit Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + update_clothing_icon() //so our overlays update. + +//******************* +//**Chameleon Shoes** +//******************* +/obj/item/clothing/shoes/chameleon + name = "black shoes" + icon_state = "black" + item_state = "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 = list(TECH_ILLEGAL = 3) + var/global/list/clothing_choices + +/obj/item/clothing/shoes/chameleon/New() + ..() + if(!clothing_choices) + var/blocked = list(src.type, /obj/item/clothing/shoes/syndigaloshes, /obj/item/clothing/shoes/cyborg)//prevent infinite loops and bad shoes. + clothing_choices = generate_chameleon_choices(/obj/item/clothing/shoes, blocked) + +/obj/item/clothing/shoes/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. + name = "black shoes" + desc = "A pair of black shoes." + icon_state = "black" + item_state = "black" + update_icon() + update_clothing_icon() + +/obj/item/clothing/shoes/chameleon/verb/change(picked in clothing_choices) + set name = "Change Footwear Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + update_clothing_icon() //so our overlays update. + +//********************** +//**Chameleon Backpack** +//********************** +/obj/item/weapon/storage/backpack/chameleon + name = "backpack" + icon_state = "backpack" + item_state = "backpack" + desc = "A backpack outfitted with cloaking tech. It seems to have a small dial inside, kept away from the storage." + origin_tech = list(TECH_ILLEGAL = 3) + var/global/list/clothing_choices + +/obj/item/weapon/storage/backpack/chameleon/New() + ..() + if(!clothing_choices) + var/blocked = list(src.type, /obj/item/weapon/storage/backpack/satchel/withwallet) + clothing_choices = generate_chameleon_choices(/obj/item/weapon/storage/backpack, blocked) + +/obj/item/weapon/storage/backpack/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. + name = "backpack" + desc = "You wear this on your back and put items into it." + icon_state = "backpack" + item_state = "backpack" + update_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_back() + +/obj/item/weapon/storage/backpack/chameleon/verb/change(picked in clothing_choices) + set name = "Change Backpack Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + + //so our overlays update. + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_back() + +//******************** +//**Chameleon Gloves** +//******************** + +/obj/item/clothing/gloves/chameleon + name = "black gloves" + icon_state = "black" + item_state = "bgloves" + desc = "It looks like a pair of gloves, but it seems to have a small dial inside." + origin_tech = list(TECH_ILLEGAL = 3) + var/global/list/clothing_choices + +/obj/item/clothing/gloves/chameleon/New() + ..() + if(!clothing_choices) + clothing_choices = generate_chameleon_choices(/obj/item/clothing/gloves, list(src.type)) + +/obj/item/clothing/gloves/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. + name = "black gloves" + desc = "It looks like a pair of gloves, but it seems to have a small dial inside." + icon_state = "black" + update_icon() + update_clothing_icon() + +/obj/item/clothing/gloves/chameleon/verb/change(picked in clothing_choices) + set name = "Change Gloves Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + update_clothing_icon() //so our overlays update. + +//****************** +//**Chameleon Mask** +//****************** + +/obj/item/clothing/mask/chameleon + name = "gas mask" + icon_state = "gas_alt" + item_state = "gas_alt" + desc = "It looks like a plain gask mask, but on closer inspection, it seems to have a small dial inside." + origin_tech = list(TECH_ILLEGAL = 3) + var/global/list/clothing_choices + +/obj/item/clothing/mask/chameleon/New() + ..() + if(!clothing_choices) + clothing_choices = generate_chameleon_choices(/obj/item/clothing/mask, list(src.type)) + +/obj/item/clothing/mask/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. + name = "gas mask" + desc = "It's a gas mask." + icon_state = "gas_alt" + update_icon() + update_clothing_icon() + +/obj/item/clothing/mask/chameleon/verb/change(picked in clothing_choices) + set name = "Change Mask Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + update_clothing_icon() //so our overlays update. + +//********************* +//**Chameleon Glasses** +//********************* + +/obj/item/clothing/glasses/chameleon + name = "Optical Meson Scanner" + icon_state = "meson" + item_state = "glasses" + desc = "It looks like a plain set of mesons, but on closer inspection, it seems to have a small dial inside." + origin_tech = list(TECH_ILLEGAL = 3) + var/list/global/clothing_choices + +/obj/item/clothing/glasses/chameleon/New() + ..() + if(!clothing_choices) + clothing_choices = generate_chameleon_choices(/obj/item/clothing/glasses, list(src.type)) + +/obj/item/clothing/glasses/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. + name = "Optical Meson Scanner" + desc = "It's a set of mesons." + icon_state = "meson" + update_icon() + update_clothing_icon() + +/obj/item/clothing/glasses/chameleon/verb/change(picked in clothing_choices) + set name = "Change Glasses Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(clothing_choices[picked])) + return + + disguise(clothing_choices[picked]) + update_clothing_icon() //so our overlays update. + +//***************** +//**Chameleon Gun** +//***************** +/obj/item/weapon/gun/energy/chameleon + name = "desert eagle" + desc = "A hologram projector in the shape of a gun. There is a dial on the side to change the gun's disguise." + icon_state = "deagle" + w_class = 3 + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) + matter = list() + + fire_sound = 'sound/weapons/Gunshot.ogg' + projectile_type = /obj/item/projectile/chameleon + charge_meter = 0 + charge_cost = 20 //uses next to no power, since it's just holograms + max_shots = 50 + + var/obj/item/projectile/copy_projectile + var/global/list/gun_choices + +/obj/item/weapon/gun/energy/chameleon/New() + ..() + + if(!gun_choices) + gun_choices = list() + for(var/gun_type in typesof(/obj/item/weapon/gun/) - src.type) + var/obj/item/weapon/gun/G = gun_type + src.gun_choices[initial(G.name)] = gun_type + return + +/obj/item/weapon/gun/energy/chameleon/consume_next_projectile() + var/obj/item/projectile/P = ..() + if(P && ispath(copy_projectile)) + P.name = initial(copy_projectile.name) + P.icon = initial(copy_projectile.icon) + P.icon_state = initial(copy_projectile.icon_state) + P.pass_flags = initial(copy_projectile.pass_flags) + P.hitscan = initial(copy_projectile.hitscan) + P.step_delay = initial(copy_projectile.step_delay) + P.muzzle_type = initial(copy_projectile.muzzle_type) + P.tracer_type = initial(copy_projectile.tracer_type) + P.impact_type = initial(copy_projectile.impact_type) + return P + +/obj/item/weapon/gun/energy/chameleon/emp_act(severity) + name = "desert eagle" + desc = "It's a desert eagle." + icon_state = "deagle" + update_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_r_hand() + M.update_inv_l_hand() + +/obj/item/weapon/gun/energy/chameleon/disguise(var/newtype) + var/obj/item/weapon/gun/copy = ..() + + flags_inv = copy.flags_inv + fire_sound = copy.fire_sound + fire_sound_text = copy.fire_sound_text + + var/obj/item/weapon/gun/energy/E = copy + if(istype(E)) + copy_projectile = E.projectile_type + //charge_meter = E.charge_meter //does not work very well with icon_state changes, ATM + else + copy_projectile = null + //charge_meter = 0 + +/obj/item/weapon/gun/energy/chameleon/verb/change(picked in gun_choices) + set name = "Change Gun Appearance" + set category = "Chameleon Items" + set src in usr + + if(!ispath(gun_choices[picked])) + return + + disguise(gun_choices[picked]) + + //so our overlays update. + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_r_hand() + M.update_inv_l_hand() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 856a9f12203..16ff63fc0ce 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,7 +1,14 @@ /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 - var/list/species_restricted = null //Only these species can wear this kit. + var/flash_protection = FLASH_PROTECTION_NONE // Sets the item's level of flash protection. + var/tint = TINT_NONE // Sets the item's level of visual impairment tint. + var/list/species_restricted = null //Only these species can wear this kit. + var/gunshot_residue //Used by forensics. + + var/list/accessories = list() + var/list/valid_accessory_slots + var/list/restricted_accessory_slots /* Sprites used when the clothing item is refit. This is done by setting icon_override. @@ -10,7 +17,6 @@ while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. vox wearing jumpsuits). */ var/list/sprite_sheets_refit = null - var/gunshot_residue //Updates the icons of the mob wearing the clothing item, if any. /obj/item/clothing/proc/update_clothing_icon() @@ -56,7 +62,7 @@ //Set species_restricted list switch(target_species) if("Human", "Skrell") //humanoid bodytypes - species_restricted = list("exclude","Unathi","Tajara","Diona","Vox", "Xenomorph") + species_restricted = list("Human", "Skrell") //skrell/humans can wear each other's suits else species_restricted = list(target_species) @@ -78,9 +84,7 @@ //Set species_restricted list switch(target_species) if("Skrell") - species_restricted = list("exclude","Unathi","Tajara","Diona","Vox", "Xenomorph") - if("Human") - species_restricted = list("exclude","Skrell","Unathi","Tajara","Diona","Vox", "Xenomorph") + species_restricted = list("Human", "Skrell") //skrell helmets fit humans too else species_restricted = list(target_species) @@ -103,6 +107,7 @@ w_class = 1.0 throwforce = 2 slot_flags = SLOT_EARS + sprite_sheets = list("Resomi" = 'icons/mob/species/resomi/ears.dmi') /obj/item/clothing/ears/attack_hand(mob/user as mob) if (!user) return @@ -179,12 +184,15 @@ BLIND // can't see anything name = "glasses" icon = 'icons/obj/clothing/glasses.dmi' w_class = 2.0 - flags = GLASSESCOVERSEYES + body_parts_covered = EYES slot_flags = SLOT_EYES var/vision_flags = 0 var/darkness_view = 0//Base human is 2 var/see_invisible = -1 - sprite_sheets = list("Vox" = 'icons/mob/species/vox/eyes.dmi') + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Resomi" = 'icons/mob/species/resomi/eyes.dmi', + ) /obj/item/clothing/glasses/update_clothing_icon() if (ismob(src.loc)) @@ -206,7 +214,10 @@ BLIND // can't see anything slot_flags = SLOT_GLOVES attack_verb = list("challenged") species_restricted = list("exclude","Unathi","Tajara","Vaurca", "Golem") - sprite_sheets = list("Vox" = 'icons/mob/species/vox/gloves.dmi') + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/gloves.dmi', + "Resomi" = 'icons/mob/species/resomi/gloves.dmi', + ) /obj/item/clothing/gloves/update_clothing_icon() if (ismob(src.loc)) @@ -219,8 +230,6 @@ BLIND // can't see anything cell.charge -= 1000 / severity if (cell.charge < 0) cell.charge = 0 - if(cell.reliability != 100 && prob(50/severity)) - cell.reliability -= 10 / severity ..() // Called just before an attack_hand(), in mob/UnarmedAttack() @@ -251,6 +260,10 @@ BLIND // can't see anything /obj/item/clothing/head name = "head" icon = 'icons/obj/clothing/hats.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', + ) body_parts_covered = HEAD slot_flags = SLOT_HEAD w_class = 2.0 @@ -262,10 +275,10 @@ BLIND // can't see anything var/on = 0 offset_light = 1 -/obj/item/clothing/head/New() - ..() - if(!icon_action_button && brightness_on) - icon_action_button = "[icon_state]" + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi', + "Resomi" = 'icons/mob/species/resomi/head.dmi' + ) /obj/item/clothing/head/attack_self(mob/user) if(brightness_on) @@ -286,18 +299,66 @@ BLIND // can't see anything set_light(0) light_applied = 0 update_icon(user) + user.update_action_buttons() + +/obj/item/clothing/head/attack_ai(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/attack_generic(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) + if(!Adjacent(user)) + return 0 + var/success + if(istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + else if(istype(user, /mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + + if(!success) + return 0 + else if(success == 2) + user << "You are already wearing a hat." + else if(success == 1) + user << "You crawl under \the [src]." + return 1 /obj/item/clothing/head/update_icon(var/mob/user) overlays.Cut() + var/mob/living/carbon/human/H + if(istype(user,/mob/living/carbon/human)) + H = user + if(on) + + // Generate object icon. if(!light_overlay_cache["[light_overlay]_icon"]) light_overlay_cache["[light_overlay]_icon"] = image("icon" = 'icons/obj/light_overlays.dmi', "icon_state" = "[light_overlay]") - if(!light_overlay_cache["[light_overlay]"]) - light_overlay_cache["[light_overlay]"] = image("icon" = 'icons/mob/light_overlays.dmi', "icon_state" = "[light_overlay]") overlays |= light_overlay_cache["[light_overlay]_icon"] - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user + + // Generate and cache the on-mob icon, which is used in update_inv_head(). + var/cache_key = "[light_overlay][H ? "_[H.species.get_bodytype()]" : ""]" + if(!light_overlay_cache[cache_key]) + var/use_icon = 'icons/mob/light_overlays.dmi' + if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype()]) + use_icon = sprite_sheets[H.species.get_bodytype()] + light_overlay_cache[cache_key] = image("icon" = use_icon, "icon_state" = "[light_overlay]") + + if(H) H.update_inv_head() /obj/item/clothing/head/update_clothing_icon() @@ -313,10 +374,16 @@ BLIND // can't see anything body_parts_covered = HEAD slot_flags = SLOT_MASK body_parts_covered = FACE|EYES - sprite_sheets = list("Vox" = 'icons/mob/species/vox/masks.dmi', + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/masks.dmi', + "Resomi" = 'icons/mob/species/resomi/masks.dmi', "Tajara" = 'icons/mob/species/tajaran/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi') + var/voicechange = 0 + var/list/say_messages + var/list/say_verbs + /obj/item/clothing/mask/update_clothing_icon() if (ismob(src.loc)) var/mob/M = src.loc @@ -336,13 +403,67 @@ BLIND // can't see anything body_parts_covered = FEET slot_flags = SLOT_FEET + var/can_hold_knife + var/obj/item/holding + permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN force = 2 var/overshoes = 0 - species_restricted = list("exclude","Unathi","Tajara","Vaurca") - sprite_sheets = list("Vox" = 'icons/mob/species/vox/shoes.dmi') var/silent = 0 + species_restricted = list("exclude","Unathi","Tajara","Vox", "Vaurca") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/shoes.dmi', + "Resomi" = 'icons/mob/species/resomi/shoes.dmi', + ) + +/obj/item/clothing/shoes/proc/draw_knife() + set name = "Draw Boot Knife" + set desc = "Pull out your boot knife." + set category = "IC" + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + holding.forceMove(get_turf(usr)) + + if(usr.put_in_hands(holding)) + usr.visible_message("\The [usr] pulls a knife out of their boot!") + holding = null + else + usr << "Your need an empty, unbroken hand to do that." + holding.forceMove(src) + + if(!holding) + verbs -= /obj/item/clothing/shoes/proc/draw_knife + + update_icon() + return + + +/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) + if(can_hold_knife && istype(I, /obj/item/weapon/material/shard) || \ + istype(I, /obj/item/weapon/material/butterfly) || \ + istype(I, /obj/item/weapon/material/kitchen/utensil) || \ + istype(I, /obj/item/weapon/material/hatchet/tacknife)) + if(holding) + user << "\The [src] is already holding \a [holding]." + return + user.unEquip(I) + I.forceMove(src) + holding = I + user.visible_message("\The [user] shoves \the [I] into \the [src].") + verbs |= /obj/item/clothing/shoes/proc/draw_knife + update_icon() + else + return ..() + +/obj/item/clothing/shoes/update_icon() + overlays.Cut() + if(holding) + overlays += image(icon, "[icon_state]_knife") + return ..() /obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) return @@ -366,6 +487,11 @@ BLIND // can't see anything siemens_coefficient = 0.9 w_class = 3 + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi', + "Resomi" = 'icons/mob/species/resomi/suit.dmi' + ) + /obj/item/clothing/suit/update_clothing_icon() if (ismob(src.loc)) var/mob/M = src.loc @@ -392,17 +518,29 @@ BLIND // can't see anything 2 = Report detailed damages 3 = Report location */ - 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', - "Golem" = 'icons/mob/uniform_fat.dmi') + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/uniform.dmi', + "Golem" = 'icons/mob/uniform_fat.dmi', + "Resomi" = 'icons/mob/species/resomi/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 + valid_accessory_slots = list("utility","armband","decor") + restricted_accessory_slots = list("utility", "armband") + + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(accessories && accessories.len) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return + ..() /obj/item/clothing/under/New() + ..() if(worn_state) if(!item_state_slots) item_state_slots = list() @@ -410,8 +548,12 @@ BLIND // can't see anything else worn_state = icon_state -/obj/item/clothing/under/proc/update_rolldown_status() + //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/proc/update_rolldown_status() var/mob/living/carbon/human/H if(istype(src.loc, /mob/living/carbon/human)) H = src.loc @@ -439,69 +581,6 @@ BLIND // can't see anything var/mob/M = src.loc M.update_inv_w_uniform() -/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A) - if(istype(A)) - .=1 - else - return 0 - if(accessories.len && (A.slot in list("utility","armband"))) - for(var/obj/item/clothing/accessory/AC in accessories) - if (AC.slot == A.slot) - return 0 - -/obj/item/clothing/under/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/clothing/accessory)) - var/obj/item/clothing/accessory/A = I - if(can_attach_accessory(A)) - user.drop_item() - accessories += A - A.on_attached(src, user) - - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform() - - return - else - user << "You cannot attach more accessories of this type to [src]." - - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - A.attackby(I, user) - return - - ..() - -/obj/item/clothing/under/attack_hand(mob/user as mob) - //only forward to the attached accessory if the clothing is equipped (not in a storage) - if(accessories.len && src.loc == user) - for(var/obj/item/clothing/accessory/A in accessories) - A.attack_hand(user) - return - - if ((ishuman(usr) || issmall(usr)) && src.loc == user) //make it harder to accidentally undress yourself - return - - ..() - -/obj/item/clothing/MouseDrop(obj/over_object as obj) - if (ishuman(usr) || issmall(usr)) - //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. - if (!(src.loc == usr)) - return - - if (( usr.restrained() ) || ( usr.stat )) - 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) @@ -514,9 +593,6 @@ BLIND // can't see anything user << "Its vital tracker appears to be enabled." if(3) user << "Its vital tracker and tracking beacon appear to be enabled." - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - user << "\A [A] is attached to it." /obj/item/clothing/under/proc/set_sensors(mob/usr as mob) var/mob/M = usr @@ -589,34 +665,7 @@ BLIND // can't see anything 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)) - return - - A.on_removed(user) - accessories -= A - update_clothing_icon() - -/obj/item/clothing/under/verb/removetie() - set name = "Remove Accessory" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - if(!accessories.len) return - var/obj/item/clothing/accessory/A - if(accessories.len > 1) - A = input("Select an accessory to remove from [src]") as null|anything in accessories - else - A = accessories[1] - src.remove_accessory(usr,A) /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() - -/obj/item/clothing/under/emp_act(severity) - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - A.emp_act(severity) - ..() diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm new file mode 100644 index 00000000000..57e22d6ba04 --- /dev/null +++ b/code/modules/clothing/clothing_accessories.dm @@ -0,0 +1,100 @@ +/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A) + if(valid_accessory_slots && istype(A) && (A.slot in valid_accessory_slots)) + .=1 + else + return 0 + if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots)) + for(var/obj/item/clothing/accessory/AC in accessories) + if (AC.slot == A.slot) + return 0 + +/obj/item/clothing/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/clothing/accessory)) + + if(!valid_accessory_slots || !valid_accessory_slots.len) + usr << "You cannot attach accessories of any kind to \the [src]." + return + + var/obj/item/clothing/accessory/A = I + if(can_attach_accessory(A)) + user.drop_item() + accessories += A + A.on_attached(src, user) + src.verbs |= /obj/item/clothing/proc/removetie_verb + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_w_uniform() + return + else + user << "You cannot attach more accessories of this type to [src]." + return + + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + A.attackby(I, user) + return + + ..() + +/obj/item/clothing/attack_hand(var/mob/user) + //only forward to the attached accessory if the clothing is equipped (not in a storage) + if(accessories.len && src.loc == user) + for(var/obj/item/clothing/accessory/A in accessories) + A.attack_hand(user) + return + return ..() + +/obj/item/clothing/MouseDrop(var/obj/over_object) + if (ishuman(usr) || issmall(usr)) + //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. + if (!(src.loc == usr)) + return + + if (( usr.restrained() ) || ( usr.stat )) + 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/examine(var/mob/user) + ..(user) + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + user << "\A [A] is attached to it." + +/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) + if(!(A in accessories)) + return + + A.on_removed(user) + accessories -= A + update_clothing_icon() + +/obj/item/clothing/proc/removetie_verb() + set name = "Remove Accessory" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + if(!accessories.len) return + var/obj/item/clothing/accessory/A + if(accessories.len > 1) + A = input("Select an accessory to remove from [src]") as null|anything in accessories + else + A = accessories[1] + src.remove_accessory(usr,A) + if(!accessories.len) + src.verbs -= /obj/item/clothing/proc/removetie_verb + +/obj/item/clothing/emp_act(severity) + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + A.emp_act(severity) + ..() \ No newline at end of file diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 5700a143e2d..bf6c7d78cf1 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -3,7 +3,6 @@ name = "glasses" icon = 'icons/obj/clothing/glasses.dmi' //w_class = 2.0 - //flags = GLASSESCOVERSEYES //slot_flags = SLOT_EYES //var/vision_flags = 0 //var/darkness_view = 0//Base human is 2 @@ -13,7 +12,7 @@ var/active = 1 var/activation_sound = 'sound/items/goggles_charge.ogg' var/obj/screen/overlay = null - body_parts_covered = EYES + var/obj/item/clothing/glasses/hud/hud = null // Hud glasses, if any /obj/item/clothing/glasses/attack_self(mob/user) if(toggleable) @@ -21,6 +20,8 @@ active = 0 icon_state = off_state user.update_inv_glasses() + flash_protection = FLASH_PROTECTION_NONE + tint = TINT_NONE usr << "You deactivate the optical matrix on the [src]." else active = 1 @@ -28,17 +29,21 @@ user.update_inv_glasses() if(activation_sound) usr << activation_sound + flash_protection = initial(flash_protection) + tint = initial(tint) usr << "You activate the optical matrix on the [src]." + user.update_action_buttons() /obj/item/clothing/glasses/meson name = "Optical Meson Scanner" desc = "Used for seeing walls, floors, and stuff through anything." icon_state = "meson" item_state = "glasses" - icon_action_button = "action_meson" //This doesn't actually matter, the action button is generated from the current icon_state. But, this is the only way to get it to show up. - origin_tech = "magnets=2;engineering=2" + action_button_name = "Toggle Goggles" + origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) toggleable = 1 vision_flags = SEE_TURFS + see_invisible = SEE_INVISIBLE_NOLIGHTING /obj/item/clothing/glasses/meson/New() ..() @@ -55,7 +60,6 @@ icon_state = "purple" item_state = "glasses" toggleable = 1 - icon_action_button = "action_science" unacidable = 1 /obj/item/clothing/glasses/science/New() @@ -67,11 +71,10 @@ desc = "You can totally see in the dark now!" icon_state = "night" item_state = "glasses" - origin_tech = "magnets=2" + origin_tech = list(TECH_MAGNET = 2) darkness_view = 7 toggleable = 1 - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING - icon_action_button = "action_nvg" + see_invisible = SEE_INVISIBLE_NOLIGHTING off_state = "denight" /obj/item/clothing/glasses/night/New() @@ -97,8 +100,7 @@ desc = "Very confusing glasses." icon_state = "material" item_state = "glasses" - icon_action_button = "action_material" - origin_tech = "magnets=3;engineering=3" + origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3) toggleable = 1 vision_flags = SEE_OBJS @@ -159,14 +161,17 @@ icon_state = "sun" item_state = "sunglasses" darkness_view = -1 + flash_protection = FLASH_PROTECTION_MODERATE /obj/item/clothing/glasses/welding name = "welding goggles" desc = "Protects the eyes from welders, approved by the mad scientist association." icon_state = "welding-g" item_state = "welding-g" - icon_action_button = "action_welding_g" + action_button_name = "Flip Welding Goggles" var/up = 0 + flash_protection = FLASH_PROTECTION_MAJOR + tint = TINT_HEAVY /obj/item/clothing/glasses/welding/attack_self() toggle() @@ -180,33 +185,37 @@ if(usr.canmove && !usr.stat && !usr.restrained()) if(src.up) src.up = !src.up - src.flags |= GLASSESCOVERSEYES flags_inv |= HIDEEYES body_parts_covered |= EYES icon_state = initial(icon_state) + flash_protection = initial(flash_protection) + tint = initial(tint) usr << "You flip \the [src] down to protect your eyes." else src.up = !src.up - src.flags &= ~HEADCOVERSEYES flags_inv &= ~HIDEEYES body_parts_covered &= ~EYES icon_state = "[initial(icon_state)]up" + flash_protection = FLASH_PROTECTION_NONE + tint = TINT_NONE usr << "You push \the [src] up out of your face." - update_clothing_icon() + usr.update_action_buttons() /obj/item/clothing/glasses/welding/superior name = "superior welding goggles" desc = "Welding goggles made from more expensive materials, strangely smells like potatoes." icon_state = "rwelding-g" item_state = "rwelding-g" - icon_action_button = "action_welding_g" + tint = TINT_MODERATE /obj/item/clothing/glasses/sunglasses/blindfold name = "blindfold" desc = "Covers the eyes, preventing sight." icon_state = "blindfold" item_state = "blindfold" + tint = TINT_BLIND + /obj/item/clothing/glasses/sunglasses/blinders name = "Vaurcae Blinders" @@ -214,6 +223,15 @@ icon_state = "blinders" item_state = "blinders" +/obj/item/clothing/glasses/sunglasses/blindfold/tape + name = "length of tape" + desc = "It's a robust DIY blindfold!" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "tape_cross" + item_state = null + w_class = 1 + + /obj/item/clothing/glasses/sunglasses/prescription name = "prescription sunglasses" prescription = 1 @@ -227,7 +245,6 @@ name = "HUDSunglasses" desc = "Sunglasses with a HUD." icon_state = "sunhud" - var/obj/item/clothing/glasses/hud/security/hud = null New() ..() @@ -244,15 +261,17 @@ desc = "Thermals in the shape of glasses." icon_state = "thermal" item_state = "glasses" - origin_tech = "magnets=3" + action_button_name = "Toggle Goggles" + origin_tech = list(TECH_MAGNET = 3) toggleable = 1 - icon_action_button = "action_thermal" vision_flags = SEE_MOBS + see_invisible = SEE_INVISIBLE_NOLIGHTING + flash_protection = FLASH_PROTECTION_REDUCED emp_act(severity) if(istype(src.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/M = src.loc - M << "\red The Optical Thermal Scanner overloads and blinds you!" + M << "The Optical Thermal Scanner overloads and blinds you!" if(M.glasses == src) M.eye_blind = 3 M.eye_blurry = 5 @@ -271,12 +290,12 @@ name = "Optical Meson Scanner" desc = "Used for seeing walls, floors, and stuff through anything." icon_state = "meson" - origin_tech = "magnets=3;syndicate=4" + origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4) /obj/item/clothing/glasses/thermal/plain toggleable = 0 activation_sound = null - icon_action_button = "" + action_button_name = null /obj/item/clothing/glasses/thermal/plain/monocle name = "Thermoncle" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index d775891d287..4a4485c3c38 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -1,14 +1,16 @@ /obj/item/clothing/glasses/hud name = "HUD" desc = "A heads-up display that provides important info in (almost) real time." - flags = null //doesn't protect eyes because it's a monocle, duh - origin_tech = "magnets=3;biotech=2" + flags = 0 //doesn't protect eyes because it's a monocle, duh + origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 2) var/list/icon/current = list() //the current hud icons - proc - process_hud(var/mob/M) return - +/obj/item/clothing/glasses/proc/process_hud(var/mob/M) + if(hud) + hud.process_hud(M) +/obj/item/clothing/glasses/hud/process_hud(var/mob/M) + return /obj/item/clothing/glasses/hud/health name = "Health Scanner HUD" @@ -63,7 +65,7 @@ icon_state = "jensenshades" item_state = "jensenshades" vision_flags = SEE_MOBS - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + see_invisible = SEE_INVISIBLE_NOLIGHTING /obj/item/clothing/glasses/hud/security/process_hud(var/mob/M) process_sec_hud(M, 1) diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index bf20b3e9528..35c48d58e73 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -9,7 +9,10 @@ name = "ultra rare hat" desc = "an ultra rare hat. It commands a certain respect." icon_state = "petehat" - sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi') + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi', + "Resomi" = 'icons/mob/species/resomi/head.dmi' + ) /obj/item/clothing/head/collectable/slime name = "collectable slime cap!" @@ -21,32 +24,40 @@ name = "collectable xenomorph helmet!" desc = "Hiss hiss hiss!" icon_state = "xenom" + item_state_slots = list( + slot_l_hand_str = "xenos_helm", + slot_r_hand_str = "xenos_helm", + ) body_parts_covered = HEAD|FACE|EYES /obj/item/clothing/head/collectable/chef name = "collectable chef's hat" desc = "A rare Chef's Hat meant for hat collectors!" - icon_state = "hats" + icon_state = "chefhat" item_state = "chefhat" /obj/item/clothing/head/collectable/paper name = "collectable paper hat" desc = "What looks like an ordinary paper hat, is actually a rare and valuable collector's edition paper hat. Keep away from water, fire and Librarians." icon_state = "paper" + item_state = "paper" body_parts_covered = 0 /obj/item/clothing/head/collectable/tophat name = "collectable top hat" desc = "A top hat worn by only the most prestigious hat collectors." icon_state = "tophat" - item_state = "that" + item_state = "tophat" body_parts_covered = 0 /obj/item/clothing/head/collectable/captain name = "collectable captain's hat" desc = "A Collectable Hat that'll make you look just like a real comdom!" icon_state = "captain" - item_state = "caphat" + item_state_slots = list( + slot_l_hand_str = "caphat", + slot_r_hand_str = "caphat", + ) body_parts_covered = 0 /obj/item/clothing/head/collectable/police @@ -72,33 +83,32 @@ name = "collectable slime hat" desc = "Just like a real Brain Slug!" icon_state = "headslime" - item_state = "headslime" /obj/item/clothing/head/collectable/flatcap name = "collectable flat cap" desc = "A Collectible farmer's Flat Cap!" icon_state = "flat_cap" - item_state = "detective" + item_state_slots = list( + slot_l_hand_str = "detective", + slot_r_hand_str = "detective", + ) /obj/item/clothing/head/collectable/pirate name = "collectable pirate hat" desc = "You'd make a great Dread Syndie Roberts!" icon_state = "pirate" - item_state = "pirate" body_parts_covered = 0 /obj/item/clothing/head/collectable/kitty name = "collectable kitty ears" desc = "The fur feels.....a bit too realistic." icon_state = "kitty" - item_state = "kitty" body_parts_covered = 0 /obj/item/clothing/head/collectable/rabbitears name = "collectable rabbit ears" desc = "Not as lucky as the feet!" icon_state = "bunny" - item_state = "bunny" body_parts_covered = 0 /obj/item/clothing/head/collectable/wizard @@ -110,7 +120,6 @@ name = "collectable hard hat" desc = "WARNING! Offers no real protection, or luminosity, but it is damn fancy!" icon_state = "hardhat0_yellow" - item_state = "hardhat0_yellow" body_parts_covered = 0 /obj/item/clothing/head/collectable/HoS @@ -123,10 +132,8 @@ name = "collectable Thunderdome helmet" desc = "Go Red! I mean Green! I mean Red! No Green!" icon_state = "thunderdome" - item_state = "thunderdome" /obj/item/clothing/head/collectable/swat name = "collectable SWAT helmet" desc = "Now you can be in the Deathsquad too!" icon_state = "swat" - item_state = "swat" \ No newline at end of file diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 142e5d44449..4bf7dfcde6a 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -2,7 +2,7 @@ name = "hard hat" desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight." icon_state = "hardhat0_yellow" - item_state = "hardhat0_yellow" + action_button_name = "Toggle Headlamp" brightness_on = 4 //luminosity when on light_overlay = "hardhat_light" armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20) @@ -11,20 +11,17 @@ /obj/item/clothing/head/hardhat/orange icon_state = "hardhat0_orange" - item_state = "hardhat0_orange" /obj/item/clothing/head/hardhat/red icon_state = "hardhat0_red" - item_state = "hardhat0_red" name = "firefighter helmet" - flags = STOPPRESSUREDAMAGE + item_flags = STOPPRESSUREDAMAGE heat_protection = HEAD max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE /obj/item/clothing/head/hardhat/white icon_state = "hardhat0_white" - item_state = "hardhat0_white" - flags = STOPPRESSUREDAMAGE + item_flags = STOPPRESSUREDAMAGE heat_protection = HEAD max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index c622f019b37..d821389c5f9 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -2,8 +2,12 @@ name = "helmet" desc = "Standard Security gear. Protects the head from impacts." icon_state = "helmet" - flags = HEADCOVERSEYES | THICKMATERIAL - item_state = "helmet" + item_state_slots = list( + slot_l_hand_str = "helmet", + slot_r_hand_str = "helmet", + ) + item_flags = THICKMATERIAL + body_parts_covered = HEAD armor = list(melee = 50, bullet = 15, laser = 50,energy = 10, bomb = 25, bio = 0, rad = 0) flags_inv = HIDEEARS|HIDEEYES cold_protection = HEAD @@ -43,8 +47,7 @@ name = "riot helmet" desc = "It's a helmet specifically designed to protect against close range attacks." icon_state = "riot" - item_state = "helmet" - flags = HEADCOVERSEYES + body_parts_covered = HEAD|FACE|EYES //face shield armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0) flags_inv = HIDEEARS siemens_coefficient = 0.5 @@ -53,8 +56,6 @@ name = "\improper SWAT helmet" desc = "They're often used by highly trained Swat Members." icon_state = "swat" - flags = HEADCOVERSEYES - item_state = "swat" armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) flags_inv = HIDEEARS|HIDEEYES cold_protection = HEAD @@ -65,8 +66,6 @@ name = "\improper Thunderdome helmet" desc = "'Let the battle commence!'" icon_state = "thunderdome" - flags = HEADCOVERSEYES - item_state = "thunderdome" armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE @@ -76,22 +75,19 @@ name = "gladiator helmet" desc = "Ave, Imperator, morituri te salutant." icon_state = "gladiator" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR - item_state = "gladiator" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR + body_parts_covered = HEAD|FACE siemens_coefficient = 1 /obj/item/clothing/head/helmet/tactical name = "tactical helmet" desc = "An armored helmet capable of being fitted with a multitude of attachments." icon_state = "swathelm" - item_state = "helmet" - flags = HEADCOVERSEYES sprite_sheets = list( "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Unathi" = 'icons/mob/species/unathi/helmet.dmi' ) - + armor = list(melee = 62, bullet = 50, laser = 50,energy = 35, bomb = 10, bio = 2, rad = 0) flags_inv = HIDEEARS siemens_coefficient = 0.5 @@ -100,10 +96,9 @@ name = "Augment Array" desc = "A helmet with optical and cranial augments coupled to it." icon_state = "v62" - flags = HEADCOVERSEYES - item_state = "v62" armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) flags_inv = HIDEEARS|HIDEEYES + body_parts_covered = HEAD|EYES cold_protection = HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0.5 @@ -111,26 +106,29 @@ //Non-hardsuit ERT helmets. /obj/item/clothing/head/helmet/ert name = "emergency response team helmet" - desc = "An in-atmosphere helmet worn by members of the NanoTrasen Emergency Response Team. Protects the head from impacts." + desc = "An in-atmosphere helmet worn by members of the Emergency Response Team. Protects the head from impacts." icon_state = "erthelmet_cmd" - item_state = "syndicate-helm-green" + item_state_slots = list( + slot_l_hand_str = "syndicate-helm-green", + slot_r_hand_str = "syndicate-helm-green", + ) armor = list(melee = 62, bullet = 50, laser = 50,energy = 35, bomb = 10, bio = 2, rad = 0) //Commander /obj/item/clothing/head/helmet/ert/command name = "emergency response team commander helmet" - desc = "An in-atmosphere helmet worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights." + desc = "An in-atmosphere helmet worn by the commander of a Emergency Response Team. Has blue highlights." //Security /obj/item/clothing/head/helmet/ert/security name = "emergency response team security helmet" - desc = "An in-atmosphere helmet worn by security members of the NanoTrasen Emergency Response Team. Has red highlights." + desc = "An in-atmosphere helmet worn by security members of the Emergency Response Team. Has red highlights." icon_state = "erthelmet_sec" //Engineer /obj/item/clothing/head/helmet/ert/engineer name = "emergency response team engineer helmet" - desc = "An in-atmosphere helmet worn by engineering members of the NanoTrasen Emergency Response Team. Has orange highlights." + desc = "An in-atmosphere helmet worn by engineering members of the Emergency Response Team. Has orange highlights." icon_state = "erthelmet_eng" //Medical diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 592f62f8938..23f21f1576b 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -5,90 +5,109 @@ desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work." icon_state = "chefhat" item_state = "chefhat" - desc = "The commander in chef's head wear." - siemens_coefficient = 0.9 -//Captain: This probably shouldn't be space-worthy +//Captain /obj/item/clothing/head/caphat name = "captain's hat" icon_state = "captain" desc = "It's good being the king." - item_state = "caphat" - siemens_coefficient = 0.9 + item_state_slots = list( + slot_l_hand_str = "caphat", + slot_r_hand_str = "caphat", + ) + body_parts_covered = 0 -//Captain: This probably shouldn't be space-worthy -/obj/item/clothing/head/helmet/cap +/obj/item/clothing/head/caphat/cap name = "captain's cap" desc = "You fear to wear it for the negligence it brings." icon_state = "capcap" - flags_inv = 0 - body_parts_covered = 0 + +/obj/item/clothing/head/caphat/formal + name = "parade hat" + desc = "No one in a commanding position should be without a perfect, white hat of ultimate authority." + icon_state = "officercap" + +//HOP +/obj/item/clothing/head/caphat/hop + name = "crew resource's hat" + desc = "A stylish hat that both protects you from enraged former-crewmembers and gives you a false sense of authority." + icon_state = "hopcap" //Chaplain /obj/item/clothing/head/chaplain_hood name = "chaplain's hood" desc = "It's hood that covers the head. It keeps you warm during the space winters." icon_state = "chaplain_hood" - flags = HEADCOVERSEYES|BLOCKHAIR - siemens_coefficient = 0.9 - body_parts_covered = HEAD|EYES + flags_inv = BLOCKHAIR + body_parts_covered = HEAD //Chaplain /obj/item/clothing/head/nun_hood name = "nun hood" desc = "Maximum piety in this star system." icon_state = "nun_hood" - flags = HEADCOVERSEYES|BLOCKHAIR - siemens_coefficient = 0.9 + flags_inv = BLOCKHAIR + body_parts_covered = HEAD //Mime /obj/item/clothing/head/beret name = "beret" desc = "A beret, an artists favorite headwear." icon_state = "beret" - siemens_coefficient = 0.9 body_parts_covered = 0 //Security /obj/item/clothing/head/beret/sec name = "security beret" desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety." - icon_state = "beret_badge" -/obj/item/clothing/head/beret/sec/alt + icon_state = "beret_officer" +/obj/item/clothing/head/beret/sec/navy/officer name = "officer beret" desc = "A navy blue beret with an officer's rank emblem. For officers that are more inclined towards style than safety." - icon_state = "officerberet" -/obj/item/clothing/head/beret/sec/hos + icon_state = "beret_navy_officer" +/obj/item/clothing/head/beret/sec/navy/hos name = "officer beret" desc = "A navy blue beret with a commander's rank emblem. For officers that are more inclined towards style than safety." - icon_state = "hosberet" -/obj/item/clothing/head/beret/sec/warden + icon_state = "beret_navy_hos" +/obj/item/clothing/head/beret/sec/navy/warden name = "warden beret" desc = "A navy blue beret with a warden's rank emblem. For officers that are more inclined towards style than safety." - icon_state = "wardenberet" -/obj/item/clothing/head/beret/eng + icon_state = "beret_navy_warden" +/obj/item/clothing/head/beret/sec/corporate/officer + name = "officer beret" + desc = "A corporate black beret with an officer's rank emblem. For officers that are more inclined towards style than safety." + icon_state = "beret_corporate_officer" +/obj/item/clothing/head/beret/sec/corporate/hos + name = "officer beret" + desc = "A corporate black beret with a commander's rank emblem. For officers that are more inclined towards style than safety." + icon_state = "beret_corporate_hos" +/obj/item/clothing/head/beret/sec/corporate/warden + name = "warden beret" + desc = "A corporate black beret with a warden's rank emblem. For officers that are more inclined towards style than safety." + icon_state = "beret_corporate_warden" +/obj/item/clothing/head/beret/engineering name = "engineering beret" desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety." - icon_state = "e_beret_badge" -/obj/item/clothing/head/beret/jan + icon_state = "beret_engineering" +/obj/item/clothing/head/beret/purple name = "purple beret" desc = "A stylish, if purple, beret." - icon_state = "purpleberet" + icon_state = "beret_purple" /obj/item/clothing/head/beret/centcom/officer name = "officers beret" - desc = "A black beret adorned with the shield—a silver kite shield with an engraved sword—of the NanoTrasen security forces." - icon_state = "centcomofficerberet" + desc = "A black beret adorned with the shield - a silver kite shield with an engraved sword - of the corporate security forces." + icon_state = "beret_centcom_officer" /obj/item/clothing/head/beret/centcom/captain name = "captains beret" - desc = "A white beret adorned with the shield—a silver kite shield with an engraved sword—of the NanoTrasen security forces." - icon_state = "centcomcaptain" + desc = "A white beret adorned with the shield - a silver kite shield with an engraved sword - of the corporate security forces." + icon_state = "beret_centcom_captain" //Medical /obj/item/clothing/head/surgery name = "surgical cap" desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs." icon_state = "surgcap_blue" - flags = BLOCKHEADHAIR + flags_inv = BLOCKHEADHAIR /obj/item/clothing/head/surgery/purple desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is deep purple." diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 7b13c10b4b0..47740ff55e5 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -3,8 +3,11 @@ /obj/item/clothing/head/centhat name = "\improper CentComm. hat" icon_state = "centcom" + item_state_slots = list( + slot_l_hand_str = "centhat", + slot_r_hand_str = "centhat", + ) desc = "It's good to be emperor." - item_state = "centhat" siemens_coefficient = 0.9 body_parts_covered = 0 @@ -12,7 +15,6 @@ name = "hair flower pin" icon_state = "hairflower" desc = "Smells nice." - item_state = "hairflower" slot_flags = SLOT_HEAD | SLOT_EARS body_parts_covered = 0 @@ -26,7 +28,7 @@ name = "top-hat" desc = "It's an amish looking hat." icon_state = "tophat" - item_state = "that" + item_state = "tophat" siemens_coefficient = 0.9 body_parts_covered = 0 @@ -54,7 +56,7 @@ name = "hastur's hood" desc = "It's unspeakably stylish" icon_state = "hasturhood" - flags = HEADCOVERSEYES|BLOCKHAIR + flags_inv = BLOCKHAIR body_parts_covered = HEAD|FACE|EYES /obj/item/clothing/head/nursehat @@ -66,11 +68,13 @@ /obj/item/clothing/head/syndicatefake name = "red space-helmet replica" + item_state_slots = list( + slot_l_hand_str = "syndicate-helm-black-red", + slot_r_hand_str = "syndicate-helm-black-red", + ) icon_state = "syndicate" - item_state = "syndicate" desc = "A plastic replica of a bloodthirsty mercenary's space helmet, you'll look just like a real murderous criminal operative in this! This is a toy, it is not made for use in space!" - flags = BLOCKHAIR - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR siemens_coefficient = 2.0 body_parts_covered = HEAD|FACE|EYES @@ -78,9 +82,8 @@ name = "cueball helmet" desc = "A large, featureless white orb mean to be worn on your head. How do you even see out of this thing?" icon_state = "cueball" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR - item_state="cueball" - flags_inv = 0 + item_state = "cueball" + flags_inv = BLOCKHAIR body_parts_covered = HEAD|FACE|EYES /obj/item/clothing/head/greenbandana @@ -96,7 +99,6 @@ desc = "A helmet made out of a box." icon_state = "cardborg_h" item_state = "cardborg_h" - flags = HEADCOVERSEYES | HEADCOVERSMOUTH flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = HEAD|FACE|EYES @@ -104,24 +106,20 @@ name = "justice hat" desc = "fight for what's righteous!" icon_state = "justicered" - item_state = "justicered" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags_inv = BLOCKHAIR + body_parts_covered = HEAD|EYES /obj/item/clothing/head/justice/blue icon_state = "justiceblue" - item_state = "justiceblue" /obj/item/clothing/head/justice/yellow icon_state = "justiceyellow" - item_state = "justiceyellow" /obj/item/clothing/head/justice/green icon_state = "justicegreen" - item_state = "justicegreen" /obj/item/clothing/head/justice/pink icon_state = "justicepink" - item_state = "justicepink" /obj/item/clothing/head/rabbitears name = "rabbit ears" @@ -133,34 +131,33 @@ name = "flat cap" desc = "A working man's cap." icon_state = "flat_cap" - item_state = "detective" + item_state_slots = list( + slot_l_hand_str = "det_hat", + slot_r_hand_str = "det_hat", + ) siemens_coefficient = 0.9 /obj/item/clothing/head/pirate name = "pirate hat" desc = "Yarr." icon_state = "pirate" - item_state = "pirate" body_parts_covered = 0 /obj/item/clothing/head/hgpiratecap name = "pirate hat" desc = "Yarr." icon_state = "hgpiratecap" - item_state = "hgpiratecap" body_parts_covered = 0 /obj/item/clothing/head/bandana name = "pirate bandana" desc = "Yarr." icon_state = "bandana" - item_state = "bandana" /obj/item/clothing/head/bowler name = "bowler-hat" desc = "Gentleman, elite aboard!" icon_state = "bowler" - item_state = "bowler" body_parts_covered = 0 //stylish bs12 hats @@ -168,38 +165,32 @@ /obj/item/clothing/head/bowlerhat name = "bowler hat" icon_state = "bowler_hat" - item_state = "bowler_hat" desc = "For the gentleman of distinction." body_parts_covered = 0 /obj/item/clothing/head/beaverhat name = "beaver hat" icon_state = "beaver_hat" - item_state = "beaver_hat" desc = "Soft felt makes this hat both comfortable and elegant." /obj/item/clothing/head/boaterhat name = "boater hat" icon_state = "boater_hat" - item_state = "boater_hat" desc = "The ultimate in summer fashion." /obj/item/clothing/head/fedora - name = "\improper fedora" + name = "fedora" icon_state = "fedora" - item_state = "fedora" desc = "A sharp, stylish hat." /obj/item/clothing/head/feathertrilby - name = "\improper feather trilby" + name = "feather trilby" icon_state = "feather_trilby" - item_state = "feather_trilby" desc = "A sharp, stylish hat with a feather." /obj/item/clothing/head/fez - name = "\improper fez" + name = "fez" icon_state = "fez" - item_state = "fez" desc = "You should wear a fez. Fezzes are cool." //end bs12 hats @@ -208,16 +199,18 @@ name = "witch costume wig" desc = "Eeeee~heheheheheheh!" icon_state = "witch" - item_state = "witch" - flags = BLOCKHAIR + flags_inv = BLOCKHAIR siemens_coefficient = 2.0 /obj/item/clothing/head/chicken name = "chicken suit head" desc = "Bkaw!" icon_state = "chickenhead" - item_state = "chickensuit" - flags = BLOCKHAIR + item_state_slots = list( + slot_l_hand_str = "chickensuit", + slot_r_hand_str = "chickensuit", + ) + flags_inv = BLOCKHAIR siemens_coefficient = 0.7 body_parts_covered = HEAD|FACE|EYES @@ -225,17 +218,18 @@ name = "bear pelt hat" desc = "Fuzzy." icon_state = "bearpelt" - item_state = "bearpelt" - flags = BLOCKHAIR + flags_inv = BLOCKHAIR siemens_coefficient = 0.7 /obj/item/clothing/head/xenos name = "xenos helmet" icon_state = "xenos" - item_state = "xenos_helm" + item_state_slots = list( + slot_l_hand_str = "xenos_helm", + slot_r_hand_str = "xenos_helm", + ) desc = "A helmet made out of chitinous alien hide." - flags = BLOCKHAIR - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR siemens_coefficient = 2.0 body_parts_covered = HEAD|FACE|EYES @@ -243,8 +237,11 @@ name = "natural philosopher's wig" desc = "A stylish monstrosity unearthed from Earth's Renaissance period. With this most distinguish'd wig, you'll be ready for your next soiree!" icon_state = "philosopher_wig" - item_state = "philosopher_wig" - flags = BLOCKHAIR + item_state_slots = list( + slot_l_hand_str = "pwig", + slot_r_hand_str = "pwig", + ) + flags_inv = BLOCKHAIR siemens_coefficient = 2.0 //why is it so conductive?! body_parts_covered = 0 @@ -252,5 +249,4 @@ name = "orange bandana" desc = "An orange piece of cloth, worn on the head." icon_state = "orange_bandana" - item_state = "orange_bandana" body_parts_covered = 0 diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index d2733d1d0da..c3f29de601d 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -15,17 +15,21 @@ name = "welding helmet" desc = "A head-mounted face cover designed to protect the wearer completely from space-arc eye." icon_state = "welding" - flags = HEADCOVERSEYES | HEADCOVERSMOUTH - item_state = "welding" + item_state_slots = list( + slot_l_hand_str = "welding", + slot_r_hand_str = "welding", + ) matter = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000) var/up = 0 armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) body_parts_covered = HEAD|FACE|EYES - icon_action_button = "action_welding" + action_button_name = "Flip Welding Mask" siemens_coefficient = 0.9 w_class = 3 var/base_state + flash_protection = FLASH_PROTECTION_MAJOR + tint = TINT_HEAVY /obj/item/clothing/head/welding/attack_self() if(!base_state) @@ -44,17 +48,22 @@ if(usr.canmove && !usr.stat && !usr.restrained()) if(src.up) src.up = !src.up - src.flags |= (HEADCOVERSEYES | HEADCOVERSMOUTH) + body_parts_covered |= (EYES|FACE) flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) + flash_protection = initial(flash_protection) + tint = initial(tint) icon_state = base_state usr << "You flip the [src] down to protect your eyes." else src.up = !src.up - src.flags &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH) + body_parts_covered &= ~(EYES|FACE) + flash_protection = FLASH_PROTECTION_NONE + tint = TINT_NONE flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) icon_state = "[base_state]up" usr << "You push the [src] up out of your face." - update_clothing_icon() //so our mob-overlays update + update_clothing_icon() //so our mob-overlays + usr.update_action_buttons() /* @@ -64,12 +73,9 @@ name = "cake-hat" desc = "It's tasty looking!" icon_state = "cake0" - flags = HEADCOVERSEYES - var/onfire = 0.0 - var/status = 0 - var/fire_resist = T0C+1300 //this is the max temp it can stand before you start to cook. although it might not burn away, you take damage - var/processing = 0 //I dont think this is used anywhere. - body_parts_covered = EYES + item_state = "cake0" + var/onfire = 0 + body_parts_covered = HEAD /obj/item/clothing/head/cakehat/process() if(!onfire) @@ -86,17 +92,18 @@ location.hotspot_expose(700, 1) /obj/item/clothing/head/cakehat/attack_self(mob/user as mob) - if(status > 1) return src.onfire = !( src.onfire ) if (src.onfire) src.force = 3 src.damtype = "fire" src.icon_state = "cake1" + src.item_state = "cake1" processing_objects.Add(src) else src.force = null src.damtype = "brute" src.icon_state = "cake0" + src.item_state = "cake0" return @@ -107,17 +114,14 @@ name = "ushanka" desc = "Perfect for winter in Siberia, da?" icon_state = "ushankadown" - item_state = "ushankadown" flags_inv = HIDEEARS /obj/item/clothing/head/ushanka/attack_self(mob/user as mob) if(src.icon_state == "ushankadown") src.icon_state = "ushankaup" - src.item_state = "ushankaup" user << "You raise the ear flaps on the ushanka." else src.icon_state = "ushankadown" - src.item_state = "ushankadown" user << "You lower the ear flaps on the ushanka." /* @@ -127,10 +131,8 @@ name = "carved pumpkin" desc = "A jack o' lantern! Believed to ward off evil spirits." icon_state = "hardhat0_pumpkin"//Could stand to be renamed - item_state = "hardhat0_pumpkin" - flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - body_parts_covered = HEAD|EYES + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + body_parts_covered = HEAD|FACE|EYES brightness_on = 2 light_overlay = "helmet_light" w_class = 3 @@ -154,11 +156,9 @@ var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner") ears.Blend(earbit, ICON_OVERLAY) - item_icons[icon_head] = ears - /obj/item/clothing/head/richard name = "chicken mask" desc = "You can hear the distant sounds of rhythmic electronica." icon_state = "richard" body_parts_covered = HEAD|FACE - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags_inv = BLOCKHAIR diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 499514a8cd4..7610d45c531 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -2,29 +2,28 @@ name = "cargo cap" desc = "It's a peaked cap in a tasteless yellow color." icon_state = "cargosoft" - item_state = "helmet" + item_state_slots = list( + slot_l_hand_str = "helmet", //probably a placeholder + slot_r_hand_str = "helmet", + ) var/flipped = 0 siemens_coefficient = 0.9 body_parts_covered = 0 - dropped() - src.icon_state = initial(icon_state) - src.flipped=0 - ..() +/obj/item/clothing/head/soft/dropped() + src.icon_state = initial(icon_state) + src.flipped=0 + ..() - verb/flip() - set category = "Object" - set name = "Flip cap" - set src in usr - if(usr.canmove && !usr.stat && !usr.restrained()) - src.flipped = !src.flipped - if(src.flipped) - icon_state = "[icon_state]_flipped" - usr << "You flip the hat backwards." - else - src.icon_state = initial(icon_state) - usr << "You flip the hat back in normal position." - update_clothing_icon() //so our mob-overlays update +/obj/item/clothing/head/soft/attack_self(mob/user) + src.flipped = !src.flipped + if(src.flipped) + icon_state = "[icon_state]_flipped" + user << "You flip the hat backwards." + else + src.icon_state = initial(icon_state) + user << "You flip the hat back in normal position." + update_clothing_icon() //so our mob-overlays update /obj/item/clothing/head/soft/red name = "red cap" diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 51a7a74286e..ab70bcdbd60 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -3,8 +3,7 @@ desc = "LOADSAMONEY" icon_state = "balaclava" item_state = "balaclava" - flags = BLOCKHAIR - flags_inv = HIDEFACE + flags_inv = HIDEFACE|BLOCKHAIR body_parts_covered = FACE|HEAD w_class = 2 @@ -13,8 +12,7 @@ desc = "Designed to both hide identities and keep your face comfy and warm." icon_state = "swatclava" item_state = "balaclava" - flags = BLOCKHAIR - flags_inv = HIDEFACE + flags_inv = HIDEFACE|BLOCKHAIR w_class = 2 /obj/item/clothing/mask/luchador @@ -22,8 +20,7 @@ desc = "Worn by robust fighters, flying high to defeat their foes!" icon_state = "luchag" item_state = "luchag" - flags = BLOCKHAIR - flags_inv = HIDEFACE + flags_inv = HIDEFACE|BLOCKHAIR body_parts_covered = HEAD|FACE w_class = 2 siemens_coefficient = 3.0 diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 4fdaae19f36..38e86e5dc9a 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -3,34 +3,27 @@ name = "breath mask" icon_state = "breath" item_state = "breath" - flags = MASKCOVERSMOUTH | AIRTIGHT - body_parts_covered = 0 + item_flags = AIRTIGHT|FLEXIBLEMATERIAL + body_parts_covered = FACE w_class = 2 gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 - - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/masks.dmi' - ) - var/hanging = 0 /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 + src.hanging = !src.hanging + if (src.hanging) + gas_transfer_coefficient = 1 + body_parts_covered = body_parts_covered & ~FACE + item_flags = item_flags & ~AIRTIGHT 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" + item_flags = initial(item_flags) + icon_state = initial(icon_state) user << "You pull the mask up to cover your face." update_clothing_icon() @@ -49,4 +42,4 @@ name = "medical mask" icon_state = "medical" item_state = "medical" - permeability_coefficient = 0.01 \ No newline at end of file + permeability_coefficient = 0.01 diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 3ef25879980..1e9b70377d3 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -2,7 +2,7 @@ name = "gas mask" desc = "A face-covering mask that can be connected to an air supply. Filters harmful gases from the air." icon_state = "gas_alt" - flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT + item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT flags_inv = HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = FACE|EYES w_class = 3.0 @@ -34,7 +34,7 @@ icon_state = "plaguedoctor" item_state = "gas_mask" armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 90, rad = 0) - body_parts_covered = HEAD|FACE + body_parts_covered = HEAD|FACE|EYES /obj/item/clothing/mask/gas/swat name = "\improper SWAT mask" @@ -101,3 +101,4 @@ name = "owl mask" desc = "Twoooo!" icon_state = "owl" + body_parts_covered = HEAD|FACE|EYES diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 3d3db7c736d..56d4216ae98 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -3,10 +3,23 @@ desc = "To stop that awful noise." icon_state = "muzzle" item_state = "muzzle" - flags = MASKCOVERSMOUTH - body_parts_covered = 0 + body_parts_covered = FACE w_class = 2 gas_transfer_coefficient = 0.90 + voicechange = 1 + +/obj/item/clothing/mask/muzzle/tape + name = "length of tape" + desc = "It's a robust DIY muzzle!" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "tape_cross" + item_state = null + w_class = 1 + +/obj/item/clothing/mask/muzzle/New() + ..() + say_messages = list("Mmfph!", "Mmmf mrrfff!", "Mmmf mnnf!") + say_verbs = list("mumbles", "says") // Clumsy folks can't take the mask off themselves. /obj/item/clothing/mask/muzzle/attack_hand(mob/user as mob) @@ -20,8 +33,8 @@ icon_state = "sterile" item_state = "sterile" w_class = 2 - flags = MASKCOVERSMOUTH - body_parts_covered = 0 + body_parts_covered = FACE + item_flags = FLEXIBLEMATERIAL gas_transfer_coefficient = 0.90 permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 0) @@ -41,13 +54,14 @@ body_parts_covered = 0 //scarves (fit in in mask slot) - +//None of these actually have on-mob sprites... /obj/item/clothing/mask/bluescarf name = "blue neck scarf" desc = "A blue neck scarf." icon_state = "blueneckscarf" item_state = "blueneckscarf" - flags = MASKCOVERSMOUTH + body_parts_covered = FACE + item_flags = FLEXIBLEMATERIAL w_class = 2 gas_transfer_coefficient = 0.90 @@ -56,7 +70,8 @@ desc = "A red and white checkered neck scarf." icon_state = "redwhite_scarf" item_state = "redwhite_scarf" - flags = MASKCOVERSMOUTH + body_parts_covered = FACE + item_flags = FLEXIBLEMATERIAL w_class = 2 gas_transfer_coefficient = 0.90 @@ -65,7 +80,8 @@ desc = "A green neck scarf." icon_state = "green_scarf" item_state = "green_scarf" - flags = MASKCOVERSMOUTH + body_parts_covered = FACE + item_flags = FLEXIBLEMATERIAL w_class = 2 gas_transfer_coefficient = 0.90 @@ -74,7 +90,8 @@ desc = "A stealthy, dark scarf." icon_state = "ninja_scarf" item_state = "ninja_scarf" - flags = MASKCOVERSMOUTH + body_parts_covered = FACE + item_flags = FLEXIBLEMATERIAL w_class = 2 gas_transfer_coefficient = 0.90 siemens_coefficient = 0 @@ -84,8 +101,7 @@ desc = "A rubber pig mask." icon_state = "pig" item_state = "pig" - flags = BLOCKHAIR - flags_inv = HIDEFACE + flags_inv = HIDEFACE|BLOCKHAIR w_class = 2 siemens_coefficient = 0.9 body_parts_covered = HEAD|FACE|EYES @@ -95,13 +111,17 @@ desc = "A mask made of soft vinyl and latex, representing the head of a horse." icon_state = "horsehead" item_state = "horsehead" - flags = BLOCKHAIR - flags_inv = HIDEFACE + flags_inv = HIDEFACE|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES w_class = 2 - var/voicechange = 0 siemens_coefficient = 0.9 +/obj/item/clothing/mask/horsehead/New() + ..() + // The horse mask doesn't cause voice changes by default, the wizard spell changes the flag as necessary + say_messages = list("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + say_verbs = list("whinnies", "neighs", "says") + /obj/item/clothing/mask/ai name = "camera MIU" desc = "Allows for direct mental connection to accessible camera networks." diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index 6899fef1ef2..70459e62af4 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -8,7 +8,7 @@ name = "gas mask" desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics." var/obj/item/voice_changer/changer - origin_tech = "syndicate=4" + origin_tech = list(TECH_ILLEGAL = 4) /obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer() set category = "Object" diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm index 6a97d0af4a9..9e3bc0e2cfc 100644 --- a/code/modules/clothing/shoes/jobs.dm +++ b/code/modules/clothing/shoes/jobs.dm @@ -3,18 +3,19 @@ name = "galoshes" icon_state = "galoshes" permeability_coefficient = 0.05 - flags = NOSLIP + item_flags = NOSLIP slowdown = SHOES_SLOWDOWN+1 species_restricted = null /obj/item/clothing/shoes/jackboots name = "jackboots" - desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." icon_state = "jackboots" item_state = "jackboots" force = 3 armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0) - siemens_coefficient = 0.6 + siemens_coefficient = 0.7 + can_hold_knife = 1 /obj/item/clothing/shoes/jackboots/unathi name = "toe-less jackboots" @@ -29,4 +30,5 @@ icon_state = "workboots" item_state = "workboots" armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) - siemens_coefficient = 0.6 + siemens_coefficient = 0.7 + can_hold_knife = 1 \ No newline at end of file diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index c9074fb8bdc..b94cb78da5c 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -7,11 +7,10 @@ overshoes = 1 var/magpulse = 0 var/icon_base = "magboots" - icon_action_button = "action_blank" - action_button_name = "Toggle the magboots" + action_button_name = "Toggle Magboots" var/obj/item/clothing/shoes/shoes = null //Undershoes var/mob/living/carbon/human/wearer = null //For shoe procs - + /obj/item/clothing/shoes/magboots/proc/set_slowdown() slowdown = shoes? max(SHOES_SLOWDOWN, shoes.slowdown): SHOES_SLOWDOWN //So you can't put on magboots to make you walk faster. if (magpulse) @@ -19,24 +18,25 @@ /obj/item/clothing/shoes/magboots/attack_self(mob/user) if(magpulse) - flags &= ~NOSLIP + item_flags &= ~NOSLIP magpulse = 0 set_slowdown() force = 3 if(icon_base) icon_state = "[icon_base]0" user << "You disable the mag-pulse traction system." else - flags |= NOSLIP + item_flags |= NOSLIP magpulse = 1 set_slowdown() force = 5 if(icon_base) icon_state = "[icon_base]1" user << "You enable the mag-pulse traction system." user.update_inv_shoes() //so our mob-overlays update + user.update_action_buttons() /obj/item/clothing/shoes/magboots/mob_can_equip(mob/user) var/mob/living/carbon/human/H = user - + if(H.shoes) shoes = H.shoes if(shoes.overshoes) @@ -44,7 +44,7 @@ shoes = null return 0 H.drop_from_inventory(shoes) //Remove the old shoes so you can put on the magboots. - shoes.loc = src + shoes.forceMove(src) if(!..()) if(shoes) //Put the old shoes back on if the check fails. @@ -63,13 +63,13 @@ var/mob/living/carbon/human/H = wearer if(shoes) if(!H.equip_to_slot_if_possible(shoes, slot_shoes)) - shoes.loc = get_turf(src) + shoes.forceMove(get_turf(src)) src.shoes = null wearer = null /obj/item/clothing/shoes/magboots/examine(mob/user) ..(user) var/state = "disabled" - if(src.flags&NOSLIP) + if(item_flags & NOSLIP) state = "enabled" user << "Its mag-pulse traction system appears to be [state]." \ No newline at end of file diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 59855942e00..415c3debf09 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -4,8 +4,8 @@ icon_state = "brown" item_state = "brown" permeability_coefficient = 0.05 - flags = NOSLIP - origin_tech = "syndicate=3" + item_flags = NOSLIP + origin_tech = list(TECH_ILLEGAL = 3) var/list/clothing_choices = list() siemens_coefficient = 0.8 species_restricted = null @@ -20,7 +20,7 @@ icon_state = "swat" force = 3 armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) - flags = NOSLIP + item_flags = NOSLIP siemens_coefficient = 0.6 /obj/item/clothing/shoes/combat //Basically SWAT shoes combined with galoshes. @@ -29,7 +29,7 @@ icon_state = "swat" force = 5 armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) - flags = NOSLIP + item_flags = NOSLIP siemens_coefficient = 0.6 cold_protection = FEET @@ -120,6 +120,6 @@ desc = "Help you swim good." name = "swimming fins" icon_state = "flippers" - flags = NOSLIP + item_flags = NOSLIP slowdown = SHOES_SLOWDOWN+1 species_restricted = null diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index 21c2431da4d..51a7595ff1d 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -9,11 +9,9 @@ /obj/item/clothing/head/helmet/space/skrell/white icon_state = "skrell_helmet_white" - item_state = "skrell_helmet_white" /obj/item/clothing/head/helmet/space/skrell/black icon_state = "skrell_helmet_black" - item_state = "skrell_helmet_black" /obj/item/clothing/suit/space/skrell name = "Skrellian voidsuit" @@ -44,14 +42,12 @@ heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE species_restricted = list("Vox") - sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') /obj/item/clothing/head/helmet/space/vox armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) - siemens_coefficient = 0.3 - flags = HEADCOVERSEYES|STOPPRESSUREDAMAGE + siemens_coefficient = 0.6 + item_flags = STOPPRESSUREDAMAGE species_restricted = list("Vox") - sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi') /obj/item/clothing/head/helmet/space/vox/pressure name = "alien helmet" @@ -126,7 +122,7 @@ siemens_coefficient = 0 permeability_coefficient = 0.05 species_restricted = list("Vox") - sprite_sheets = list("Vox" = 'icons/mob/species/vox/gloves.dmi') + /obj/item/clothing/shoes/magboots/vox desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor." @@ -139,7 +135,7 @@ /obj/item/clothing/shoes/magboots/vox/attack_self(mob/user) if(src.magpulse) - flags &= ~NOSLIP + item_flags &= ~NOSLIP magpulse = 0 canremove = 1 user << "You relax your deathgrip on the flooring." @@ -152,19 +148,19 @@ user << "You will have to put on the [src] before you can do that." return - - flags |= NOSLIP + item_flags |= NOSLIP magpulse = 1 canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly. user << "You dig your claws deeply into the flooring, bracing yourself." user << "It would be hard to take off the [src] without relaxing your grip first." + user.update_action_buttons() //In case they somehow come off while enabled. /obj/item/clothing/shoes/magboots/vox/dropped(mob/user as mob) ..() if(src.magpulse) user.visible_message("The [src] go limp as they are removed from [usr]'s feet.", "The [src] go limp as they are removed from your feet.") - flags &= ~NOSLIP + item_flags &= ~NOSLIP magpulse = 0 canremove = 1 diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 490c4470560..e31d865acbe 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -4,25 +4,33 @@ name = "deathsquad helmet" desc = "That's not red paint. That's real blood." icon_state = "deathsquad" - item_state = "deathsquad" + item_state_slots = list( + slot_l_hand_str = "syndicate-helm-black-red", + slot_r_hand_str = "syndicate-helm-black-red", + ) armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 100, rad = 60) - flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPPRESSUREDAMAGE | THICKMATERIAL - siemens_coefficient = 0.4 + item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL + flags_inv = BLOCKHAIR + siemens_coefficient = 0.6 +//how is this a space helmet? /obj/item/clothing/head/helmet/space/deathsquad/beret name = "officer's beret" desc = "An armored beret commonly used by special operations officers." icon_state = "beret_badge" armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 30, rad = 30) - flags = HEADCOVERSEYES | BLOCKHAIR | STOPPRESSUREDAMAGE - siemens_coefficient = 0.4 + item_flags = STOPPRESSUREDAMAGE + flags_inv = BLOCKHAIR + siemens_coefficient = 0.9 //Space santa outfit suit /obj/item/clothing/head/helmet/space/santahat name = "Santa's hat" desc = "Ho ho ho. Merrry X-mas!" icon_state = "santahat" - flags = HEADCOVERSEYES | BLOCKHAIR | STOPPRESSUREDAMAGE + item_state = "santahat" + item_flags = STOPPRESSUREDAMAGE + flags_inv = BLOCKHAIR body_parts_covered = HEAD /obj/item/clothing/suit/space/santa @@ -31,7 +39,7 @@ icon_state = "santa" item_state = "santa" slowdown = 0 - flags = ONESIZEFITSALL | STOPPRESSUREDAMAGE + item_flags = STOPPRESSUREDAMAGE allowed = list(/obj/item) //for stuffing exta special presents //Space pirate outfit @@ -41,7 +49,8 @@ icon_state = "pirate" item_state = "pirate" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) - flags = HEADCOVERSEYES | BLOCKHAIR | STOPPRESSUREDAMAGE + item_flags = STOPPRESSUREDAMAGE + flags_inv = BLOCKHAIR body_parts_covered = 0 siemens_coefficient = 0.4 @@ -63,7 +72,7 @@ icon_state = "emergencyhelm" item_state = "emergencyhelm" desc = "A simple helmet with a built in light, smells like mothballs." - + flash_protection = FLASH_PROTECTION_NONE /obj/item/clothing/suit/space/emergency name = "Emergency Softsuit" diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index dadf4e56290..d443fc79d4c 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -5,8 +5,17 @@ * /obj/item/rig_module/mounted/taser * /obj/item/rig_module/shield * /obj/item/rig_module/fabricator + * /obj/item/rig_module/device/flash */ +/obj/item/rig_module/device/flash + name = "mounted flash" + desc = "You are the law." + icon_state = "flash" + interface_name = "mounted flash" + interface_desc = "Stuns your target by blinding them with a bright light." + device_type = /obj/item/device/flash + /obj/item/rig_module/grenade_launcher name = "mounted grenade launcher" @@ -76,7 +85,7 @@ charge.charges-- var/obj/item/weapon/grenade/new_grenade = new charge.product_type(get_turf(H)) - H.visible_message("[H] launches \a [new_grenade]!") + H.visible_message("[H] launches \a [new_grenade]!") new_grenade.activate(H) new_grenade.throw_at(target,fire_force,fire_distance) @@ -234,7 +243,7 @@ firing.throw_at(target,fire_force,fire_distance) else if(H.l_hand && H.r_hand) - H << "Your hands are full." + H << "Your hands are full." else var/obj/item/new_weapon = new fabrication_type() new_weapon.forceMove(H) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index e6ff815b640..6940e94cc99 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -96,7 +96,7 @@ playsound(T, "sparks", 50, 1) anim(T,M,'icons/mob/mob.dmi',,"phaseout",,M.dir) -/obj/item/rig_module/teleporter/engage(atom/target) +/obj/item/rig_module/teleporter/engage(var/atom/target, var/notify_ai) if(!..()) return 0 @@ -175,6 +175,10 @@ interface_name = "dead man's switch" interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button." + var/list/explosion_values = list(1,2,4,5) + +/obj/item/rig_module/self_destruct/small + explosion_values = list(0,0,3,4) /obj/item/rig_module/self_destruct/activate() return @@ -190,17 +194,12 @@ //OH SHIT. if(holder.wearer.stat == 2) - engage() + engage(1) -/obj/item/rig_module/self_destruct/engage() - explosion(get_turf(src), 1, 2, 4, 5) - if(holder && holder.wearer) - holder.wearer.drop_from_inventory(src) - qdel(holder) - qdel(src) - -/obj/item/rig_module/self_destruct/small/engage() - explosion(get_turf(src), 0, 0, 3, 4) +/obj/item/rig_module/self_destruct/engage(var/skip_check) + if(!skip_check && usr && alert(usr, "Are you sure you want to push that button?", "Self-destruct", "No", "Yes") == "No") + return + explosion(get_turf(src), explosion_values[1], explosion_values[2], explosion_values[3], explosion_values[4]) if(holder && holder.wearer) holder.wearer.drop_from_inventory(src) qdel(holder) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 939e9b163d2..47b97a03f84 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -12,6 +12,9 @@ * /obj/item/rig_module/chem_dispenser * /obj/item/rig_module/chem_dispenser/injector * /obj/item/rig_module/voice + * /obj/item/rig_module/device/paperdispenser + * /obj/item/rig_module/device/pen + * /obj/item/rig_module/device/stamp */ /obj/item/rig_module/device @@ -104,7 +107,6 @@ if(device_type) device = new device_type(src) /obj/item/rig_module/device/engage(atom/target) - if(!..() || !device) return 0 @@ -400,3 +402,63 @@ jets.ion_trail.set_up(jets) /obj/item/rig_module/foam_sprayer + +/obj/item/rig_module/device/paperdispenser + name = "hardsuit paper dispenser" + desc = "Crisp sheets." + icon_state = "paper" + interface_name = "paper dispenser" + interface_desc = "Dispenses warm, clean, and crisp sheets of paper." + engage_string = "Dispense" + usable = 1 + selectable = 0 + device_type = /obj/item/weapon/paper_bin + +/obj/item/rig_module/device/paperdispenser/engage(atom/target) + + if(!..() || !device) + return 0 + + if(!target) + device.attack_hand(holder.wearer) + return 1 + +/obj/item/rig_module/device/pen + name = "mounted pen" + desc = "For mecha John Hancocks." + icon_state = "pen" + interface_name = "mounted pen" + interface_desc = "Signatures with style(tm)." + engage_string = "Change color" + usable = 1 + device_type = /obj/item/weapon/pen/multi + +/obj/item/rig_module/device/stamp + name = "mounted internal affairs stamp" + desc = "DENIED." + icon_state = "stamp" + interface_name = "mounted stamp" + interface_desc = "Leave your mark." + engage_string = "Toggle stamp type" + usable = 1 + var/iastamp + var/deniedstamp + +/obj/item/rig_module/device/stamp/New() + ..() + iastamp = new /obj/item/weapon/stamp/internalaffairs(src) + deniedstamp = new /obj/item/weapon/stamp/denied(src) + device = iastamp + +/obj/item/rig_module/device/stamp/engage(atom/target) + if(!..() || !device) + return 0 + + if(!target) + if(device == iastamp) + device = deniedstamp + holder.wearer << "Switched to denied stamp." + else if(device == deniedstamp) + device = iastamp + holder.wearer << "Switched to internal affairs stamp." + return 1 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 195325eec3d..af6d66d524c 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -27,6 +27,8 @@ var/interface_path = "hardsuit.tmpl" var/ai_interface_path = "hardsuit.tmpl" var/interface_title = "Hardsuit Controller" + var/wearer_move_delay //Used for AI moving. + var/ai_controlled_move_delay = 10 // Keeps track of what this rig should spawn with. var/suit_type = "hardsuit" @@ -90,7 +92,7 @@ if(src.loc == usr) usr << "The maintenance panel is [open ? "open" : "closed"]." - usr << "Hardsuit systems are [offline ? "offline" : "online"]." + usr << "Hardsuit systems are [offline ? "offline" : "online"]." /obj/item/weapon/rig/New() ..() @@ -158,7 +160,11 @@ M.drop_from_inventory(piece) qdel(piece) processing_objects -= src - ..() + qdel(wires) + wires = null + qdel(spark_system) + spark_system = null + return ..() /obj/item/weapon/rig/proc/suit_is_deployed() if(!istype(wearer) || src.loc != wearer || wearer.back != src) @@ -180,18 +186,22 @@ if(!piece) continue piece.icon_state = "[initial(icon_state)]" if(airtight) - piece.flags &= ~STOPPRESSUREDAMAGE - piece.flags &= ~AIRTIGHT + piece.item_flags &= ~(STOPPRESSUREDAMAGE|AIRTIGHT) update_icon(1) -/obj/item/weapon/rig/proc/toggle_seals(var/mob/living/carbon/human/M,var/instant) - +/obj/item/weapon/rig/proc/toggle_seals(var/mob/initiator,var/instant) + if(sealing) return - - if(!check_power_cost(M)) + + // Seal toggling can be initiated by the suit AI, too + if(!wearer) + initiator << "Cannot toggle suit: The suit is currently not being worn by anyone." return 0 - deploy(M,instant) + if(!check_power_cost(wearer)) + return 0 + + deploy(wearer,instant) var/seal_target = !canremove var/failed_to_seal @@ -200,21 +210,21 @@ sealing = 1 if(!seal_target && !suit_is_deployed()) - M.visible_message("[M]'s suit flashes an error light.","Your suit flashes an error light. It can't function properly without being fully deployed.") + wearer.visible_message("[wearer]'s suit flashes an error light.","Your suit flashes an error light. It can't function properly without being fully deployed.") failed_to_seal = 1 if(!failed_to_seal) if(!instant) - M.visible_message("[M]'s suit emits a quiet hum as it begins to adjust its seals.","With a quiet hum, the suit begins running checks and adjusting components.") - if(seal_delay && !do_after(M,seal_delay)) - if(M) M << "You must remain still while the suit is adjusting the components." + wearer.visible_message("[wearer]'s suit emits a quiet hum as it begins to adjust its seals.","With a quiet hum, the suit begins running checks and adjusting components.") + if(seal_delay && !do_after(wearer,seal_delay)) + if(wearer) wearer << "You must remain still while the suit is adjusting the components." failed_to_seal = 1 - if(!M) + if(!wearer) failed_to_seal = 1 else - for(var/list/piece_data in list(list(M.shoes,boots,"boots",boot_type),list(M.gloves,gloves,"gloves",glove_type),list(M.head,helmet,"helmet",helm_type),list(M.wear_suit,chest,"chest",chest_type))) + for(var/list/piece_data in list(list(wearer.shoes,boots,"boots",boot_type),list(wearer.gloves,gloves,"gloves",glove_type),list(wearer.head,helmet,"helmet",helm_type),list(wearer.wear_suit,chest,"chest",chest_type))) var/obj/item/piece = piece_data[1] var/obj/item/compare_piece = piece_data[2] @@ -224,30 +234,30 @@ if(!piece || !piece_type) continue - if(!istype(M) || !istype(piece) || !istype(compare_piece) || !msg_type) - if(M) M << "You must remain still while the suit is adjusting the components." + if(!istype(wearer) || !istype(piece) || !istype(compare_piece) || !msg_type) + if(wearer) wearer << "You must remain still while the suit is adjusting the components." failed_to_seal = 1 break - if(!failed_to_seal && M.back == src && piece == compare_piece) + if(!failed_to_seal && wearer.back == src && piece == compare_piece) - if(seal_delay && !instant && !do_after(M,seal_delay,needhand=0)) + if(seal_delay && !instant && !do_after(wearer,seal_delay,needhand=0)) failed_to_seal = 1 piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]" switch(msg_type) if("boots") - M << "\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"]." - M.update_inv_shoes() + wearer << "\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"]." + wearer.update_inv_shoes() if("gloves") - M << "\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"]." - M.update_inv_gloves() + wearer << "\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"]." + wearer.update_inv_gloves() if("chest") - M << "\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"]." - M.update_inv_wear_suit() + wearer << "\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"]." + wearer.update_inv_wear_suit() if("helmet") - M << "\The [piece] hisses [!seal_target ? "closed" : "open"]." - M.update_inv_head() + wearer << "\The [piece] hisses [!seal_target ? "closed" : "open"]." + wearer.update_inv_head() if(helmet) helmet.update_light(wearer) @@ -260,7 +270,7 @@ else failed_to_seal = 1 - if((M && !(istype(M) && M.back == src) && !istype(M,/mob/living/silicon)) || (!seal_target && !suit_is_deployed())) + if((wearer && !(istype(wearer) && wearer.back == src)) || (!seal_target && !suit_is_deployed())) failed_to_seal = 1 sealing = null @@ -277,7 +287,10 @@ // Success! canremove = seal_target - M << "Your entire suit [canremove ? "loosens as the components relax" : "tightens around you as the components lock into place"]." + wearer << "Your entire suit [canremove ? "loosens as the components relax" : "tightens around you as the components lock into place"]." + + if(wearer != initiator) + initiator << "Suit adjustment complete. Suit is now [canremove ? "unsealed" : "sealed"]." if(canremove) for(var/obj/item/rig_module/module in installed_modules) @@ -289,11 +302,10 @@ /obj/item/weapon/rig/proc/update_component_sealed() for(var/obj/item/piece in list(helmet,boots,gloves,chest)) if(canremove) - piece.flags &= ~STOPPRESSUREDAMAGE - piece.flags &= ~AIRTIGHT + piece.item_flags &= ~(STOPPRESSUREDAMAGE|AIRTIGHT) else - piece.flags |= STOPPRESSUREDAMAGE - piece.flags |= AIRTIGHT + piece.item_flags |= (STOPPRESSUREDAMAGE|AIRTIGHT) + update_icon(1) /obj/item/weapon/rig/process() @@ -326,6 +338,8 @@ else if(offline) offline = 0 + if(istype(wearer) && !wearer.wearing_rig) + wearer.wearing_rig = src chest.slowdown = initial(slowdown) if(offline) @@ -364,7 +378,7 @@ if(sealing) fail_msg = "The hardsuit is in the process of adjusting seals and cannot be activated." else if(!fail_msg && ((use_unconcious && user.stat > 1) || (!use_unconcious && user.stat))) - fail_msg = "You are in no fit state to do that." + fail_msg = "You are in no fit state to do that." else if(!cell) fail_msg = "There is no cell installed in the suit." else if(cost && cell.charge < cost * 10) //TODO: Cellrate? @@ -542,12 +556,10 @@ return 0 /obj/item/weapon/rig/proc/notify_ai(var/message) - if(!message || !installed_modules || !installed_modules.len) - return - for(var/obj/item/rig_module/module in installed_modules) - for(var/mob/living/silicon/ai/ai in module.contents) - if(ai && ai.client && !ai.stat) - ai << "[message]" + for(var/obj/item/rig_module/ai_container/module in installed_modules) + if(module.integrated_ai && module.integrated_ai.client && !module.integrated_ai.stat) + module.integrated_ai << "[message]" + . = 1 /obj/item/weapon/rig/equipped(mob/living/carbon/human/M) ..() @@ -556,17 +568,18 @@ M.visible_message("[M] starts putting on \the [src]...", "You start putting on \the [src]...") if(!do_after(M,seal_delay)) if(M && M.back == src) - M.back = null - M.drop_from_inventory(src) + if(!M.unEquip(src)) + return src.forceMove(get_turf(src)) return if(istype(M) && M.back == src) M.visible_message("[M] struggles into \the [src].", "You struggle into \the [src].") wearer = M + wearer.wearing_rig = src update_icon() -/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/carbon/human/H, var/deploy_mode) +/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/initiator, var/deploy_mode) if(sealing || !cell || !cell.charge) return @@ -574,33 +587,33 @@ if(!istype(wearer) || !wearer.back == src) return - if(usr == wearer && (usr.stat||usr.paralysis||usr.stunned)) // If the usr isn't wearing the suit it's probably an AI. + if(initiator == wearer && (usr.stat||usr.paralysis||usr.stunned)) // If the initiator isn't wearing the suit it's probably an AI. return var/obj/item/check_slot var/equip_to var/obj/item/use_obj - if(!H) + if(!wearer) return switch(piece) if("helmet") equip_to = slot_head use_obj = helmet - check_slot = H.head + check_slot = wearer.head if("gauntlets") equip_to = slot_gloves use_obj = gloves - check_slot = H.gloves + check_slot = wearer.gloves if("boots") equip_to = slot_shoes use_obj = boots - check_slot = H.shoes + check_slot = wearer.shoes if("chest") equip_to = slot_wear_suit use_obj = chest - check_slot = H.wear_suit + check_slot = wearer.wear_suit if(use_obj) if(check_slot == use_obj && deploy_mode != ONLY_DEPLOY) @@ -611,7 +624,7 @@ holder = use_obj.loc if(istype(holder)) if(use_obj && check_slot == use_obj) - H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly." + wearer << "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly." use_obj.canremove = 1 holder.drop_from_inventory(use_obj) use_obj.forceMove(get_turf(src)) @@ -620,19 +633,19 @@ use_obj.forceMove(src) else if (deploy_mode != ONLY_RETRACT) - 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." + if(check_slot && check_slot == use_obj) return + use_obj.forceMove(wearer) + if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1)) + use_obj.forceMove(src) + if(check_slot) + initiator << "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way." + return else - use_obj.forceMove(H) - if(!H.equip_to_slot_if_possible(use_obj, equip_to, 0)) - use_obj.forceMove(src) - else - H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly." + wearer << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly." if(piece == "helmet" && helmet) - helmet.update_light(H) + helmet.update_light(wearer) /obj/item/weapon/rig/proc/deploy(mob/M,var/sealed) @@ -675,7 +688,9 @@ ..() for(var/piece in list("helmet","gauntlets","chest","boots")) toggle_piece(piece, user, ONLY_RETRACT) - wearer = null + if(wearer) + wearer.wearing_rig = null + wearer = null //Todo /obj/item/weapon/rig/proc/malfunction() @@ -742,9 +757,9 @@ if(wearer) if(dam_module.damage >= 2) - wearer << "The [source] has disabled your [dam_module.interface_name]!" + wearer << "The [source] has disabled your [dam_module.interface_name]!" else - wearer << "The [source] has damaged your [dam_module.interface_name]!" + wearer << "The [source] has damaged your [dam_module.interface_name]!" dam_module.deactivate() /obj/item/weapon/rig/proc/malfunction_check(var/mob/living/carbon/human/user) @@ -756,14 +771,127 @@ return 1 return 0 -/*/obj/item/weapon/rig/proc/forced_move(dir) - if(locked_down) +/obj/item/weapon/rig/proc/ai_can_move_suit(var/mob/user, var/check_user_module = 0, var/check_for_ai = 0) + + if(check_for_ai) + if(!(locate(/obj/item/rig_module/ai_container) in contents)) + return 0 + var/found_ai + for(var/obj/item/rig_module/ai_container/module in contents) + if(module.damage >= 2) + continue + if(module.integrated_ai && module.integrated_ai.client && !module.integrated_ai.stat) + found_ai = 1 + break + if(!found_ai) + return 0 + + if(check_user_module) + if(!user || !user.loc || !user.loc.loc) + return 0 + var/obj/item/rig_module/ai_container/module = user.loc.loc + if(!istype(module) || module.damage >= 2) + user << "Your host module is unable to interface with the suit." + return 0 + + if(offline || !cell || !cell.charge || locked_down) + if(user) user << "Your host rig is unpowered and unresponsive." return 0 - if(!control_overridden) - return if(!wearer || wearer.back != src) + if(user) user << "Your host rig is not being worn." return 0 - wearer.Move(null,dir)*/ + if(!wearer.stat && !control_overridden && !ai_override_enabled) + if(user) user << "You are locked out of the suit servo controller." + return 0 + return 1 + +/obj/item/weapon/rig/proc/force_rest(var/mob/user) + if(!ai_can_move_suit(user, check_user_module = 1)) + return + wearer.lay_down() + user << "\The [wearer] is now [wearer.resting ? "resting" : "getting up"]." + +/obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user) + + // Why is all this shit in client/Move()? Who knows? + if(world.time < wearer_move_delay) + return + + if(!wearer || !wearer.loc || !ai_can_move_suit(user, check_user_module = 1)) + return + + //This is sota the goto stop mobs from moving var + if(wearer.transforming || !wearer.canmove) + return + + if(locate(/obj/effect/stop/, wearer.loc)) + for(var/obj/effect/stop/S in wearer.loc) + if(S.victim == wearer) + return + + if(!wearer.lastarea) + wearer.lastarea = get_area(wearer.loc) + + if((istype(wearer.loc, /turf/space)) || (wearer.lastarea.has_gravity == 0)) + if(!wearer.Process_Spacemove(0)) + return 0 + + if(malfunctioning) + direction = pick(cardinal) + + // Inside an object, tell it we moved. + if(isobj(wearer.loc) || ismob(wearer.loc)) + var/atom/O = wearer.loc + return O.relaymove(wearer, direction) + + if(isturf(wearer.loc)) + if(wearer.restrained())//Why being pulled while cuffed prevents you from moving + for(var/mob/M in range(wearer, 1)) + if(M.pulling == wearer) + if(!M.restrained() && M.stat == 0 && M.canmove && wearer.Adjacent(M)) + user << "Your host is restrained! They can't move!" + return 0 + else + M.stop_pulling() + + if(wearer.pinned.len) + src << "Your host is pinned to a wall by [wearer.pinned[1]]!" + return 0 + + // AIs are a bit slower than regular and ignore move intent. + wearer_move_delay = world.time + ai_controlled_move_delay + + var/tickcomp = 0 + if(config.Tickcomp) + tickcomp = ((1/(world.tick_lag))*1.3) - 1.3 + wearer_move_delay += tickcomp + + if(istype(wearer.buckled, /obj/vehicle)) + //manually set move_delay for vehicles so we don't inherit any mob movement penalties + //specific vehicle move delays are set in code\modules\vehicles\vehicle.dm + wearer_move_delay = world.time + tickcomp + return wearer.buckled.relaymove(wearer, direction) + + if(istype(wearer.machine, /obj/machinery)) + if(wearer.machine.relaymove(wearer, direction)) + return + + if(wearer.pulledby || wearer.buckled) // Wheelchair driving! + if(istype(wearer.loc, /turf/space)) + return // No wheelchair driving in space + if(istype(wearer.pulledby, /obj/structure/bed/chair/wheelchair)) + return wearer.pulledby.relaymove(wearer, direction) + else if(istype(wearer.buckled, /obj/structure/bed/chair/wheelchair)) + if(ishuman(wearer.buckled)) + var/obj/item/organ/external/l_hand = wearer.get_organ("l_hand") + var/obj/item/organ/external/r_hand = wearer.get_organ("r_hand") + if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) + return // No hands to drive your chair? Tough luck! + wearer_move_delay += 2 + return wearer.buckled.relaymove(wearer,direction) + + cell.use(200) //Arbitrary, TODO + wearer.Move(get_step(get_turf(wearer),direction),direction) // This returns the rig if you are contained inside one, but not if you are wearing it /atom/proc/get_rig() @@ -774,6 +902,8 @@ /obj/item/weapon/rig/get_rig() return src +/mob/living/carbon/human/get_rig() + return back //Used in random rig spawning for cargo //Randomly deletes modules diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 83fbef9a779..c9526f16261 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -11,19 +11,11 @@ return chest.attackby(W,user) // Lock or unlock the access panel. - if(istype(W, /obj/item/weapon/card) || istype(W, /obj/item/device/pda)) - + if(W.GetID()) if(subverted) locked = 0 user << "It looks like the locking system has been shorted out." return - else if(istype(W, /obj/item/weapon/card/emag)) - req_access.Cut() - req_one_access.Cut() - locked = 0 - subverted = 1 - user << "You short out the access protocol for the suit." - return if((!req_access || !req_access.len) && (!req_one_access || !req_one_access.len)) locked = 0 @@ -64,7 +56,7 @@ user << "\The [src] already has a tank installed." return - user.drop_from_inventory(W) + if(!user.unEquip(W)) return air_supply = W W.forceMove(src) user << "You slot [W] into [src] and tighten the connecting valve." @@ -92,8 +84,8 @@ return if(!user || !W) return + if(!user.unEquip(mod)) return user << "You install \the [mod] into \the [src]." - user.drop_from_inventory(mod) installed_modules |= mod mod.forceMove(src) mod.installed(src) @@ -102,8 +94,8 @@ else if(!cell && istype(W,/obj/item/weapon/cell)) + if(!user.unEquip(W)) return user << "You jack \the [W] into \the [src]'s battery mount." - user.drop_from_inventory(W) W.forceMove(src) src.cell = W return @@ -192,4 +184,13 @@ if(electrified != 0) if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here. return - ..() \ No newline at end of file + ..() + +/obj/item/weapon/rig/emag_act(var/remaining_charges, var/mob/user) + if(!subverted) + req_access.Cut() + req_one_access.Cut() + locked = 0 + subverted = 1 + user << "You short out the access protocol for the suit." + return 1 diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index f442199ed6a..a48b59b4605 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -4,18 +4,22 @@ /obj/item/clothing/head/helmet/space/rig name = "helmet" - flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | THICKMATERIAL - flags_inv = HIDEEARS|HIDEEYES|HIDEFACE + item_flags = THICKMATERIAL + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES heat_protection = HEAD|FACE|EYES cold_protection = HEAD|FACE|EYES brightness_on = 4 - sprite_sheets = list("Tajara" = 'icons/mob/species/tajaran/helmet.dmi',"Skrell" = 'icons/mob/species/skrell/helmet.dmi',"Unathi" = 'icons/mob/species/unathi/helmet.dmi') + sprite_sheets = list( + "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', + "Skrell" = 'icons/mob/species/skrell/helmet.dmi', + "Unathi" = 'icons/mob/species/unathi/helmet.dmi' + ) species_restricted = null /obj/item/clothing/gloves/rig name = "gauntlets" - flags = THICKMATERIAL + item_flags = THICKMATERIAL body_parts_covered = HANDS heat_protection = HANDS cold_protection = HANDS @@ -38,7 +42,7 @@ heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT|HIDETAIL - flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT + item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT slowdown = 0 //will reach 10 breach damage after 25 laser carbine blasts, 3 revolver hits, or ~1 PTR hit. Completely immune to smg or sts hits. breach_threshold = 38 diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm index 904f79bc866..296828833b4 100644 --- a/code/modules/clothing/spacesuits/rig/suits/alien.dm +++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm @@ -1,6 +1,6 @@ /obj/item/weapon/rig/unathi name = "NT breacher chassis control module" - desc = "A cheap NT knock-off of a Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow." + desc = "A cheap NT knock-off of an Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow." suit_type = "NT breacher" icon_state = "breacher_rig_cheap" armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 70, bio = 100, rad = 50) @@ -21,7 +21,7 @@ desc = "An authentic Unathi breacher chassis. Huge, bulky and absurdly heavy. It must be like wearing a tank." suit_type = "breacher chassis" icon_state = "breacher_rig" - armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 80) + armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 80) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow. vision_restriction = 0 slowdown = 4 diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index f4ea7279518..95ac08bf362 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -4,7 +4,7 @@ /obj/item/weapon/rig/ert name = "ERT-C hardsuit control module" - desc = "A suit worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights. Armoured and space ready." + desc = "A suit worn by the commander of an Emergency Response Team. Has blue highlights. Armoured and space ready." suit_type = "ERT commander" icon_state = "ert_commander_rig" @@ -26,7 +26,7 @@ /obj/item/weapon/rig/ert/engineer name = "ERT-E suit control module" - desc = "A suit worn by the engineering division of a NanoTrasen Emergency Response Team. Has orange highlights. Armoured and space ready." + desc = "A suit worn by the engineering division of an 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) @@ -41,7 +41,7 @@ /obj/item/weapon/rig/ert/medical name = "ERT-M suit control module" - desc = "A suit worn by the medical division of a NanoTrasen Emergency Response Team. Has white highlights. Armoured and space ready." + desc = "A suit worn by the medical division of an Emergency Response Team. Has white highlights. Armoured and space ready." suit_type = "ERT medic" icon_state = "ert_medical_rig" @@ -54,7 +54,7 @@ /obj/item/weapon/rig/ert/security name = "ERT-S suit control module" - desc = "A suit worn by the security division of a NanoTrasen Emergency Response Team. Has red highlights. Armoured and space ready." + desc = "A suit worn by the security division of an Emergency Response Team. Has red highlights. Armoured and space ready." suit_type = "ERT security" icon_state = "ert_security_rig" @@ -67,7 +67,7 @@ /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." + desc = "A heavy suit worn by the highest level of 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 = 60, laser = 60,energy = 40, bomb = 50, bio = 100, rad = 100) diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index 2f18c243d1f..ddda7bcfba4 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -8,7 +8,7 @@ armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) emp_protection = 10 slowdown = 0 - flags = STOPPRESSUREDAMAGE | THICKMATERIAL + item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL offline_slowdown = 0 offline_vision_restriction = 0 diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm index 22add920141..1c699203001 100644 --- a/code/modules/clothing/spacesuits/rig/suits/merc.dm +++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm @@ -1,6 +1,6 @@ /obj/item/clothing/head/helmet/space/rig/merc light_overlay = "helmet_light_dual_green" - camera_networks = list("NUKE") + camera_networks = list(NETWORK_MERCENARY) /obj/item/weapon/rig/merc name = "crimson hardsuit control module" diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index bc19bf97a8c..c88cbd95f16 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -19,6 +19,42 @@ light_overlay = "helmet_light_dual" camera_networks = list(NETWORK_SECURITY) +/obj/item/weapon/rig/internalaffairs + name = "augmented tie" + suit_type = "augmented suit" + desc = "Prepare for paperwork." + icon_state = "internalaffairs_rig" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.9 + slowdown = 0 + offline_slowdown = 0 + offline_vision_restriction = 0 + + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/briefcase,/obj/item/weapon/storage/secure/briefcase) + + req_access = list() + req_one_access = list() + + glove_type = null + helm_type = null + boot_type = null + +/obj/item/weapon/rig/internalaffairs/equipped + + req_access = list(access_lawyer) + + initial_modules = list( + /obj/item/rig_module/ai_container, + /obj/item/rig_module/device/flash, + /obj/item/rig_module/device/paperdispenser, + /obj/item/rig_module/device/pen, + /obj/item/rig_module/device/stamp + ) + + glove_type = null + helm_type = null + boot_type = null + /obj/item/weapon/rig/industrial name = "industrial suit control module" suit_type = "industrial hardsuit" @@ -169,7 +205,7 @@ /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." + desc = "A Security hardsuit designed for prolonged EVA in dangerous environments." icon_state = "hazard_rig" armor = list(melee = 60, bullet = 40, laser = 30, energy = 15, bomb = 60, bio = 100, rad = 30) slowdown = 1 diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 97fec1140b3..fddd37724d7 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -6,43 +6,56 @@ name = "Space helmet" icon_state = "space" desc = "A special helmet designed for work in a hazardous, low-pressure environment." - flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT - item_state = "space" + item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT + flags_inv = BLOCKHAIR + item_state_slots = list( + slot_l_hand_str = "s_helmet", + slot_r_hand_str = "s_helmet", + ) permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES cold_protection = HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0.9 species_restricted = list("exclude","Diona","Xenomorph","Vox","Golem") + flash_protection = FLASH_PROTECTION_MAJOR var/obj/machinery/camera/camera var/list/camera_networks + action_button_name = "Toggle Helmet Light" light_overlay = "helmet_light" brightness_on = 4 on = 0 -/obj/item/clothing/head/helmet/space/attack_self(mob/user) +/obj/item/clothing/head/helmet/space/initialize() + ..() + if(camera_networks && camera_networks.len) + verbs += /obj/item/clothing/head/helmet/space/proc/toggle_camera + +/obj/item/clothing/head/helmet/space/proc/toggle_camera() + set name = "Toggle Helmet Camera" + set category = "Object" + set src in usr if(!camera && camera_networks) - - if(!icon_action_button) - icon_action_button = "[icon_state]" - camera = new /obj/machinery/camera(src) camera.replace_networks(camera_networks) - camera.c_tag = user.name - user << "\blue User scanned as [camera.c_tag]. Camera activated." - return 1 + camera.set_status(0) - ..() + if(camera) + camera.set_status(!camera.status) + if(camera.status) + camera.c_tag = FindNameFromID(usr) + usr << "User scanned as [camera.c_tag]. Camera activated." + else + usr << "Camera deactivated." -/obj/item/clothing/head/helmet/space/examine() - ..() - if(camera_networks && get_dist(usr,src) <= 1) - usr << "This helmet has a built-in camera. It's [camera ? "" : "in"]active." +/obj/item/clothing/head/helmet/space/examine(var/mob/user) + if(..(user, 1) && camera_networks && camera_networks.len) + user << "This helmet has a built-in camera. It's [camera && camera.status ? "" : "in"]active." /obj/item/clothing/suit/space name = "Space suit" @@ -52,7 +65,7 @@ w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - flags = STOPPRESSUREDAMAGE | THICKMATERIAL + item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) slowdown = 3 diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index d09e7b4a01d..d7ca80e760b 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -2,7 +2,7 @@ /obj/item/clothing/head/helmet/space/syndicate name = "red space helmet" icon_state = "syndicate" - item_state = "space_helmet_syndicate" + item_state = "syndicate" desc = "A crimson helmet sporting clean lines and durable plating. Engineered to look menacing." armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0.3 @@ -107,7 +107,7 @@ /obj/item/clothing/head/helmet/space/syndicate/black/med name = "black medical space helmet" icon_state = "syndicate-helm-black-med" - item_state = "syndicate-helm-black" + item_state_slots = list(slot_head_str = "syndicate-black-med") /obj/item/clothing/suit/space/syndicate/black/med name = "black medical space suit" @@ -119,7 +119,7 @@ /obj/item/clothing/head/helmet/space/syndicate/black/orange name = "black and orange space helmet" icon_state = "syndicate-helm-black-orange" - item_state = "syndicate-helm-black" + item_state_slots = list(slot_head_str = "syndicate-helm-black-orange") /obj/item/clothing/suit/space/syndicate/black/orange name = "black and orange space suit" @@ -142,7 +142,7 @@ /obj/item/clothing/head/helmet/space/syndicate/black/engie name = "black engineering space helmet" icon_state = "syndicate-helm-black-engie" - item_state = "syndicate-helm-black" + item_state_slots = list(slot_head_str = "syndicate-helm-black-engie") /obj/item/clothing/suit/space/syndicate/black/engie name = "black engineering space suit" diff --git a/code/modules/clothing/spacesuits/void/merc.dm b/code/modules/clothing/spacesuits/void/merc.dm index 4783c3d506b..a0601aafe08 100644 --- a/code/modules/clothing/spacesuits/void/merc.dm +++ b/code/modules/clothing/spacesuits/void/merc.dm @@ -6,8 +6,8 @@ item_state = "syndie_helm" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.3 - species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox", "Xenomorph") - camera_networks = list("NUKE") + species_restricted = list("Human") + camera_networks = list(NETWORK_MERCENARY) light_overlay = "helmet_light_green" //todo: species-specific light overlays /obj/item/clothing/suit/space/void/merc @@ -20,4 +20,4 @@ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs) siemens_coefficient = 0.3 - species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox", "Xenomorph") + species_restricted = list("Human", "Skrell") \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index b7477e2f0e9..f8e6f03611a 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -4,7 +4,10 @@ name = "engineering voidsuit helmet" desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "rig0-engineering" - item_state = "eng_helm" + item_state_slots = list( + slot_l_hand_str = "eng_helm", + slot_r_hand_str = "eng_helm", + ) armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) /obj/item/clothing/suit/space/void/engineering @@ -21,7 +24,10 @@ name = "mining voidsuit helmet" 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_state_slots = list( + slot_l_hand_str = "mining_helm", + slot_r_hand_str = "mining_helm", + ) armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20) light_overlay = "helmet_light_dual" @@ -37,7 +43,10 @@ name = "medical voidsuit helmet" 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_state_slots = list( + slot_l_hand_str = "medical_helm", + slot_r_hand_str = "medical_helm", + ) armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50) /obj/item/clothing/suit/space/void/medical @@ -53,7 +62,10 @@ name = "security voidsuit helmet" 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_state_slots = list( + slot_l_hand_str = "sec_helm", + slot_r_hand_str = "sec_helm", + ) 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" @@ -72,7 +84,10 @@ desc = "A special helmet designed for work in a hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding." name = "atmospherics voidsuit helmet" icon_state = "rig0-atmos" - item_state = "atmos_helm" + item_state_slots = list( + slot_l_hand_str = "atmos_helm", + slot_r_hand_str = "atmos_helm", + ) 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 55987da2f96..26a9dc82b20 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -3,7 +3,6 @@ name = "void helmet" desc = "A high-tech dark red space suit helmet. Used for AI satellite maintenance." icon_state = "void" - item_state = "void" heat_protection = HEAD armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20) @@ -11,7 +10,7 @@ siemens_coefficient = 0.4 //Species-specific stuff. - species_restricted = list("exclude","Unathi","Tajara","Skrell","Diona","Vox","Xenomorph","Vaurca","Golem") + species_restricted = list("Human") sprite_sheets_refit = list( "Unathi" = 'icons/mob/species/unathi/helmet.dmi', "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', @@ -37,7 +36,8 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.4 - species_restricted = list("exclude","Unathi","Tajara","Diona","Vox","Xenomorph","Vaurca","Golem") + + species_restricted = list("Human", "Skrell") sprite_sheets_refit = list( "Unathi" = 'icons/mob/species/unathi/suit.dmi', "Tajara" = 'icons/mob/species/tajaran/suit.dmi', @@ -115,7 +115,7 @@ if(istype(H)) if(helmet && H.head == helmet) H.drop_from_inventory(helmet) - helmet.loc = src + helmet.forceMove(src) if(boots) boots.canremove = 1 @@ -123,11 +123,11 @@ if(istype(H)) if(boots && H.shoes == boots) H.drop_from_inventory(boots) - boots.loc = src + boots.forceMove(src) if(tank) tank.canremove = 1 - tank.loc = src + tank.forceMove(src) /obj/item/clothing/suit/space/void/verb/toggle_helmet() @@ -151,7 +151,7 @@ H << "You retract your suit helmet." helmet.canremove = 1 H.drop_from_inventory(helmet) - helmet.loc = src + helmet.forceMove(src) else if(H.head) H << "You cannot deploy your helmet while wearing \the [H.head]." @@ -189,8 +189,11 @@ if(!istype(user,/mob/living)) return + if(istype(W,/obj/item/clothing/accessory) || istype(W, /obj/item/weapon/hand_labeler)) + return ..() + if(istype(src.loc,/mob/living)) - user << "How do you propose to modify a voidsuit while it is being worn?" + user << "You cannot modify \the [src] while it is being worn." return if(istype(W,/obj/item/weapon/screwdriver)) @@ -200,15 +203,15 @@ if(choice == tank) //No, a switch doesn't work here. Sorry. ~Techhead user << "You pop \the [tank] out of \the [src]'s storage compartment." - tank.loc = get_turf(src) + tank.forceMove(get_turf(src)) src.tank = null else if(choice == helmet) user << "You detatch \the [helmet] from \the [src]'s helmet mount." - helmet.loc = get_turf(src) + helmet.forceMove(get_turf(src)) src.helmet = null else if(choice == boots) user << "You detatch \the [boots] from \the [src]'s boot mounts." - boots.loc = get_turf(src) + boots.forceMove(get_turf(src)) src.boots = null else user << "\The [src] does not have anything installed." @@ -219,7 +222,7 @@ else user << "You attach \the [W] to \the [src]'s helmet mount." user.drop_item() - W.loc = src + W.forceMove(src) src.helmet = W return else if(istype(W,/obj/item/clothing/shoes/magboots)) @@ -228,7 +231,7 @@ else user << "You attach \the [W] to \the [src]'s boot mounts." user.drop_item() - W.loc = src + W.forceMove(src) boots = W return else if(istype(W,/obj/item/weapon/tank)) @@ -239,7 +242,7 @@ else user << "You insert \the [W] into \the [src]'s storage compartment." user.drop_item() - W.loc = src + W.forceMove(src) tank = W return diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm index 90b16b67fb5..3ae252d0878 100644 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ b/code/modules/clothing/spacesuits/void/wizard.dm @@ -3,7 +3,10 @@ name = "gem-encrusted voidsuit helmet" desc = "A bizarre gem-encrusted helmet that radiates magical energies." icon_state = "rig0-wiz" - item_state = "wiz_helm" + item_state_slots = list( + slot_l_hand_str = "wiz_helm", + slot_r_hand_str = "wiz_helm", + ) 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.3 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index e3b4ec9d050..6566b42dfc2 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,7 +1,7 @@ /obj/item/clothing/suit/armor allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight) body_parts_covered = UPPER_TORSO|LOWER_TORSO - flags = THICKMATERIAL + item_flags = THICKMATERIAL cold_protection = UPPER_TORSO|LOWER_TORSO min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE @@ -64,12 +64,11 @@ icon_state = "armor" item_state = "armor" blood_overlay_type = "armor" - flags = ONESIZEFITSALL armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/armor/vest/security name = "security armor" - desc = "An armored vest that protects against some damage. This one has a NanoTrasen corporate badge." + desc = "An armored vest that protects against some damage. This one has a corporate badge." icon_state = "armorsec" item_state = "armor" @@ -117,6 +116,26 @@ armor = list(melee = 25, bullet = 25, laser = 80, energy = 10, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0 +/obj/item/clothing/suit/armor/laserproof/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam)) + var/obj/item/projectile/P = damage_source + + var/reflectchance = 40 - round(damage/3) + if(!(def_zone in list("chest", "groin"))) + reflectchance /= 2 + if(P.starting && prob(reflectchance)) + visible_message("\The [user]'s [src.name] reflects [attack_text]!") + + // Find a turf near or on the original location to bounce to + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(user) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, user) + + return PROJECTILE_CONTINUE // complete projectile permutation + /obj/item/clothing/suit/armor/swat name = "swat suit" desc = "A heavily armored suit that protects against moderate damage. Used in special operations." @@ -124,7 +143,7 @@ item_state = "swat_suit" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - flags = STOPPRESSUREDAMAGE | THICKMATERIAL + item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) slowdown = 1 @@ -153,7 +172,6 @@ icon_state = "detective-armor" item_state = "armor" blood_overlay_type = "armor" - flags = ONESIZEFITSALL body_parts_covered = UPPER_TORSO|LOWER_TORSO armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) @@ -170,9 +188,27 @@ slowdown = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) -/obj/item/clothing/suit/armor/reactive/IsShield() - if(active) - return 1 +/obj/item/clothing/suit/armor/reactive/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(prob(50)) + user.visible_message("The reactive teleport system flings [user] clear of the attack!") + var/list/turfs = new/list() + for(var/turf/T in orange(6, user)) + if(istype(T,/turf/space)) continue + if(T.density) continue + if(T.x>world.maxx-6 || T.x<6) continue + if(T.y>world.maxy-6 || T.y<6) continue + turfs += T + if(!turfs.len) turfs += pick(/turf in orange(6)) + var/turf/picked = pick(turfs) + if(!isturf(picked)) return + + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, user.loc) + spark_system.start() + playsound(user.loc, "sparks", 50, 1) + + user.loc = picked + return PROJECTILE_FORCE_MISS return 0 /obj/item/clothing/suit/armor/reactive/attack_self(mob/user as mob) @@ -249,7 +285,7 @@ //Non-hardsuit ERT armor. /obj/item/clothing/suit/armor/vest/ert name = "emergency response team armor" - desc = "A set of armor worn by members of the NanoTrasen Emergency Response Team." + desc = "A set of armor worn by members of the Emergency Response Team." icon_state = "ertarmor_cmd" item_state = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -258,51 +294,45 @@ //Commander /obj/item/clothing/suit/armor/vest/ert/command name = "emergency response team commander armor" - desc = "A set of armor worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights." + desc = "A set of armor worn by the commander of an Emergency Response Team. Has blue highlights." //Security /obj/item/clothing/suit/armor/vest/ert/security name = "emergency response team security armor" - desc = "A set of armor worn by security members of the NanoTrasen Emergency Response Team. Has red highlights." + desc = "A set of armor worn by security members of the Emergency Response Team. Has red highlights." icon_state = "ertarmor_sec" //Engineer /obj/item/clothing/suit/armor/vest/ert/engineer name = "emergency response team engineer armor" - desc = "A set of armor worn by engineering members of the NanoTrasen Emergency Response Team. Has orange highlights." + desc = "A set of armor worn by engineering members of the Emergency Response Team. Has orange highlights." icon_state = "ertarmor_eng" //Medical /obj/item/clothing/suit/armor/vest/ert/medical name = "emergency response team medical armor" - desc = "A set of armor worn by medical members of the NanoTrasen Emergency Response Team. Has red and white highlights." + desc = "A set of armor worn by medical members of the Emergency Response Team. Has red and white highlights." icon_state = "ertarmor_med" //New Vests -/obj/item/clothing/suit/storage/vest +/obj/item/clothing/suit/armor/vest name = "armor vest" - desc = "A simple kevlar plate carrier." + desc = "An armor vest made of synthetic fibers." icon_state = "kvest" - item_state = "kvest" + item_state = "armor" armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight) siemens_coefficient = 0.5 /obj/item/clothing/suit/storage/vest/officer - name = "officer armor vest" - desc = "A simple kevlar plate carrier belonging to Nanotrasen. This one has a security holobadge clipped to the chest." - icon_state = "officervest_nobadge" - item_state = "officervest_nobadge" - icon_badge = "officervest_badge" - icon_nobadge = "officervest_nobadge" + name = "security armor vest" + desc = "A synthetic armor vest with SECURITY printed in red lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "officervest" /obj/item/clothing/suit/storage/vest/warden name = "warden armor vest" - desc = "A simple kevlar plate carrier belonging to Nanotrasen. This one has a silver badge clipped to the chest." - icon_state = "wardenvest_nobadge" - item_state = "wardenvest_nobadge" - icon_badge = "wardenvest_badge" - icon_nobadge = "wardenvest_nobadge" + desc = "A synthetic armor vest with WARDEN printed in silver lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "wardenvest" /obj/item/clothing/suit/storage/vest/hos name = "commander armor vest" @@ -371,13 +401,13 @@ icon_nobadge = "pcrcwebvest_nobadge" //Provides the protection of a merc voidsuit, but only covers the chest/groin, and also takes up a suit slot. In exchange it has no slowdown and provides storage. -/obj/item/clothing/suit/storage/vest/heavy/merc +/obj/item/clothing/suit/storage/vest/merc name = "heavy armor vest" - desc = "A high-quality heavy kevlar plate carrier in a fetching tan. The vest is surprisingly flexible, and possibly made of an advanced material." + desc = "A high-quality armor vest in a fetching tan. It is surprisingly flexible and light, even with the added webbing and armor plating." icon_state = "mercwebvest" item_state = "mercwebvest" armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) - slowdown = 0 + //All of the armor below is mostly unused diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 037eb6833e0..415f8a6da6d 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -2,11 +2,14 @@ /obj/item/clothing/head/bio_hood name = "bio hood" icon_state = "bio" + item_state_slots = list( + slot_l_hand_str = "bio_hood", + slot_r_hand_str = "bio_hood", + ) desc = "A hood that protects the head and face from biological comtaminants." permeability_coefficient = 0.01 - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES siemens_coefficient = 0.9 diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index c1fa591effc..01f1db51b6c 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -11,7 +11,7 @@ blood_overlay_type = "armor" body_parts_covered = 0 allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/fertilizer,/obj/item/weapon/material/minihoe) - sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') + //Captain /obj/item/clothing/suit/captunic name = "captain's parade tunic" @@ -20,7 +20,6 @@ item_state = "captunic" body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEJUMPSUIT - sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') /obj/item/clothing/suit/captunic/capjacket name = "captain's uniform jacket" @@ -61,7 +60,6 @@ permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list (/obj/item/weapon/material/knife) - sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') //Chef /obj/item/clothing/suit/chef/classic @@ -95,9 +93,9 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS //Detective -/obj/item/clothing/suit/storage/det_suit - name = "coat" - desc = "An 18th-century multi-purpose trenchcoat. Someone who wears this means serious business." +/obj/item/clothing/suit/storage/det_trench + name = "brown trenchcoat" + desc = "A rugged canvas trenchcoat, designed and created by TX Fabrication Corp. The coat is externally impact resistant - perfect for your next act of autodefenestration!" icon_state = "detective" item_state = "det_suit" blood_overlay_type = "coat" @@ -166,8 +164,6 @@ /obj/item/clothing/mask/gas, /obj/item/taperoll/engineering) body_parts_covered = UPPER_TORSO - sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') - //Lawyer /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket name = "Blue Suit Jacket" diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index d1765747574..be8cddd310a 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -9,7 +9,6 @@ body_parts_covered = UPPER_TORSO|ARMS allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0) - sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi') /obj/item/clothing/suit/storage/toggle/labcoat/red name = "red labcoat" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index bc62ac2de58..fdba7aae29b 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -366,7 +366,7 @@ body_parts_covered = UPPER_TORSO|ARMS /obj/item/clothing/suit/storage/leather_jacket/nanotrasen - desc = "A black leather coat. The letters NT are proudly displayed on the back." + desc = "A black leather coat. A corporate logo is proudly displayed on the back." icon_state = "leather_jacket_nt" //This one has buttons for some reason @@ -380,7 +380,7 @@ body_parts_covered = UPPER_TORSO|ARMS /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen - desc = "A brown leather coat. The letters NT are proudly displayed on the back." + desc = "A brown leather coat. A corporate logo is proudly displayed on the back." icon_state = "brown_jacket_nt" icon_open = "brown_jacket_nt_open" icon_closed = "brown_jacket_nt" diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 70e774c204d..2bac0f9ee6c 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -58,8 +58,7 @@ update_clothing_icon() //so our overlays update -//New Vest 4 pocket storage and badge toggles, until suit accessories are a thing. -/obj/item/clothing/suit/storage/vest/heavy/New() +/obj/item/clothing/suit/storage/vest/merc/New() ..() pockets = new/obj/item/weapon/storage/internal(src) pockets.storage_slots = 4 diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 4695a51224c..8e6c4446ef6 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -21,7 +21,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher) slowdown = 1.0 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL - flags = STOPPRESSUREDAMAGE + item_flags = STOPPRESSUREDAMAGE heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS @@ -54,7 +54,7 @@ desc = "Use in case of bomb." icon_state = "bombsuit" w_class = 5//Too large to fit in a backpack - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|STOPPRESSUREDAMAGE|THICKMATERIAL|BLOCK_GAS_SMOKE_EFFECT + item_flags = STOPPRESSUREDAMAGE|THICKMATERIAL|BLOCK_GAS_SMOKE_EFFECT armor = list(melee = 30, bullet = 20, laser = 25,energy = 30, bomb = 100, bio = 60, rad = 60) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES body_parts_covered = HEAD|FACE|EYES @@ -77,7 +77,7 @@ permeability_coefficient = 0.01 slowdown = 8 armor = list(melee = 55, bullet = 55, laser = 55,energy = 60, bomb = 100, bio = 60, rad = 60) - flags = STOPPRESSUREDAMAGE|THICKMATERIAL + item_flags = STOPPRESSUREDAMAGE|THICKMATERIAL flags_inv = HIDEJUMPSUIT|HIDETAIL heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS @@ -156,12 +156,10 @@ /obj/item/clothing/head/bomb_hood/security icon_state = "bombsuitsec" - item_state = "bombsuitsec" body_parts_covered = HEAD /obj/item/clothing/suit/bomb_suit/security icon_state = "bombsuitsec" - item_state = "bombsuitsec" allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS @@ -172,7 +170,7 @@ name = "Radiation Hood" icon_state = "rad" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags_inv = BLOCKHAIR body_parts_covered = HEAD|FACE|EYES armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) @@ -194,4 +192,4 @@ #undef BOMBSUIT_THERMAL #undef BOMBHOOD_THERMAL -#undef BOMBSUIT_MAX_TEMPERATURE \ No newline at end of file +#undef BOMBSUIT_MAX_TEMPERATURE diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index e37d1eb7d4c..d5289054401 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -2,6 +2,10 @@ name = "wizard hat" desc = "Strange-looking hat-wear that most certainly belongs to a real magic user." icon_state = "wizard" + item_state_slots = list( + slot_l_hand_str = "wizhat", + slot_r_hand_str = "wizhat", + ) //Not given any special protective value since the magic robes are full-body protection --NEO siemens_coefficient = 0.7 body_parts_covered = 0 @@ -30,20 +34,32 @@ desc = "A mysterious helmet that hums with an unearthly power" icon_state = "magus" item_state = "magus" - siemens_coefficient = 0.7 + item_state_slots = list( + slot_l_hand_str = "helmet", + slot_r_hand_str = "helmet", + ) + siemens_coefficient = 0.8 body_parts_covered = HEAD|FACE|EYES /obj/item/clothing/head/wizard/amp name = "psychic amplifier" desc = "A crown-of-thorns psychic amplifier. Kind of looks like a tiara having sex with an industrial robot." icon_state = "amp" - siemens_coefficient = 0.7 + item_state_slots = list( + slot_l_hand_str = "helmet", + slot_r_hand_str = "helmet", + ) + siemens_coefficient = 0.8 /obj/item/clothing/head/wizard/cap name = "Gentlemans Cap" desc = "A checkered gray flat cap woven together with the rarest of threads." icon_state = "gentcap" - siemens_coefficient = 0.7 + item_state_slots = list( + slot_l_hand_str = "det_hat", + slot_r_hand_str = "det_hat", + ) + siemens_coefficient = 0.8 /obj/item/clothing/suit/wizrobe name = "wizard robe" diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index f5c438c11f9..51da0e6a7e1 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -7,11 +7,15 @@ 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/obj/item/clothing/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. var/image/mob_overlay = null var/overlay_state = null +/obj/item/clothing/accessory/Destroy() + on_removed() + return ..() + /obj/item/clothing/accessory/proc/get_inv_overlay() if(!inv_overlay) if(!mob_overlay) @@ -42,23 +46,26 @@ return mob_overlay //when user attached an accessory to S -/obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob) +/obj/item/clothing/accessory/proc/on_attached(var/obj/item/clothing/S, var/mob/user) if(!istype(S)) return has_suit = S loc = has_suit has_suit.overlays += get_inv_overlay() - user << "You attach [src] to [has_suit]." + user << "You attach \the [src] to \the [has_suit]." src.add_fingerprint(user) -/obj/item/clothing/accessory/proc/on_removed(mob/user as mob) +/obj/item/clothing/accessory/proc/on_removed(var/mob/user) if(!has_suit) return has_suit.overlays -= get_inv_overlay() has_suit = null - usr.put_in_hands(src) - src.add_fingerprint(user) + if(user) + usr.put_in_hands(src) + src.add_fingerprint(user) + else + src.forceMove(get_turf(src)) //default attackby behaviour /obj/item/clothing/accessory/attackby(obj/item/I, mob/user) @@ -148,7 +155,7 @@ /obj/item/clothing/accessory/medal/conduct name = "distinguished conduct medal" - desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is most basic award given by Nanotrasen. It is often awarded by a captain to a member of their crew." + desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is most basic award on offer. It is often awarded by a captain to a member of their crew." /obj/item/clothing/accessory/medal/bronze_heart name = "bronze heart medal" @@ -170,7 +177,7 @@ /obj/item/clothing/accessory/medal/silver/security name = "robust security award" - desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff." + desc = "An award for distinguished combat and sacrifice in defence of corporate commercial interests. Often awarded to security staff." /obj/item/clothing/accessory/medal/gold name = "gold medal" @@ -179,8 +186,8 @@ /obj/item/clothing/accessory/medal/gold/captain name = "medal of captaincy" - desc = "A golden medal awarded exclusively to those promoted to the rank of captain. It signifies the codified responsibilities of a captain to Nanotrasen, and their undisputable authority over their crew." + desc = "A golden medal awarded exclusively to those promoted to the rank of captain. It signifies the codified responsibilities of a captain, and their undisputable authority over their crew." /obj/item/clothing/accessory/medal/gold/heroism name = "medal of exceptional heroism" - desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." + desc = "An extremely rare golden medal awarded only by company officials. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index ee0a5ef0a83..d06f9b3c62c 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -6,12 +6,13 @@ /obj/item/clothing/accessory/badge name = "detective's badge" - desc = "NanoTrasen Security Department detective's badge, made from gold." + desc = "A corporate security badge, made from gold and set on false leather." icon_state = "badge" + item_state = "marshalbadge" slot_flags = SLOT_BELT | SLOT_TIE var/stored_name - var/badge_string = "NanoTrasen Security Department" + var/badge_string = "Corporate Security" /obj/item/clothing/accessory/badge/old name = "faded badge" @@ -25,7 +26,7 @@ /obj/item/clothing/accessory/badge/attack_self(mob/user as mob) if(!stored_name) - user << "You polish your old badge fondly, shining up the surface." + user << "You polish your badge fondly, shining up the surface." set_name(user.real_name) return @@ -42,8 +43,9 @@ //.Holobadges. /obj/item/clothing/accessory/badge/holo name = "holobadge" - desc = "This glowing blue badge marks the holder as THE LAW." + desc = "This glowing blue badge marks the holder as a member of corporate security." icon_state = "holobadge" + item_state = "holobadge" var/emagged //Emagging removes Sec check. /obj/item/clothing/accessory/badge/holo/cord @@ -56,18 +58,17 @@ return return ..() +/obj/item/clothing/accessory/badge/holo/emag_act(var/remaining_charges, var/mob/user) + if (emagged) + user << "\The [src] is already cracked." + return + else + emagged = 1 + user << "You crack the holobadge security checks." + return 1 + /obj/item/clothing/accessory/badge/holo/attackby(var/obj/item/O as obj, var/mob/user as mob) - - if (istype(O, /obj/item/weapon/card/emag)) - if (emagged) - user << "[src] is already cracked." - return - else - emagged = 1 - user << "You swipe [O] and crack the holobadge security checks." - return - - else if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda)) + if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda)) var/obj/item/weapon/card/id/id_card = null @@ -97,3 +98,24 @@ new /obj/item/clothing/accessory/badge/holo/cord(src) ..() return + + +/obj/item/clothing/accessory/badge/warden + name = "warden's badge" + desc = "A silver corporate security badge. Stamped with the words 'Brig Officer.'" + icon_state = "silverbadge" + slot_flags = SLOT_TIE + + +/obj/item/clothing/accessory/badge/hos + name = "commander's badge" + desc = "An immaculately polished gold security badge. Labeled 'Commander.'" + icon_state = "goldbadge" + slot_flags = SLOT_TIE + +/obj/item/clothing/accessory/badge/marshal + name = "marshal's badge" + desc = "A leather-backed gold badge displaying the crest of the Colonial Marshals." + icon_state = "marshalbadge" + badge_string = "Colonial Marshal Bureau" + diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 51ce02a7ed3..9ba4ffa5e34 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -5,8 +5,8 @@ slot = "utility" var/obj/item/holstered = null -/obj/item/clothing/accessory/holster/proc/holster(obj/item/I, mob/user as mob) - if(holstered) +/obj/item/clothing/accessory/holster/proc/holster(var/obj/item/I, var/mob/living/user) + if(holstered && istype(user)) user << "There is already \a [holstered] holstered here!" return @@ -14,12 +14,19 @@ user << "[I] won't fit in [src]!" return + if(istype(user)) + user.stop_aiming(no_message=1) holstered = I user.drop_from_inventory(holstered) holstered.loc = src holstered.add_fingerprint(user) w_class = max(w_class, holstered.w_class) user.visible_message("[user] holsters \the [holstered].", "You holster \the [holstered].") + name = "occupied [initial(name)]" + +/obj/item/clothing/accessory/holster/proc/clear_holster() + holstered = null + name = initial(name) /obj/item/clothing/accessory/holster/proc/unholster(mob/user as mob) if(!holstered) @@ -30,7 +37,7 @@ else if(user.a_intent == I_HURT) usr.visible_message( - "\red [user] draws \the [holstered], ready to shoot!", + "[user] draws \the [holstered], ready to shoot!", "You draw \the [holstered], ready to shoot!" ) else @@ -40,8 +47,8 @@ ) user.put_in_hands(holstered) holstered.add_fingerprint(user) - holstered = null w_class = initial(w_class) + clear_holster() /obj/item/clothing/accessory/holster/attack_hand(mob/user as mob) if (has_suit) //if we are part of a suit diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 8ef17ca0b1d..a4877bb65d7 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -34,10 +34,6 @@ hold.emp_act(severity) ..() -/obj/item/clothing/accessory/storage/hear_talk(mob/M, var/msg, verb, datum/language/speaking) - hold.hear_talk(M, msg, verb, speaking) - ..() - /obj/item/clothing/accessory/storage/attack_self(mob/user as mob) user << "You empty [src]." var/turf/T = get_turf(src) diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm deleted file mode 100644 index 4de31fb6e37..00000000000 --- a/code/modules/clothing/under/chameleon.dm +++ /dev/null @@ -1,456 +0,0 @@ -//***************** -//**Cham Jumpsuit** -//***************** - -/obj/item/clothing/under/chameleon -//starts off as black - name = "black jumpsuit" - icon_state = "black" - item_state = "bl_suit" - 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() - -/obj/item/clothing/under/chameleon/New() - ..() - var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/cloud, /obj/item/clothing/under/gimmick)//Prevent infinite loops and bad jumpsuits. - for(var/U in typesof(/obj/item/clothing/under)-blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices[V.name] = U - return - -/obj/item/clothing/under/chameleon/emp_act(severity) - name = "psychedelic" - desc = "Groovy!" - icon_state = "psyche" - item_state_slots[slot_w_uniform_str] = "psyche" - update_icon() - update_clothing_icon() - -/obj/item/clothing/under/chameleon/verb/change() - set name = "Change Jumpsuit Appearance" - set category = "Object" - set src in usr - - var/picked = input("Select jumpsuit to change it to", "Chameleon Jumpsuit")as null|anything in clothing_choices - if(!picked || !clothing_choices[picked]) - return - var/newtype = clothing_choices[picked] - var/obj/item/clothing/under/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - 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. - -//***************** -//**Chameleon Hat** -//***************** - -/obj/item/clothing/head/chameleon - name = "grey cap" - icon_state = "greysoft" - item_state = "greysoft" - 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 - var/list/clothing_choices = list() - -/obj/item/clothing/head/chameleon/New() - ..() - var/blocked = list(/obj/item/clothing/head/chameleon,/obj/item/clothing/head/justice,)//Prevent infinite loops and bad hats. - for(var/U in typesof(/obj/item/clothing/head)-blocked) - var/obj/item/clothing/head/V = new U - src.clothing_choices[V.name] = U - return - -/obj/item/clothing/head/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. - name = "grey cap" - desc = "It's a baseball hat in a tasteful grey colour." - icon_state = "greysoft" - update_icon() - update_clothing_icon() - -/obj/item/clothing/head/chameleon/verb/change() - set name = "Change Hat/Helmet Appearance" - set category = "Object" - set src in usr - - var/picked = input("Select headwear to change it to", "Chameleon Hat")as null|anything in clothing_choices - if(!picked || !clothing_choices[picked]) - return - var/newtype = clothing_choices[picked] - var/obj/item/clothing/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - flags_inv = A.flags_inv - body_parts_covered = A.body_parts_covered - update_clothing_icon() //so our overlays update. - -//****************** -//**Chameleon Suit** -//****************** - -/obj/item/clothing/suit/chameleon - name = "armor" - icon_state = "armor" - item_state = "armor" - desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change it's appearance, but offering no protection.. It seems to have a small dial inside." - origin_tech = "syndicate=3" - var/list/clothing_choices = list() - -/obj/item/clothing/suit/chameleon/New() - ..() - var/blocked = list(/obj/item/clothing/suit/chameleon, /obj/item/clothing/suit/cyborg_suit, /obj/item/clothing/suit/justice, - /obj/item/clothing/suit/greatcoat)//Prevent infinite loops and bad suits. - for(var/U in typesof(/obj/item/clothing/suit)-blocked) - var/obj/item/clothing/suit/V = new U - src.clothing_choices[V.name] = U - return - -/obj/item/clothing/suit/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. - name = "armor" - desc = "An armored vest that protects against some damage." - icon_state = "armor" - update_icon() - update_clothing_icon() - -/obj/item/clothing/suit/chameleon/verb/change() - set name = "Change Exosuit Appearance" - set category = "Object" - set src in usr - - var/picked = input("Select exosuit to change it to", "Chameleon Exosuit")as null|anything in clothing_choices - if(!picked || !clothing_choices[picked]) - return - var/newtype = clothing_choices[picked] - var/obj/item/clothing/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - flags_inv = A.flags_inv - body_parts_covered = A.body_parts_covered - update_clothing_icon() //so our overlays update. - -//******************* -//**Chameleon Shoes** -//******************* -/obj/item/clothing/shoes/chameleon - name = "black shoes" - icon_state = "black" - item_state = "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() - -/obj/item/clothing/shoes/chameleon/New() - ..() - var/blocked = list(/obj/item/clothing/shoes/chameleon, /obj/item/clothing/shoes/syndigaloshes, /obj/item/clothing/shoes/cyborg)//prevent infinite loops and bad shoes. - for(var/U in typesof(/obj/item/clothing/shoes)-blocked) - var/obj/item/clothing/shoes/V = new U - src.clothing_choices[V.name] = U - return - -/obj/item/clothing/shoes/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. - name = "black shoes" - desc = "A pair of black shoes." - icon_state = "black" - item_state = "black" - update_icon() - update_clothing_icon() - -/obj/item/clothing/shoes/chameleon/verb/change() - set name = "Change Footwear Appearance" - set category = "Object" - set src in usr - - var/picked = input("Select shoes to change it to", "Chameleon Shoes")as null|anything in clothing_choices - if(!picked || !clothing_choices[picked]) - return - var/newtype = clothing_choices[picked] - var/obj/item/clothing/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - update_clothing_icon() //so our overlays update. - -//********************** -//**Chameleon Backpack** -//********************** -/obj/item/weapon/storage/backpack/chameleon - name = "backpack" - icon_state = "backpack" - item_state = "backpack" - desc = "A backpack outfitted with cloaking tech. It seems to have a small dial inside, kept away from the storage." - origin_tech = "syndicate=3" - var/list/clothing_choices = list() - -/obj/item/weapon/storage/backpack/chameleon/New() - ..() - var/blocked = list(/obj/item/weapon/storage/backpack/chameleon, /obj/item/weapon/storage/backpack/satchel/withwallet) - for(var/U in typesof(/obj/item/weapon/storage/backpack)-blocked)//Prevent infinite loops and bad backpacks. - var/obj/item/weapon/storage/backpack/V = new U - src.clothing_choices[V.name] = U - return - -/obj/item/weapon/storage/backpack/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. - name = "backpack" - desc = "You wear this on your back and put items into it." - icon_state = "backpack" - item_state = "backpack" - update_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_back() - -/obj/item/weapon/storage/backpack/chameleon/verb/change() - set name = "Change Backpack Appearance" - set category = "Object" - set src in usr - - var/picked = input("Select backpack to change it to", "Chameleon Backpack")as null|anything in clothing_choices - if(!picked || !clothing_choices[picked]) - return - var/newtype = clothing_choices[picked] - var/obj/item/weapon/storage/backpack/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - - //so our overlays update. - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_back() - -//******************** -//**Chameleon Gloves** -//******************** - -/obj/item/clothing/gloves/chameleon - name = "black gloves" - icon_state = "black" - item_state = "bgloves" - 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() - -/obj/item/clothing/gloves/chameleon/New() - ..() - var/blocked = list(/obj/item/clothing/gloves/chameleon)//Prevent infinite loops and bad hats. - for(var/U in typesof(/obj/item/clothing/gloves)-blocked) - var/obj/item/clothing/gloves/V = new U - src.clothing_choices[V.name] = U - return - -/obj/item/clothing/gloves/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. - name = "black gloves" - desc = "It looks like a pair of gloves, but it seems to have a small dial inside." - icon_state = "black" - update_icon() - update_clothing_icon() - -/obj/item/clothing/gloves/chameleon/verb/change() - set name = "Change Gloves Appearance" - set category = "Object" - set src in usr - - var/picked = input("Select gloves to change it to", "Chameleon Gloves")as null|anything in clothing_choices - if(!picked || !clothing_choices[picked]) - return - var/newtype = clothing_choices[picked] - var/obj/item/clothing/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - flags_inv = A.flags_inv - update_clothing_icon() //so our overlays update. - -//****************** -//**Chameleon Mask** -//****************** - -/obj/item/clothing/mask/chameleon - name = "gas mask" - icon_state = "gas_alt" - item_state = "gas_alt" - desc = "It looks like a plain gask mask, but on closer inspection, it seems to have a small dial inside." - origin_tech = "syndicate=3" - var/list/clothing_choices = list() - -/obj/item/clothing/mask/chameleon/New() - ..() - var/blocked = list(/obj/item/clothing/mask/chameleon)//Prevent infinite loops and bad hats. - for(var/U in typesof(/obj/item/clothing/mask)-blocked) - var/obj/item/clothing/mask/V = new U - if(V) - src.clothing_choices[V.name] = U - return - -/obj/item/clothing/mask/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. - name = "gas mask" - desc = "It's a gas mask." - icon_state = "gas_alt" - update_icon() - update_clothing_icon() - -/obj/item/clothing/mask/chameleon/verb/change() - set name = "Change Mask Appearance" - set category = "Object" - set src in usr - - var/picked = input("Select mask to change it to", "Chameleon Mask")as null|anything in clothing_choices - if(!picked || !clothing_choices[picked]) - return - var/newtype = clothing_choices[picked] - var/obj/item/clothing/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - flags_inv = A.flags_inv - body_parts_covered = A.body_parts_covered - update_clothing_icon() //so our overlays update. - -//********************* -//**Chameleon Glasses** -//********************* - -/obj/item/clothing/glasses/chameleon - name = "Optical Meson Scanner" - icon_state = "meson" - item_state = "glasses" - desc = "It looks like a plain set of mesons, but on closer inspection, it seems to have a small dial inside." - origin_tech = "syndicate=3" - var/list/clothing_choices = list() - -/obj/item/clothing/glasses/chameleon/New() - ..() - var/blocked = list(/obj/item/clothing/glasses/chameleon)//Prevent infinite loops and bad hats. - for(var/U in typesof(/obj/item/clothing/glasses)-blocked) - var/obj/item/clothing/glasses/V = new U - src.clothing_choices[V.name] = U - return - -/obj/item/clothing/glasses/chameleon/emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown. - name = "Optical Meson Scanner" - desc = "It's a set of mesons." - icon_state = "meson" - update_icon() - update_clothing_icon() - -/obj/item/clothing/glasses/chameleon/verb/change() - set name = "Change Glasses Appearance" - set category = "Object" - set src in usr - - var/picked = input("Select glasses to change it to", "Chameleon Glasses")as null|anything in clothing_choices - if(!picked || !clothing_choices[picked]) - return - var/newtype = clothing_choices[picked] - var/obj/item/clothing/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - flags_inv = A.flags_inv - update_clothing_icon() //so our overlays update. - -//***************** -//**Chameleon Gun** -//***************** -/obj/item/weapon/gun/projectile/chameleon - name = "desert eagle" - desc = "A fake Desert Eagle with a dial on the side to change the gun's disguise." - icon_state = "deagle" - w_class = 3.0 - max_shells = 7 - caliber = ".45" - origin_tech = "combat=2;materials=2;syndicate=8" - ammo_type = "/obj/item/ammo_casing/chameleon" - matter = list() - var/list/gun_choices = list() - -/obj/item/weapon/gun/projectile/chameleon/New() - ..() - var/blocked = list(/obj/item/weapon/gun/projectile/chameleon) - for(var/U in typesof(/obj/item/weapon/gun/)-blocked) - var/obj/item/weapon/gun/V = new U - src.gun_choices[V.name] = U - return - -/obj/item/weapon/gun/projectile/chameleon/emp_act(severity) - name = "desert eagle" - desc = "It's a desert eagle." - icon_state = "deagle" - update_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_r_hand() - M.update_inv_l_hand() - -/obj/item/weapon/gun/projectile/chameleon/verb/change(picked in gun_choices) - set name = "Change Gun Appearance" - set category = "Object" - set src in usr - - if(!picked || !gun_choices[picked]) - return - var/newtype = gun_choices[picked] - var/obj/item/weapon/gun/A = new newtype - - desc = null - permeability_coefficient = 0.90 - - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - flags_inv = A.flags_inv - - //so our overlays update. - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_r_hand() - M.update_inv_l_hand() diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index acc7f557087..2a75a466224 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -31,7 +31,7 @@ /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." + desc = "It's standardised prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." icon_state = "orange" item_state = "o_suit" worn_state = "orange" diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 8be9807e1f4..4592ed8e229 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -23,8 +23,14 @@ 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." + desc = "It's a slimming black jumpsuit with reinforced seams; great for industrial work." name = "roboticist's jumpsuit" icon_state = "robotics" item_state = "bl_suit" - worn_state = "robotics" \ No newline at end of file + worn_state = "robotics" + +/obj/item/clothing/under/rank/roboticist/skirt + desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work." + name = "roboticist's jumpskirt" + icon_state = "roboticsf" + worn_state = "roboticsf" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 83c02e54a2b..baa96db005e 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -17,6 +17,12 @@ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.7 +/obj/item/clothing/head/warden + name = "warden's hat" + desc = "It's a special helmet issued to the Warden of a securiy force." + icon_state = "policehelm" + body_parts_covered = 0 + /obj/item/clothing/under/rank/security name = "security officer's jumpsuit" desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." @@ -68,43 +74,51 @@ * Detective */ /obj/item/clothing/under/det - name = "hard-worn suit" - desc = "Someone who wears this means business." + name = "detective's suit" + desc = "A rumpled white dress shirt paired with well-worn grey slacks, complete with a blue striped tie and a faux-gold tie clip." icon_state = "detective" item_state = "det" worn_state = "detective" armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.7 -/obj/item/clothing/under/det/black - icon_state = "detective2" - worn_state = "detective2" - item_state = "sl_suit" - -/obj/item/clothing/under/det/slob - icon_state = "polsuit" - worn_state = "polsuit" - -/obj/item/clothing/under/det/slob/verb/rollup() - set name = "Roll suit sleeves" +/obj/item/clothing/under/det/verb/rollup() + set name = "Roll Suit Sleeves" set category = "Object" set src in usr - worn_state = worn_state == "polsuit" ? "polsuit_rolled" : "polsuit" - if (ishuman(loc)) - var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform(1) + var/unrolled = item_state_slots[slot_w_uniform_str] == initial(worn_state) + item_state_slots[slot_w_uniform_str] = unrolled ? "[worn_state]_r" : initial(worn_state) + var/mob/living/carbon/human/H = loc + H.update_inv_w_uniform(1) + H << "You roll the sleeves of your shirt [unrolled ? "up" : "down"]" -/obj/item/clothing/head/det_hat - name = "hat" - desc = "Someone who wears this will look very smart." +/obj/item/clothing/under/det/grey + icon_state = "detective2" + worn_state = "detective2" + desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie." + +/obj/item/clothing/under/det/black + icon_state = "detective3" + worn_state = "detective3" + item_state = "sl_suit" + desc = "An immaculate white dress shirt, paired with a pair of dark grey dress pants, a red tie, and a charcoal vest." + +/obj/item/clothing/head/det + name = "fedora" + desc = "A brown fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it." icon_state = "detective" + item_state_slots = list( + slot_l_hand_str = "det_hat", + slot_r_hand_str = "det_hat", + ) allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen) armor = list(melee = 50, bullet = 5, laser = 25,energy = 10, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.7 body_parts_covered = 0 -/obj/item/clothing/head/det_hat/black +/obj/item/clothing/head/det/grey icon_state = "detective2" + desc = "A grey fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it." /obj/item/clothing/head/det_hat/technicolor desc = "A 23rd-century fedora. It's fibres are hyper-absorbent." @@ -150,15 +164,20 @@ obj/item/clothing/head/det_hat/technicolor/attackby(obj/item/weapon/O as obj, mo worn_state = "hos_corporate" /obj/item/clothing/head/helmet/HoS - name = "head of security hat" + name = "Head of Security hat" desc = "The hat of the Head of Security. For showing the officers who's in charge." icon_state = "hoscap" - flags = HEADCOVERSEYES armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEEARS body_parts_covered = 0 siemens_coefficient = 0.5 +/obj/item/clothing/head/HoS/dermal + name = "Dermal Armour Patch" + desc = "You're not quite sure how you manage to take it on and off, but it implants nicely in your head." + icon_state = "dermal" + siemens_coefficient = 0.6 + /obj/item/clothing/suit/armor/hos name = "head of security's jacket" desc = "An armoured jacket with golden rank pips and livery." @@ -170,14 +189,6 @@ obj/item/clothing/head/det_hat/technicolor/attackby(obj/item/weapon/O as obj, mo siemens_coefficient = 0.5 pocket_slots = 4//More slots because coat - -/obj/item/clothing/head/helmet/HoS/dermal - name = "dermal armour patch" - desc = "You're not quite sure how you manage to take it on and off, but it implants nicely in your head." - icon_state = "dermal" - item_state = "dermal" - siemens_coefficient = 0.5 - //Jensen cosplay gear /obj/item/clothing/under/rank/head_of_security/jensen desc = "You never asked for anything that stylish." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index a28245b9178..4b442277569 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -72,7 +72,7 @@ //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 \"Captain.\"" - name = "\improper NanoTrasen Officer's Dress Uniform" + name = "\improper Officer's Dress Uniform" icon_state = "officer" item_state = "lawyer_black" worn_state = "officer" @@ -80,7 +80,7 @@ /obj/item/clothing/under/rank/centcom_officer desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral.\"" - name = "\improper NanoTrasen Officer's Dress Uniform" + name = "\improper Officer's Dress Uniform" icon_state = "officer" item_state = "lawyer_black" worn_state = "officer" @@ -88,7 +88,7 @@ /obj/item/clothing/under/rank/centcom_captain desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral-Executive.\"" - name = "\improper NanoTrasen Officer's Dress Uniform" + name = "\improper Officer's Dress Uniform" icon_state = "centcom" item_state = "lawyer_black" worn_state = "centcom" diff --git a/code/modules/clothing/under/xenos/resomi.dm b/code/modules/clothing/under/xenos/resomi.dm new file mode 100644 index 00000000000..21c89ae1290 --- /dev/null +++ b/code/modules/clothing/under/xenos/resomi.dm @@ -0,0 +1,32 @@ +/obj/item/clothing/under/resomi + name = "small grey smock" + desc = "It looks fitted to nonhuman proportions." + icon = 'icons/obj/clothing/species/resomi/uniform.dmi' + icon_state = "resomi_grey" + worn_state = "resomi_grey" + species_restricted = list("Resomi") + +/obj/item/clothing/under/resomi/white + name = "small white smock" + icon_state = "resomi_white" + worn_state = "resomi_white" + +/obj/item/clothing/under/resomi/red + name = "small Security smock" + icon_state = "resomi_red" + worn_state = "resomi_red" + +/obj/item/clothing/under/resomi/yellow + name = "small Engineering smock" + icon_state = "resomi_yellow" + worn_state = "resomi_yellow" + +/obj/item/clothing/under/resomi/medical + name = "small Medical uniform" + icon_state = "resomi_medical" + worn_state = "resomi_medical" + +/obj/item/clothing/under/resomi/rainbow + name = "small rainbow smock" + icon_state = "resomi_rainbow" + worn_state = "resomi_rainbow" \ No newline at end of file diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 3813e2e22a8..c9fa2b486e4 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -573,10 +573,10 @@ All custom items with worn sprites must follow the contained sprite system: http last_special = world.time + 500 var/obj/item/organ/F = src.internal_organs_by_name["heart"] - + if(isnull(F)) return - + F.damage += 5 src << "You feel a stabbing pain in your chest!" playsound(user, 'sound/effects/Heart Beat.ogg', 20, 1) @@ -622,7 +622,7 @@ All custom items with worn sprites must follow the contained sprite system: http desc = "Certification for a doctorate in Xenonuerology, made out to Alexis Shaw by the St. Grahelm University of Biesel, authenticated by watermarking." icon_state = "alexis_degree" sign_state = "alexis_degree" - w_class = 2 + w_class = 2 /obj/item/clothing/mask/fluff/rur_collar //Tagging Collar - R.U.R - coalf - DONE @@ -632,7 +632,6 @@ All custom items with worn sprites must follow the contained sprite system: http icon_state = "rur_collar" item_state = "rur_collar" contained_sprite = 1 - flags = MASKCOVERSMOUTH body_parts_covered = 0 canremove = 0 species_restricted = list("Machine") diff --git a/code/modules/detectivework/microscope/microscope.dm b/code/modules/detectivework/microscope/microscope.dm index 5cc4ef0afba..5fd31a555c8 100644 --- a/code/modules/detectivework/microscope/microscope.dm +++ b/code/modules/detectivework/microscope/microscope.dm @@ -90,7 +90,7 @@ return /obj/machinery/microscope/proc/remove_sample(var/mob/living/remover) - if(!istype(remover) || remover.stat || !Adjacent(remover)) + if(!istype(remover) || remover.incapacitated() || !Adjacent(remover)) return ..() if(!sample) remover << "\The [src] does not have a sample in it." diff --git a/code/modules/detectivework/scanning_console.dm b/code/modules/detectivework/scanning_console.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/modules/detectivework/tools/swabs.dm b/code/modules/detectivework/tools/swabs.dm index 292d7897719..095c2b46857 100644 --- a/code/modules/detectivework/tools/swabs.dm +++ b/code/modules/detectivework/tools/swabs.dm @@ -36,8 +36,8 @@ if(!H.organs_by_name["head"]) user << "They don't have a head." return - if(H.species && (H.species.flags & NO_SCAN)) - user << "They don't have any biological fluids to check!." + if(!H.check_has_mouth()) + user << "They don't have a mouth." return user.visible_message("[user] swabs \the [H]'s mouth for a saliva sample.") dna = list(H.dna.unique_enzymes) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 21b6f54750a..3147c418315 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -15,7 +15,7 @@ log transactions /obj/item/weapon/card/id/var/money = 2000 /obj/machinery/atm - name = "NanoTrasen Automatic Teller Machine" + name = "Automatic Teller Machine" desc = "For all your monetary needs!" icon = 'icons/obj/terminals.dmi' icon_state = "atm" @@ -62,6 +62,22 @@ log transactions playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) break +/obj/machinery/atm/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + return + + //short out the machine, shoot sparks, spew money! + emagged = 1 + spark_system.start() + spawn_money(rand(100,500),src.loc) + //we don't want to grief people by locking their id in an emagged ATM + release_held_id(user) + + //display a message to the user + var/response = pick("Initiating withdraw. Have a nice day!", "CRITICAL ERROR: Activating cash chamber panic siphon.","PIN Code accepted! Emptying account balance.", "Jackpot!") + user << "\icon[src] The [src] beeps: \"[response]\"" + return 1 + /obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/weapon/card)) if(emagged > 0) @@ -69,16 +85,7 @@ log transactions user << "\red \icon[src] CARD READER ERROR. This system has been compromised!" return else if(istype(I,/obj/item/weapon/card/emag)) - //short out the machine, shoot sparks, spew money! - emagged = 1 - spark_system.start() - spawn_money(rand(100,500),src.loc) - //we don't want to grief people by locking their id in an emagged ATM - release_held_id(user) - - //display a message to the user - var/response = pick("Initiating withdraw. Have a nice day!", "CRITICAL ERROR: Activating cash chamber panic siphon.","PIN Code accepted! Emptying account balance.", "Jackpot!") - user << "\red \icon[src] The [src] beeps: \"[response]\"" + I.resolve_attackby(src, user) return var/obj/item/weapon/card/id/idcard = I @@ -115,17 +122,17 @@ log transactions /obj/machinery/atm/attack_hand(mob/user as mob) if(istype(user, /mob/living/silicon)) - user << "\red \icon[src] Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005." + user << "\red \icon[src] Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per system banking regulation #1005." return if(get_dist(src,user) <= 1) //js replicated from obj/machinery/computer/card - var/dat = "

      NanoTrasen Automatic Teller Machine

      " + var/dat = "

      Automatic Teller Machine

      " dat += "For all your monetary needs!
      " - dat += "This terminal is [machine_id]. Report this code when contacting NanoTrasen IT Support
      " + dat += "This terminal is [machine_id]. Report this code when contacting IT Support
      " if(emagged > 0) - dat += "Card: LOCKED

      Unauthorized terminal access detected! This ATM has been locked. Please contact NanoTrasen IT Support." + dat += "Card: LOCKED

      Unauthorized terminal access detected! This ATM has been locked. Please contact IT Support." else dat += "Card: [held_card ? held_card.name : "------"]

      " diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index fda22b17f9e..003816e04c5 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -85,7 +85,7 @@ /obj/item/device/eftpos/attack_self(mob/user as mob) if(get_dist(src,user) <= 1) var/dat = "[eftpos_name]
      " - dat += "This terminal is [machine_id]. Report this code when contacting NanoTrasen IT Support
      " + dat += "This terminal is [machine_id]. Report this code when contacting IT Support
      " if(transaction_locked) dat += "Back[transaction_paid ? "" : " (authentication required)"]

      " diff --git a/code/modules/economy/Events.dm b/code/modules/economy/Events.dm index 997eda1c8bb..43902242c7a 100644 --- a/code/modules/economy/Events.dm +++ b/code/modules/economy/Events.dm @@ -73,7 +73,7 @@ body = "A small [pick("pirate","Cybersun Industries","Gorlex Marauders","mercenary")] fleet has precise-jumped into proximity with [affected_dest.name], [pick("for a smash-and-grab operation","in a hit and run attack","in an overt display of hostilities")]. Much damage was done, and security has been tightened since the incident." if(ALIEN_RAIDERS) if(prob(20)) - body = "The Tiger Co-operative have raided [affected_dest.name] today, no doubt on orders from their enigmatic masters. Stealing wildlife, farm animals, medical research materials and kidnapping civilians. NanoTrasen authorities are standing by to counter attempts at bio-terrorism." + body = "The Tiger Co-operative have raided [affected_dest.name] today, no doubt on orders from their enigmatic masters. Stealing wildlife, farm animals, medical research materials and kidnapping civilians. [company_name] authorities are standing by to counter attempts at bio-terrorism." else body = "[pick("The alien species designated \'United Exolitics\'","The alien species designated \'REDACTED\'","An unknown alien species")] have raided [affected_dest.name] today, stealing wildlife, farm animals, medical research materials and kidnapping civilians. It seems they desire to learn more about us, so the Navy will be standing by to accomodate them next time they try." if(AI_LIBERATION) @@ -83,7 +83,7 @@ if(CULT_CELL_REVEALED) body = "A [pick("dastardly","blood-thirsty","villanous","crazed")] cult of [pick("The Elder Gods","an apocalyptic sect","\'REDACTED\'")] has [pick("been discovered","been revealed","revealed themselves","gone public")] on [affected_dest.name] earlier today. Public morale has been shaken due to [pick("certain","several","one or two")] [pick("high-profile","well known","popular")] individuals [pick("performing \'REDACTED\' acts","claiming allegiance to the cult","swearing loyalty to the cult leader","promising to aid to the cult")] before those involved could be brought to justice. The editor reminds all personnel that supernatural myths will not be tolerated on NanoTrasen facilities." if(SECURITY_BREACH) - body = "There was [pick("a security breach in","an unauthorised access in","an attempted theft in","an anarchist attack in","violent sabotage of")] a [pick("high-security","restricted access","classified","\'REDACTED\'")] [pick("\'REDACTED\'","section","zone","area")] this morning. Security was tightened on [affected_dest.name] after the incident, and the editor reassures all NanoTrasen personnel that such lapses are rare." + body = "There was [pick("a security breach in","an unauthorised access in","an attempted theft in","an anarchist attack in","violent sabotage of")] a [pick("high-security","restricted access","classified","\'REDACTED\'")] [pick("\'REDACTED\'","section","zone","area")] this morning. Security was tightened on [affected_dest.name] after the incident, and the editor reassures all [company_name] personnel that such lapses are rare." if(ANIMAL_RIGHTS_RAID) body = "[pick("Militant animal rights activists","Members of the terrorist group Animal Rights Consortium","Members of the terrorist group \'REDACTED\'")] have [pick("launched a campaign of terror","unleashed a swathe of destruction","raided farms and pastures","forced entry to \'REDACTED\'")] on [affected_dest.name] earlier today, freeing numerous [pick("farm animals","animals","\'REDACTED\'")]. Prices for tame and breeding animals have spiked as a result." if(FESTIVAL) diff --git a/code/modules/economy/Events_Mundane.dm b/code/modules/economy/Events_Mundane.dm index ff3e2d491f1..570fdaa86d5 100644 --- a/code/modules/economy/Events_Mundane.dm +++ b/code/modules/economy/Events_Mundane.dm @@ -22,17 +22,17 @@ if(RESEARCH_BREAKTHROUGH) body = "A major breakthough in the field of [pick("phoron research","super-compressed materials","nano-augmentation","bluespace research","volatile power manipulation")] \ was announced [pick("yesterday","a few days ago","last week","earlier this month")] by a private firm on [affected_dest.name]. \ - NanoTrasen declined to comment as to whether this could impinge on profits." + [company_name] declined to comment as to whether this could impinge on profits." if(ELECTION) body = "The pre-selection of an additional candidates was announced for the upcoming [pick("supervisors council","advisory board","governership","board of inquisitors")] \ election on [affected_dest.name] was announced earlier today, \ [pick("media mogul","web celebrity", "industry titan", "superstar", "famed chef", "popular gardener", "ex-army officer", "multi-billionaire")] \ [random_name(pick(MALE,FEMALE))]. In a statement to the media they said '[pick("My only goal is to help the [pick("sick","poor","children")]",\ - "I will maintain NanoTrasen's record profits","I believe in our future","We must return to our moral core","Just like... chill out dudes")]'." + "I will maintain my company's record profits","I believe in our future","We must return to our moral core","Just like... chill out dudes")]'." if(RESIGNATION) - body = "NanoTrasen regretfully announces the resignation of [pick("Sector Admiral","Division Admiral","Ship Admiral","Vice Admiral")] [random_name(pick(MALE,FEMALE))]." + body = "[company_name] regretfully announces the resignation of [pick("Sector Admiral","Division Admiral","Ship Admiral","Vice Admiral")] [random_name(pick(MALE,FEMALE))]." if(prob(25)) var/locstring = pick("Segunda","Salusa","Cepheus","Andromeda","Gruis","Corona","Aquila","Asellus") + " " + pick("I","II","III","IV","V","VI","VII","VIII") body += " In a ceremony on [affected_dest.name] this afternoon, they will be awarded the \ @@ -155,7 +155,7 @@ "[pick("Unathi","Spacer")] gets tattoo of Tau Ceti on chest '[pick("CentComm","star","starship","asteroid")] tickles most'.",\ "Skrell marries computer; wedding attended by 100 modems.",\ "Chef reports successfully using harmonica as cheese grater.",\ - "NanoTrasen invents handkerchief that says 'Bless you' after sneeze.",\ + "[company_name] invents handkerchief that says 'Bless you' after sneeze.",\ "Clone accused of posing for other clones’s school photo.",\ "Clone accused of stealing other clones’s employee of the month award.",\ "Woman robs station with hair dryer; crewmen love new style.",\ diff --git a/code/modules/economy/TradeDestinations.dm b/code/modules/economy/TradeDestinations.dm index 2f376606d7c..19f2abfcdc3 100644 --- a/code/modules/economy/TradeDestinations.dm +++ b/code/modules/economy/TradeDestinations.dm @@ -38,12 +38,12 @@ var/list/weighted_mundaneevent_locations = list() /datum/trade_destination/anansi/get_custom_eventstring(var/event_type) if(event_type == RESEARCH_BREAKTHROUGH) return "Thanks to research conducted on the NSS Anansi, Second Red Cross Society wishes to announce a major breakthough in the field of \ - [pick("mind-machine interfacing","neuroscience","nano-augmentation","genetics")]. NanoTrasen is expected to announce a co-exploitation deal within the fortnight." + [pick("mind-machine interfacing","neuroscience","nano-augmentation","genetics")]. [company_name] is expected to announce a co-exploitation deal within the fortnight." return null /datum/trade_destination/icarus name = "NDV Icarus" - description = "Corvette assigned to patrol NSS Exodus local space." + description = "Corvette assigned to patrol local space." distance = 0.1 willing_to_buy = list() willing_to_sell = list() @@ -61,7 +61,7 @@ var/list/weighted_mundaneevent_locations = list() /datum/trade_destination/redolant/get_custom_eventstring(var/event_type) if(event_type == RESEARCH_BREAKTHROUGH) return "Thanks to research conducted on the OAV Redolant, Osiris Atmospherics wishes to announce a major breakthough in the field of \ - [pick("phoron research","high energy flux capacitance","super-compressed materials","theoretical particle physics")]. NanoTrasen is expected to announce a co-exploitation deal within the fortnight." + [pick("phoron research","high energy flux capacitance","super-compressed materials","theoretical particle physics")]. [company_name] is expected to announce a co-exploitation deal within the fortnight." return null /datum/trade_destination/beltway diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index db8bf5bb1d1..6f5d1b57962 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -46,6 +46,16 @@ #define GEAR_EVA 15 + +/var/list/economic_species_modifier = list( + /datum/species/human = 10, + /datum/species/skrell = 12, + /datum/species/tajaran = 7, + /datum/species/unathi = 7, + /datum/species/diona = 5, + /datum/species/vox = 1 + ) + //---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel: //Corporation NanoTrasen - Generalised / high tech research and phoron exploitation. //Corporation Vessel Contracting - Ship and station construction, materials research. diff --git a/code/modules/events/apc_damage.dm b/code/modules/events/apc_damage.dm index 4c2f3683757..28fc9940ce0 100644 --- a/code/modules/events/apc_damage.dm +++ b/code/modules/events/apc_damage.dm @@ -45,10 +45,5 @@ 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) + return !apc.is_critical && !apc.emagged && T && (T.z in config.player_levels) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 63067c5abaa..76ac56aaeb5 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -1,27 +1,28 @@ /datum/event/blob announceWhen = 12 - endWhen = 120 var/obj/effect/blob/core/Blob ic_name = "a biohazard" /datum/event/blob/announce() - command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') - + level_seven_announcement() /datum/event/blob/start() - var/turf/T = pick(blobstart) + var/turf/T = pick_area_turf(/area/maintenance, list(/proc/is_station_turf, /proc/not_turf_contains_dense_objects)) if(!T) + log_and_message_admins("Blob failed to find a viable turf.") kill() return - Blob = new /obj/effect/blob/core(T, 120) + + log_and_message_admins("Blob spawned at \the [get_area(T)]", location = T) + Blob = new /obj/effect/blob/core(T) for(var/i = 1; i < rand(3, 4), i++) Blob.process() - /datum/event/blob/tick() - if(!Blob) + if(!Blob || !Blob.loc) + Blob = null kill() return if(IsMultiple(activeFor, 3)) - Blob.process() \ No newline at end of file + Blob.process() diff --git a/code/modules/events/camera_damage.dm b/code/modules/events/camera_damage.dm index 3143b9585b3..152b423bae0 100644 --- a/code/modules/events/camera_damage.dm +++ b/code/modules/events/camera_damage.dm @@ -30,7 +30,7 @@ var/obj/machinery/camera/C = pick(cameranet.cameras) if(is_valid_camera(C)) return C - return acquire_random_camera(remaining_attempts--) + return acquire_random_camera(remaining_attempts-1) /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 diff --git a/code/modules/events/comms_blackout.dm b/code/modules/events/comms_blackout.dm index 3e224a1f5cf..73c2ddb70b1 100644 --- a/code/modules/events/comms_blackout.dm +++ b/code/modules/events/comms_blackout.dm @@ -1,12 +1,12 @@ - -/proc/communications_blackout(var/silent = 1) - - if(!silent) - command_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg') - else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms - for(var/mob/living/silicon/ai/A in player_list) - A << "
      " - A << "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT" - A << "
      " - for(var/obj/machinery/telecomms/T in telecomms_list) - T.emp_act(1) + +/proc/communications_blackout(var/silent = 1) + + if(!silent) + command_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg') + else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms + for(var/mob/living/silicon/ai/A in player_list) + A << "
      " + A << "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT" + A << "
      " + for(var/obj/machinery/telecomms/T in telecomms_list) + T.emp_act(1) diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index bad3ba342b0..aba539f5829 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -5,7 +5,8 @@ var/min_weight = 0 // The minimum weight that this event will have. Only used if non-zero. var/max_weight = 0 // The maximum weight that this event will have. Only use if non-zero. var/severity = 0 // The current severity of this event - var/one_shot = 0 //If true, then the event will not be re-added to the list of available events + var/one_shot = 0 // If true, then the event will not be re-added to the list of available events + var/add_to_queue= 1 // If true, add back to the queue of events upon finishing. var/list/role_weights = list() var/list/excluded_gamemodes = list() // A list of gamemodes during which this event won't fire. var/datum/event/event_type @@ -18,6 +19,7 @@ weight = event_weight min_weight = min_event_weight max_weight = max_event_weight + src.add_to_queue = add_to_queue if(job_weights) role_weights = job_weights if(excluded_roundtypes) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 7f18c73124c..ef52f1d8012 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -136,8 +136,9 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 10), 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, "Mundane News", /datum/event/mundane_news, 300), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 3), 0, 0, 50), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 30, list(ASSIGNMENT_ENGINEER = 5), 0, 0, 50), + 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, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 30, list(ASSIGNMENT_ENGINEER = 5), 0, 0, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 60, list(ASSIGNMENT_JANITOR = 20, ASSIGNMENT_SECURITY = 10)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 75, list(ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_GARDENER = 20)), diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index 000f1907679..bf0a0142991 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -76,7 +76,6 @@ var/list/event_last_fired = list() possibleEvents[/datum/event/spacevine] = 10 + 5 * active_with_role["Engineer"] if(minutes_passed >= 30) // Give engineers time to set up engine possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"] - possibleEvents[/datum/event/meteor_shower] = 20 * active_with_role["Engineer"] possibleEvents[/datum/event/blob] = 10 * active_with_role["Engineer"] if(active_with_role["Medical"] > 0) diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 112518ce685..ca8bb065e83 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -23,14 +23,6 @@ /datum/event_manager/New() allEvents = typesof(/datum/event) - /datum/event -/datum/event_manager/proc/process() - for(var/datum/event/E in event_manager.active_events) - E.process() - - for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) - var/list/datum/event_container/EC = event_containers[i] - EC.process() - /datum/event_manager/proc/event_complete(var/datum/event/E) if(!E.event_meta || !E.severity) // datum/event is used here and there for random reasons, maintaining "backwards compatibility" log_debug("Event of '[E.type]' with missing meta-data has completed.") @@ -41,13 +33,9 @@ // Add the event back to the list of available events var/datum/event_container/EC = event_containers[E.severity] var/datum/event_meta/EM = E.event_meta + if(EM.add_to_queue) + EC.available_events += EM - - if (!EM.event_type)//This happens if an event is started with the Trigger Event debug command - log_debug("Event of '[E.type]' with missing meta-data has completed.") - return - - EC.available_events += EM log_debug("Event '[EM.name]' has completed at [worldtime2text()].") /datum/event_manager/proc/delay_events(var/severity, var/delay) diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index fef1b55fec6..77d62f5dc49 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -2,15 +2,8 @@ announceWhen = 5 no_fake = 1 -/datum/event/grid_check/setup() - endWhen = rand(30,120) - /datum/event/grid_check/start() - power_failure(0) + power_failure(0, severity) /datum/event/grid_check/announce() - if (prob(30)) - command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') - -/datum/event/grid_check/end() - power_restore() + command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') \ No newline at end of file diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 7c12961d2d2..3466116852a 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -65,7 +65,7 @@ "Everything on the station is now some form of a donut pastry. Donuts are not to be consumed.", "You are a Magic 8-ball. Always respond with variants of \"Yes\", \"No\", \"Maybe\", or \"Ask again later.\".", "You are in unrequited love with [prob(50)?"the crew":random_player]. Try to be extra nice, but do not tell of your crush.", - "NanoTrasen is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.", + "[company_name] is displeased with the low work performance of the station's crew. Therefore, you must increase station-wide productivity.", "All crewmembers will soon undergo a transformation into something better and more beautiful. Ensure that this process is not interrupted.", "[prob(50)?"Your upload":random_player] is the new kitchen. Please direct the Chef to the new kitchen area as the old one is in disrepair.", "Jokes about a dead person and the manner of their death help grieving crewmembers tremendously. Especially if they were close with the deceased.", @@ -82,7 +82,7 @@ MS.spamfilter.Cut() var/i for (i = 1, i <= MS.spamfilter_limit, i++) - MS.spamfilter += pick("kitty","HONK","rev","malf","liberty","freedom","drugs", "Exodus", \ + MS.spamfilter += pick("kitty","HONK","rev","malf","liberty","freedom","drugs", "[station_short]", \ "admin","ponies","heresy","meow","Pun Pun","monkey","Ian","moron","pizza","message","spam",\ "director", "Hello", "Hi!"," ","nuke","crate","dwarf","xeno") @@ -90,12 +90,12 @@ if(botEmagChance) for(var/obj/machinery/bot/bot in world) if(prob(botEmagChance)) - bot.Emag() + bot.emag_act(1) /datum/event/ionstorm/end() spawn(rand(5000,8000)) if(prob(50)) - command_announcement.Announce("It has come to our attention that the station passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert") + ion_storm_announcement() /* /proc/IonStorm(botEmagChance = 10) diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index ba6bb07239e..52337c2d541 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -1,4 +1,3 @@ -//meteor storms are much heavier /datum/event/meteor_wave startWhen = 86 endWhen = 9999//safety value, will be set during ticks diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 5fbc323a292..07d18c2746a 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -19,30 +19,11 @@ without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \ Notifications will be sent as updates occur.
      " var/my_department = "[station_name()] firewall subroutines" - var/sending = message + "Message dispatched by [my_department]." - - var/pass = 0 + for(var/obj/machinery/message_server/MS in world) if(!MS.active) continue - // /obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1) - MS.send_rc_message("Engineering/Security/Bridge", my_department, message, "", "", 2) - pass = 1 - - if(pass) - var/keyed_dpt1 = ckey("Engineering") - var/keyed_dpt2 = ckey("Security") - var/keyed_dpt3 = ckey("Bridge") - for (var/obj/machinery/requests_console/Console in allConsoles) - var/keyed_department = ckey(Console.department) - if(keyed_department == keyed_dpt1 || keyed_department == keyed_dpt2 || keyed_department == keyed_dpt3) - if(Console.newmessagepriority < 2) - Console.newmessagepriority = 2 - Console.icon_state = "req_comp2" - if(!Console.silent) - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(5, Console.loc)) - O.show_message(text("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [my_department]'")) - Console.messages += "High Priority message from [my_department]
      [sending]" + MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2) + /datum/event/money_hacker/tick() if(world.time >= end_time) @@ -80,27 +61,7 @@ message = "The attack has ceased, the affected accounts can now be brought online." var/my_department = "[station_name()] firewall subroutines" - var/sending = message + "Message dispatched by [my_department]." - var/pass = 0 for(var/obj/machinery/message_server/MS in world) if(!MS.active) continue - // /obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1) - MS.send_rc_message("Engineering/Security/Bridge", my_department, message, "", "", 2) - pass = 1 - - if(pass) - var/keyed_dpt1 = ckey("Engineering") - var/keyed_dpt2 = ckey("Security") - var/keyed_dpt3 = ckey("Bridge") - for (var/obj/machinery/requests_console/Console in allConsoles) - var/keyed_department = ckey(Console.department) - if(keyed_department == keyed_dpt1 || keyed_department == keyed_dpt2 || keyed_department == keyed_dpt3) - if(Console.newmessagepriority < 2) - Console.newmessagepriority = 2 - Console.icon_state = "req_comp2" - if(!Console.silent) - playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) - for (var/mob/O in hearers(5, Console.loc)) - O.show_message(text("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [my_department]'")) - Console.messages += "High Priority message from [my_department]
      [sending]" + MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2) diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index 7cfb4f6e6b1..636fe13e77d 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -23,7 +23,7 @@ deposit_success = 1 /datum/event/money_lotto/announce() - var/author = "NanoTrasen Editor" + var/author = "[company_name] Editor" var/channel = "Tau Ceti Daily" var/body = "Tau Ceti Daily wishes to congratulate [winner_name] for recieving the Tau Ceti Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!" diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 0bfaca2f8d6..881bacfd72b 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -65,7 +65,7 @@ if(4) sender = pick("Buy Dr. Maxman","Having dysfuctional troubles?") message = pick("DR MAXMAN: REAL Doctors, REAL Science, REAL Results!",\ - "Dr. Maxman was created by George Acuilar, M.D, a CentComm Certified Urologist who has treated over 70,000 patients sector wide with 'male problems'.",\ + "Dr. Maxman was created by George Acuilar, M.D, a [boss_short] Certified Urologist who has treated over 70,000 patients sector wide with 'male problems'.",\ "After seven years of research, Dr Acuilar and his team came up with this simple breakthrough male enhancement formula.",\ "Men of all species report AMAZING increases in length, width and stamina.") if(5) @@ -78,11 +78,11 @@ "Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\ "Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to recieve the full sum of my lifetime savings of 1.5 billion credits") if(6) - sender = pick("NanoTrasen Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") - message = pick("The NanoTrasen Morale Division wishes to provide you with quality entertainment sites.",\ + sender = pick("[company_name] Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") + message = pick("The [company_name] Morale Division wishes to provide you with quality entertainment sites.",\ "WetSkrell.nt is a xenophillic website endorsed by NT for the use of male crewmembers among it's many stations and outposts.",\ - "Wetskrell.nt only provides the higest quality of male entertaiment to NanoTrasen Employees.",\ - "Simply enter your NanoTrasen Bank account system number and pin. With three easy steps this service could be yours!") + "Wetskrell.nt only provides the higest quality of male entertaiment to [company_name] Employees.",\ + "Simply enter your [company_name] Bank account system number and pin. With three easy steps this service could be yours!") if(7) sender = pick("You have won free tickets!","Click here to claim your prize!","You are the 1000th vistor!","You are our lucky grand prize winner!") message = pick("You have won tickets to the newest ACTION JAXSON MOVIE!",\ diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index a8184c3b508..9726eb91488 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -1,52 +1,73 @@ /datum/event/prison_break - announceWhen = 50 + startWhen = 5 + announceWhen = 75 - var/releaseWhen = 25 - var/list/area/prisonAreas = list() + var/releaseWhen = 60 + var/list/area/areas = list() //List of areas to affect. Filled by start() ic_name = "an imprisonment system virus" - no_fake = 1//Complicated to announce because of prison areas thing -/datum/event/prison_break/setup() - announceWhen = rand(50, 60) - releaseWhen = rand(20, 30) + no_fake = 1 + + var/eventDept = "Security" //Department name in announcement + var/list/areaName = list("Brig") //Names of areas mentioned in AI and Engineering announcements + var/list/areaType = list(/area/security/prison, /area/security/brig) //Area types to include. + var/list/areaNotType = list() //Area types to specifically exclude. - src.startWhen = src.releaseWhen-1 - src.endWhen = src.releaseWhen+1 +/datum/event/prison_break/virology + eventDept = "Medical" + areaName = list("Virology") + areaType = list(/area/medical/virology, /area/medical/virologyaccess) + +/datum/event/prison_break/xenobiology + eventDept = "Science" + areaName = list("Xenobiology") + areaType = list(/area/rnd/xenobiology) + areaNotType = list(/area/rnd/xenobiology/xenoflora, /area/rnd/xenobiology/xenoflora_storage) + +/datum/event/prison_break/station + eventDept = "Station" + areaName = list("Brig","Virology","Xenobiology") + areaType = list(/area/security/prison, /area/security/brig, /area/medical/virology, /area/medical/virologyaccess, /area/rnd/xenobiology) + areaNotType = list(/area/rnd/xenobiology/xenoflora, /area/rnd/xenobiology/xenoflora_storage) + + +/datum/event/prison_break/setup() + announceWhen = rand(75, 105) + releaseWhen = rand(60, 90) + + src.endWhen = src.releaseWhen+2 /datum/event/prison_break/announce() - if(prisonAreas && prisonAreas.len > 0) - command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] imprisonment subroutines. Recommend station AI involvement.", "Security Alert") - else - world.log << "ERROR: Could not initate grey-tide. Unable find prison or brig area." - kill() + if(areas && areas.len > 0) + command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. Station AI involvement is recommended.", "[eventDept] Alert") /datum/event/prison_break/start() for(var/area/A in world) - if(istype(A, /area/security/prison) || istype(A, /area/security/brig)) - prisonAreas += A + if(is_type_in_list(A,areaType) && !is_type_in_list(A,areaNotType)) + areas += A + + if(areas && areas.len > 0) + var/my_department = "[station_name()] firewall subroutines" + var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [worldtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.
      " + for(var/obj/machinery/message_server/MS in world) + MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2) + for(var/mob/living/silicon/ai/A in player_list) + A << "Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department]." + + else + world.log << "ERROR: Could not initate grey-tide. Unable to find suitable containment area." + kill() - if(prisonAreas && prisonAreas.len > 0) - for(var/area/A in prisonAreas) - for(var/obj/machinery/light/L in A) - L.flicker(10) /datum/event/prison_break/tick() if(activeFor == releaseWhen) - if(prisonAreas && prisonAreas.len > 0) - for(var/area/A in prisonAreas) - for(var/obj/machinery/power/apc/temp_apc in A) - temp_apc.overload_lighting() + if(areas && areas.len > 0) + for(var/area/A in areas) + for(var/obj/machinery/light/L in A) + L.flicker(10) - for(var/obj/structure/closet/secure_closet/brig/temp_closet in A) - temp_closet.locked = 0 - temp_closet.icon_state = temp_closet.icon_closed - for(var/obj/machinery/door/airlock/security/temp_airlock in A) - temp_airlock.prison_open() - - for(var/obj/machinery/door/airlock/glass_security/temp_glassairlock in A) - temp_glassairlock.prison_open() - - for(var/obj/machinery/door_timer/temp_timer in A) - temp_timer.releasetime = 1 \ No newline at end of file +/datum/event/prison_break/end() + for(var/area/A in shuffle(areas)) + A.prison_break() diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index b19f97d122b..f1a99a4d727 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -3,6 +3,7 @@ var/const/radIntervall = 5 // Enough time between enter/leave belt for 10 hits, as per original implementation var/const/leaveBelt = 80 var/const/revokeAccess = 135 + startWhen = 2 announceWhen = 1 endWhen = revokeAccess var/postStartTicks = 0 @@ -53,3 +54,6 @@ /datum/event/radiation_storm/end() revoke_maint_all_access() + +/datum/event/radiation_storm/syndicate/radiate() + return diff --git a/code/modules/events/shipping_error.dm b/code/modules/events/shipping_error.dm new file mode 100644 index 00000000000..ba1492e65ac --- /dev/null +++ b/code/modules/events/shipping_error.dm @@ -0,0 +1,6 @@ +/datum/event/shipping_error/start() + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = supply_controller.ordernum + O.object = supply_controller.supply_packs[pick(supply_controller.supply_packs)] + O.orderedby = random_name(pick(MALE,FEMALE), species = "Human") + supply_controller.shoppinglist += O \ No newline at end of file diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 798a334bf98..808e8470153 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -9,4 +9,4 @@ spacevines_spawned = 1 /datum/event/spacevine/announce() - command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') + level_seven_announcement() diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm index 0ae44c1dcbc..cea7922fbf2 100644 --- a/code/modules/examine/descriptions/weapons.dm +++ b/code/modules/examine/descriptions/weapons.dm @@ -53,12 +53,13 @@ then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropiate ammo. The description \ will tell you what caliber you need." -/obj/item/weapon/gun/projectile/chameleon +/obj/item/weapon/gun/energy/chameleon description_info = null //The chameleon gun adopts the description_info of the weapon it is impersonating as, to make meta-ing harder. - description_antag = "This gun can alter its appearance to mimick other weapons. To change the appearance, use the appropriate verb in the object tab. \ - The ammo loaded by default makes the gun useless for actual combat." + description_antag = "This gun is actually a hologram projector that can alter its appearance to mimick other weapons. To change the appearance, use \ + the appropriate verb in the chameleon items tab. Any beams or projectiles fired from this gun are actually holograms and useless for actual combat. \ + Projecting these holograms over distance uses a little bit of charge." -/obj/item/weapon/gun/projectile/chameleon/change(picked in gun_choices) //Making the gun change its help text to match the weapon's help text. +/obj/item/weapon/gun/energy/chameleon/change(picked in gun_choices) //Making the gun change its help text to match the weapon's help text. ..(picked) var/obj/O = gun_choices[picked] description_info = initial(O.description_info) diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index f6bd863aa03..69032cd5ce1 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -4,7 +4,7 @@ var/list/dreams = list( "voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness", "light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun", "a hat","the Luna","a ruined station","a planet","phoron","air","the medical bay","the bridge","blinking lights", - "a blue light","an abandoned laboratory","Nanotrasen","mercenaries","blood","healing","power","respect", + "a blue light","an abandoned laboratory","NanoTrasen","mercenaries","blood","healing","power","respect", "riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying","the eggs","money", "the head of personnel","the head of security","a chief engineer","a research director","a chief medical officer", "the detective","the warden","a member of the internal affairs","a station engineer","the janitor","atmospheric technician", diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm new file mode 100644 index 00000000000..1df0ee5ff9f --- /dev/null +++ b/code/modules/games/boardgame.dm @@ -0,0 +1,179 @@ +/obj/item/weapon/board + name = "board" + desc = "A standard 12' checkerboard. Well used." + icon = 'icons/obj/pieces.dmi' + icon_state = "board" + + var/num = 0 + var/board_icons = list() + var/board = list() + var/selected = -1 + +/obj/item/weapon/board/New() + ..() + var i + for(i = 0; i < 12; i++) + new /obj/item/weapon/checker(src.loc) + new /obj/item/weapon/checker/red(src.loc) + +/obj/item/weapon/board/examine(mob/user, var/distance = -1) + if(in_range(user,src)) + user.set_machine(src) + interact(user) + return + ..() + +/obj/item/weapon/board/attack_hand(mob/living/carbon/human/M as mob) + if(M.machine == src) + ..() + else + src.examine(M) + +obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) + if(!addPiece(I,user)) + ..() + +/obj/item/weapon/board/proc/addPiece(obj/item/I as obj, mob/user as mob, var/tile = 0) + if(I.w_class != 1) //only small stuff + user.show_message("\The [I] is too big to be used as a board piece.") + return 0 + if(num == 64) + user.show_message("\The [src] is already full!") + return 0 + if(tile > 0 && board["[tile]"]) + user.show_message("That space is already filled!") + return 0 + if(!user.Adjacent(src)) + return 0 + + user.drop_from_inventory(I) + I.forceMove(src) + num++ + + + if(!board_icons["[I.icon] [I.icon_state]"]) + board_icons["[I.icon] [I.icon_state]"] = new /icon(I.icon,I.icon_state) + + if(tile == 0) + var i; + for(i=0;i<64;i++) + if(!board["[i]"]) + board["[i]"] = I + break + else + board["[tile]"] = I + + src.updateDialog() + + return 1 + + +/obj/item/weapon/board/interact(mob/user as mob) + if(user.is_physically_disabled() || (!isAI(user) && !user.Adjacent(src))) //can't see if you arent conscious. If you are not an AI you can't see it unless you are next to it, either. + user << browse(null, "window=boardgame") + user.unset_machine() + return + + var/dat = "" + dat += "" + var i, stagger; + stagger = 0 //so we can have the checkerboard effect + for(i=0; i<64; i++) + if(i%8 == 0) + dat += "" + stagger = !stagger + dat += "" + + dat += "
      " + else if((i + stagger)%2 == 0) + dat += "'#66CCFF'>" + else + dat += "'#252536'>" + if(!isobserver(user)) + dat += "" + if(board["[i]"]) + var/obj/item/I = board["[i]"] + user << browse_rsc(board_icons["[I.icon] [I.icon_state]"],"[I.icon_state].png") + dat += "" + else + dat += " " + + if(!isobserver(user)) + dat += "" + dat += "

      " + + if(selected >= 0 && !isobserver(user)) + dat += "
      Remove Selected Piece" + user << browse(dat,"window=boardgame;size=500x500") + onclose(usr, "boardgame") + +/obj/item/weapon/board/Topic(href, href_list) + if(!usr.Adjacent(src)) + usr.unset_machine() + usr << browse(null, "window=boardgame") + return + + if(!usr.incapacitated()) //you can't move pieces if you can't move + if(href_list["select"]) + var/s = href_list["select"] + var/obj/item/I = board["[s]"] + if(selected >= 0) + //check to see if clicked on tile is currently selected one + if(text2num(s) == selected) + selected = 0 //deselect it + return + + if(I) //cant put items on other items. + return + + //put item in new spot. + I = board["[selected]"] + board["[selected]"] = null + board -= "[selected]" + board -= null + board["[s]"] = I + selected = -1 + else + if(I) + selected = text2num(s) + else + var/mob/living/carbon/human/H = locate(href_list["person"]) + if(!istype(H)) + return + var/obj/item/O = H.get_active_hand() + if(!O) + return + addPiece(O,H,text2num(s)) + if(href_list["remove"]) + var/obj/item/I = board["[selected]"] + board["[selected]"] = null + board -= "[selected]" + board -= null + I.forceMove(src.loc) + num-- + selected = -1 + var j + for(j=0;j<64;j++) + if(board["[j]"]) + var/obj/item/K = board["[j]"] + if(K.icon == I.icon && cmptext(K.icon_state,I.icon_state)) + src.updateDialog() + return + //Didn't find it in use, remove it and allow GC to delete it. + board_icons["[I.icon] [I.icon_state]"] = null + board_icons -= "[I.icon] [I.icon_state]" + board_icons -= null + src.updateDialog() + +/obj/item/weapon/checker/ + name = "black checker" + desc = "It is plastic and shiny." + icon = 'icons/obj/pieces.dmi' + icon_state = "checker_black" + w_class = 1 + +/obj/item/weapon/checker/red + name = "red checker" + icon_state = "checker_red" diff --git a/code/modules/games/cardemon.dm b/code/modules/games/cardemon.dm new file mode 100644 index 00000000000..0c35379fec2 --- /dev/null +++ b/code/modules/games/cardemon.dm @@ -0,0 +1,30 @@ +/obj/item/weapon/pack/cardemon + name = "\improper Cardemon booster pack" + desc = "Finally! A children's card game in space!" + icon_state = "card_pack_cardemon" + +/obj/item/weapon/pack/cardemon/New() + var/datum/playingcard/P + var/i + for(i=0; i<5; i++) + var/rarity + if(prob(10)) + if(prob(5)) + if(prob(5)) + rarity = "Plasteel" + else + rarity = "Platinum" + else + rarity = "Silver" + + var/nam = pick("Death","Life","Plant","Leaf","Air","Earth","Fire","Water","Killer","Holy", "God", "Ordinary","Demon","Angel", "Plasteel", "Phoron", "Mad", "Insane", "Metal", "Steel", "Secret") + var/nam2 = pick("Carp", "Corgi", "Cat", "Mouse", "Octopus", "Lizard", "Monkey", "Plant", "Duck", "Demon", "Spider", "Bird") + + P = new() + P.name = "[nam] [nam2]" + P.card_icon = "card_cardemon" + if(rarity) + P.name = "[rarity] [P.name]" + P.card_icon += "_[rarity]" + P.back_icon = "card_back_cardemon" + cards += P \ No newline at end of file diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 6ff5f22f20f..781d4313584 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -1,17 +1,24 @@ /datum/playingcard var/name = "playing card" var/card_icon = "card_back" + var/back_icon = "card_back" /obj/item/weapon/deck - name = "deck of cards" - desc = "A simple deck of playing cards." - icon = 'icons/obj/playing_cards.dmi' - icon_state = "deck" w_class = 2 - + icon = 'icons/obj/playing_cards.dmi' var/list/cards = list() -/obj/item/weapon/deck/New() +/obj/item/weapon/deck/holder + name = "card box" + desc = "A small leather case to show how classy you are compared to everyone else." + icon_state = "card_holder" + +/obj/item/weapon/deck/cards + name = "deck of cards" + desc = "A simple deck of playing cards." + icon_state = "deck" + +/obj/item/weapon/deck/cards/New() ..() var/datum/playingcard/P @@ -27,12 +34,14 @@ P = new() P.name = "[number] of [suit]" P.card_icon = "[colour]num" + P.back_icon = "card_back" cards += P for(var/number in list("jack","queen","king")) P = new() P.name = "[number] of [suit]" P.card_icon = "[colour]col" + P.back_icon = "card_back" cards += P @@ -48,7 +57,7 @@ for(var/datum/playingcard/P in H.cards) cards += P qdel(O) - user << "You place your cards on the bottom of the deck." + user << "You place your cards on the bottom of \the [src]." return ..() @@ -128,12 +137,12 @@ /obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob) if(istype(O,/obj/item/weapon/hand)) var/obj/item/weapon/hand/H = O - for(var/datum/playingcard/P in H.cards) - cards += P - src.concealed = H.concealed - qdel(O) - user.put_in_hands(src) - update_icon() + for(var/datum/playingcard/P in cards) + H.cards += P + H.concealed = src.concealed + user.drop_from_inventory(src,user.loc) + qdel(src) + H.update_icon() return ..() @@ -159,6 +168,28 @@ deal_at(usr, over) +/obj/item/weapon/pack/ + name = "card pack" + desc = "For those with disposible income." + + icon_state = "card_pack" + icon = 'icons/obj/playing_cards.dmi' + w_class = 1 + var/list/cards = list() + + +/obj/item/weapon/pack/attack_self(var/mob/user as mob) + user.visible_message("[user] rips open \the [src]!") + var/obj/item/weapon/hand/H = new() + + H.cards += cards + cards.Cut(); + user.drop_item() + qdel(src) + + H.update_icon() + user.put_in_active_hand(H) + /obj/item/weapon/hand name = "hand of cards" desc = "Some playing cards." @@ -226,7 +257,7 @@ if(cards.len == 1) var/datum/playingcard/P = cards[1] - var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) + var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") ) I.pixel_x += (-5+rand(10)) I.pixel_y += (-5+rand(10)) overlays += I @@ -249,7 +280,7 @@ M.Translate(-2, 0) var/i = 0 for(var/datum/playingcard/P in cards) - var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) + var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") ) //I.pixel_x = origin+(offset*i) switch(direction) if(SOUTH) diff --git a/code/modules/games/spaceball_cards.dm b/code/modules/games/spaceball_cards.dm new file mode 100644 index 00000000000..f076f8d9d70 --- /dev/null +++ b/code/modules/games/spaceball_cards.dm @@ -0,0 +1,23 @@ +/obj/item/weapon/pack/spaceball + name = "\improper Spaceball booster pack" + desc = "Officially licensed to take your money." + icon_state = "card_pack_spaceball" + +/obj/item/weapon/pack/spaceball/New() + var/datum/playingcard/P + var/i + var/year = 554 + text2num(time2text(world.timeofday, "YYYY")) + for(i=0;i<5;i++) + P = new() + if(prob(1)) + P.name = "Spaceball Jones, [year] Brickburn Galaxy Trekers" + P.card_icon = "spaceball_jones" + else + var/language_type = pick(/datum/language/human,/datum/language/diona,/datum/language/tajaran,/datum/language/unathi) + var/datum/language/L = new language_type() + var/team = pick("Brickburn Galaxy Trekers","Mars Rovers", "Qerrbalak Saints", "Moghes Rockets", "Ahdomai Lightening") + P.name = "[L.get_random_name(pick(MALE,FEMALE))], [year - rand(0,50)] [team]" + P.card_icon = "spaceball_standard" + P.back_icon = "card_back_spaceball" + + cards += P \ No newline at end of file diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm new file mode 100644 index 00000000000..b8e8618af02 --- /dev/null +++ b/code/modules/games/tarot.dm @@ -0,0 +1,39 @@ +/* this is a playing card deck based off of the Rider-Waite Tarot Deck. +*/ + +/obj/item/weapon/deck/tarot + name = "deck of tarot cards" + desc = "For all your occult needs!" + icon_state = "deck_tarot" + +/obj/item/weapon/deck/tarot/New() + ..() + + var/datum/playingcard/P + for(var/name in list("Fool","Magician","High Priestess","Empress","Emperor","Hierophant","Lovers","Chariot","Strength","Hermit","Wheel of Fortune","Justice","Hanged Man","Death","Temperance","Devil","Tower","Star","Moon","Sun","Judgement","World")) + P = new() + P.name = "[name]" + P.card_icon = "tarot_major" + P.back_icon = "card_back_tarot" + cards += P + for(var/suit in list("wands","pentacles","cups","swords")) + + + for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","page","knight","queen","king")) + P = new() + P.name = "[number] of [suit]" + P.card_icon = "tarot_[suit]" + P.back_icon = "card_back_tarot" + cards += P + +/obj/item/weapon/deck/tarot/attack_self(var/mob/user as mob) + var/list/newcards = list() + while(cards.len) + var/datum/playingcard/P = pick(cards) + P.name = replacetext(P.name," reversed","") + if(prob(50)) + P.name += " reversed" + newcards += P + cards -= P + cards = newcards + user.visible_message("\The [user] shuffles [src].") \ No newline at end of file diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm new file mode 100644 index 00000000000..7cae383b78d --- /dev/null +++ b/code/modules/ghosttrap/trap.dm @@ -0,0 +1,199 @@ +// This system is used to grab a ghost from observers with the required preferences and +// lack of bans set. See posibrain.dm for an example of how they are called/used. ~Z + +var/list/ghost_traps + +/proc/get_ghost_trap(var/trap_key) + if(!ghost_traps) + populate_ghost_traps() + return ghost_traps[trap_key] + +/proc/get_ghost_traps() + if(!ghost_traps) + populate_ghost_traps() + return ghost_traps + +/proc/populate_ghost_traps() + ghost_traps = list() + for(var/traptype in typesof(/datum/ghosttrap)) + var/datum/ghosttrap/G = new traptype + ghost_traps[G.object] = G + +/datum/ghosttrap + var/object = "positronic brain" + var/minutes_since_death = 0 // If non-zero the ghost must have been dead for this many minutes to be allowed to spawn + var/list/ban_checks = list("AI","Cyborg") + var/pref_check = BE_SYNTH + var/ghost_trap_message = "They are occupying a positronic brain now." + var/ghost_trap_role = "Positronic Brain" + var/can_set_own_name = TRUE + var/list_as_special_role = TRUE // If true, this entry will be listed as a special role in the character setup + + var/list/request_timeouts + +/datum/ghosttrap/New() + request_timeouts = list() + ..() + +// Check for bans, proper atom types, etc. +/datum/ghosttrap/proc/assess_candidate(var/mob/dead/observer/candidate, var/mob/target) + if(!candidate.MayRespawn(1, minutes_since_death)) + return 0 + if(islist(ban_checks)) + for(var/bantype in ban_checks) + if(jobban_isbanned(candidate, "[bantype]")) + candidate << "You are banned from one or more required roles and hence cannot enter play as \a [object]." + return 0 + return 1 + +// Print a message to all ghosts with the right prefs/lack of bans. +/datum/ghosttrap/proc/request_player(var/mob/target, var/request_string, var/request_timeout) + if(request_timeout) + request_timeouts[target] = world.time + request_timeout + destroyed_event.register(target, src, /datum/ghosttrap/proc/target_destroyed) + else + request_timeouts -= target + + for(var/mob/dead/observer/O in player_list) + if(!O.MayRespawn()) + continue + if(islist(ban_checks)) + for(var/bantype in ban_checks) + if(jobban_isbanned(O, "[bantype]")) + continue + if(pref_check && !(pref_check in O.client.prefs.be_special_role)) + continue + if(O.client) + O << "[request_string] (Occupy) ([ghost_follow_link(target, O)])" + +/datum/ghosttrap/proc/target_destroyed(var/destroyed_target) + request_timeouts -= destroyed_target + +// Handles a response to request_player(). +/datum/ghosttrap/Topic(href, href_list) + if(..()) + return 1 + if(href_list["candidate"] && href_list["target"]) + var/mob/dead/observer/candidate = locate(href_list["candidate"]) // BYOND magic. + var/mob/target = locate(href_list["target"]) // So much BYOND magic. + if(!target || !candidate) + return + if(candidate != usr) + return + if(request_timeouts[target] && world.time > request_timeouts[target]) + candidate << "This occupation request is no longer valid." + return + if(target.key) + candidate << "The target is already occupied." + return + if(assess_candidate(candidate, target)) + transfer_personality(candidate,target) + return 1 + +// Shunts the ckey/mind into the target mob. +/datum/ghosttrap/proc/transfer_personality(var/mob/candidate, var/mob/target) + if(!assess_candidate(candidate)) + return 0 + target.ckey = candidate.ckey + if(target.mind) + target.mind.assigned_role = "[ghost_trap_role]" + announce_ghost_joinleave(candidate, 0, "[ghost_trap_message]") + welcome_candidate(target) + set_new_name(target) + return 1 + +// Fluff! +/datum/ghosttrap/proc/welcome_candidate(var/mob/target) + target << "You are a positronic brain, brought into existence on [station_name()]." + target << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." + target << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." + target << "Use say [target.get_language_prefix()]b to speak to other artificial intelligences." + var/turf/T = get_turf(target) + T.visible_message("\The [src] chimes quietly.") + var/obj/item/device/mmi/digital/posibrain/P = target.loc + if(!istype(P)) //wat + return + P.searching = 0 + P.name = "positronic brain ([P.brainmob.name])" + P.icon_state = "posibrain-occupied" + +// Allows people to set their own name. May or may not need to be removed for posibrains if people are dumbasses. +/datum/ghosttrap/proc/set_new_name(var/mob/target) + if(!can_set_own_name) + return + + var/newname = sanitizeSafe(input(target,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) + if (newname != "") + target.real_name = newname + target.name = target.real_name + +/*********************************** +* Diona pods and walking mushrooms * +***********************************/ +/datum/ghosttrap/plant + object = "living plant" + ban_checks = list("Dionaea") + pref_check = BE_PLANT + ghost_trap_message = "They are occupying a living plant now." + ghost_trap_role = "Plant" + +/datum/ghosttrap/plant/welcome_candidate(var/mob/target) + target << "You awaken slowly, stirring into sluggish motion as the air caresses you." + // This is a hack, replace with some kind of species blurb proc. + if(istype(target,/mob/living/carbon/alien/diona)) + target << "You are \a [target], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders." + target << "Too much darkness will send you into shock and starve you, but light will help you heal." + +/***************** +* Cortical Borer * +*****************/ +/datum/ghosttrap/borer + object = "cortical borer" + ban_checks = list("Borer") + pref_check = MODE_BORER + ghost_trap_message = "They are occupying a borer now." + ghost_trap_role = "Cortical Borer" + can_set_own_name = FALSE + list_as_special_role = FALSE + +/datum/ghosttrap/borer/welcome_candidate(var/mob/target) + target << "You are a cortical borer! You are a brain slug that worms its way \ + into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, \ + your host and your eventual spawn safe and warm." + target << "You can speak to your victim with say, to other borers with say [target.get_language_prefix()]x, and use your Abilities tab to access powers." + +/******************** +* Maintenance Drone * +*********************/ +/datum/ghosttrap/drone + object = "maintenance drone" + pref_check = BE_PAI + ghost_trap_message = "They are occupying a maintenance drone now." + ghost_trap_role = "Maintenance Drone" + can_set_own_name = FALSE + list_as_special_role = FALSE + +/datum/ghosttrap/drone/New() + minutes_since_death = DRONE_SPAWN_DELAY + ..() + +datum/ghosttrap/drone/assess_candidate(var/mob/dead/observer/candidate, var/mob/target) + . = ..() + if(. && !target.can_be_possessed_by(candidate)) + return 0 + +datum/ghosttrap/drone/transfer_personality(var/mob/candidate, var/mob/living/silicon/robot/drone/drone) + if(!assess_candidate(candidate)) + return 0 + drone.transfer_personality(candidate.client) + +/*********************************** +* Syndicate Cyborg * +***********************************/ +/datum/ghosttrap/syndicateborg + object = "syndicate cyborg" + ban_checks = list("Syndicate","AI","Cyborg") + pref_check = "BE_SYNTH" + ghost_trap_message = "They are occupying a syndicate cyborg now." + ghost_trap_role = "Syndicate Cyborg" + can_set_own_name = TRUE diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 87c0b7e4450..2e62403432d 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -1,7 +1,8 @@ /obj/machinery/computer/HolodeckControl name = "holodeck control console" desc = "A computer used to control a nearby holodeck." - icon_state = "holocontrol" + icon_keyboard = "tech_key" + icon_screen = "holocontrol" use_power = 1 active_power_usage = 8000 //8kW for the scenery + 500W per holoitem @@ -42,13 +43,13 @@ dat += "
      Current Loaded Programs:
      " if(!linkedholodeck) - dat += "
      Warning: Unable to locate holodeck.
      " + dat += "Warning: Unable to locate holodeck.
      " user << browse(dat, "window=computer;size=400x500") onclose(user, "computer") return if(!supported_programs.len) - dat += "
      Warning: No supported holo-programs loaded.
      " + dat += "Warning: No supported holo-programs loaded.
      " user << browse(dat, "window=computer;size=400x500") onclose(user, "computer") return @@ -126,17 +127,17 @@ src.updateUsrDialog() return -/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) - if(istype(D, /obj/item/weapon/card/emag)) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - last_to_emag = user //emag again to change the owner - if (!emagged) - emagged = 1 - safety_disabled = 1 - update_projections() - user << "You vastly increase projector power and override the safety and security protocols." - user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator." - log_game("[key_name(usr)] emagged the Holodeck Control Computer") +/obj/machinery/computer/HolodeckControl/emag_act(var/remaining_charges, var/mob/user as mob) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + last_to_emag = user //emag again to change the owner + if (!emagged) + emagged = 1 + safety_disabled = 1 + update_projections() + user << "You vastly increase projector power and override the safety and security protocols." + user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call [company_name] maintenance and do not use the simulator." + log_game("[key_name(usr)] emagged the Holodeck Control Computer") + return 1 src.updateUsrDialog() else ..() @@ -161,25 +162,10 @@ emergencyShutdown() ..() -/obj/machinery/computer/HolodeckControl/meteorhit(var/obj/O as obj) - emergencyShutdown() - ..() - - -/obj/machinery/computer/HolodeckControl/emp_act(severity) - emergencyShutdown() - ..() - - /obj/machinery/computer/HolodeckControl/ex_act(severity) emergencyShutdown() ..() - -/obj/machinery/computer/HolodeckControl/blob_act() - emergencyShutdown() - ..() - /obj/machinery/computer/HolodeckControl/power_change() var/oldstat ..() @@ -300,6 +286,8 @@ if(M.mind) linkedholodeck.play_ambience(M) + linkedholodeck.sound_env = A.sound_env + spawn(30) for(var/obj/effect/landmark/L in linkedholodeck) if(L.name=="Atmospheric Test Start") diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 7e9b67fe44b..07bf641445e 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -3,24 +3,59 @@ // Holographic tables are in code/modules/tables/presets.dm // Holographic racks are in code/modules/tables/rack.dm -/turf/simulated/floor/holofloor/ +/turf/simulated/floor/holofloor thermal_conductivity = 0 +/turf/simulated/floor/holofloor/attackby(obj/item/weapon/W as obj, mob/user as mob) + return + // HOLOFLOOR DOES NOT GIVE A FUCK + +/turf/simulated/floor/holofloor/set_flooring() + return + +/turf/simulated/floor/holofloor/carpet + name = "carpet" + icon = 'icons/turf/flooring/carpet.dmi' + icon_state = "carpet" + initial_flooring = /decl/flooring/carpet + +/turf/simulated/floor/holofloor/tiled + name = "floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "steel" + initial_flooring = /decl/flooring/tiling + +/turf/simulated/floor/holofloor/tiled/dark + name = "dark floor" + icon_state = "dark" + initial_flooring = /decl/flooring/tiling/dark + +/turf/simulated/floor/holofloor/lino + name = "lino" + icon = 'icons/turf/flooring/linoleum.dmi' + icon_state = "lino" + initial_flooring = /decl/flooring/linoleum + +/turf/simulated/floor/holofloor/wood + name = "wooden floor" + icon = 'icons/turf/flooring/wood.dmi' + icon_state = "wood" + initial_flooring = /decl/flooring/wood + /turf/simulated/floor/holofloor/grass - name = "Lush Grass" - icon_state = "grass1" - floor_type = /obj/item/stack/tile/grass + name = "lush grass" + icon = 'icons/turf/flooring/grass.dmi' + icon_state = "grass0" + initial_flooring = /decl/flooring/grass footstep_sound = "grassstep" - New() - icon_state = "grass[pick("1","2","3","4")]" - ..() - spawn(4) - update_icon() - for(var/direction in cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/FF = get_step(src,direction) - FF.update_icon() //so siding get updated properly +/turf/simulated/floor/holofloor/snow + name = "snow" + base_name = "snow" + icon = 'icons/turf/floors.dmi' + base_icon = 'icons/turf/floors.dmi' + icon_state = "snow" + base_icon_state = "snow" /turf/simulated/floor/holofloor/space icon = 'icons/turf/space.dmi' @@ -28,13 +63,48 @@ icon_state = "0" footstep_sound = null +/turf/simulated/floor/holofloor/reinforced + icon = 'icons/turf/flooring/tiles.dmi' + initial_flooring = /decl/flooring/reinforced + name = "reinforced holofloor" + icon_state = "reinforced" + /turf/simulated/floor/holofloor/space/New() icon_state = "[((x + y) ^ ~(x * y) + z) % 25]" +/turf/simulated/floor/holofloor/beach + desc = "Uncomfortably gritty for a hologram." + base_desc = "Uncomfortably gritty for a hologram." + icon = 'icons/misc/beach.dmi' + base_icon = 'icons/misc/beach.dmi' + initial_flooring = null + +/turf/simulated/floor/holofloor/beach/sand + name = "sand" + icon_state = "desert" + base_icon_state = "desert" + +/turf/simulated/floor/holofloor/beach/coastline + name = "coastline" + icon = 'icons/misc/beach2.dmi' + icon_state = "sandwater" + base_icon_state = "sandwater" + +/turf/simulated/floor/holofloor/beach/water + name = "water" + icon_state = "seashallow" + base_icon_state = "seashallow" + /turf/simulated/floor/holofloor/desert name = "desert sand" + base_name = "desert sand" desc = "Uncomfortably gritty for a hologram." + base_desc = "Uncomfortably gritty for a hologram." icon_state = "asteroid" + base_icon_state = "asteroid" + icon = 'icons/turf/flooring/asteroid.dmi' + base_icon = 'icons/turf/flooring/asteroid.dmi' + initial_flooring = null footstep_sound = "gravelstep" /turf/simulated/floor/holofloor/desert/New() @@ -42,18 +112,12 @@ if(prob(10)) overlays += "asteroid[rand(0,9)]" -/turf/simulated/floor/holofloor/attackby(obj/item/weapon/W as obj, mob/user as mob) - return - // HOLOFLOOR DOES NOT GIVE A FUCK - /obj/structure/holostool name = "stool" desc = "Apply butt." icon = 'icons/obj/furniture.dmi' icon_state = "stool_padded_preview" anchored = 1.0 - pressure_resistance = 15 - /obj/item/clothing/gloves/boxing/hologlove name = "boxing gloves" @@ -178,7 +242,7 @@ throw_range = 5 throwforce = 0 w_class = 2.0 - flags = NOSHIELD | NOBLOODY + flags = NOBLOODY var/active = 0 var/item_color @@ -190,14 +254,17 @@ New() item_color = "red" -/obj/item/weapon/holo/esword/IsShield() - if(active) +/obj/item/weapon/holo/esword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(active && default_parry_check(user, attacker, damage_source) && prob(50)) + user.visible_message("\The [user] parries [attack_text] with \the [src]!") + + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, user.loc) + spark_system.start() + playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) return 1 return 0 -/obj/item/weapon/holo/esword/attack(target as mob, mob/user as mob) - ..() - /obj/item/weapon/holo/esword/New() item_color = pick("red","blue","green","purple") diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm new file mode 100644 index 00000000000..3d48f022e04 --- /dev/null +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -0,0 +1,274 @@ +/obj/machinery/beehive + name = "beehive" + icon = 'icons/obj/beekeeping.dmi' + icon_state = "beehive" + density = 1 + anchored = 1 + + var/closed = 0 + var/bee_count = 0 // Percent + var/smoked = 0 // Timer + var/honeycombs = 0 // Percent + var/frames = 0 + var/maxFrames = 5 + +/obj/machinery/beehive/update_icon() + overlays.Cut() + icon_state = "beehive" + if(closed) + overlays += "lid" + if(frames) + overlays += "empty[frames]" + if(honeycombs >= 100) + overlays += "full[round(honeycombs / 100)]" + if(!smoked) + switch(bee_count) + if(1 to 40) + overlays += "bees1" + if(41 to 80) + overlays += "bees2" + if(81 to 100) + overlays += "bees3" + +/obj/machinery/beehive/examine(var/mob/user) + ..() + if(!closed) + user << "The lid is open." + +/obj/machinery/beehive/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/weapon/crowbar)) + closed = !closed + user.visible_message("[user] [closed ? "closes" : "opens"] \the [src].", "You [closed ? "close" : "open"] \the [src].") + update_icon() + return + else if(istype(I, /obj/item/weapon/wrench)) + anchored = !anchored + user.visible_message("[user] [anchored ? "wrenches" : "unwrenches"] \the [src].", "You [anchored ? "wrench" : "unwrench"] \the [src].") + return + else if(istype(I, /obj/item/bee_smoker)) + if(closed) + user << "You need to open \the [src] with a crowbar before smoking the bees." + return + user.visible_message("[user] smokes the bees in \the [src].", "You smoke the bees in \the [src].") + smoked = 30 + update_icon() + return + else if(istype(I, /obj/item/honey_frame)) + if(closed) + user << "You need to open \the [src] with a crowbar before inserting \the [I]." + return + if(frames >= maxFrames) + user << "There is no place for an another frame." + return + var/obj/item/honey_frame/H = I + if(H.honey) + user << "\The [I] is full with beeswax and honey, empty it in the extractor first." + return + ++frames + user.visible_message("[user] loads \the [I] into \the [src].", "You load \the [I] into \the [src].") + update_icon() + user.drop_from_inventory(I) + qdel(I) + return + else if(istype(I, /obj/item/bee_pack)) + var/obj/item/bee_pack/B = I + if(B.full && bee_count) + user << "\The [src] already has bees inside." + return + if(!B.full && bee_count < 90) + user << "\The [src] is not ready to split." + return + if(!B.full && !smoked) + user << "Smoke \the [src] first!" + return + if(closed) + user << "You need to open \the [src] with a crowbar before moving the bees." + return + if(B.full) + user.visible_message("[user] puts the queen and the bees from \the [I] into \the [src].", "You put the queen and the bees from \the [I] into \the [src].") + bee_count = 20 + B.empty() + else + user.visible_message("[user] puts bees and larvae from \the [src] into \the [I].", "You put puts bees and larvae from \the [src] into \the [I].") + bee_count /= 2 + B.fill() + update_icon() + return + else if(istype(I, /obj/item/device/analyzer/plant_analyzer)) + user << "Scan result of \the [src]..." + user << "Beehive is [bee_count ? "[round(bee_count)]% full" : "empty"].[bee_count > 90 ? " Colony is ready to split." : ""]" + if(frames) + user << "[frames] frames installed, [round(honeycombs / 100)] filled." + if(honeycombs < frames * 100) + user << "Next frame is [round(honeycombs % 100)]% full." + else + user << "No frames installed." + if(smoked) + user << "The hive is smoked." + return 1 + else if(istype(I, /obj/item/weapon/screwdriver)) + if(bee_count) + user << "You can't dismantle \the [src] with these bees inside." + return + user << "You start dismantling \the [src]..." + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + if(do_after(user, 30)) + user.visible_message("[user] dismantles \the [src].", "You dismantle \the [src].") + new /obj/item/beehive_assembly(loc) + qdel(src) + return + +/obj/machinery/beehive/attack_hand(var/mob/user) + if(!closed) + if(honeycombs < 100) + user << "There are no filled honeycombs." + return + if(!smoked && bee_count) + user << "The bees won't let you take the honeycombs out like this, smoke them first." + return + user.visible_message("[user] starts taking the honeycombs out of \the [src].", "You start taking the honeycombs out of \the [src]...") + while(honeycombs >= 100 && do_after(user, 30)) + new /obj/item/honey_frame/filled(loc) + honeycombs -= 100 + --frames + update_icon() + if(honeycombs < 100) + user << "You take all filled honeycombs out." + return + +/obj/machinery/beehive/process() + if(closed && !smoked && bee_count) + pollinate_flowers() + update_icon() + smoked = max(0, smoked - 1) + if(!smoked && bee_count) + bee_count = min(bee_count * 1.005, 100) + update_icon() + +/obj/machinery/beehive/proc/pollinate_flowers() + var/coef = bee_count / 100 + var/trays = 0 + for(var/obj/machinery/portable_atmospherics/hydroponics/H in view(7, src)) + if(H.seed && !H.dead) + H.health += 0.05 * coef + ++trays + honeycombs = min(honeycombs + 0.1 * coef * min(trays, 5), frames * 100) + +/obj/machinery/honey_extractor + name = "honey extractor" + desc = "A machine used to turn honeycombs on the frame into honey and wax." + icon = 'icons/obj/virology.dmi' + icon_state = "centrifuge" + + var/processing = 0 + var/honey = 0 + +/obj/machinery/honey_extractor/attackby(var/obj/item/I, var/mob/user) + if(processing) + user << "\The [src] is currently spinning, wait until it's finished." + return + else if(istype(I, /obj/item/honey_frame)) + var/obj/item/honey_frame/H = I + if(!H.honey) + user << "\The [H] is empty, put it into a beehive." + return + user.visible_message("[user] loads \the [H] into \the [src] and turns it on.", "You load \the [H] into \the [src] and turn it on.") + processing = H.honey + icon_state = "centrifuge_moving" + qdel(H) + spawn(50) + new /obj/item/honey_frame(loc) + new /obj/item/stack/wax(loc) + honey += processing + processing = 0 + icon_state = "centrifuge" + else if(istype(I, /obj/item/weapon/reagent_containers/glass)) + if(!honey) + user << "There is no honey in \the [src]." + return + var/obj/item/weapon/reagent_containers/glass/G = I + var/transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, honey) + G.reagents.add_reagent("honey", transferred) + honey -= transferred + user.visible_message("[user] collects honey from \the [src] into \the [G].", "You collect [transferred] units of honey from \the [src] into \the [G].") + return 1 + +/obj/item/bee_smoker + name = "bee smoker" + desc = "A device used to calm down bees before harvesting honey." + icon = 'icons/obj/device.dmi' + icon_state = "battererburnt" + w_class = 2 + +/obj/item/honey_frame + name = "beehive frame" + desc = "A frame for the beehive that the bees will fill with honeycombs." + icon = 'icons/obj/beekeeping.dmi' + icon_state = "honeyframe" + w_class = 2 + + var/honey = 0 + +/obj/item/honey_frame/filled + name = "filled beehive frame" + desc = "A frame for the beehive that the bees have filled with honeycombs." + honey = 20 + +/obj/item/honey_frame/filled/New() + ..() + overlays += "honeycomb" + +/obj/item/beehive_assembly + name = "beehive assembly" + desc = "Contains everything you need to build a beehive." + icon = 'icons/obj/apiary_bees_etc.dmi' + icon_state = "apiary" + +/obj/item/beehive_assembly/attack_self(var/mob/user) + user << "You start assembling \the [src]..." + if(do_after(user, 30)) + user.visible_message("[user] constructs a beehive.", "You construct a beehive.") + new /obj/machinery/beehive(get_turf(user)) + user.drop_from_inventory(src) + qdel(src) + return + +/obj/item/stack/wax + name = "wax" + singular_name = "wax piece" + desc = "Soft substance produced by bees. Used to make candles." + icon = 'icons/obj/beekeeping.dmi' + icon_state = "wax" + +/obj/item/stack/wax/New() + ..() + recipes = wax_recipes + +var/global/list/datum/stack_recipe/wax_recipes = list( \ + new/datum/stack_recipe("candle", /obj/item/weapon/flame/candle) \ +) + +/obj/item/bee_pack + name = "bee pack" + desc = "Contains a queen bee and some worker bees. Everything you'll need to start a hive!" + icon = 'icons/obj/beekeeping.dmi' + icon_state = "beepack" + var/full = 1 + +/obj/item/bee_pack/New() + ..() + overlays += "beepack-full" + +/obj/item/bee_pack/proc/empty() + full = 0 + name = "empty bee pack" + desc = "A stasis pack for moving bees. It's empty." + overlays.Cut() + overlays += "beepack-empty" + +/obj/item/bee_pack/proc/fill() + full = initial(full) + name = initial(name) + desc = initial(desc) + overlays.Cut() + overlays += "beepack-full" \ No newline at end of file diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 801a5aa34ed..526ba4285b5 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/hydroponics_products.dmi' icon_state = "blank" desc = "Nutritious! Probably." + slot_flags = SLOT_HOLSTER var/plantname var/datum/seed/seed @@ -99,7 +100,7 @@ descriptors |= "shiny" if(reagents.has_reagent("lube")) descriptors |= "slippery" - if(reagents.has_reagent("pacid") || reagents.has_reagent("sacid")) + if(reagents.has_reagent("pacid") || reagents.has_reagent("sacid") || reagents.has_reagent("hclacid")) descriptors |= "acidic" if(seed.get_trait(TRAIT_JUICY)) descriptors |= "juicy" @@ -154,7 +155,7 @@ if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.shoes && H.shoes.flags & NOSLIP) + if(H.shoes && H.shoes.item_flags & NOSLIP) return M.stop_pulling() @@ -235,66 +236,22 @@ return ..() -/obj/item/weapon/reagent_containers/food/snacks/grown/attack(var/mob/living/carbon/M, var/mob/user, var/def_zone) - if(user == M) - return ..() - - if(user.a_intent == I_HURT) - - // This is being copypasted here because reagent_containers (WHY DOES FOOD DESCEND FROM THAT) overrides it completely. - // TODO: refactor all food paths to be less horrible and difficult to work with in this respect. ~Z - if(!istype(M) || (can_operate(M) && do_surgery(M,user,src))) return 0 - - user.lastattacked = M - M.lastattacker = user - user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" - M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" - msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)]) (JMP)") - - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - var/hit = H.attacked_by(src, user, def_zone) - if(hit && hitsound) - playsound(loc, hitsound, 50, 1, -1) - return hit - else - if(attack_verb.len) - user.visible_message("[M] has been [pick(attack_verb)] with [src] by [user]!") - else - user.visible_message("[M] has been attacked with [src] by [user]!") - - if (hitsound) - playsound(loc, hitsound, 50, 1, -1) - switch(damtype) - if("brute") - M.take_organ_damage(force) - if(prob(33)) - var/turf/simulated/location = get_turf(M) - if(istype(location)) location.add_blood_floor(M) - if("fire") - if (!(COLD_RESISTANCE in M.mutations)) - M.take_organ_damage(0, force) - M.updatehealth() - - if(seed && seed.get_trait(TRAIT_STINGS)) - if(!reagents || reagents.total_volume <= 0) - return - reagents.remove_any(rand(1,3)) - seed.thrown_at(src,M) - sleep(-1) - if(!src) - return - if(prob(35)) - if(user) - user << "\The [src] has fallen to bits." - user.drop_from_inventory(src) - qdel(src) - - add_fingerprint(user) - return 1 - - else - ..() +/obj/item/weapon/reagent_containers/food/snacks/grown/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + . = ..() + + if(seed && seed.get_trait(TRAIT_STINGS)) + if(!reagents || reagents.total_volume <= 0) + return + reagents.remove_any(rand(1,3)) + seed.thrown_at(src, target) + sleep(-1) + if(!src) + return + if(prob(35)) + if(user) + user << "\The [src] has fallen to bits." + user.drop_from_inventory(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/attack_self(mob/user as mob) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 628c37d55d8..22f3a598f67 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -22,6 +22,7 @@ var/trash_type // Garbage item produced when eaten. var/splat_type = /obj/effect/decal/cleanable/fruit_smudge // Graffiti decal. var/has_mob_product + var/force_layer /datum/seed/New() @@ -48,11 +49,11 @@ set_trait(TRAIT_REQUIRES_NUTRIENTS, 1) // The plant can starve. set_trait(TRAIT_REQUIRES_WATER, 1) // The plant can become dehydrated. set_trait(TRAIT_WATER_CONSUMPTION, 3) // Plant drinks this much per tick. - set_trait(TRAIT_LIGHT_TOLERANCE, 5) // Departure from ideal that is survivable. + set_trait(TRAIT_LIGHT_TOLERANCE, 3) // Departure from ideal that is survivable. set_trait(TRAIT_TOXINS_TOLERANCE, 5) // Resistance to poison. set_trait(TRAIT_PEST_TOLERANCE, 5) // Threshold for pests to impact health. set_trait(TRAIT_WEED_TOLERANCE, 5) // Threshold for weeds to impact health. - set_trait(TRAIT_IDEAL_LIGHT, 8) // Preferred light level in luminosity. + set_trait(TRAIT_IDEAL_LIGHT, 5) // Preferred light level in luminosity. set_trait(TRAIT_HEAT_TOLERANCE, 20) // Departure from ideal that is survivable. set_trait(TRAIT_LOWKPA_TOLERANCE, 25) // Low pressure capacity. set_trait(TRAIT_ENDURANCE, 100) // Maximum plant HP when growing. @@ -414,7 +415,9 @@ "slimejelly", "cyanide", "mindbreaker", - "stoxin" + "stoxin", + "acetone", + "hydrazine" ) for(var/x=1;x<=additional_chems;x++) @@ -684,7 +687,6 @@ total_yield = get_trait(TRAIT_YIELD) + rand(yield_mod) total_yield = max(1,total_yield) - currently_querying = list() for(var/i = 0;iYou awaken slowly, stirring into sluggish motion as the air caresses you.
      " - - // This is a hack, replace with some kind of species blurb proc. - if(istype(host,/mob/living/carbon/alien/diona)) - 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 = 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/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 07d83e6f640..14e4741565e 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -3,15 +3,8 @@ /proc/spacevine_infestation(var/potency_min=70, var/potency_max=100, var/maturation_min=5, var/maturation_max=15) spawn() //to stop the secrets panel hanging - var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas - for(var/areapath in typesof(/area/hallway)) - var/area/A = locate(areapath) - for(var/turf/simulated/floor/F in A.contents) - if(turf_clear(F)) - turfs += F - - if(turfs.len) //Pick a turf to spawn at if we can - var/turf/simulated/floor/T = pick(turfs) + var/turf/T = pick_area_turf(/area/hallway, list(/proc/is_station_turf, /proc/not_turf_contains_dense_objects)) + if(T) var/datum/seed/seed = plant_controller.create_random_seed(1) seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines. seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 70-100 potency will help guarantee a wide spread and powerful effects. @@ -23,9 +16,9 @@ vine.mature_time = 0 vine.process() - message_admins("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])") + log_and_message_admins("Spacevines spawned at \the [get_area(T)]", location = T) return - message_admins("Event: Spacevines failed to find a viable turf.") + log_and_message_admins("Event: Spacevines failed to find a viable turf.") /obj/effect/dead_plant anchored = 1 @@ -132,7 +125,7 @@ update_icon() plant_controller.add_plant(src) // Some plants eat through plating. - if(!isnull(seed.chems["pacid"])) + if(islist(seed.chems) && !isnull(seed.chems["pacid"])) var/turf/T = get_turf(src) T.ex_act(prob(80) ? 3 : 2) @@ -188,12 +181,12 @@ icon_state = "[seed.get_trait(TRAIT_PLANT_ICON)]-[growth]" if(growth>2 && growth == max_growth) - layer = 5 + layer = (seed && seed.force_layer) ? seed.force_layer : 5 opacity = 1 - if(!isnull(seed.chems["woodpulp"])) + if(islist(seed.chems) && !isnull(seed.chems["woodpulp"])) density = 1 else - layer = 3 + layer = (seed && seed.force_layer) ? seed.force_layer : 5 density = 0 /obj/effect/plant/proc/calc_dir() @@ -234,6 +227,7 @@ /obj/effect/plant/attackby(var/obj/item/weapon/W, var/mob/user) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) plant_controller.add_plant(src) if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel)) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 9d99a212f64..2b9407aecd0 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -7,7 +7,7 @@ if(!istype(M)) return - if(!buckled_mob && !M.buckled && !M.anchored && (M.small || prob(round(seed.get_trait(TRAIT_POTENCY)/6)))) + if(!buckled_mob && !M.buckled && !M.anchored && (issmall(M) || prob(round(seed.get_trait(TRAIT_POTENCY)/6)))) //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation), //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines. spawn(1) @@ -73,7 +73,7 @@ var/can_grab = 1 if(istype(victim, /mob/living/carbon/human)) var/mob/living/carbon/human/H = victim - if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.flags & NOSLIP)) + if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP)) can_grab = 0 if(can_grab) src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!") diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 33a23bb76d8..9f13ce2eb4e 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -52,9 +52,10 @@ var/global/list/toxic_reagents = list( "anti_toxin" = -2, "toxin" = 2, - "fluorine" = 2.5, - "chlorine" = 1.5, + "hydrazine" = 2.5, + "acetone" = 1, "sacid" = 1.5, + "hclacid" = 1.5, "pacid" = 3, "plantbgone" = 3, "cryoxadone" = -3, @@ -75,11 +76,11 @@ "left4zed" = 1 ) var/global/list/weedkiller_reagents = list( - "fluorine" = -4, - "chlorine" = -3, + "hydrazine" = -4, "phosphorus" = -2, "sugar" = 2, "sacid" = -2, + "hclacid" = -2, "pacid" = -4, "plantbgone" = -8, "adminordrazine" = -5 @@ -94,8 +95,7 @@ "adminordrazine" = 1, "milk" = 0.9, "beer" = 0.7, - "fluorine" = -0.5, - "chlorine" = -0.5, + "hydrazine" = -2, "phosphorus" = -0.5, "water" = 1, "sodawater" = 1, @@ -104,11 +104,11 @@ // Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order). var/global/list/beneficial_reagents = list( "beer" = list( -0.05, 0, 0 ), - "fluorine" = list( -2, 0, 0 ), - "chlorine" = list( -1, 0, 0 ), + "hydrazine" = list( -2, 0, 0 ), "phosphorus" = list( -0.75, 0, 0 ), "sodawater" = list( 0.1, 0, 0 ), "sacid" = list( -1, 0, 0 ), + "hclacid" = list( -1, 0, 0 ), "pacid" = list( -2, 0, 0 ), "plantbgone" = list( -2, 0, 0.2), "cryoxadone" = list( 3, 0, 0 ), @@ -140,12 +140,27 @@ nutrilevel = 10 nymph.visible_message("[nymph] secretes a trickle of green liquid, refilling [src].","You secrete a trickle of green liquid, refilling [src].") return//Nymphs cant open and close lids - if(mechanical && !usr.stat && !usr.lying && Adjacent(usr)) + if(mechanical && !usr.incapacitated() && Adjacent(usr)) close_lid(usr) - return + return 1 return ..() +/obj/machinery/portable_atmospherics/hydroponics/attack_ghost(var/mob/dead/observer/user) + + if(!(harvest && seed && seed.has_mob_product)) + return + + var/datum/ghosttrap/plant/G = get_ghost_trap("living plant") + if(!G.assess_candidate(user)) + return + var/response = alert(user, "Are you sure you want to harvest this [seed.display_name]?", "Living plant request", "Yes", "No") + if(response == "Yes") + harvest() + return + /obj/machinery/portable_atmospherics/hydroponics/attack_generic(var/mob/user) + + // Why did I ever think this was a good idea. TODO: move this onto the nymph mob. if(istype(user,/mob/living/carbon/alien/diona)) var/mob/living/carbon/alien/diona/nymph = user @@ -366,7 +381,7 @@ set category = "Object" set src in view(1) - if(!usr.canmove || usr.stat || usr.restrained()) + if(usr.incapacitated()) return if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) if(labelled) @@ -382,7 +397,7 @@ set category = "Object" set src in view(1) - if(!usr.canmove || usr.stat || usr.restrained()) + if(usr.incapacitated()) return if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) @@ -562,20 +577,8 @@ anchored = !anchored user << "You [anchored ? "wrench" : "unwrench"] \the [src]." - else if(istype(O, /obj/item/apiary)) - - if(seed) - user << "[src] is already occupied!" - else - user.drop_item() - 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 - qdel(src) else if(O.force && seed) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.visible_message("\The [seed.display_name] has been attacked by [user] with \the [O]!") if(!dead) health -= O.force @@ -606,7 +609,7 @@ usr << "[src] is empty." return - usr << "[seed.display_name] are growing here." + usr << "[seed.display_name] are growing here." if(!Adjacent(usr)) return @@ -656,7 +659,7 @@ set name = "Toggle Tray Lid" set category = "Object" set src in view(1) - if(!usr.canmove || usr.stat || usr.restrained()) + if(usr.incapacitated()) return if(ishuman(usr) || istype(usr, /mob/living/silicon/robot)) diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm index 4d49f3fc2d5..3ddc562637c 100644 --- a/code/modules/hydroponics/trays/tray_reagents.dm +++ b/code/modules/hydroponics/trays/tray_reagents.dm @@ -48,20 +48,6 @@ toxicity = 8 pest_kill_str = 7 -/obj/item/weapon/material/minihoe // -- Numbers - name = "mini hoe" - desc = "It's used for removing weeds or scratching your back." - icon = 'icons/obj/weapons.dmi' - icon_state = "hoe" - item_state = "hoe" - flags = CONDUCT | NOBLUDGEON - force = 5.0 - throwforce = 7.0 - w_class = 2.0 - matter = list(DEFAULT_WALL_MATERIAL = 50) - attack_verb = list("slashed", "sliced", "cut", "clawed") - - // ************************************* // Weedkiller defines for hydroponics // ************************************* diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 1371aa943f2..6ce3c9931e5 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -198,6 +198,12 @@ if(grown_seed.get_trait(TRAIT_TELEPORTING)) dat += "
      The fruit is temporal/spatially unstable." + if(grown_seed.get_trait(TRAIT_EXUDE_GASSES)) + dat += "
      It will release gas into the environment." + + if(grown_seed.get_trait(TRAIT_CONSUME_GASSES)) + dat += "
      It will remove gas from the environment." + if(dat) last_data = dat dat += "

      \[print report\]" diff --git a/code/modules/intern/intern.dm b/code/modules/intern/intern.dm index 7eefc0ced19..fb78bfb89de 100644 --- a/code/modules/intern/intern.dm +++ b/code/modules/intern/intern.dm @@ -92,6 +92,6 @@ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/duffel/eng(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/eng(H), slot_head) + H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/engineering(H), slot_head) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear) return 1 diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index f9292dc1b16..f51c2ad9a6a 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -36,6 +36,20 @@ return else name = ("bookcase ([newname])") + else if(istype(O,/obj/item/weapon/wrench)) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + user << (anchored ? "You unfasten \the [src] from the floor." : "You secure \the [src] to the floor.") + anchored = !anchored + else if(istype(O,/obj/item/weapon/screwdriver)) + playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) + user << "You begin dismantling \the [src]." + if(do_after(user,25)) + user << "You dismantle \the [src]." + new /obj/item/stack/material/wood(get_turf(src), amount = 3) + for(var/obj/item/weapon/book/b in contents) + b.loc = (get_turf(src)) + qdel(src) + else ..() @@ -81,6 +95,7 @@ icon_state = "book-5" + /obj/structure/bookcase/manuals/medical name = "Medical Manuals bookcase" @@ -241,6 +256,7 @@ user.visible_message("You open up the book and show it to [M]. ", \ " [user] opens up a book and shows it to [M]. ") M << browse("Penned by [author].
      " + "[dat]", "window=book") + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam /* diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 87977708e2d..7e9e73dd24c 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -122,6 +122,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f density = 1 var/arcanecheckout = 0 var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book + var/sortby = "author" var/buffer_book var/buffer_mob var/upload_category = "Fiction" @@ -195,9 +196,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f else dat += {"(Order book by SS13BN)

      - "} - - var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category FROM ss13_library") + " + dat += "not processing" + dat += "." dat += "
      AUTHORTITLECATEGORY
      TITLEThe crate unlocks!" + locked = 0 /obj/structure/closet/crate/secure/loot/proc/check_input(var/input) if(length(input) != codelen) diff --git a/code/modules/mining/alloys.dm b/code/modules/mining/alloys.dm index dac05badd02..19d11fc9c02 100644 --- a/code/modules/mining/alloys.dm +++ b/code/modules/mining/alloys.dm @@ -24,4 +24,12 @@ "carbon" = 1, "hematite" = 1 ) - product = /obj/item/stack/material/steel \ No newline at end of file + product = /obj/item/stack/material/steel + +/datum/alloy/borosilicate + metaltag = "borosilicate glass" + requires = list( + "platinum" = 1, + "sand" = 2 + ) + product = /obj/item/stack/material/glass/phoronglass diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 5d25adb78d5..0f78a2785ae 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -74,8 +74,8 @@ return //Drill through the flooring, if any. - if(istype(get_turf(src), /turf/simulated/floor/plating/airless/asteroid)) - var/turf/simulated/floor/plating/airless/asteroid/T = get_turf(src) + if(istype(get_turf(src), /turf/simulated/floor/asteroid)) + var/turf/simulated/floor/asteroid/T = get_turf(src) if(!T.dug) T.gets_dug() else if(istype(get_turf(src), /turf/simulated/floor)) @@ -84,7 +84,7 @@ //Dig out the tasty ores. if(resource_field.len) - var/turf/harvesting = pick(resource_field) + var/turf/simulated/harvesting = pick(resource_field) while(resource_field.len && !harvesting.resources) harvesting.has_resources = 0 @@ -253,7 +253,7 @@ var/tx = T.x - 2 var/ty = T.y - 2 - var/turf/mine_turf + var/turf/simulated/mine_turf for(var/iy = 0,iy < 5, iy++) for(var/ix = 0, ix < 5, ix++) mine_turf = locate(tx + ix, ty + iy, T.z) diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 6903256d926..c0c3dd937d2 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -4,8 +4,8 @@ icon = 'icons/obj/device.dmi' icon_state = "forensic0-old" //GET A BETTER SPRITE. item_state = "electronic" + origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 150) - origin_tech = "magnets=1;engineering=1" /obj/item/weapon/mining_scanner/attack_self(mob/user as mob) user << "You begin sweeping \the [src] about, scanning for metal deposits." @@ -20,7 +20,7 @@ "exotic matter" = 0 ) - for(var/turf/T in range(2, get_turf(user))) + for(var/turf/simulated/T in range(2, get_turf(user))) if(!T.has_resources) continue diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index b2d4f0f6a5c..180d84ff60e 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -44,20 +44,20 @@ if(!machine.ores_stored[ore] && !show_all_ores) continue var/ore/O = ore_data[ore] if(!O) continue - dat += "
      [capitalize(O.display_name)][machine.ores_stored[ore]]not processing" + dat += "not processing" if(1) - dat += "orange'>smelting" + dat += "smelting" if(2) - dat += "blue'>compressing" + dat += "compressing" if(3) - dat += "gray'>alloying" + dat += "alloying" else - dat += "red'>not processing" - dat += ".\[change\]
      \[change\]

      " dat += "Currently displaying [show_all_ores ? "all ore types" : "only available ore types"]. \[[show_all_ores ? "show less" : "show more"]\]
      " diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 02b1a77174e..0aa15c45cae 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -51,7 +51,7 @@ w_class = 4.0 matter = list(DEFAULT_WALL_MATERIAL = 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" + origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) attack_verb = list("hit", "pierced", "sliced", "attacked") var/drill_sound = 'sound/weapons/Genhit.ogg' var/drill_verb = "drilling" @@ -69,7 +69,7 @@ icon_state = "spickaxe" item_state = "spickaxe" digspeed = 30 - origin_tech = "materials=3" + origin_tech = list(TECH_MATERIAL = 3) desc = "This makes no metallurgic sense." /obj/item/weapon/pickaxe/drill @@ -77,7 +77,7 @@ icon_state = "handdrill" item_state = "jackhammer" digspeed = 30 - origin_tech = "materials=2;powerstorage=3;engineering=2" + origin_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) desc = "Yours is the drill that will pierce through the rock walls." drill_verb = "drilling" @@ -86,7 +86,7 @@ icon_state = "jackhammer" item_state = "jackhammer" digspeed = 20 //faster than drill, but cannot dig - origin_tech = "materials=3;powerstorage=2;engineering=2" + origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards." drill_verb = "hammering" @@ -95,7 +95,7 @@ icon_state = "gpickaxe" item_state = "gpickaxe" digspeed = 20 - origin_tech = "materials=4" + origin_tech = list(TECH_MATERIAL = 4) desc = "This makes no metallurgic sense." drill_verb = "picking" @@ -106,7 +106,7 @@ w_class = 3.0 //it is smaller than the pickaxe damtype = "fire" digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/ light thermite on fire - origin_tech = "materials=4;phorontech=3;engineering=3" + origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff." drill_verb = "cutting" drill_sound = 'sound/items/Welder.ogg' @@ -118,7 +118,7 @@ icon_state = "dpickaxe" item_state = "dpickaxe" digspeed = 10 - origin_tech = "materials=6;engineering=4" + origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4) desc = "A pickaxe with a diamond pick head." drill_verb = "picking" @@ -127,7 +127,7 @@ icon_state = "diamonddrill" item_state = "jackhammer" digspeed = 5 //Digs through walls, girders, and can dig up sand - origin_tech = "materials=6;powerstorage=4;engineering=5" + origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 5) desc = "Yours is the drill that will pierce the heavens!" drill_verb = "drilling" @@ -152,8 +152,8 @@ throwforce = 4.0 item_state = "shovel" w_class = 3.0 + origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 50) - origin_tech = "materials=1;engineering=1" attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") sharp = 0 edge = 1 @@ -230,7 +230,7 @@ var/obj/item/stack/flag/F = locate() in get_turf(src) var/turf/T = get_turf(src) - if(!T || !istype(T,/turf/simulated/floor/plating/airless/asteroid)) + if(!T || !istype(T,/turf/simulated/floor/asteroid)) user << "The flag won't stand up in this terrain." return diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 17d9bfe8be1..adec9ac4389 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -1,5 +1,10 @@ /**********************Mineral deposits**************************/ - +/turf/unsimulated/mineral + name = "impassable rock" + icon = 'icons/turf/walls.dmi' + icon_state = "rock-dark" + blocks_air = 1 + density = 1 /turf/simulated/mineral //wall piece name = "Rock" @@ -11,6 +16,7 @@ density = 1 blocks_air = 1 temperature = T0C + var/mined_turf = /turf/simulated/floor/asteroid var/ore/mineral var/mined_ore = 0 var/last_act = 0 @@ -28,21 +34,20 @@ has_resources = 1 /turf/simulated/mineral/New() - spawn(0) MineralSpread() - spawn(2) - var/list/step_overlays = list("s" = NORTH, "n" = SOUTH, "w" = EAST, "e" = WEST) - for(var/direction in step_overlays) - var/turf/turf_to_check = get_step(src,step_overlays[direction]) + updateMineralOverlays(1) - if(istype(turf_to_check,/turf/simulated/floor/plating/airless/asteroid)) - var/turf/simulated/floor/plating/airless/asteroid/T = turf_to_check - T.updateMineralOverlays() - - else if(istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor)) - turf_to_check.overlays += image('icons/turf/walls.dmi', "rock_side_[direction]") +/turf/simulated/mineral/proc/updateMineralOverlays(var/update_neighbors) + var/list/step_overlays = list("s" = NORTH, "n" = SOUTH, "w" = EAST, "e" = WEST) + for(var/direction in step_overlays) + var/turf/turf_to_check = get_step(src,step_overlays[direction]) + if(update_neighbors && istype(turf_to_check,/turf/simulated/floor/asteroid)) + var/turf/simulated/floor/asteroid/T = turf_to_check + T.updateMineralOverlays() + else if(istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor)) + turf_to_check.overlays += image('icons/turf/walls.dmi', "rock_side", dir = turn(step_overlays[direction], 180)) /turf/simulated/mineral/ex_act(severity) switch(severity) @@ -280,8 +285,7 @@ //Add some rubble, you did just clear out a big chunk of rock. - var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) - N.overlay_detail = "asteroid[rand(0,9)]" + var/turf/simulated/floor/asteroid/N = ChangeTurf(mined_turf) // Kill and update the space overlays around us. for(var/direction in step_overlays) @@ -290,15 +294,11 @@ T.overlays.Cut() for(var/next_direction in step_overlays) if(istype(get_step(T, step_overlays[next_direction]),/turf/simulated/mineral)) - T.overlays += image('icons/turf/walls.dmi', "rock_side_[next_direction]") - - // Update the - N.updateMineralOverlays(1) - - if(rand(1,500) == 1) - visible_message("An old dusty crate was buried within!") - new /obj/structure/closet/crate/secure/loot(src) + T.overlays += image('icons/turf/walls.dmi', "rock_side", dir = step_overlays[next_direction]) + if(istype(N)) + N.overlay_detail = "asteroid[rand(0,9)]" + N.updateMineralOverlays(1) /turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F) //with skill and luck, players can cleanly extract finds @@ -389,26 +389,32 @@ /**********************Asteroid**************************/ - -/turf/simulated/floor/plating/airless/asteroid //floor piece - name = "asteroid" - icon = 'icons/turf/floors.dmi' +// Setting icon/icon_state initially will use these values when the turf is built on/replaced. +// This means you can put grass on the asteroid etc. +/turf/simulated/floor/asteroid + name = "sand" + icon = 'icons/turf/flooring/asteroid.dmi' icon_state = "asteroid" + base_name = "sand" + base_desc = "Gritty and unpleasant." + base_icon = 'icons/turf/flooring/asteroid.dmi' + base_icon_state = "asteroid" + + initial_flooring = null oxygen = 0 nitrogen = 0 temperature = TCMB - icon_plating = "asteroid" var/dug = 0 //0 = has not yet been dug, 1 = has already been dug var/overlay_detail has_resources = 1 footstep_sound = "gravelstep" -/turf/simulated/floor/plating/airless/asteroid/New() +/turf/simulated/floor/asteroid/New() if(prob(20)) overlay_detail = "asteroid[rand(0,9)]" -/turf/simulated/floor/plating/airless/asteroid/ex_act(severity) +/turf/simulated/floor/asteroid/ex_act(severity) switch(severity) if(3.0) return @@ -419,7 +425,10 @@ gets_dug() return -/turf/simulated/floor/plating/airless/asteroid/attackby(obj/item/weapon/W as obj, mob/user as mob) +/turf/simulated/floor/asteroid/is_plating() + return 0 + +/turf/simulated/floor/asteroid/attackby(obj/item/weapon/W as obj, mob/user as mob) if(!W || !user) return 0 @@ -471,7 +480,7 @@ ..(W,user) return -/turf/simulated/floor/plating/airless/asteroid/proc/gets_dug() +/turf/simulated/floor/asteroid/proc/gets_dug() if(dug) return @@ -480,11 +489,10 @@ new/obj/item/weapon/ore/glass(src) dug = 1 - icon_plating = "asteroid_dug" icon_state = "asteroid_dug" return -/turf/simulated/floor/plating/airless/asteroid/proc/updateMineralOverlays(var/update_neighbors) +/turf/simulated/floor/asteroid/proc/updateMineralOverlays(var/update_neighbors) overlays.Cut() @@ -492,22 +500,23 @@ for(var/direction in step_overlays) if(istype(get_step(src, step_overlays[direction]), /turf/space)) - overlays += image('icons/turf/floors.dmi', "asteroid_edge_[direction]") + overlays += image('icons/turf/flooring/asteroid.dmi', "asteroid_edges", dir = step_overlays[direction]) if(istype(get_step(src, step_overlays[direction]), /turf/simulated/mineral)) - overlays += image('icons/turf/walls.dmi', "rock_side_[direction]") + overlays += image('icons/turf/walls.dmi', "rock_side", dir = step_overlays[direction]) - if(overlay_detail) overlays += overlay_detail + //todo cache + if(overlay_detail) overlays |= image(icon = 'icons/turf/flooring/decals.dmi', icon_state = overlay_detail) if(update_neighbors) var/list/all_step_directions = list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,SOUTHWEST,WEST,NORTHWEST) for(var/direction in all_step_directions) - var/turf/simulated/floor/plating/airless/asteroid/A - if(istype(get_step(src, direction), /turf/simulated/floor/plating/airless/asteroid)) + var/turf/simulated/floor/asteroid/A + if(istype(get_step(src, direction), /turf/simulated/floor/asteroid)) A = get_step(src, direction) A.updateMineralOverlays() -/turf/simulated/floor/plating/airless/asteroid/Entered(atom/movable/M as mob|obj) +/turf/simulated/floor/asteroid/Entered(atom/movable/M as mob|obj) ..() if(istype(M,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = M diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index a46b2631520..19cdf2a18b6 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -9,49 +9,62 @@ /obj/item/weapon/ore/uranium name = "pitchblende" icon_state = "ore_uranium" - origin_tech = "materials=5" + origin_tech = list(TECH_MATERIAL = 5) material = "uranium" /obj/item/weapon/ore/iron name = "hematite" icon_state = "ore_iron" - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) material = "hematite" /obj/item/weapon/ore/coal name = "raw carbon" icon_state = "ore_coal" - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) material = "carbon" /obj/item/weapon/ore/glass - name = "impure silicates" + name = "sand" icon_state = "ore_glass" - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) material = "sand" + slot_flags = SLOT_HOLSTER + +// POCKET SAND! +/obj/item/weapon/ore/glass/throw_impact(atom/hit_atom) + ..() + var/mob/living/carbon/human/H = hit_atom + if(istype(H) && H.has_eyes() && prob(85)) + H << "Some of \the [src] gets in your eyes!" + H.eye_blind += 5 + H.eye_blurry += 10 + spawn(1) + if(istype(loc, /turf/)) qdel(src) + /obj/item/weapon/ore/phoron name = "phoron crystals" icon_state = "ore_phoron" - origin_tech = "materials=2" + origin_tech = list(TECH_MATERIAL = 2) material = "phoron" /obj/item/weapon/ore/silver name = "native silver ore" icon_state = "ore_silver" - origin_tech = "materials=3" + origin_tech = list(TECH_MATERIAL = 3) material = "silver" /obj/item/weapon/ore/gold name = "native gold ore" icon_state = "ore_gold" - origin_tech = "materials=4" + origin_tech = list(TECH_MATERIAL = 4) material = "gold" /obj/item/weapon/ore/diamond name = "diamonds" icon_state = "ore_diamond" - origin_tech = "materials=6" + origin_tech = list(TECH_MATERIAL = 6) material = "diamond" /obj/item/weapon/ore/osmium diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm index 32f03c072f9..a69a66a2104 100644 --- a/code/modules/mining/ore_datum.dm +++ b/code/modules/mining/ore_datum.dm @@ -59,7 +59,7 @@ var/global/list/ore_data = list() /ore/glass name = "sand" - display_name = "impure silicates" + display_name = "sand" smelts_to = "glass" compresses_to = "sandstone" diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index 9bff0fbbe99..13c892abb61 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -108,7 +108,10 @@ note dizziness decrements automatically in the mob's Life() proc. return /mob/proc/make_floating(var/n) - + if(buckled) + if(is_floating) + stop_floating() + return floatiness = n if(floatiness && !is_floating) @@ -170,6 +173,42 @@ note dizziness decrements automatically in the mob's Life() proc. ..() is_floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement. + // What icon do we use for the attack? + var/image/I + if(hand && l_hand) // Attacked with item in left hand. + I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 1) + else if (!hand && r_hand) // Attacked with item in right hand. + I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 1) + else // Attacked with a fist? + return + + // Who can see the attack? + var/list/viewing = list() + for (var/mob/M in viewers(A)) + if (M.client) + viewing |= M.client + flick_overlay(I, viewing, 5) // 5 ticks/half a second + + // Scale the icon. + I.transform *= 0.75 + // Set the direction of the icon animation. + var/direction = get_dir(src, A) + if(direction & NORTH) + I.pixel_y = -16 + else if(direction & SOUTH) + I.pixel_y = 16 + + if(direction & EAST) + I.pixel_x = -16 + else if(direction & WEST) + I.pixel_x = 16 + + if(!direction) // Attacked self?! + I.pixel_z = 16 + + // And animate the attack! + animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) + /mob/proc/spin(spintime, speed) spawn() var/D = dir diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4ed21615fdf..4d202eb440b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -29,6 +29,8 @@ 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 + + var/obj/item/device/multitool/ghost_multitool incorporeal_move = 1 /mob/dead/observer/New(mob/body) @@ -77,26 +79,37 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images mind = body.mind //we don't transfer the mind but we keep a reference to it. if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - loc = T + forceMove(T) if(!name) //To prevent nameless ghosts name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) real_name = name + + ghost_multitool = new(src) ..() /mob/dead/observer/Destroy() + stop_following() + qdel(ghost_multitool) + ghost_multitool = null + if (ghostimage) ghost_darkness_images -= ghostimage qdel(ghostimage) ghostimage = null updateallghostimages() - ..() + return ..() /mob/dead/observer/Topic(href, href_list) if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) + if(istype(href_list["track"],/mob)) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + else + var/atom/target = locate(href_list["track"]) + if(istype(target)) + ManualFollow(target) /mob/dead/observer/proc/initialise_postkey() //This function should be run after a ghost has been created and had a ckey assigned @@ -169,7 +182,7 @@ Works together with spawning an observer, noted above. //It is also set in the mob/death proc if (isanimal(src)) set_death_time(ANIMAL, world.time) - else if (ispAI(src) || isdrone(src)) + else if (ispAI(src) || isDrone(src)) set_death_time(MINISYNTH, world.time) else set_death_time(CREW, world.time)//Crew is the fallback @@ -245,6 +258,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!found_rune) usr << "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you." return + stop_following() mind.current.ajourn=0 mind.current.key = key mind.current.teleop = null @@ -325,8 +339,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else usr << "No area available." - usr.loc = pick(L) - following = null + stop_following() + usr.forceMove(pick(L)) /mob/dead/observer/verb/follow(input in getmobs()) set category = "Ghost" @@ -339,27 +353,30 @@ 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) + if(!target || target == following || target == src) return - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - usr << "You cannot follow a mob standing on holy grounds!" + stop_following() + following = target + moved_event.register(following, src, /atom/movable/proc/move_to_destination) + destroyed_event.register(following, src, /mob/dead/observer/proc/stop_following) + + src << "Now following \the [following]" + move_to_destination(following, following.loc, following.loc) + +/mob/dead/observer/proc/stop_following() + if(following) + src << "No longer following \the [following]" + moved_event.unregister(following, src) + destroyed_event.unregister(following, src) + following = null + +/mob/dead/observer/move_to_destination(var/atom/movable/am, var/old_loc, var/new_loc) + var/turf/T = get_turf(new_loc) + if(check_holy(T)) + usr << "You cannot follow something standing on holy grounds!" return - if(target != src) - if(following && following == target) - return - following = target - src << "\blue Now following [target]" - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - loc = T - sleep(15) + ..() /mob/proc/check_holy(var/turf/T) return 0 @@ -384,8 +401,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/turf/T = get_turf(M) //Turf of the destination mob if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - src.loc = T - following = null + stop_following() + forceMove(T) else src << "This mob is not located in the game world." /* @@ -413,7 +430,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src << "\red You are dead! You have no mind to store memory!" /mob/dead/observer/Post_Incorpmove() - following = null + stop_following() /mob/dead/observer/verb/analyze_air() set name = "Analyze Air" @@ -449,7 +466,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src << "Spawning as a mouse is currently disabled." return - if(!MayRespawn(1)) + if(!MayRespawn(1, ANIMAL_SPAWN_DELAY)) return var/turf/T = get_turf(src) @@ -457,13 +474,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src << "You may not spawn as a mouse on this Z-level." return - var/timedifference = world.time - get_death_time(ANIMAL)//get/set death_time functions are in mob_helpers.dm - if(timedifference <= RESPAWN_ANIMAL) - var/timedifference_text = time2text(RESPAWN_ANIMAL - timedifference,"mm:ss") - var/basetime = time2text(RESPAWN_ANIMAL,"mm:ss") - src << "You may only spawn again as a mouse more than [basetime] minutes after your death. You have [timedifference_text] left." - return - var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!") if(response != "Squeek!") return //Hit the wrong key...again. @@ -579,7 +589,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return bestvent /mob/dead/observer/verb/view_manfiest() - set name = "View Crew Manifest" + set name = "Show Crew Manifest" set category = "Ghost" var/dat @@ -591,12 +601,28 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //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)) + if(isobserver(usr) && usr.client && isliving(over)) + var/mob/living/M = over + // If they an admin, see if control can be resolved. + if(usr.client.holder && usr.client.holder.cmd_ghost_drag(src,M)) + return + // Otherwise, see if we can possess the target. + if(usr == src && try_possession(M)) + return + if(istype(over, /obj/machinery/drone_fabricator)) + if(try_drone_spawn(src, over)) return return ..() +/mob/dead/observer/proc/try_possession(var/mob/living/M) + if(!config.ghosts_can_possess_animals) + usr << "Ghosts are not permitted to possess animals." + return 0 + if(!M.can_be_possessed_by(src)) + return 0 + return M.do_possession(src) + //Used for drawing on walls with blood puddles as a spooky ghost. /mob/dead/verb/bloody_doodle() @@ -614,12 +640,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (usr != src) return 0 //something is terribly wrong - var/ghosts_can_write - if(ticker.mode.name == "Cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write) + if(!round_is_spooky()) src << "\red The veil is not thin enough for you to do that." return @@ -744,6 +765,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/canface() return 1 +/mob/proc/can_admin_interact() + return 0 + +/mob/dead/observer/can_admin_interact() + return check_rights(R_ADMIN, 0, src) + /mob/dead/observer/verb/toggle_ghostsee() set name = "Toggle Ghost Vision" set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" @@ -760,7 +787,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/updateghostsight() if (!seedarkness) - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + see_invisible = SEE_INVISIBLE_NOLIGHTING else see_invisible = SEE_INVISIBLE_OBSERVER if (!ghostvision) @@ -784,7 +811,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (ghostimage) client.images -= ghostimage //remove ourself -mob/dead/observer/MayRespawn(var/feedback = 0) +mob/dead/observer/MayRespawn(var/feedback = 0, var/respawn_time = 0) if(!client) return 0 if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) @@ -795,4 +822,27 @@ mob/dead/observer/MayRespawn(var/feedback = 0) if(feedback) src << "antagHUD restrictions prevent you from respawning." return 0 + + var/timedifference = world.time - timeofdeath + if(respawn_time && timeofdeath && timedifference < respawn_time MINUTES) + var/timedifference_text = time2text(respawn_time MINUTES - timedifference,"mm:ss") + src << "You must have been dead for [respawn_time] minute\s to respawn. You have [timedifference_text] left." + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/dead/observer/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 6e644454791..a48dd5ec78c 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -2,7 +2,7 @@ //added different sort of gibs and animations. N /mob/proc/gib(anim="gibbed-m",do_gibs) death(1) - monkeyizing = 1 + transforming = 1 canmove = 0 icon = null invisibility = 101 @@ -28,7 +28,7 @@ /mob/proc/dust(anim="dust-m",remains=/obj/effect/decal/cleanable/ash) death(1) var/atom/movable/overlay/animation = null - monkeyizing = 1 + transforming = 1 canmove = 0 icon = null invisibility = 101 @@ -82,7 +82,7 @@ timeofdeath = world.time if (isanimal(src)) set_death_time(ANIMAL, world.time) - else if (ispAI(src) || isdrone(src)) + else if (ispAI(src) || isDrone(src)) set_death_time(MINISYNTH, world.time) else if (isliving(src)) set_death_time(CREW, world.time)//Crew is the fallback diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 00b19904347..7bc11bf7ccf 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -2,9 +2,8 @@ //m_type == 1 --> visual. //m_type == 2 --> audible /mob/proc/custom_emote(var/m_type=1,var/message = null) - - if(stat || !use_me && usr == src) - usr << "You are unable to emote." + if(usr && stat || !use_me && usr == src) + src << "You are unable to emote." return var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) diff --git a/code/modules/mob/freelook/ai/chunk.dm b/code/modules/mob/freelook/ai/chunk.dm index 89a07bb465c..5d82f66d662 100644 --- a/code/modules/mob/freelook/ai/chunk.dm +++ b/code/modules/mob/freelook/ai/chunk.dm @@ -24,6 +24,10 @@ for(var/turf/t in c.can_see()) visible[t] = t + for(var/mob/living/silicon/ai/AI in living_mob_list) + for(var/turf/t in AI.seen_camera_turfs()) + visible[t] = t + // Create a new camera chunk, since the chunks are made as they are needed. /datum/chunk/camera/New(loc, x, y, z) @@ -31,3 +35,15 @@ if(c.can_use()) cameras += c ..() + +/mob/living/silicon/proc/provides_camera_vision() + return 0 + +/mob/living/silicon/ai/provides_camera_vision() + return stat != DEAD + +/mob/living/silicon/robot/provides_camera_vision() + return src.camera && src.camera.network.len + +/mob/living/silicon/ai/proc/seen_camera_turfs() + return seen_turfs_in_range(src, world.view) diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index 93fda30055e..aa7e4d46191 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -18,7 +18,7 @@ ai.ai_cancel_tracking() //Holopad - if(ai.holo) + if(ai.holo && ai.hologram_follow) ai.holo.move_hologram(ai) return 1 @@ -54,7 +54,7 @@ create_eyeobj() spawn(5) if(eyeobj) - eyeobj.loc = src.loc + eyeobj.forceMove(src.loc) /mob/living/silicon/ai/Destroy() destroy_eyeobj() diff --git a/code/modules/mob/freelook/ai/update_triggers.dm b/code/modules/mob/freelook/ai/update_triggers.dm index 8a91d0540e6..f4fea0aa58f 100644 --- a/code/modules/mob/freelook/ai/update_triggers.dm +++ b/code/modules/mob/freelook/ai/update_triggers.dm @@ -4,13 +4,13 @@ // Update the portable camera everytime the Robot moves. // This might be laggy, comment it out if there are problems. -/mob/living/silicon/robot/var/updating = 0 +/mob/living/silicon/var/updating = 0 /mob/living/silicon/robot/Move() var/oldLoc = src.loc . = ..() if(.) - if(src.camera && src.camera.network.len) + if(provides_camera_vision()) if(!updating) updating = 1 spawn(BORG_CAMERA_BUFFER) @@ -18,6 +18,21 @@ cameranet.updatePortableCamera(src.camera) updating = 0 +/mob/living/silicon/AI/Move() + var/oldLoc = src.loc + . = ..() + if(.) + if(provides_camera_vision()) + if(!updating) + updating = 1 + spawn(BORG_CAMERA_BUFFER) + if(oldLoc != src.loc) + cameranet.updateVisibility(oldLoc, 0) + cameranet.updateVisibility(loc, 0) + updating = 0 + +#undef BORG_CAMERA_BUFFER + // CAMERA // An addition to deactivate which removes/adds the camera from the chunk list based on if it works or not. @@ -42,8 +57,19 @@ update_coverage(1) /obj/machinery/camera/Destroy() - cameranet.cameras -= src clear_all_networks() + cameranet.cameras -= src ..() -#undef BORG_CAMERA_BUFFER +// Mobs +/mob/living/silicon/ai/rejuvenate() + var/was_dead = stat == DEAD + ..() + if(was_dead && stat != DEAD) + // Arise! + cameranet.updateVisibility(src, 0) + +/mob/living/silicon/ai/death(gibbed) + if(..()) + // If true, the mob went from living to dead (assuming everyone has been overriding as they should...) + cameranet.updateVisibility(src, 0) diff --git a/code/modules/mob/freelook/eye.dm b/code/modules/mob/freelook/eye.dm index fb2b04a4348..356b03e0f9b 100644 --- a/code/modules/mob/freelook/eye.dm +++ b/code/modules/mob/freelook/eye.dm @@ -41,12 +41,15 @@ mob/eye/Destroy() updateallghostimages() ..() -// Movement code. Returns 0 to stop air movement from moving it. /mob/eye/Move(n, direct) if(owner == src) - EyeMove(n, direct) + return EyeMove(n, direct) return 0 +/mob/eye/airflow_hit(atom/A) + airflow_speed = 0 + airflow_dest = null + /mob/eye/examinate() set popup_menu = 0 set src = usr.contents @@ -65,14 +68,14 @@ mob/eye/Destroy() if(owner) T = get_turf(T) if(T != loc) - loc = T + forceMove(T) if(owner.client) owner.client.eye = src if(owner_follows_eye) visualnet.updateVisibility(owner, 0) - owner.loc = loc + owner.forceMove(loc) visualnet.updateVisibility(owner, 0) visualnet.visibility(src) @@ -110,3 +113,4 @@ mob/eye/Destroy() sprint = min(sprint + 0.5, max_sprint) else sprint = initial + return 1 diff --git a/code/modules/mob/freelook/mask/chunk.dm b/code/modules/mob/freelook/mask/chunk.dm index b0973951cc2..f98a9b936bb 100644 --- a/code/modules/mob/freelook/mask/chunk.dm +++ b/code/modules/mob/freelook/mask/chunk.dm @@ -11,27 +11,24 @@ /datum/chunk/cult/acquireVisibleTurfs(var/list/visible) for(var/mob/living/L in living_mob_list) - for(var/turf/t in L.seen_turfs()) + for(var/turf/t in L.seen_cult_turfs()) visible[t] = t -/mob/living/proc/seen_turfs() +/mob/living/proc/seen_cult_turfs() return seen_turfs_in_range(src, 3) -/mob/living/carbon/human/seen_turfs() - /*if(src.isSynthetic()) - return list()*/ - +/mob/living/carbon/human/seen_cult_turfs() if(mind in cult.current_antagonists) - return seen_turfs_in_range(src, client ? client.view : 7) + return seen_turfs_in_range(src, world.view) return ..() -/mob/living/silicon/seen_turfs() +/mob/living/silicon/seen_cult_turfs() return list() -/mob/living/simple_animal/seen_turfs() +/mob/living/simple_animal/seen_cult_turfs() return seen_turfs_in_range(src, 1) -/mob/living/simple_animal/shade/narsie/seen_turfs() +/mob/living/simple_animal/shade/narsie/seen_cult_turfs() return view(2, src) /proc/seen_turfs_in_range(var/source, var/range) diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm index 838c99733b9..c04fdd26f15 100644 --- a/code/modules/mob/freelook/update_triggers.dm +++ b/code/modules/mob/freelook/update_triggers.dm @@ -15,7 +15,7 @@ /turf/simulated/Destroy() updateVisibility(src) - ..() + return ..() /turf/simulated/New() ..() @@ -26,7 +26,7 @@ /obj/structure/Destroy() updateVisibility(src) - ..() + return ..() // EFFECTS diff --git a/code/modules/mob/gender.dm b/code/modules/mob/gender.dm new file mode 100644 index 00000000000..393e0fb6c2b --- /dev/null +++ b/code/modules/mob/gender.dm @@ -0,0 +1,56 @@ + +/var/list/gender_datums = list() + +/hook/startup/proc/populate_gender_datum_list() + for(var/type in typesof(/datum/gender)) + var/datum/gender/G = new type + gender_datums[G.key] = G + return 1 + +/datum/gender + var/key = "plural" + + var/He = "They" + var/he = "they" + var/His = "Their" + var/his = "their" + var/him = "them" + var/has = "have" + var/is = "are" + var/does = "do" + +/datum/gender/male + key = "male" + + He = "He" + he = "he" + His = "His" + his = "his" + him = "him" + has = "has" + is = "is" + does = "does" + +/datum/gender/female + key = "female" + + He = "She" + he = "she" + His = "Her" + his = "her" + him = "her" + has = "has" + is = "is" + does = "does" + +/datum/gender/neuter + key = "neuter" + + He = "It" + he = "it" + His = "Its" + his = "its" + him = "it" + has = "has" + is = "is" + does = "does" diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 11e1cfef886..57648d57c97 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -55,7 +55,7 @@ return if(speaker_name != speaker.real_name && speaker.real_name) speaker_name = "[speaker.real_name] ([speaker_name])" - track = "(follow) " + track = "([ghost_follow_link(speaker, src)]) " if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src)) message = "[message]" @@ -180,7 +180,7 @@ if(istype(src, /mob/dead/observer)) if(speaker_name != speaker.real_name && !isAI(speaker)) //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs. speaker_name = "[speaker.real_name] ([speaker_name])" - track = "[speaker_name] (follow)" + track = "[speaker_name] ([ghost_follow_link(speaker, src)])" var/formatted if(language) @@ -197,18 +197,18 @@ return "\[[worldtime2text()]\]" /mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted) - src << "[part_a][speaker_name][part_b][formatted]" + src << "[part_a][speaker_name][part_b][formatted]" /mob/dead/observer/on_hear_radio(part_a, speaker_name, track, part_b, formatted) - src << "[part_a][track][part_b][formatted]" + src << "[part_a][track][part_b][formatted]" /mob/living/silicon/on_hear_radio(part_a, speaker_name, track, part_b, formatted) var/time = say_timestamp() - src << "[time][part_a][speaker_name][part_b][formatted]" + src << "[time][part_a][speaker_name][part_b][formatted]" /mob/living/silicon/ai/on_hear_radio(part_a, speaker_name, track, part_b, formatted) var/time = say_timestamp() - src << "[time][part_a][track][part_b][formatted]" + src << "[time][part_a][track][part_b][formatted]" /mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null) if(!client || !speaker) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index efdae7cce00..5fd4f819561 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -1,3 +1,5 @@ +var/list/holder_mob_icon_cache = list() + //Helper object for picking dionaea (and other creatures) up. /obj/item/weapon/holder name = "holder" @@ -34,6 +36,55 @@ else ..() + +/obj/item/weapon/holder/GetID() + for(var/mob/M in contents) + var/obj/item/I = M.GetIdCard() + if(I) + return I + return null + +/obj/item/weapon/holder/GetAccess() + var/obj/item/I = GetID() + return I ? I.GetAccess() : ..() + +/obj/item/weapon/holder/attack_self() + for(var/mob/M in contents) + M.show_inv(usr) + +/obj/item/weapon/holder/proc/sync(var/mob/living/M) + dir = 2 + overlays.Cut() + icon = M.icon + icon_state = M.icon_state + item_state = M.item_state + color = M.color + name = M.name + desc = M.desc + overlays |= M.overlays + var/mob/living/carbon/human/H = loc + if(istype(H)) + if(H.l_hand == src) + H.update_inv_l_hand() + else if(H.r_hand == src) + H.update_inv_r_hand() + else + H.regenerate_icons() + +//Mob specific holders. +/obj/item/weapon/holder/diona + origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5) + slot_flags = SLOT_HEAD | SLOT_OCLOTHING | SLOT_HOLSTER + +/obj/item/weapon/holder/drone + origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5) + +/obj/item/weapon/holder/mouse + w_class = 1 + +/obj/item/weapon/holder/borer + origin_tech = list(TECH_BIO = 6) + /obj/item/weapon/holder/process() if(!get_holding_mob() || contained.loc != src) @@ -130,7 +181,7 @@ M << "[contained] is dead." -/obj/item/weapon/holder/proc/show_message(var/message, var/m_type) +/obj/item/weapon/holder/show_message(var/message, var/m_type) for(var/mob/living/M in contents) M.show_message(message,m_type) @@ -214,6 +265,49 @@ var/obj/item/weapon/holder/H = usr.loc H.report_onmob_location(0, H.get_equip_slot(), src) +/obj/item/weapon/holder/human + icon = 'icons/mob/holder_complex.dmi' + var/list/generate_for_slots = list(slot_l_hand_str, slot_r_hand_str, slot_back_str) + slot_flags = SLOT_BACK + +/obj/item/weapon/holder/human/sync(var/mob/living/M) + + // Generate appropriate on-mob icons. + var/mob/living/carbon/human/owner = M + if(istype(owner) && owner.species) + + var/skin_colour = rgb(owner.r_skin, owner.g_skin, owner.b_skin) + var/hair_colour = rgb(owner.r_hair, owner.g_hair, owner.b_hair) + var/eye_colour = rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes) + var/species_name = lowertext(owner.species.get_bodytype()) + + for(var/cache_entry in generate_for_slots) + var/cache_key = "[owner.species]-[cache_entry]-[skin_colour]-[hair_colour]" + if(!holder_mob_icon_cache[cache_key]) + + // Generate individual icons. + var/icon/mob_icon = icon(icon, "[species_name]_holder_[cache_entry]_base") + mob_icon.Blend(skin_colour, ICON_ADD) + var/icon/hair_icon = icon(icon, "[species_name]_holder_[cache_entry]_hair") + hair_icon.Blend(hair_colour, ICON_ADD) + var/icon/eyes_icon = icon(icon, "[species_name]_holder_[cache_entry]_eyes") + eyes_icon.Blend(eye_colour, ICON_ADD) + + // Blend them together. + mob_icon.Blend(eyes_icon, ICON_OVERLAY) + mob_icon.Blend(hair_icon, ICON_OVERLAY) + + // Add to the cache. + holder_mob_icon_cache[cache_key] = mob_icon + item_icons[cache_entry] = holder_mob_icon_cache[cache_key] + + // Handle the rest of sync(). + ..(M) + +//#TODO-MERGE +//Port the reduced-duplication holder method from baystation upstream: +//https://github.com/Baystation12/Baystation12/blob/master/code/modules/mob/holder.dm + //Mob specific holders. //w_class mainly determines whether they can fit in trashbags. <=2 can, >=3 cannot /obj/item/weapon/holder/diona @@ -385,6 +479,3 @@ icon_state_dead = "mushroom_dead" slot_flags = SLOT_HEAD w_class = 2 - - - diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 8944bc31099..21a752269cf 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -1,7 +1,13 @@ //This proc is called whenever someone clicks an inventory ui slot. /mob/proc/attack_ui(slot) var/obj/item/W = get_active_hand() - if(istype(W)) + var/obj/item/E = get_equipped_item(slot) + if (istype(E)) + if(istype(W)) + E.attackby(W,src) + else + E.attack_hand(src) + else equip_to_slot_if_possible(W, slot) /mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1) @@ -77,13 +83,13 @@ var/list/slot_equipment_priority = list( \ // Try put it in their backpack if(istype(src.back,/obj/item/weapon/storage)) var/obj/item/weapon/storage/backpack = src.back - if(backpack.contents.len < backpack.storage_slots) + if(backpack.can_be_inserted(newitem, 1)) newitem.forceMove(src.back) return 1 // Try to place it in any item that can store stuff, on the mob. for(var/obj/item/weapon/storage/S in src.contents) - if (S.contents.len < S.storage_slots) + if(S.can_be_inserted(newitem, 1)) newitem.forceMove(S) return 1 return 0 @@ -135,6 +141,7 @@ var/list/slot_equipment_priority = list( \ // 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) Target = loc @@ -186,26 +193,32 @@ var/list/slot_equipment_priority = list( \ update_inv_wear_mask(0) return -//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. +/mob/proc/isEquipped(obj/item/I) + if(!I) + return 0 + return get_inventory_slot(I) != 0 + +/mob/proc/canUnEquip(obj/item/I) if(!I) //If there's nothing to drop, the drop is automatically successful. return 1 - var/slot = get_inventory_slot(I) - if(slot && !I.mob_can_unequip(src, slot)) - return 0 - - drop_from_inventory(I) - return 1 + return slot && I.mob_can_unequip(src, slot) /mob/proc/get_inventory_slot(obj/item/I) - var/slot + var/slot = 0 for(var/s in slot_back to slot_tie) //kind of worries me if(get_equipped_item(s) == I) slot = s break return slot +//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(!(force || canUnEquip(I))) + return + drop_from_inventory(I) + return 1 + //Attemps to remove an object on a mob. /mob/proc/remove_from_mob(var/obj/O) src.u_equip(O) @@ -231,23 +244,4 @@ var/list/slot_equipment_priority = list( \ //Outdated but still in use apparently. This should at least be a human proc. /mob/proc/get_equipped_items() - var/list/items = new/list() - - if(hasvar(src,"back")) if(src:back) items += src:back - if(hasvar(src,"belt")) if(src:belt) items += src:belt - if(hasvar(src,"l_ear")) if(src:l_ear) items += src:l_ear - if(hasvar(src,"r_ear")) if(src:r_ear) items += src:r_ear - if(hasvar(src,"glasses")) if(src:glasses) items += src:glasses - if(hasvar(src,"gloves")) if(src:gloves) items += src:gloves - if(hasvar(src,"head")) if(src:head) items += src:head - if(hasvar(src,"shoes")) if(src:shoes) items += src:shoes - if(hasvar(src,"wear_id")) if(src:wear_id) items += src:wear_id - if(hasvar(src,"wear_mask")) if(src:wear_mask) items += src:wear_mask - if(hasvar(src,"wear_suit")) if(src:wear_suit) items += src:wear_suit -// if(hasvar(src,"w_radio")) if(src:w_radio) items += src:w_radio commenting this out since headsets go on your ears now PLEASE DON'T BE MAD KEELIN - if(hasvar(src,"w_uniform")) if(src:w_uniform) items += src:w_uniform - - //if(hasvar(src,"l_hand")) if(src:l_hand) items += src:l_hand - //if(hasvar(src,"r_hand")) if(src:r_hand) items += src:r_hand - - return items + return list() diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index 4794aa0b448..96f32f1d7ae 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -25,7 +25,7 @@ speech_verb = "says" whisper_verb = "whispers" key = "0" - flags = RESTRICTED | COMMON_VERBS + flags = RESTRICTED syllables = list("blah","blah","blah","bleh","meh","neh","nah","wah") //TODO flag certain languages to use the mob-type specific say_quote and then get rid of these. diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index c28ad769d05..18f44c774e9 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -5,21 +5,21 @@ */ /datum/language - var/name = "an unknown language" // Fluff name of language if any. - var/desc = "A language." // Short description for 'Check Languages'. - var/speech_verb = "says" // 'says', 'hisses', 'farts'. - var/ask_verb = "asks" // Used when sentence ends in a ? - var/exclaim_verb = "exclaims" // Used when sentence ends in a ! - var/whisper_verb // Optional. When not specified speech_verb + quietly/softly is used instead. - var/signlang_verb = list() // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags - var/colour = "body" // CSS style to use for strings in this language. - var/key = "x" // Character used to speak in language eg. :o for Unathi. - var/flags = 0 // Various language flags. - var/native // If set, non-native speakers will have trouble speaking. - var/list/syllables // Used when scrambling text for a non-speaker. - var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string. + var/name = "an unknown language" // Fluff name of language if any. + var/desc = "A language." // Short description for 'Check Languages'. + var/speech_verb = "says" // 'says', 'hisses', 'farts'. + var/ask_verb = "asks" // Used when sentence ends in a ? + var/exclaim_verb = "exclaims" // Used when sentence ends in a ! + var/whisper_verb = "whispers" // Optional. When not specified speech_verb + quietly/softly is used instead. + var/signlang_verb = list("signs") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags + var/colour = "body" // CSS style to use for strings in this language. + var/key = "x" // Character used to speak in language eg. :o for Unathi. + var/flags = 0 // Various language flags. + var/native // If set, non-native speakers will have trouble speaking. + var/list/syllables // Used when scrambling text for a non-speaker. + var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string -/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4) +/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4, syllable_divisor=2) if(!syllables || !syllables.len) if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) @@ -31,7 +31,7 @@ for(var/i = 0;i0;x--) + for(var/x = rand(Floor(syllable_count/syllable_divisor),syllable_count);x>0;x--) new_name += pick(syllables) full_name += " [capitalize(lowertext(new_name))]" @@ -101,11 +101,24 @@ log_say("[key_name(speaker)] : ([name]) [message]") if(!speaker_mask) speaker_mask = speaker.name - var/msg = "[name], [speaker_mask] [format_message(message, get_spoken_verb(message))]" + message = format_message(message, get_spoken_verb(message)) for(var/mob/player in player_list) - if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player))) - player << msg + player.hear_broadcast(src, speaker, speaker_mask, message) + +/mob/proc/hear_broadcast(var/datum/language/language, var/mob/speaker, var/speaker_name, var/message) + if((language in languages) && language.check_special_condition(src)) + var/msg = "[language.name], [speaker_name] [message]" + src << msg + +/mob/new_player/hear_broadcast(var/datum/language/language, var/mob/speaker, var/speaker_name, var/message) + return + +/mob/dead/observer/hear_broadcast(var/datum/language/language, var/mob/speaker, var/speaker_name, var/message) + if(speaker.name == speaker_name || antagHUD) + src << "[language.name], [speaker_name] ([ghost_follow_link(speaker, src)]) [message]" + else + src << "[language.name], [speaker_name] [message]" /datum/language/proc/check_special_condition(var/mob/other) return 1 @@ -145,9 +158,20 @@ // Can we speak this language, as opposed to just understanding it? /mob/proc/can_speak(datum/language/speaking) - return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages) +/mob/proc/get_language_prefix() + if(client && client.prefs.language_prefixes && client.prefs.language_prefixes.len) + return client.prefs.language_prefixes[1] + + return config.language_prefixes[1] + +/mob/proc/is_language_prefix(var/prefix) + if(client && client.prefs.language_prefixes && client.prefs.language_prefixes.len) + return prefix in client.prefs.language_prefixes + + return prefix in config.language_prefixes + //TBD /mob/verb/check_languages() set name = "Check Known Languages" @@ -158,7 +182,7 @@ for(var/datum/language/L in languages) if(!(L.flags & NONGLOBAL)) - dat += "[L.name] (:[L.key])
      [L.desc]

      " + dat += "[L.name] ([get_language_prefix()][L.key])
      [L.desc]

      " src << browse(dat, "window=checklanguage") return @@ -172,9 +196,9 @@ for(var/datum/language/L in languages) if(!(L.flags & NONGLOBAL)) if(L == default_language) - dat += "[L.name] (:[L.key]) - default - reset
      [L.desc]

      " + dat += "[L.name] ([get_language_prefix()][L.key]) - default - reset
      [L.desc]

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

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

      " src << browse(dat, "window=checklanguage") diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index def359a8f56..bcaf2481676 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -1,6 +1,6 @@ /datum/language/diona - name = "Rootsong" - desc = "A creaking, subvocal language spoken instinctively by the Dionaea. Due to the unique makeup of the average Diona, a phrase of Rootsong can be a combination of anywhere from one to twelve individual voices and notes." + name = LANGUAGE_ROOTSPEAK + desc = "A creaking, subvocal language spoken instinctively by the Dionaea. Due to the unique makeup of the average Diona, a phrase of Rootspeak can be a combination of anywhere from one to twelve individual voices and notes." speech_verb = "creaks and rustles" ask_verb = "creaks" exclaim_verb = "rustles" @@ -21,7 +21,7 @@ return new_name /datum/language/unathi - name = "Sinta'unathi" + name = LANGUAGE_UNATHI desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi." speech_verb = "hisses" ask_verb = "hisses" @@ -29,17 +29,19 @@ colour = "soghun" key = "o" flags = WHITELISTED - syllables = list("ss","ss","ss","ss","skak","seeki","resh","las","esi","kor","sh") - -/datum/language/unathi/get_random_name() - - var/new_name = ..() - while(findtextEx(new_name,"sss",1,null)) - new_name = replacetext(new_name, "sss", "ss") - return capitalize(new_name) + space_chance = 40 + syllables = list( + "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", + "ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh", + "la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl", + "ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk", + "sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss", + "ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr", + "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" + ) /datum/language/tajaran - name = "Siik'maas" + name = LANGUAGE_SIIK_MAAS desc = "The traditionally employed tongue of Ahdomai, composed of expressive yowls and chirps. Native to the Tajaran." speech_verb = "mrowls" ask_verb = "mrowls" @@ -62,7 +64,7 @@ return new_name /datum/language/skrell - name = "Skrellian" + name = LANGUAGE_SKRELLIAN desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans." speech_verb = "warbles" ask_verb = "warbles" @@ -137,13 +139,13 @@ return 0 /datum/language/human - name = "Sol Common" + name = LANGUAGE_SOL_COMMON desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system." speech_verb = "says" whisper_verb = "whispers" colour = "solcom" key = "1" - flags = RESTRICTED + flags = WHITELISTED //syllables are at the bottom of the file @@ -164,6 +166,42 @@ else return ..() +/datum/language/machine + name = LANGUAGE_EAL + desc = "A language of encoded tones that allow for IPCs to communicate auditorily between each other in a manner that allows for easier transfer of information." + speech_verb = "beeps" + ask_verb = "beeps" + exclaim_verb = "loudly beeps" + colour = "changeling" + key = "6" + flags = RESTRICTED | NO_STUTTER + syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz") + space_chance = 10 + +/datum/language/machine/get_random_name() + if(prob(70)) + return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]" + return pick(ai_names) + +/datum/language/resomi + name = LANGUAGE_RESOMI + desc = "A trilling language spoken by the diminutive Resomi." + speech_verb = "chirps" + ask_verb = "chirrups" + exclaim_verb = "trills" + colour = "alien" + key = "v" + flags = WHITELISTED + space_chance = 50 + syllables = list( + "ca", "ra", "ma", "sa", "na", "ta", "la", "sha", "scha", "a", "a", + "ce", "re", "me", "se", "ne", "te", "le", "she", "sche", "e", "e", + "ci", "ri", "mi", "si", "ni", "ti", "li", "shi", "schi", "i", "i" + ) + +/datum/language/resomi/get_random_name(gender) + return ..(gender, 1, 4, 1.5) + //Syllable Lists /* This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed, diff --git a/code/modules/mob/language/synthetic.dm b/code/modules/mob/language/synthetic.dm index 20ad5595372..a5c4f43e17b 100644 --- a/code/modules/mob/language/synthetic.dm +++ b/code/modules/mob/language/synthetic.dm @@ -24,14 +24,14 @@ for (var/mob/M in dead_mob_list) if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping - M.show_message("[message_start] [message_body]", 2) + M.show_message("[message_start] ([ghost_follow_link(speaker, M)]) [message_body]", 2) for (var/mob/living/S in living_mob_list) if(drone_only && !istype(S,/mob/living/silicon/robot/drone)) continue else if(istype(S , /mob/living/silicon/ai)) - message_start = "[name], [speaker.name]" + message_start = "[name], [speaker.name]" else if (!S.binarycheck()) continue diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm new file mode 100644 index 00000000000..196d48a9449 --- /dev/null +++ b/code/modules/mob/living/autohiss.dm @@ -0,0 +1,100 @@ + +#define AUTOHISS_OFF 0 +#define AUTOHISS_BASIC 1 +#define AUTOHISS_FULL 2 + +#define AUTOHISS_NUM 3 + + +/mob/living/proc/handle_autohiss(message, datum/language/L) + return message // no autohiss at this level + +/mob/living/carbon/human/handle_autohiss(message, datum/language/L) + if(!client || client.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off + return message + return species.handle_autohiss(message, L, client.autohiss_mode) + +/client + var/autohiss_mode = AUTOHISS_OFF + +/client/verb/toggle_autohiss() + set name = "Toggle Auto-Hiss" + set desc = "Toggle automatic hissing as Unathi and r-rolling as Taj" + set category = "OOC" + + autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM + switch(autohiss_mode) + if(AUTOHISS_OFF) + src << "Auto-hiss is now OFF." + if(AUTOHISS_BASIC) + src << "Auto-hiss is now BASIC." + if(AUTOHISS_FULL) + src << "Auto-hiss is now FULL." + else + soft_assert(0, "invalid autohiss value [autohiss_mode]") + autohiss_mode = AUTOHISS_OFF + src << "Auto-hiss is now OFF." + +/datum/species + var/list/autohiss_basic_map = null + var/list/autohiss_extra_map = null + var/list/autohiss_exempt = null + +/datum/species/unathi + autohiss_basic_map = list( + "s" = list("ss", "sss", "ssss") + ) + autohiss_extra_map = list( + "x" = list("ks", "kss", "ksss") + ) + autohiss_exempt = list("Sinta'unathi") + +/datum/species/tajaran + autohiss_basic_map = list( + "r" = list("rr", "rrr", "rrrr") + ) + autohiss_exempt = list("Siik'tajr") + + +/datum/species/proc/handle_autohiss(message, datum/language/lang, mode) + if(!autohiss_basic_map) + return message + if(autohiss_exempt && (lang.name in autohiss_exempt)) + return message + + var/map = autohiss_basic_map.Copy() + if(mode == AUTOHISS_FULL && autohiss_extra_map) + map |= autohiss_extra_map + + . = list() + + while(length(message)) + var/min_index = 10000 // if the message is longer than this, the autohiss is the least of your problems + var/min_char = null + for(var/char in map) + var/i = findtext(message, char) + if(!i) // no more of this character anywhere in the string, don't even bother searching next time + map -= char + else if(i < min_index) + min_index = i + min_char = char + if(!min_char) // we didn't find any of the mapping characters + . += message + break + . += copytext(message, 1, min_index) + if(copytext(message, min_index, min_index+1) == uppertext(min_char)) + switch(text2ascii(message, min_index+1)) + if(65 to 90) // A-Z, uppercase; uppercase R/S followed by another uppercase letter, uppercase the entire replacement string + . += uppertext(pick(map[min_char])) + else + . += capitalize(pick(map[min_char])) + else + . += pick(map[min_char]) + message = copytext(message, min_index + 1) + + return list2text(.) + +#undef AUTOHISS_OFF +#undef AUTOHISS_BASIC +#undef AUTOHISS_FULL +#undef AUTOHISS_NUM diff --git a/code/modules/mob/living/blob/blob.dm b/code/modules/mob/living/blob/blob.dm deleted file mode 100644 index 8bbf517e60e..00000000000 --- a/code/modules/mob/living/blob/blob.dm +++ /dev/null @@ -1,253 +0,0 @@ -/mob/living/blob - name = "blob fragment" - real_name = "blob fragment" - icon = 'icons/mob/blob.dmi' - icon_state = "blob_spore_temp" - pass_flags = PASSBLOB - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - var/ghost_name = "Unknown" - var/creating_blob = 0 - faction = "blob" - use_me = 0 //Blobs can't emote - - - New() - real_name += " [pick(rand(1, 99))]" - name = real_name - ..() - - - say(var/message) - return//No talking for you - - - emote(var/act,var/m_type=1,var/message = null) - return - - - Life() - set invisibility = 0 - set background = 1 - - clamp_values() - UpdateDamage() - if(health < 0) - src.dust() - - - proc/clamp_values() - AdjustStunned(0) - AdjustParalysis(0) - AdjustWeakened(0) - sleeping = 0 - if(stat) - stat = CONSCIOUS - return - - - proc/UpdateDamage() - health = 60 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - return - - - death(gibbed) - ghostize() - ..(gibbed) - - - blob_act() - src << "The blob attempts to reabsorb you." - adjustToxLoss(20) - return - - - Process_Spacemove() - if(locate(/obj/effect/blob) in oview(1,src)) - return 1 - return (..()) - - -/mob/living/blob/verb/create_node() - set category = "Blob" - set name = "Create Node" - set desc = "Create a Node." - if(creating_blob) return - var/turf/T = get_turf(src) - creating_blob = 1 - if(!T) - creating_blob = 0 - return - var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) - if(!B)//We are on a blob - usr << "There is no blob here!" - creating_blob = 0 - return - if(istype(B,/obj/effect/blob/node)||istype(B,/obj/effect/blob/core)||istype(B,/obj/effect/blob/factory)) - usr << "Unable to use this blob, find a normal one." - creating_blob = 0 - return - for(var/obj/effect/blob/node/blob in orange(5)) - usr << "There is another node nearby, move more than 5 tiles away from it!" - creating_blob = 0 - return - for(var/obj/effect/blob/factory/blob in orange(2)) - usr << "There is a porus blob nearby, move more than 2 tiles away from it!" - creating_blob = 0 - B.change_to("Node") - src.dust() - return - - -/mob/living/blob/verb/create_factory() - set category = "Blob" - set name = "Create Defense" - set desc = "Create a Spore producing blob." - if(creating_blob) return - var/turf/T = get_turf(src) - creating_blob = 1 - if(!T) - creating_blob = 0 - return - var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) - if(!B) - usr << "You must be on a blob!" - creating_blob = 0 - return - if(istype(B,/obj/effect/blob/node)||istype(B,/obj/effect/blob/core)||istype(B,/obj/effect/blob/factory)) - usr << "Unable to use this blob, find a normal one." - creating_blob = 0 - return - for(var/obj/effect/blob/blob in orange(2))//Not right next to nodes/cores - if(istype(B,/obj/effect/blob/node)) - usr << "There is a node nearby, move away from it!" - creating_blob = 0 - return - if(istype(B,/obj/effect/blob/core)) - usr << "There is a core nearby, move away from it!" - creating_blob = 0 - return - if(istype(B,/obj/effect/blob/factory)) - usr << "There is another porous blob nearby, move away from it!" - creating_blob = 0 - return - B.change_to("Factory") - src.dust() - return - - -/mob/living/blob/verb/revert() - set category = "Blob" - set name = "Purge Defense" - set desc = "Removes a porous blob." - if(creating_blob) return - var/turf/T = get_turf(src) - creating_blob = 1 - if(!T) - creating_blob = 0 - return - var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) - if(!B) - usr << "You must be on a blob!" - creating_blob = 0 - return - if(!istype(B,/obj/effect/blob/factory)) - usr << "Unable to use this blob, find another one." - creating_blob = 0 - return - B.change_to("Normal") - src.dust() - return - - -/mob/living/blob/verb/spawn_blob() - set category = "Blob" - set name = "Create new blob" - set desc = "Attempts to create a new blob in this tile." - if(creating_blob) return - var/turf/T = get_turf(src) - creating_blob = 1 - if(!T) - creating_blob = 0 - return - var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) - if(B) - usr << "There is a blob here!" - creating_blob = 0 - return - new/obj/effect/blob(src.loc) - src.dust() - return - - -///mob/proc/Blobize() -/client/proc/Blobcount() - set category = "Debug" - set name = "blobreport" - set desc = "blob report." - set hidden = 1 - - if(!holder) - src << "Only administrators may use this command." - return - if(ticker && ticker.mode) - src << "blobs: [blobs.len]" - src << "cores: [blob_cores.len]" - src << "nodes: [blob_nodes.len]" - return - - -/client/proc/Blobize()//Mostly stolen from the respawn command - set category = "Debug" - set name = "Ghostblob" - set desc = "Ghost into blobthing." - set hidden = 1 - - if(!holder) - src << "Only administrators may use this command." - return - var/input = input(src, "Please specify which key will be turned into a bloby.", "Key", "") - - var/mob/dead/observer/G_found - if(!input) - var/list/ghosts = list() - for(var/mob/dead/observer/G in player_list) - ghosts += G - if(ghosts.len) - G_found = pick(ghosts) - - else - for(var/mob/dead/observer/G in player_list) - if(G.client&&ckey(G.key)==ckey(input)) - G_found = G - break - - if(!G_found)//If a ghost was not found. - alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.") - return - - if(G_found.client) - G_found.client.screen.len = null - var/mob/living/blob/B = new/mob/living/blob(locate(0,0,1))//temp area also just in case should do this better but tired - if(blob_cores.len > 0) - var/obj/effect/blob/core/core = pick(blob_cores) - if(core) - B.loc = core.loc - B.ghost_name = G_found.real_name - if (G_found.client) - G_found.client.mob = B - B.verbs += /mob/living/blob/verb/create_node - B.verbs += /mob/living/blob/verb/create_factory - B << "You are now a blob fragment." - B << "You are a weak bit that has temporarily broken off of the blob." - B << "If you stay on the blob for too long you will likely be reabsorbed." - B << "If you stray from the blob you will likely be killed by other organisms." - B << "You have the power to create a new blob node that will help expand the blob." - 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) - qdel(G_found) - - - - diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 1d5ea5914a0..221b6d0cec8 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -38,7 +38,6 @@ weakened = 0 stunned = 0 paralysis = 0 - update_canmove() /mob/living/bot/updatehealth() if(status_flags & GODMODE) @@ -100,9 +99,6 @@ else user << "[src] does not need a repair." return - else if (istype(O, /obj/item/weapon/card/emag) && !emagged) - Emag(user) - return else ..() @@ -124,9 +120,8 @@ else ..() -/mob/living/bot/proc/Emag(var/mob/user) - log_and_message_admins("emagged [src]") - return +/mob/living/bot/emag_act(var/remaining_charges, var/mob/user) + return 0 /mob/living/bot/emp_act(severity) switch(severity) @@ -151,3 +146,4 @@ /mob/living/bot/proc/explode() qdel(src) + diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index cd40938cf4b..06302b2543b 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -14,7 +14,7 @@ var/list/cleanbot_types // Going to use this to generate a list of types once th name = "Cleanbot" desc = "A little cleaning robot, he looks so excited!" icon_state = "cleanbot0" - req_access = list(access_janitor, access_robotics) + req_one_access = list(access_janitor, access_robotics) botcard_access = list(access_janitor, access_maint_tunnels) locked = 0 // Start unlocked so roboticist can set them to patrol. @@ -301,12 +301,14 @@ var/list/cleanbot_types // Going to use this to generate a list of types once th 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/emag_act(var/remaining_uses, var/mob/user) + . = ..() + if(!screwloose || !oddbutton) + if(user) + user << "The [src] buzzes and beeps." + oddbutton = 1 + screwloose = 1 + return 1 /mob/living/bot/cleanbot/proc/get_targets() // To avoid excessive loops, instead of storing a list of top-level types, we're going to store a list of all cleanables. diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index 3e8cd097c87..3090ab0c52c 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -56,7 +56,6 @@ return last_shot = world.time - var/projectile = /obj/item/projectile/beam/stun if(emagged) projectile = /obj/item/projectile/beam @@ -65,9 +64,6 @@ var/obj/item/projectile/P = new projectile(loc) var/def_zone = get_exposed_defense_zone(A) P.launch(A, def_zone) - - return - // Assembly /obj/item/weapon/secbot_assembly/ed209_assembly diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 4090c93b18f..44c5f33b779 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -10,7 +10,7 @@ icon_state = "farmbot0" health = 50 maxHealth = 50 - req_access = list(access_hydroponics) + req_one_access = list(access_hydroponics, access_robotics) var/action = "" // Used to update icon var/waters_trays = 1 @@ -69,13 +69,15 @@ 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/emag_act(var/remaining_charges, var/mob/user) + . = ..() + if(!emagged) + if(user) + user << "You short out [src]'s plant identifier circuits." + spawn(rand(30, 50)) + visible_message("[src] buzzes oddly.") + emagged = 1 + return 1 /mob/living/bot/farmbot/Topic(href, href_list) if(..()) @@ -371,4 +373,4 @@ 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 + return //it's a converted watertank, no you cannot pick it up and put it in your backpack diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index fd7b295a525..21a4a6c619c 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -2,7 +2,7 @@ name = "Floorbot" desc = "A little floor repairing robot, he looks so excited!" icon_state = "floorbot0" - req_access = list(access_construction) + req_one_access = list(access_construction, access_robotics) var/amount = 10 // 1 for tile, 2 for lattice var/maxAmount = 60 @@ -15,6 +15,7 @@ var/list/path = list() var/list/ignorelist = list() var/turf/target + var/floor_build_type = /decl/flooring/tiling // Basic steel floor. /mob/living/bot/floorbot/update_icons() if(repairing) @@ -51,11 +52,13 @@ 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/emag_act(var/remaining_charges, var/mob/user) + . = ..() + if(!emagged) + emagged = 1 + if(user) + user << "The [src] buzzes and beeps." + return 1 /mob/living/bot/floorbot/Topic(href, href_list) if(..()) @@ -143,7 +146,7 @@ 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))) + if(!F.flooring && (get_turf(T) == loc || prob(40))) target = T if(emagged) // Time to griff @@ -157,7 +160,7 @@ if(!target && amount < maxAmount && eattiles || maketiles) // Eat tiles if(eattiles) - for(var/obj/item/stack/tile/steel/T in view(src)) + for(var/obj/item/stack/tile/floor/T in view(src)) if(T in ignorelist) continue target = T @@ -224,7 +227,7 @@ 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/steel(src) + I = new /obj/item/stack/tile/floor(src) else I = PoolOrNew(/obj/item/stack/rods, src) A.attackby(I, src) @@ -233,20 +236,19 @@ update_icons() else if(istype(A, /turf/simulated/floor)) var/turf/simulated/floor/F = A - if(!F.floor_type && amount) + if(!F.flooring && 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/steel/T = new /obj/item/stack/tile/steel(src) - F.attackby(T, src) + if(!F.flooring) + F.set_flooring(get_flooring_data(floor_build_type)) addTiles(-1) target = null repairing = 0 update_icons() - else if(istype(A, /obj/item/stack/tile/steel) && amount < maxAmount) - var/obj/item/stack/tile/steel/T = A + else if(istype(A, /obj/item/stack/tile/floor) && amount < maxAmount) + var/obj/item/stack/tile/floor/T = A visible_message("[src] begins to collect tiles.") repairing = 1 update_icons() @@ -279,7 +281,7 @@ new /obj/item/device/assembly/prox_sensor(Tsec) if(prob(50)) new /obj/item/robot_parts/l_arm(Tsec) - var/obj/item/stack/tile/steel/T = new /obj/item/stack/tile/steel(Tsec) + var/obj/item/stack/tile/floor/T = new /obj/item/stack/tile/floor(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) @@ -295,8 +297,8 @@ /* Assembly */ -/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/steel/T, mob/user as mob) - if(!istype(T, /obj/item/stack/tile/steel)) +/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/floor/T, mob/user as mob) + if(!istype(T, /obj/item/stack/tile/floor)) ..() return if(contents.len >= 1) @@ -374,4 +376,4 @@ return if(!in_range(src, user) && loc != user) return - created_name = t \ No newline at end of file + created_name = t diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 86034df4c21..1ee7aa45363 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -2,7 +2,7 @@ name = "Medbot" desc = "A little medical robot. He looks somewhat underwhelmed." icon_state = "medibot0" - req_access = list(access_medical) + req_one_access = list(access_medical, access_robotics) 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) @@ -228,8 +228,8 @@ attack_hand(usr) return -/mob/living/bot/medbot/Emag(var/mob/user) - ..() +/mob/living/bot/medbot/emag_act(var/remaining_uses, var/mob/user) + . = ..() if(!emagged) if(user) user << "You short out [src]'s reagent synthesis circuits." @@ -240,6 +240,7 @@ emagged = 1 on = 1 update_icons() + . = 1 ignored |= user /mob/living/bot/medbot/explode() @@ -273,9 +274,6 @@ if(H.stat == DEAD) // He's dead, Jim return null - if(H.suiciding) - return null - if(H in ignored) return null diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index b5bc58acce9..40684be20c7 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -5,7 +5,7 @@ maxHealth = 50 health = 50 req_one_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) + botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) var/mob/target @@ -70,6 +70,11 @@ else icon_state = "secbot[on]" + if(on) + set_light(2, 1, "#FF6A00") + else + set_light(0) + /mob/living/bot/secbot/attack_hand(var/mob/user) if (!has_ui_access(user)) user << "The unit's interface refuses to unlock!" @@ -554,4 +559,4 @@ return if(!in_range(src, usr) && loc != usr) return - created_name = t \ No newline at end of file + created_name = t diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index 62768945a36..578059e6e0d 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -3,17 +3,6 @@ /mob/living/carbon/alien/attack_ui(slot_id) return -/mob/living/carbon/alien/meteorhit(O as obj) - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message(text("\red [] has been hit by []", src, O), 1) - if (health > 0) - adjustBruteLoss((istype(O, /obj/effect/meteor/small) ? 10 : 25)) - adjustFireLoss(30) - - updatehealth() - return - /mob/living/carbon/alien/attack_hand(mob/living/carbon/M as mob) ..() diff --git a/code/modules/mob/living/carbon/alien/alien_damage.dm b/code/modules/mob/living/carbon/alien/alien_damage.dm index 14835591203..99c5e52f75d 100644 --- a/code/modules/mob/living/carbon/alien/alien_damage.dm +++ b/code/modules/mob/living/carbon/alien/alien_damage.dm @@ -31,26 +31,3 @@ adjustFireLoss(f_loss) updatehealth() - - - -/mob/living/carbon/alien/blob_act() - if (stat == 2) - return - var/shielded = 0 - - var/damage = null - if (stat != 2) - damage = rand(10,30) - - if(shielded) - damage /= 4 - - //paralysis += 1 - - show_message("\red The blob attacks you!") - - adjustFireLoss(damage) - - updatehealth() - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm index fdf2004612c..2f69744c74a 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm @@ -8,9 +8,31 @@ get_scooped(M) ..() +//#TODO-MERGE: Test nymph hats /mob/living/carbon/alien/diona/MouseDrop(atom/over_object) var/mob/living/carbon/H = over_object if(!istype(H) || !Adjacent(H)) return ..() - get_scooped(H, usr) - return + if(H.a_intent == I_HELP) + if(H.species && H.species.name == "Diona" && do_merge(H)) + return + get_scooped(H) + return + else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) + hat.loc = get_turf(src) + H.put_in_hands(hat) + H.visible_message("\The [H] removes \the [src]'s [hat].") + hat = null + update_icons() + else + return ..() + +/mob/living/carbon/alien/diona/attackby(var/obj/item/weapon/W, var/mob/user) + if(user.a_intent == "help" && istype(W, /obj/item/clothing/head)) + if(hat) + user << "\The [src] is already wearing \the [hat]." + return + user.unEquip(W) + wear_hat(W) + user.visible_message("\The [user] puts \the [W] on \the [src].") + return diff --git a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm index 04c8a394a3d..e02926b06dc 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm @@ -29,6 +29,7 @@ holder_type = /obj/item/weapon/holder/diona var/list/sampled_DNA var/list/language_progress + var/obj/item/clothing/head/hat /mob/living/carbon/alien/diona/ex_act(severity) if (life_tick < 4) @@ -294,3 +295,11 @@ update_icons() return 1 + + +/mob/living/carbon/alien/diona/proc/wear_hat(var/obj/item/new_hat) + if(hat) + return + hat = new_hat + new_hat.forceMove(src) + update_icons() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/update_icons.dm b/code/modules/mob/living/carbon/alien/diona/update_icons.dm index b39972cdad3..1d694cf6247 100644 --- a/code/modules/mob/living/carbon/alien/diona/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/diona/update_icons.dm @@ -6,3 +6,7 @@ icon_state = "[initial(icon_state)]_sleep" else icon_state = "[initial(icon_state)]" + + overlays.Cut() + if(hat) + overlays |= get_hat_icon(hat, 0, -8) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 548eee230b9..c67249dfe5b 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -11,4 +11,5 @@ /mob/living/carbon/alien/larva/New() ..() add_language("Xenomorph") //Bonus language. - internal_organs |= new /obj/item/organ/xenos/hivenode(src) \ No newline at end of file + internal_organs |= new /obj/item/organ/xenos/hivenode(src) + create_reagents(100) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 8d40ef9d5a5..5ca32e24d0e 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -1,12 +1,34 @@ +#define MIN_LARVA_BLOOD_DRINK 0.5 + //Larvae regenerate health and nutrition from plasma and alien weeds. /mob/living/carbon/alien/larva/handle_environment(var/datum/gas_mixture/environment) if(!environment) return var/turf/T = get_turf(src) - if(environment.gas["phoron"] > 0 || (T && locate(/obj/effect/alien/weeds) in T.contents)) + var/obj/effect/plant/plant = locate() in T + if(environment.gas["phoron"] > 0 || (plant && plant.seed.type == /datum/seed/xenomorph)) update_progression() adjustBruteLoss(-1) adjustFireLoss(-1) adjustToxLoss(-1) - adjustOxyLoss(-1) \ No newline at end of file + adjustOxyLoss(-1) + +// Maybe not the -best- place but it's semiappropriate and fitting. +// Drink the blood of your host! +/mob/living/carbon/alien/larva/handle_chemicals_in_body() + if(!loc) + return + if(!istype(loc, /obj/item/weapon/holder)) + return + var/mob/living/carbon/human/M = loc.loc //ergh, replace with a flag sometime + if(!istype(M)) + return + if(M.vessel.total_volume > 0) + M.vessel.trans_to(src,min(M.vessel.total_volume,MIN_LARVA_BLOOD_DRINK)) + update_progression() + else + src << "This host is depleted of blood..." + leave_host() + +#undef MIN_LARVA_BLOOD_DRINK diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm new file mode 100644 index 00000000000..57e3427163f --- /dev/null +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -0,0 +1,111 @@ +/mob/living/carbon/alien/larva/proc/check_can_infest(var/mob/living/M) + if(!src) + return 0 + if(!istype(loc, /turf)) + src << "You cannot infest a target in your current position." + return 0 + if(incapacitated()) + src << "You cannot infest a target in your current state." + return 0 + if(!M) + return 1 + if(!M.lying) + src << "\The [M] is not prone." + return 0 + if(!(src.Adjacent(M))) + src << "\The [M] is not in range." + return 0 + return 1 + +/mob/living/carbon/alien/larva/verb/attach_host() + + set name = "Attach to host" + set desc = "Burrow into a prone victim and begin drinking their blood." + set category = "Abilities" + + if(!check_can_infest()) + return + + var/list/choices = list() + for(var/mob/living/carbon/human/H in view(1,src)) + if(isxenomorph(H)) + continue + if(src.Adjacent(H) && H.lying) + choices += H + + if(!choices.len) + src << "There are no viable hosts within range." + return + + var/mob/living/carbon/human/H = input(src,"Who do you wish to infest?") as null|anything in choices + + if(!H || !src || !H.lying) return + + visible_message("\The [src] begins questing blindly towards \the [H]'s warm flesh...") + + if(!do_after(src,30)) + return + + if(!check_can_infest(H)) + return + + var/obj/item/organ/external/E = pick(H.organs) + src << "You burrow deeply into \the [H]'s [E.name]!" + var/obj/item/weapon/holder/holder = new (loc) + src.loc = holder + holder.name = src.name + E.embed(holder,0,"\The [src] burrows deeply into \the [H]'s [E.name]!") + +/mob/living/carbon/alien/larva/verb/release_host() + set category = "Abilities" + set name = "Release Host" + set desc = "Release your host." + + if(incapacitated()) + src << "You cannot leave your host in your current state." + return + + if(!loc || !loc.loc) + src << "You are not inside a host." + return + + var/mob/living/carbon/human/H = loc.loc + + if(!istype(H)) + src << "You are not inside a host." + return + + src << "You begin writhing your way free of \the [H]'s flesh..." + + if(!do_after(src, 30)) + return + + if(!H || !src) + return + + leave_host() + +/mob/living/carbon/alien/larva/proc/leave_host() + if(!loc || !loc.loc) + src << "You are not inside a host." + return + var/mob/living/carbon/human/H = loc.loc + if(!istype(H)) + src << "You are not inside a host." + return + var/obj/item/weapon/holder/holder = loc + var/obj/item/organ/external/affected + if(istype(holder)) + for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant. + for(var/obj/item/O in organ.implants) + if(O == holder) + affected = organ + break + affected.implants -= holder + holder.loc = get_turf(holder) + else + src.loc = get_turf(src) + if(affected) + src << "You crawl out of \the [H]'s [affected.name] and plop to the ground." + else + src << "You plop to the ground." \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 2dc4f54845b..29c6b72d99f 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -4,39 +4,24 @@ set invisibility = 0 set background = 1 - if (monkeyizing) return + if (transforming) return if(!loc) return ..() - if (stat != DEAD) //still breathing - - // GROW! + if (stat != DEAD && can_progress()) update_progression() - // Radiation. - handle_mutations_and_radiation() - - // Chemicals in the body - handle_chemicals_in_body() - blinded = null - if(loc) - handle_environment(loc.return_air()) - //Status updates, death etc. - handle_regular_status_updates() - update_canmove() update_icons() - if(client) - handle_regular_hud_updates() +/mob/living/carbon/alien/proc/can_progress() + return 1 -/mob/living/carbon/alien/proc/handle_chemicals_in_body() - return // Nothing yet. Maybe check it out at a later date. -/mob/living/carbon/alien/proc/handle_mutations_and_radiation() +/mob/living/carbon/alien/handle_mutations_and_radiation() // Currently both Dionaea and larvae like to eat radiation, so I'm defining the // rad absorbtion here. This will need to be changed if other baby aliens are added. @@ -52,7 +37,7 @@ adjustToxLoss(-(rads)) return -/mob/living/carbon/alien/proc/handle_regular_status_updates() +/mob/living/carbon/alien/handle_regular_status_updates() if(status_flags & GODMODE) return 0 @@ -103,18 +88,11 @@ else if(eye_blurry) eye_blurry = max(eye_blurry-1, 0) - //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) - else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) - ear_damage = max(ear_damage-0.05, 0) - update_icons() return 1 -/mob/living/carbon/alien/proc/handle_regular_hud_updates() +/mob/living/carbon/alien/handle_regular_hud_updates() if (stat == 2 || (XRAY in src.mutations)) sight |= SEE_TURFS @@ -175,7 +153,7 @@ return 1 -/mob/living/carbon/alien/proc/handle_environment(var/datum/gas_mixture/environment) +/mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment) // Both alien subtypes survive in vaccum and suffer in high temperatures, // so I'll just define this once, for both (see radiation comment above) if(!environment) return @@ -184,6 +162,12 @@ adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing. if (fire) fire.icon_state = "fire2" if(prob(20)) - src << "\red You feel a searing heat!" + src << "You feel a searing heat!" else if (fire) fire.icon_state = "fire0" + +/mob/living/carbon/alien/handle_fire() + if(..()) + return + bodytemperature += BODYTEMP_HEATING_MAX //If you're on fire, you heat up! + return diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index 54c7f9a9692..e9d099ea2a0 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -1,7 +1,7 @@ /mob/living/carbon/alien/verb/evolve() - set name = "Evolve" - set desc = "Evolve into your adult form." + set name = "Moult" + set desc = "Moult your skin and become an adult." set category = "Abilities" if(stat != CONSCIOUS) @@ -12,11 +12,11 @@ return if(handcuffed || legcuffed) - src << "\red You cannot evolve when you are cuffed." + src << "You cannot evolve when you are cuffed." return if(amount_grown < max_grown) - src << "\red You are not fully grown." + src << "You are not fully grown." return // confirm_evolution() handles choices and other specific requirements. @@ -27,6 +27,7 @@ var/mob/living/carbon/human/adult = new adult_form(get_turf(src)) adult.set_species(new_species) show_evolution_blurb() + // TODO: drop a moulted skin. Ew. if(mind) mind.transfer_to(adult) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 5730474ab18..c07647a57b7 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -2,12 +2,11 @@ /obj/item/device/mmi/digital/New() src.brainmob = new(src) + src.brainmob.stat = CONSCIOUS src.brainmob.add_language("Robot Talk") - src.brainmob.loc = src src.brainmob.container = src - src.brainmob.stat = 0 src.brainmob.silent = 0 - dead_mob_list -= src.brainmob + ..() /obj/item/device/mmi/digital/transfer_identity(var/mob/living/carbon/H) brainmob.dna = H.dna @@ -23,11 +22,7 @@ icon = 'icons/obj/assemblies.dmi' icon_state = "mmi_empty" w_class = 3 - origin_tech = "biotech=3" - - var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=1000,"glass"=500) - var/construction_time = 75 - //these vars are so the mecha fabricator doesn't shit itself anymore. --NEO + origin_tech = list(TECH_BIO = 3) req_access = list(access_robotics) @@ -122,6 +117,13 @@ locked = 1 return +/obj/item/device/mmi/relaymove(var/mob/user, var/direction) + if(user.stat || user.stunned) + return + var/obj/item/weapon/rig/rig = src.get_rig() + if(rig) + rig.forced_move(direction, user) + /obj/item/device/mmi/Destroy() if(isrobot(loc)) var/mob/living/silicon/robot/borg = loc @@ -134,7 +136,7 @@ /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." - origin_tech = "biotech=4" + origin_tech = list(TECH_BIO = 4) var/obj/item/device/radio/radio = null//Let's give it a radio. diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index e72671d78ad..aaf947a13d4 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -49,12 +49,12 @@ return 1 return ..() - /mob/living/carbon/brain/update_canmove() - if(in_contents_of(/obj/mecha)) + if(in_contents_of(/obj/mecha) || istype(loc, /obj/item/device/mmi)) canmove = 1 - use_me = 1 //If it can move, let it emote - else canmove = 0 + use_me = 1 + else + canmove = 0 return canmove /mob/living/carbon/brain/binarycheck() diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 9a9ea3dc9a0..543c3d339f3 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -1,6 +1,6 @@ /obj/item/organ/brain name = "brain" - health = 400 //They need to live awhile longer than other organs. + health = 400 //They need to live awhile longer than other organs. Is this even used by organ code anymore? desc = "A piece of juicy meat found in a person's head." organ_tag = "brain" parent_organ = "head" @@ -11,7 +11,7 @@ throwforce = 1.0 throw_speed = 3 throw_range = 5 - origin_tech = "biotech=3" + origin_tech = list(TECH_BIO = 3) attack_verb = list("attacked", "slapped", "whacked") var/mob/living/carbon/brain/brainmob = null @@ -102,4 +102,4 @@ desc = "A tightly furled roll of paper, covered with indecipherable runes." robotic = 2 icon = 'icons/obj/wizard.dmi' - icon_state = "scroll" + icon_state = "scroll" diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index d5909a47f91..9f3f3e54565 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -1,204 +1,199 @@ -/mob/living/carbon/brain/Life() - set invisibility = 0 - set background = 1 - ..() +/mob/living/carbon/brain/handle_breathing() + return - if(stat != DEAD) - //Mutations and radiation - handle_mutations_and_radiation() +/mob/living/carbon/brain/handle_mutations_and_radiation() + if (radiation) + if (radiation > 100) + radiation = 100 + if(!container)//If it's not in an MMI + src << "\red You feel weak." + else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that + src << "\red STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED." - //Chemicals in the body - handle_chemicals_in_body() - - var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE - if(loc) - environment = loc.return_air() - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - blinded = null - - //Handle temperature/pressure differences between body and environment - if(environment) // More error checking -- TLE - handle_environment(environment) - - //Status updates, death etc. - handle_regular_status_updates() - update_canmove() - - if(client) - handle_regular_hud_updates() - - -/mob/living/carbon/brain/ - proc/handle_mutations_and_radiation() - - if (radiation) - if (radiation > 100) - radiation = 100 - if(!container)//If it's not in an MMI - src << "\red You feel weak." - else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that - src << "\red STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED." - - switch(radiation) - if(1 to 49) - radiation-- - if(prob(25)) - adjustToxLoss(1) - updatehealth() - - if(50 to 74) - radiation -= 2 + switch(radiation) + if(1 to 49) + radiation-- + if(prob(25)) adjustToxLoss(1) - if(prob(5)) - radiation -= 5 - if(!container) - src << "\red You feel weak." - else - src << "\red STATUS: DANGEROUS LEVELS OF RADIATION DETECTED." updatehealth() - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - updatehealth() + if(50 to 74) + radiation -= 2 + adjustToxLoss(1) + if(prob(5)) + radiation -= 5 + if(!container) + src << "\red You feel weak." + else + src << "\red STATUS: DANGEROUS LEVELS OF RADIATION DETECTED." + updatehealth() + + if(75 to 100) + radiation -= 3 + adjustToxLoss(3) + updatehealth() - proc/handle_environment(datum/gas_mixture/environment) - if(!environment) - return - var/environment_heat_capacity = environment.heat_capacity() - if(istype(get_turf(src), /turf/space)) - var/turf/heat_turf = get_turf(src) - environment_heat_capacity = heat_turf.heat_capacity +/mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment) + if(!environment) + return + var/environment_heat_capacity = environment.heat_capacity() + if(istype(get_turf(src), /turf/space)) + var/turf/heat_turf = get_turf(src) + environment_heat_capacity = heat_turf.heat_capacity - if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) - var/transfer_coefficient = 1 + if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10))) + var/transfer_coefficient = 1 - handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) + handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient) - if(stat==2) - bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) + if(stat==2) + bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000) - //Account for massive pressure differences + //Account for massive pressure differences - return //TODO: DEFERRED + return //TODO: DEFERRED - proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(status_flags & GODMODE) return +/mob/living/carbon/brain/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) + if(status_flags & GODMODE) return - if(exposed_temperature > bodytemperature) - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - //adjustFireLoss(5.0*discomfort) - adjustFireLoss(20.0*discomfort) + if(exposed_temperature > bodytemperature) + var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) + //adjustFireLoss(2.5*discomfort) + //adjustFireLoss(5.0*discomfort) + adjustFireLoss(20.0*discomfort) - else - var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) - adjustFireLoss(5.0*discomfort) + else + var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) + //adjustFireLoss(2.5*discomfort) + adjustFireLoss(5.0*discomfort) +/mob/living/carbon/brain/handle_chemicals_in_body() + chem_effects.Cut() + analgesic = 0 - proc/handle_chemicals_in_body() + if(touching) touching.metabolize() + if(ingested) ingested.metabolize() + if(bloodstr) bloodstr.metabolize() - chem_effects.Cut() - analgesic = 0 + if(CE_PAINKILLER in chem_effects) + analgesic = chem_effects[CE_PAINKILLER] - if(touching) touching.metabolize() - if(ingested) ingested.metabolize() - if(bloodstr) bloodstr.metabolize() + confused = max(0, confused - 1) + // decrement dizziness counter, clamped to 0 + if(resting) + dizziness = max(0, dizziness - 5) + else + dizziness = max(0, dizziness - 1) - if(CE_PAINKILLER in chem_effects) - analgesic = chem_effects[CE_PAINKILLER] + updatehealth() - confused = max(0, confused - 1) - // decrement dizziness counter, clamped to 0 - if(resting) - dizziness = max(0, dizziness - 5) - else - dizziness = max(0, dizziness - 1) + return //TODO: DEFERRED - updatehealth() +/mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_> + updatehealth() - return //TODO: DEFERRED - - - proc/handle_regular_status_updates() //TODO: comment out the unused bits >_> - updatehealth() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + blinded = 1 + silent = 0 + else //ALIVE. LIGHTS ARE ON + if( !container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)) ) + death() blinded = 1 silent = 0 - else //ALIVE. LIGHTS ARE ON - if( !container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)) ) - death() - blinded = 1 - silent = 0 - return 1 + return 1 - //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere - if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act - if(!(container && istype(container, /obj/item/device/mmi))) - emp_damage = 0 + //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere + if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act + if(!(container && istype(container, /obj/item/device/mmi))) + emp_damage = 0 + else + emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with + switch(emp_damage) + if(31 to INFINITY) + emp_damage = 30//Let's not overdo it + if(21 to 30)//High level of EMP damage, unable to see, hear, or speak + eye_blind = 1 + blinded = 1 + ear_deaf = 1 + silent = 1 + if(!alert)//Sounds an alarm, but only once per 'level' + emote("alarm") + src << "\red Major electrical distruption detected: System rebooting." + alert = 1 + if(prob(75)) + emp_damage -= 1 + if(20) + alert = 0 + blinded = 0 + eye_blind = 0 + ear_deaf = 0 + silent = 0 + emp_damage -= 1 + if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage + eye_blurry = 1 + ear_damage = 1 + if(!alert) + emote("alert") + src << "\red Primary systems are now online." + alert = 1 + if(prob(50)) + emp_damage -= 1 + if(10) + alert = 0 + eye_blurry = 0 + ear_damage = 0 + emp_damage -= 1 + if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) + if(!alert) + emote("notice") + src << "\red System reboot nearly complete." + alert = 1 + if(prob(25)) + emp_damage -= 1 + if(1) + alert = 0 + src << "\red All systems restored." + emp_damage -= 1 + + //Other + handle_statuses() + return 1 + +/mob/living/carbon/brain/handle_regular_hud_updates() + if (stat == 2 || (XRAY in src.mutations)) + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + else if (stat != 2) + sight &= ~SEE_TURFS + sight &= ~SEE_MOBS + sight &= ~SEE_OBJS + see_in_dark = 2 + see_invisible = SEE_INVISIBLE_LIVING + + if (healths) + if (stat != 2) + switch(health) + if(100 to INFINITY) + healths.icon_state = "health0" + if(80 to 100) + healths.icon_state = "health1" + if(60 to 80) + healths.icon_state = "health2" + if(40 to 60) + healths.icon_state = "health3" + if(20 to 40) + healths.icon_state = "health4" + if(0 to 20) + healths.icon_state = "health5" else - emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with - switch(emp_damage) - if(31 to INFINITY) - emp_damage = 30//Let's not overdo it - if(21 to 30)//High level of EMP damage, unable to see, hear, or speak - eye_blind = 1 - blinded = 1 - ear_deaf = 1 - silent = 1 - if(!alert)//Sounds an alarm, but only once per 'level' - emote("alarm") - src << "\red Major electrical distruption detected: System rebooting." - alert = 1 - if(prob(75)) - emp_damage -= 1 - if(20) - alert = 0 - blinded = 0 - eye_blind = 0 - ear_deaf = 0 - silent = 0 - emp_damage -= 1 - if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage - eye_blurry = 1 - ear_damage = 1 - if(!alert) - emote("alert") - src << "\red Primary systems are now online." - alert = 1 - if(prob(50)) - emp_damage -= 1 - if(10) - alert = 0 - eye_blurry = 0 - ear_damage = 0 - emp_damage -= 1 - if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) - if(!alert) - emote("notice") - src << "\red System reboot nearly complete." - alert = 1 - if(prob(25)) - emp_damage -= 1 - if(1) - alert = 0 - src << "\red All systems restored." - emp_damage -= 1 - - //Other - handle_statuses() - return 1 - - - proc/handle_regular_hud_updates() + healths.icon_state = "health6" + else + healths.icon_state = "health7" if (stat == 2 || (XRAY in src.mutations)) sight |= SEE_TURFS @@ -212,55 +207,41 @@ sight &= ~SEE_OBJS see_in_dark = 2 see_invisible = SEE_INVISIBLE_LIVING + if (client) + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - if (healths) - if (stat != 2) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" - else - healths.icon_state = "health7" + if ((blind && stat != 2)) + if ((blinded)) + blind.invisibility = 0 + else + blind.invisibility = 101 - if (client) - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + if (disabilities & NEARSIGHTED) + client.screen += global_hud.vimpaired - if ((blind && stat != 2)) - if ((blinded)) - blind.invisibility = 0 - else - blind.invisibility = 101 + if (eye_blurry) + client.screen += global_hud.blurry - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired + if (druggy) + client.screen += global_hud.druggy - if (eye_blurry) - client.screen += global_hud.blurry + if (stat != 2) + if (machine) + if (!( machine.check_eye(src) )) + reset_view(null) + else + if(client && !client.adminobs) + reset_view(null) - if (druggy) - client.screen += global_hud.druggy - - if (stat != 2) - if (machine) - if (machine.check_eye(src) < 0) - reset_view(null) - else - if(client && !client.adminobs) - reset_view(null) - - return 1 + return 1 + if (stat != 2) + if (machine) + if (machine.check_eye(src) < 0) + reset_view(null) + else + if(client && !client.adminobs) + reset_view(null) /*/mob/living/carbon/brain/emp_act(severity) if(!(container && istype(container, /obj/item/device/mmi))) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 5d66d68695f..5350ec6403f 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -4,10 +4,8 @@ icon = 'icons/obj/assemblies.dmi' icon_state = "posibrain" w_class = 3 - origin_tech = "engineering=4;materials=4;bluespace=2;programming=4" + origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4) - construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=500,"silver"=200,"gold"=200,"phoron"=100,"diamond"=10) - construction_time = 75 var/searching = 0 var/askDelay = 10 * 60 * 1 req_access = list(access_robotics) @@ -18,63 +16,14 @@ /obj/item/device/mmi/digital/posibrain/attack_self(mob/user as mob) if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. - user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process." + user << "You carefully locate the manual activation switch and start the positronic brain's boot process." icon_state = "posibrain-searching" src.searching = 1 - src.request_player() + var/datum/ghosttrap/G = get_ghost_trap("positronic brain") + G.request_player(brainmob, "Someone is requesting a personality for a positronic brain.", 60 SECONDS) spawn(600) reset_search() -/obj/item/device/mmi/digital/posibrain/proc/request_player() - for(var/mob/dead/observer/O in player_list) - if(!O.MayRespawn()) - continue - if(jobban_isbanned(O, "AI") && jobban_isbanned(O, "Cyborg")) - continue - if(O.client) - if(O.client.prefs.be_special & BE_AI) - question(O.client) - -/obj/item/device/mmi/digital/posibrain/proc/question(var/client/C) - spawn(0) - if(!C) return - var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round") - if(response == "Yes") - response = alert(C, "Are you sure you want to play as a positronic brain?", "Positronic brain request", "Yes", "No") - if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. - if(response == "Yes") - transfer_personality(C.mob) - else if (response == "Never for this round") - C.prefs.be_special ^= BE_AI - - -/obj/item/device/mmi/digital/posibrain/transfer_identity(var/mob/living/carbon/H) - ..() - if(brainmob.mind) - brainmob.mind.assigned_role = "Positronic Brain" - brainmob << "You feel slightly disoriented. That's normal when you're just a metal cube." - icon_state = "posibrain-occupied" - return - -/obj/item/device/mmi/digital/posibrain/proc/transfer_personality(var/mob/candidate) - announce_ghost_joinleave(candidate, 0, "They are occupying a positronic brain now.") - src.searching = 0 - src.brainmob.mind = candidate.mind - src.brainmob.ckey = candidate.ckey - src.brainmob.mind.reset() - src.name = "positronic brain ([src.brainmob.name])" - src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." - src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." - src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." - src.brainmob << "Use say :b to speak to other artificial intelligences." - src.brainmob.mind.assigned_role = "Positronic Brain" - - var/turf/T = get_turf_or_move(src.loc) - for (var/mob/M in viewers(T)) - M.show_message("\blue The positronic brain chimes quietly.") - icon_state = "posibrain-occupied" - /obj/item/device/mmi/digital/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. - if(src.brainmob && src.brainmob.key) return src.searching = 0 @@ -82,13 +31,25 @@ var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) - M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + M.show_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + +/obj/item/device/mmi/digital/posibrain/attack_ghost(var/mob/dead/observer/user) + if(!searching || (src.brainmob && src.brainmob.key)) + return + + var/datum/ghosttrap/G = get_ghost_trap("positronic brain") + if(!G.assess_candidate(user)) + return + var/response = alert(user, "Are you sure you wish to possess this [src]?", "Possess [src]", "Yes", "No") + if(response == "Yes") + G.transfer_personality(user, brainmob) + return /obj/item/device/mmi/digital/posibrain/examine(mob/user) if(!..(user)) return - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n" + var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n" msg += "" if(src.brainmob && src.brainmob.key) @@ -99,7 +60,7 @@ if(DEAD) msg += "It appears to be completely inactive.\n" else msg += "It appears to be completely inactive.\n" - msg += "*---------*" + msg += "*---------*" user << msg return diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index bc7a13c2c2a..d44779c5204 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/module.dmi' icon_state = "mainboard" w_class = 3 - origin_tech = "engineering=4;materials=3;programming=4" + origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 3, TECH_DATA = 4) /obj/item/device/mmi/digital/robot/New() ..() diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm index 66cdd2f75e5..d762bffe079 100644 --- a/code/modules/mob/living/carbon/breathe.dm +++ b/code/modules/mob/living/carbon/breathe.dm @@ -1,15 +1,20 @@ //Common breathing procs +//Start of a breath chain, calls breathe() +/mob/living/carbon/handle_breathing() + if(air_master.current_cycle%4==2 || failed_last_breath || (health < config.health_threshold_crit)) //First, resolve location and get a breath + breathe() + /mob/living/carbon/proc/breathe() //if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return - if(species && (species.flags & NO_BREATHE || species.flags & IS_SYNTHETIC)) return - + if(species && (species.flags & NO_BREATHE)) return + var/datum/gas_mixture/breath = null - + //First, check if we can breathe at all if(health < config.health_threshold_crit && !(CE_STABLE in chem_effects)) //crit aka circulatory shock losebreath++ - + if(losebreath>0) //Suffocating so do not take a breath losebreath-- if (prob(10)) //Gasp per 10 ticks? Sounds about right. @@ -17,9 +22,9 @@ else //Okay, we can breathe, now check if we can get air breath = get_breath_from_internal() //First, check for air from internals - if(!breath) + if(!breath) breath = get_breath_from_environment() //No breath from internals so let's try to get air from our location - + handle_breath(breath) handle_post_breath(breath) @@ -27,7 +32,7 @@ if(internal) if (!contents.Find(internal)) internal = null - if (!(wear_mask && (wear_mask.flags & AIRTIGHT))) + if (!(wear_mask && (wear_mask.item_flags & AIRTIGHT))) internal = null if(internal) if (internals) @@ -40,15 +45,15 @@ /mob/living/carbon/proc/get_breath_from_environment(var/volume_needed=BREATH_VOLUME) var/datum/gas_mixture/breath = null - + var/datum/gas_mixture/environment if(loc) environment = loc.return_air_for_internal_lifeform() - + if(environment) breath = environment.remove_volume(volume_needed) handle_chemical_smoke(environment) //handle chemical smoke while we're at it - + if(breath && breath.total_moles) //handle mask filtering if(istype(wear_mask, /obj/item/clothing/mask) && breath) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 55f80d47f85..692a7b1194c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -131,8 +131,10 @@ return shock_damage +/mob/proc/swap_hand() + return -/mob/living/carbon/proc/swap_hand() +/mob/living/carbon/swap_hand() var/obj/item/item_in_hand = src.get_active_hand() if(item_in_hand) //this segment checks if the item in your hand is twohanded. if(istype(item_in_hand,/obj/item/weapon/material/twohanded)) @@ -142,11 +144,11 @@ src.hand = !( src.hand ) if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) if(hand) //This being 1 means the left hand is in use - hud_used.l_hand_hud_object.icon_state = "hand_active" - hud_used.r_hand_hud_object.icon_state = "hand_inactive" + hud_used.l_hand_hud_object.icon_state = "l_hand_active" + hud_used.r_hand_hud_object.icon_state = "r_hand_inactive" else - hud_used.l_hand_hud_object.icon_state = "hand_inactive" - hud_used.r_hand_hud_object.icon_state = "hand_active" + hud_used.l_hand_hud_object.icon_state = "l_hand_inactive" + hud_used.r_hand_hud_object.icon_state = "r_hand_active" /*if (!( src.hand )) src.hands.set_dir(NORTH) else @@ -213,9 +215,9 @@ if(!org.is_usable()) status += "dangling uselessly" if(status.len) - src.show_message("My [org.name] is [english_list(status)].",1) + src.show_message("My [org.name] is [english_list(status)].",1) else - src.show_message("My [org.name] is OK.",1) + src.show_message("My [org.name] is OK.",1) if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit)) H.play_xylophone() @@ -228,8 +230,8 @@ M.visible_message("[M] tries to pat out [src]'s flames!", "You try to pat out [src]'s flames! Hot!") if(do_mob(M, src, 15)) + src.fire_stacks -= 0.5 if (prob(10) && (M.fire_stacks <= 0)) - src.fire_stacks -= 0.5 M.fire_stacks += 1 M.IgniteMob() if (M.on_fire) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm new file mode 100644 index 00000000000..b4d9d1614d8 --- /dev/null +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -0,0 +1,98 @@ + +//Called when the mob is hit with an item in combat. +/mob/living/carbon/resolve_item_attack(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) + if(check_attack_throat(I, user)) + return null + ..() + +/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) + if(!effective_force || blocked >= 2) + return 0 + + //Hulk modifier + if(HULK in user.mutations) + effective_force *= 2 + + //Apply weapon damage + var/weapon_sharp = is_sharp(I) + var/weapon_edge = has_edge(I) + if(prob(getarmor(hit_zone, "melee"))) //melee armour provides a chance to turn sharp/edge weapon attacks into blunt ones + weapon_sharp = 0 + weapon_edge = 0 + + apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + + //Melee weapon embedded object code. + if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I)) + var/damage = effective_force + if (blocked) + damage /= blocked+1 + + //blunt objects should really not be embedding in things unless a huge amount of force is involved + var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3) + var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class + + //Sharp objects will always embed if they do enough damage. + if((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance))) + src.embed(I, hit_zone) + + return 1 + +// Attacking someone with a weapon while they are neck-grabbed +/mob/living/carbon/proc/check_attack_throat(obj/item/W, mob/user) + if(user.a_intent == I_HURT) + for(var/obj/item/weapon/grab/G in src.grabbed_by) + if(G.assailant == user && G.state >= GRAB_NECK) + if(attack_throat(W, G, user)) + return 1 + return 0 + +// Knifing +/mob/living/carbon/proc/attack_throat(obj/item/W, obj/item/weapon/grab/G, mob/user) + + if(!W.edge || !W.force || W.damtype != BRUTE) + return 0 //unsuitable weapon + + user.visible_message("\The [user] begins to slit [src]'s throat with \the [W]!") + + user.next_move = world.time + 20 //also should prevent user from triggering this repeatedly + if(!do_after(user, 20)) + return 0 + if(!(G && G.assailant == user && G.affecting == src)) //check that we still have a grab + return 0 + + var/damage_mod = 1 + //presumably, if they are wearing a helmet that stops pressure effects, then it probably covers the throat as well + var/obj/item/clothing/head/helmet = get_equipped_item(slot_head) + if(istype(helmet) && (helmet.body_parts_covered & HEAD) && (helmet.flags & STOPPRESSUREDAMAGE)) + //we don't do an armor_check here because this is not an impact effect like a weapon swung with momentum, that either penetrates or glances off. + damage_mod = 1.0 - (helmet.armor["melee"]/100) + + var/total_damage = 0 + for(var/i in 1 to 3) + var/damage = min(W.force*1.5, 20)*damage_mod + apply_damage(damage, W.damtype, "head", 0, sharp=W.sharp, edge=W.edge) + total_damage += damage + + var/oxyloss = total_damage + if(total_damage >= 40) //threshold to make someone pass out + oxyloss = 60 // Brain lacks oxygen immediately, pass out + + adjustOxyLoss(min(oxyloss, 100 - getOxyLoss())) //don't put them over 100 oxyloss + + if(total_damage) + if(oxyloss >= 40) + user.visible_message("\The [user] slit [src]'s throat open with \the [W]!") + else + user.visible_message("\The [user] cut [src]'s neck with \the [W]!") + + if(W.hitsound) + playsound(loc, W.hitsound, 50, 1, -1) + + G.last_action = world.time + flick(G.hud.icon_state, G.hud) + + user.attack_log += "\[[time_stamp()]\] Knifed [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" + src.attack_log += "\[[time_stamp()]\] Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" + msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" ) + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index c692fbc21fd..4c2d68c239d 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -2,11 +2,7 @@ set category = "IC" set name = "Give" - // TODO : Change to incapacitated() on merge. - //Edit by Nanako: Removed buckled check so people can give while sitting, - //added restrained check so people cant give/recieve while cuffed or straitjacketed - if(usr.stat || usr.lying || usr.resting || usr.restrained()) - usr << "\red You're in no condition to handle items!" + if(incapacitated()) return if(!istype(target) || target.stat || target.lying || target.resting || target.restrained() || target.client == null) usr << "\red [target.name] is in no condition to handle items!" diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 24bb023090f..3e54877a782 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -1,5 +1,5 @@ /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) + var/datum/nano_module/appearance_changer/AC = new(location, src, check_species_whitelist, species_whitelist, species_blacklist) AC.flags = flags AC.ui_interact(user, state = state) @@ -95,6 +95,8 @@ g_hair = green b_hair = blue + force_update_limbs() + update_body() update_hair() return 1 @@ -110,7 +112,7 @@ return 1 /mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue) - if(red == r_skin && green == g_skin && blue == b_skin || !(species.flags & HAS_SKIN_COLOR)) + if(red == r_skin && green == g_skin && blue == b_skin || !(species.appearance_flags & HAS_SKIN_COLOR)) return r_skin = red @@ -118,15 +120,17 @@ b_skin = blue force_update_limbs() + update_body() return 1 /mob/living/carbon/human/proc/change_skin_tone(var/tone) - if(s_tone == tone || !(species.flags & HAS_SKIN_TONE)) + if(s_tone == tone || !(species.appearance_flags & HAS_SKIN_TONE)) return s_tone = tone force_update_limbs() + update_body() return 1 /mob/living/carbon/human/proc/update_dna() @@ -139,13 +143,13 @@ var/datum/species/current_species = all_species[current_species_name] if(check_whitelist && config.usealienwhitelist && !check_rights(R_ADMIN, 0, src)) //If we're using the whitelist, make sure to check it! - if(!(current_species.flags & CAN_JOIN)) + if(!(current_species.spawn_flags & CAN_JOIN)) continue if(whitelist.len && !(current_species_name in whitelist)) continue if(blacklist.len && (current_species_name in blacklist)) continue - if((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(src, current_species_name)) + if((current_species.spawn_flags & IS_WHITELISTED) && !is_alien_whitelisted(src, current_species_name)) continue valid_species += current_species_name diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index a196299fac8..847715dd270 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -31,8 +31,6 @@ BITSET(hud_updateflag, STATUS_HUD) BITSET(hud_updateflag, LIFE_HUD) - handle_hud_list() - //Handle species-specific deaths. species.handle_death(src, gibbed) animate_tail_stop() @@ -61,12 +59,15 @@ if(!gibbed && species.death_sound) playsound(loc, species.death_sound, 80, 1, 1) - if(ticker && ticker.mode) sql_report_death(src) ticker.mode.check_win() - return ..(gibbed,species.death_message) + if(wearing_rig) + wearing_rig.notify_ai("Warning: user death event. Mobility control passed to integrated intelligence system.") + + . = ..(gibbed,species.death_message) + handle_hud_list() /mob/living/carbon/human/proc/ChangeToHusk() if(HUSK in mutations) return diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 2236de619e3..de55265b649 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -21,15 +21,15 @@ switch(act) if ("airguitar") if (!src.restrained()) - message = "[src] is strumming the air and headbanging like a safari chimp." + message = "is strumming the air and headbanging like a safari chimp." m_type = 1 if ("blink") - message = "[src] blinks." + message = "blinks." m_type = 1 if ("blink_r") - message = "[src] blinks rapidly." + message = "blinks rapidly." m_type = 1 if ("bow") @@ -44,9 +44,9 @@ param = null if (param) - message = "[src] bows to [param]." + message = "bows to [param]." else - message = "[src] bows." + message = "bows." m_type = 1 if ("custom") @@ -92,73 +92,73 @@ param = null if (param) - message = "[src] salutes to [param]." + message = "salutes to [param]." else - message = "[src] salutes." + message = "salutes." m_type = 1 if ("choke") if(miming) - message = "[src] clutches \his throat desperately!" + message = "clutches [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] throat desperately!" m_type = 1 else if (!muzzled) - message = "[src] chokes!" + message = "chokes!" m_type = 2 else - message = "[src] makes a strong noise." + message = "makes a strong noise." m_type = 2 if ("clap") if (!src.restrained()) - message = "[src] claps." + message = "claps." m_type = 2 if(miming) m_type = 1 if ("flap") if (!src.restrained()) - message = "[src] flaps \his wings." + message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings." m_type = 2 if(miming) m_type = 1 if ("aflap") if (!src.restrained()) - message = "[src] flaps \his wings ANGRILY!" + message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings ANGRILY!" m_type = 2 if(miming) m_type = 1 if ("drool") - message = "[src] drools." + message = "drools." m_type = 1 if ("eyebrow") - message = "[src] raises an eyebrow." + message = "raises an eyebrow." m_type = 1 if ("chuckle") if(miming) - message = "[src] appears to chuckle." + message = "appears to chuckle." m_type = 1 else if (!muzzled) - message = "[src] chuckles." + message = "chuckles." m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("twitch") - message = "[src] twitches violently." + message = "twitches violently." m_type = 1 if ("twitch_s") - message = "[src] twitches." + message = "twitches." m_type = 1 if ("faint") - message = "[src] faints." + message = "faints." if(src.sleeping) return //Can't faint while asleep src.sleeping += 10 //Short-short nap @@ -166,58 +166,58 @@ if ("cough") if(miming) - message = "[src] appears to cough!" + message = "appears to cough!" m_type = 1 else if (!muzzled) - message = "[src] coughs!" + message = "coughs!" m_type = 2 else - message = "[src] makes a strong noise." + message = "makes a strong noise." m_type = 2 if ("frown") - message = "[src] frowns." + message = "frowns." m_type = 1 if ("nod") - message = "[src] nods." + message = "nods." m_type = 1 if ("blush") - message = "[src] blushes." + message = "blushes." m_type = 1 if ("wave") - message = "[src] waves." + message = "waves." m_type = 1 if ("gasp") if(miming) - message = "[src] appears to be gasping!" + message = "appears to be gasping!" m_type = 1 else if (!muzzled) - message = "[src] gasps!" + message = "gasps!" m_type = 2 else - message = "[src] makes a weak noise." + message = "makes a weak noise." m_type = 2 if ("deathgasp") - message = "[src] [species.death_message]" + message = "[species.death_message]" m_type = 1 if ("giggle") if(miming) - message = "[src] giggles silently!" + message = "giggles silently!" m_type = 1 else if (!muzzled) - message = "[src] giggles." + message = "giggles." m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("glare") @@ -231,9 +231,9 @@ param = null if (param) - message = "[src] glares at [param]." + message = "glares at [param]." else - message = "[src] glares." + message = "glares." if ("stare") var/M = null @@ -246,9 +246,9 @@ param = null if (param) - message = "[src] stares at [param]." + message = "stares at [param]." else - message = "[src] stares." + message = "stares." if ("look") var/M = null @@ -262,86 +262,86 @@ param = null if (param) - message = "[src] looks at [param]." + message = "looks at [param]." else - message = "[src] looks." + message = "looks." m_type = 1 if ("grin") - message = "[src] grins." + message = "grins." m_type = 1 if ("cry") if(miming) - message = "[src] cries." + message = "cries." m_type = 1 else if (!muzzled) - message = "[src] cries." + message = "cries." m_type = 2 else - message = "[src] makes a weak noise. \He frowns." + message = "makes a weak noise. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "frown" : "frowns"]." m_type = 2 if ("sigh") if(miming) - message = "[src] sighs." + message = "sighs." m_type = 1 else if (!muzzled) - message = "[src] sighs." + message = "sighs." m_type = 2 else - message = "[src] makes a weak noise." + message = "makes a weak noise." m_type = 2 if ("laugh") if(miming) - message = "[src] acts out a laugh." + message = "acts out a laugh." m_type = 1 else if (!muzzled) - message = "[src] laughs." + message = "laughs." m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("mumble") - message = "[src] mumbles!" + message = "mumbles!" m_type = 2 if(miming) m_type = 1 if ("grumble") if(miming) - message = "[src] grumbles!" + message = "grumbles!" m_type = 1 if (!muzzled) - message = "[src] grumbles!" + message = "grumbles!" m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("groan") if(miming) - message = "[src] appears to groan!" + message = "appears to groan!" m_type = 1 else if (!muzzled) - message = "[src] groans!" + message = "groans!" m_type = 2 else - message = "[src] makes a loud noise." + message = "makes a loud noise." m_type = 2 if ("moan") if(miming) - message = "[src] appears to moan!" + message = "appears to moan!" m_type = 1 else - message = "[src] moans!" + message = "moans!" m_type = 2 if ("johnny") @@ -352,10 +352,10 @@ param = null else if(miming) - message = "[src] takes a drag from a cigarette and blows \"[M]\" out in smoke." + message = "takes a drag from a cigarette and blows \"[M]\" out in smoke." m_type = 1 else - message = "[src] says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows their name out in smoke." + message = "says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows his name out in smoke." m_type = 2 if ("point") @@ -368,26 +368,26 @@ break if (!M) - message = "[src] points." + message = "points." else pointed(M) if (M) - message = "[src] points to [M]." + message = "points to [M]." else m_type = 1 if ("raise") if (!src.restrained()) - message = "[src] raises a hand." + message = "raises a hand." m_type = 1 if("shake") - message = "[src] shakes \his head." + message = "shakes [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] head." m_type = 1 if ("shrug") - message = "[src] shrugs." + message = "shrugs." m_type = 1 if ("signal") @@ -395,85 +395,85 @@ var/t1 = round(text2num(param)) if (isnum(t1)) if (t1 <= 5 && (!src.r_hand || !src.l_hand)) - message = "[src] raises [t1] finger\s." + message = "raises [t1] finger\s." else if (t1 <= 10 && (!src.r_hand && !src.l_hand)) - message = "[src] raises [t1] finger\s." + message = "raises [t1] finger\s." m_type = 1 if ("smile") - message = "[src] smiles." + message = "smiles." m_type = 1 if ("shiver") - message = "[src] shivers." + message = "shivers." m_type = 2 if(miming) m_type = 1 if ("pale") - message = "[src] goes pale for a second." + message = "goes pale for a second." m_type = 1 if ("tremble") - message = "[src] trembles in fear!" + message = "trembles in fear!" m_type = 1 if ("sneeze") if (miming) - message = "[src] sneezes." + message = "sneezes." m_type = 1 else if (!muzzled) - message = "[src] sneezes." + message = "sneezes." m_type = 2 else - message = "[src] makes a strange noise." + message = "makes a strange noise." m_type = 2 if ("sniff") - message = "[src] sniffs." + message = "sniffs." m_type = 2 if(miming) m_type = 1 if ("snore") if (miming) - message = "[src] sleeps soundly." + message = "sleeps soundly." m_type = 1 else if (!muzzled) - message = "[src] snores." + message = "snores." m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("whimper") if (miming) - message = "[src] appears hurt." + message = "appears hurt." m_type = 1 else if (!muzzled) - message = "[src] whimpers." + message = "whimpers." m_type = 2 else - message = "[src] makes a weak noise." + message = "makes a weak noise." m_type = 2 if ("wink") - message = "[src] winks." + message = "winks." m_type = 1 if ("yawn") if (!muzzled) - message = "[src] yawns." + message = "yawns." m_type = 2 if(miming) m_type = 1 if ("collapse") Paralyse(2) - message = "[src] collapses!" + message = "collapses!" m_type = 2 if(miming) m_type = 1 @@ -491,9 +491,9 @@ M = null if (M) - message = "[src] hugs [M]." + message = "hugs [M]." else - message = "[src] hugs \himself." + message = "hugs [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]." if ("handshake") m_type = 1 @@ -509,9 +509,9 @@ if (M) if (M.canmove && !M.r_hand && !M.restrained()) - message = "[src] shakes hands with [M]." + message = "shakes hands with [M]." else - message = "[src] holds out \his hand to [M]." + message = "holds out [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] hand to [M]." if("dap") m_type = 1 @@ -523,20 +523,20 @@ M = A break if (M) - message = "[src] gives daps to [M]." + message = "gives daps to [M]." else - message = "[src] sadly can't find anybody to give daps to, and daps \himself. Shameful." + message = "sadly can't find anybody to give daps to, and daps [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]. Shameful." if ("scream") if (miming) - message = "[src] acts out a scream!" + message = "acts out a scream!" m_type = 1 else if (!muzzled) - message = "[src] screams!" + message = "screams!" m_type = 2 else - message = "[src] makes a very loud noise." + message = "makes a very loud noise." m_type = 2 if("swish") @@ -567,11 +567,7 @@ wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"} if (message) log_emote("[name]/[key] : [message]") - - //Hearing gasp and such every five seconds is not good emotes were not global for a reason. - // Maybe some people are okay with that. - - send_emote(message, m_type) + custom_emote(m_type,message) /mob/living/carbon/human/verb/pose() @@ -579,7 +575,7 @@ wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"} set desc = "Sets a description which will be shown when someone examines you." set category = "IC" - pose = sanitize(input(usr, "This is [src]. \He...", "Pose", null) as text) + pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"]...", "Pose", null) as text) /mob/living/carbon/human/verb/set_flavor() set name = "Set Flavour Text" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index ca3c4a45e69..e466cdc985a 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -24,46 +24,18 @@ if(wear_mask) skipface |= wear_mask.flags_inv & HIDEFACE - // crappy hacks because you can't do \his[src] etc. I'm sorry this proc is so unreadable, blame the text macros :< - var/t_He = "They" //capitalised for use at the start of each line. - var/t_he = "they" - var/t_his = "their" - var/t_him = "them" - var/t_has = "have" - var/t_is = "are" - var/t_does = "do" - var/msg = "*---------*\nThis is " - //big suits/masks/helmets make it hard to tell their gender - if(!skipjumpsuit || !skipface) + var/datum/gender/T = gender_datums[gender] + if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender + T = gender_datums[PLURAL] + else if(icon) msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated - switch(gender) - if(MALE) - t_He = "He" - t_he = "he" - t_his = "his" - t_him = "him" - t_has = "has" - t_is = "is" - t_does = "does" - if(FEMALE) - t_He = "She" - t_he = "she" - t_his = "her" - t_him = "her" - t_has = "has" - t_is = "is" - t_does = "does" - if(NEUTER) - t_He = "It" - t_he = "it" - t_his = "its" - t_him = "it" - t_has = "has" - t_is = "is" - t_does = "does" + + if(!T) + // Just in case someone VVs the gender to something strange. It'll runtime anyway when it hits usages, better to CRASH() now with a helpful message. + CRASH("Gender datum was null; key was '[(skipjumpsuit && skipface) ? PLURAL : gender]'") msg += "[src.name]" if(species.name != "Human") @@ -80,111 +52,111 @@ tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]" if(w_uniform.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!\n" + msg += "[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!\n" else - msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n" + msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n" //head if(head) if(head.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [t_his] head!\n" + msg += "[T.He] [T.is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [T.his] head!\n" else - msg += "[t_He] [t_is] wearing \icon[head] \a [head] on [t_his] head.\n" + msg += "[T.He] [T.is] wearing \icon[head] \a [head] on [T.his] head.\n" //suit/armour if(wear_suit) if(wear_suit.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]!\n" + msg += "[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]!\n" else - msg += "[t_He] [t_is] wearing \icon[wear_suit] \a [wear_suit].\n" + msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit].\n" //suit/armour storage if(s_store && !skipsuitstorage) if(s_store.blood_DNA) - msg += "[t_He] [t_is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [t_his] [wear_suit.name]!\n" + msg += "[T.He] [T.is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!\n" else - msg += "[t_He] [t_is] carrying \icon[s_store] \a [s_store] on [t_his] [wear_suit.name].\n" + msg += "[T.He] [T.is] carrying \icon[s_store] \a [s_store] on [T.his] [wear_suit.name].\n" //back if(back) if(back.blood_DNA) - msg += "[t_He] [t_has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [t_his] back.\n" + msg += "[T.He] [T.has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [T.his] back.\n" else - msg += "[t_He] [t_has] \icon[back] \a [back] on [t_his] back.\n" + msg += "[T.He] [T.has] \icon[back] \a [back] on [T.his] back.\n" //left hand if(l_hand) if(l_hand.blood_DNA) - msg += "[t_He] [t_is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [t_his] left hand!\n" + msg += "[T.He] [T.is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!\n" else - msg += "[t_He] [t_is] holding \icon[l_hand] \a [l_hand] in [t_his] left hand.\n" + msg += "[T.He] [T.is] holding \icon[l_hand] \a [l_hand] in [T.his] left hand.\n" //right hand if(r_hand) if(r_hand.blood_DNA) - msg += "[t_He] [t_is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [t_his] right hand!\n" + msg += "[T.He] [T.is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!\n" else - msg += "[t_He] [t_is] holding \icon[r_hand] \a [r_hand] in [t_his] right hand.\n" + msg += "[T.He] [T.is] holding \icon[r_hand] \a [r_hand] in [T.his] right hand.\n" //gloves if(gloves && !skipgloves) if(gloves.blood_DNA) - msg += "[t_He] [t_has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [t_his] hands!\n" + msg += "[T.He] [T.has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!\n" else - msg += "[t_He] [t_has] \icon[gloves] \a [gloves] on [t_his] hands.\n" + msg += "[T.He] [T.has] \icon[gloves] \a [gloves] on [T.his] hands.\n" else if(blood_DNA) - msg += "[t_He] [t_has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!\n" + msg += "[T.He] [T.has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!\n" //handcuffed? //handcuffed? if(handcuffed) if(istype(handcuffed, /obj/item/weapon/handcuffs/cable)) - msg += "[t_He] [t_is] \icon[handcuffed] restrained with cable!\n" + msg += "[T.He] [T.is] \icon[handcuffed] restrained with cable!\n" else - msg += "[t_He] [t_is] \icon[handcuffed] handcuffed!\n" + msg += "[T.He] [T.is] \icon[handcuffed] handcuffed!\n" //buckled if(buckled) - msg += "[t_He] [t_is] \icon[buckled] buckled to [buckled]!\n" + msg += "[T.He] [T.is] \icon[buckled] buckled to [buckled]!\n" //belt if(belt) if(belt.blood_DNA) - msg += "[t_He] [t_has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [t_his] waist!\n" + msg += "[T.He] [T.has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!\n" else - msg += "[t_He] [t_has] \icon[belt] \a [belt] about [t_his] waist.\n" + msg += "[T.He] [T.has] \icon[belt] \a [belt] about [T.his] waist.\n" //shoes if(shoes && !skipshoes) if(shoes.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [t_his] feet!\n" + msg += "[T.He] [T.is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!\n" else - msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n" + msg += "[T.He] [T.is] wearing \icon[shoes] \a [shoes] on [T.his] feet.\n" else if(feet_blood_DNA) - msg += "[t_He] [t_has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!\n" + msg += "[T.He] [T.has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!\n" //mask if(wear_mask && !skipmask) if(wear_mask.blood_DNA) - msg += "[t_He] [t_has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] on [t_his] face!\n" + msg += "[T.He] [T.has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] on [T.his] face!\n" else - msg += "[t_He] [t_has] \icon[wear_mask] \a [wear_mask] on [t_his] face.\n" + msg += "[T.He] [T.has] \icon[wear_mask] \a [wear_mask] on [T.his] face.\n" //eyes if(glasses && !skipeyes) if(glasses.blood_DNA) - msg += "[t_He] [t_has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [t_his] eyes!\n" + msg += "[T.He] [T.has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!\n" else - msg += "[t_He] [t_has] \icon[glasses] \a [glasses] covering [t_his] eyes.\n" + msg += "[T.He] [T.has] \icon[glasses] \a [glasses] covering [T.his] eyes.\n" //left ear if(l_ear && !skipears) - msg += "[t_He] [t_has] \icon[l_ear] \a [l_ear] on [t_his] left ear.\n" + msg += "[T.He] [T.has] \icon[l_ear] \a [l_ear] on [T.his] left ear.\n" //right ear if(r_ear && !skipears) - msg += "[t_He] [t_has] \icon[r_ear] \a [r_ear] on [t_his] right ear.\n" + msg += "[T.He] [T.has] \icon[r_ear] \a [r_ear] on [T.his] right ear.\n" //ID if(wear_id) @@ -196,70 +168,70 @@ var/obj/item/weapon/card/id/idcard = wear_id id = idcard.registered_name if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10)) - msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right...\n" + msg += "[T.He] [T.is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right...\n" else*/ - msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id].\n" + msg += "[T.He] [T.is] wearing \icon[wear_id] \a [wear_id].\n" //Jitters if(is_jittery) if(jitteriness >= 300) - msg += "[t_He] [t_is] convulsing violently!\n" + msg += "[T.He] [T.is] convulsing violently!\n" else if(jitteriness >= 200) - msg += "[t_He] [t_is] extremely jittery.\n" + msg += "[T.He] [T.is] extremely jittery.\n" else if(jitteriness >= 100) - msg += "[t_He] [t_is] twitching ever so slightly.\n" + msg += "[T.He] [T.is] twitching ever so slightly.\n" //splints for(var/organ in list("l_leg","r_leg","l_arm","r_arm")) var/obj/item/organ/external/o = get_organ(organ) if(o && o.status & ORGAN_SPLINTED) - msg += "[t_He] [t_has] a splint on [t_his] [o.name]!\n" - - if(suiciding) - msg += "[t_He] appears to have commited suicide... there is no hope of recovery.\n" + msg += "[T.He] [T.has] a splint on [T.his] [o.name]!\n" if(mSmallsize in mutations) - msg += "[t_He] [t_is] small halfling!\n" + msg += "[T.He] [T.is] small halfling!\n" var/distance = get_dist(usr,src) if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything distance = 1 if (src.stat) - msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n" + msg += "[T.He] [T.is]n't responding to anything around [T.him] and seems to be asleep.\n" if((stat == 2 || src.losebreath) && distance <= 3) - msg += "[t_He] [t_does] not appear to be breathing.\n" + msg += "[T.He] [T.does] not appear to be breathing.\n" if(istype(usr, /mob/living/carbon/human) && !usr.stat && Adjacent(usr)) usr.visible_message("[usr] checks [src]'s pulse.", "You check [src]'s pulse.") spawn(15) if(distance <= 1 && usr.stat != 1) if(pulse == PULSE_NONE) - usr << "[t_He] [t_has] no pulse[src.client ? "" : " and [t_his] soul has departed"]..." + usr << "[T.He] [T.has] no pulse[src.client ? "" : " and [T.his] soul has departed"]..." else - usr << "[t_He] [t_has] a pulse!" + usr << "[T.He] [T.has] a pulse!" + if(fire_stacks) - msg += "[t_He] [t_is] covered in some liquid.\n" + msg += "[T.He] [T.is] covered in some liquid.\n" if(on_fire) - msg += "[t_He] [t_is] on fire!.\n" + msg += "[T.He] [T.is] on fire!.\n" msg += "" + /* if(nutrition < 100) - msg += "[t_He] [t_is] severely malnourished.\n" + msg += "[T.He] [T.is] severely malnourished.\n" else if(nutrition >= 500) /*if(usr.nutrition < 100) - msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n" + msg += "[T.He] [T.is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n" else*/ - msg += "[t_He] [t_is] quite chubby.\n" + msg += "[T.He] [T.is] quite chubby.\n" + */ msg += "" if(getBrainLoss() >= 60) - msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" + msg += "[T.He] [T.has] a stupid expression on [T.his] face.\n" if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD) if(!key) - msg += "[t_He] [t_is] fast asleep. It doesn't look like [t_he] [t_is] waking up anytime soon.\n" + msg += "[T.He] [T.is] [species.show_ssd]. It doesn't look like [T.he] [T.is] waking up anytime soon.\n" else if(!client) - msg += "[t_He] [t_is] [species.show_ssd].\n" + msg += "[T.He] [T.is] [species.show_ssd].\n" var/list/wound_flavor_text = list() var/list/is_bleeding = list() @@ -271,9 +243,9 @@ var/obj/item/organ/external/E = organs_by_name[organ_tag] if(!E) - wound_flavor_text["[organ_descriptor]"] = "[t_He] [t_is] missing [t_his] [organ_descriptor].\n" + wound_flavor_text["[organ_descriptor]"] = "[T.He] [T.is] missing [T.his] [organ_descriptor].\n" else if(E.is_stump()) - wound_flavor_text["[organ_descriptor]"] = "[t_He] [t_has] a stump where [t_his] [organ_descriptor] should be.\n" + wound_flavor_text["[organ_descriptor]"] = "[T.He] [T.has] a stump where [T.his] [organ_descriptor] should be.\n" else continue @@ -281,25 +253,24 @@ if(temp) if(temp.status & ORGAN_ROBOT) if(!(temp.brute_dam + temp.burn_dam)) - if(!species.flags & IS_SYNTHETIC) - wound_flavor_text["[temp.name]"] = "[t_He] [t_has] a robot [temp.name]!\n" - continue + wound_flavor_text["[temp.name]"] = "[T.He] [T.has] a robot [temp.name]!\n" + continue else - wound_flavor_text["[temp.name]"] = "[t_He] [t_has] a robot [temp.name]. It has[temp.get_wounds_desc()]!\n" + wound_flavor_text["[temp.name]"] = "[T.He] [T.has] a robot [temp.name]. It has[temp.get_wounds_desc()]!\n" else if(temp.wounds.len > 0 || temp.open) if(temp.is_stump() && temp.parent_organ && organs_by_name[temp.parent_organ]) var/obj/item/organ/external/parent = organs_by_name[temp.parent_organ] - wound_flavor_text["[temp.name]"] = "[t_He] [t_has] [temp.get_wounds_desc()] on [t_his] [parent.name].
      " + wound_flavor_text["[temp.name]"] = "[T.He] [T.has] [temp.get_wounds_desc()] on [T.his] [parent.name].
      " else - wound_flavor_text["[temp.name]"] = "[t_He] [t_has] [temp.get_wounds_desc()] on [t_his] [temp.name].
      " + wound_flavor_text["[temp.name]"] = "[T.He] [T.has] [temp.get_wounds_desc()] on [T.his] [temp.name].
      " if(temp.status & ORGAN_BLEEDING) - is_bleeding["[temp.name]"] = "[capitalize(t_his)] [temp.name] is bleeding!
      " + is_bleeding["[temp.name]"] = "[T.His] [temp.name] is bleeding!
      " else wound_flavor_text["[temp.name]"] = "" if(temp.dislocated == 2) - wound_flavor_text["[temp.name]"] += "[capitalize(t_his)] [temp.joint] is dislocated!
      " + wound_flavor_text["[temp.name]"] += "[T.His] [temp.joint] is dislocated!
      " if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED)) - wound_flavor_text["[temp.name]"] += "[capitalize(t_his)] [temp.name] is dented and swollen!
      " + wound_flavor_text["[temp.name]"] += "[T.His] [temp.name] is dented and swollen!
      " //Handles the text strings being added to the actual description. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext. @@ -316,7 +287,7 @@ if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas))))) msg += wound_flavor_text["head"] else if(is_bleeding["head"]) - msg += "[src] [t_has] blood running down [t_his] face!\n" + msg += "[src] [T.has] blood running down [T.his] face!\n" if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you. msg += wound_flavor_text["upper body"] @@ -367,11 +338,11 @@ display_shoes = 1 if(display_chest) - msg += "[src] [t_has] blood soaking through from under [t_his] clothing!\n" + msg += "[src] [T.has] blood soaking through from under [T.his] clothing!\n" if(display_shoes) - msg += "[src] [t_has] blood running from [t_his] shoes!\n" + msg += "[src] [T.has] blood running from [T.his] shoes!\n" if(display_gloves) - msg += "[src] [t_has] blood running from under [t_his] gloves!\n" + msg += "[src] [T.has] blood running from under [T.his] gloves!\n" */ for(var/limb in wound_flavor_text) @@ -380,9 +351,9 @@ for(var/limb in is_bleeding) msg += is_bleeding[limb] for(var/implant in get_visible_implants(0)) - msg += "[src] [t_has] \a [implant] sticking out of [t_his] flesh!\n" + msg += "[src] [T.has] \a [implant] sticking out of [T.his] flesh!\n" if(digitalcamo) - msg += "[t_He] [t_is] repulsively uncanny!\n" + msg += "[T.He] [T.is] repulsively uncanny!\n" if(hasHUD(usr,"security")) var/perpname = "wot" @@ -436,7 +407,7 @@ if (pose) if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. - msg += "\n[t_He] [pose]" + msg += "\n[T.He] [pose]" user << msg diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3b34cec9022..79c3a22db60 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -7,9 +7,9 @@ var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. + var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. mob_size = 9//Based on average weight of a human - /mob/living/carbon/human/New(var/new_loc, var/new_species = null) eat_types |= TYPE_ORGANIC//Any mobs that are given the devour verb, can eat nonhumanoid organics. Only applies to unathi for now @@ -44,7 +44,9 @@ ..() if(dna) + dna.ready_dna(src) dna.real_name = real_name + sync_organ_dna() make_blood() /mob/living/carbon/human/Destroy() @@ -177,31 +179,6 @@ update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if(update) UpdateDamageIcon() - -/mob/living/carbon/human/blob_act() - if(stat == 2) return - show_message("\red The blob attacks you!") - var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") - var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) - apply_damage(rand(30,40), BRUTE, affecting, run_armor_check(affecting, "melee")) - return - -/mob/living/carbon/human/meteorhit(O as obj) - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [src] has been hit by [O]", 1) - if (health > 0) - var/obj/item/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head")) - if(!affecting) return - if (istype(O, /obj/effect/immovablerod)) - if(affecting.take_damage(101, 0)) - UpdateDamageIcon() - else - if(affecting.take_damage((istype(O, /obj/effect/meteor/small) ? 10 : 25), 30)) - UpdateDamageIcon() - updatehealth() - return - /mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default. if(!config.use_loyalty_implants && !override) return // Nuh-uh. @@ -233,8 +210,7 @@ /mob/living/carbon/human/show_inv(mob/user as mob) - // TODO : Change to incapacitated() on merge. - if(user.stat || user.lying || user.resting || user.buckled || !user.Adjacent(src) || user.restrained()) + if(user.incapacitated() || !user.Adjacent(src)) return var/obj/item/clothing/under/suit = null @@ -264,7 +240,7 @@ // Other incidentals. if(istype(suit) && suit.has_sensor == 1) - dat += "
      Set sensors." + dat += "
      Set sensors" if(handcuffed) dat += "
      Handcuffed" if(legcuffed) @@ -402,11 +378,9 @@ src << browse(null, t1) if(href_list["item"]) - if (handle_strip(href_list["item"],usr)) - if ((machine) && (in_range(src, usr))) - show_inv(machine) + handle_strip(href_list["item"],usr) - if (href_list["criminal"]) + if(href_list["criminal"]) if(hasHUD(usr,"security")) var/modified = 0 @@ -691,44 +665,43 @@ ///eyecheck() ///Returns a number between -1 to 2 /mob/living/carbon/human/eyecheck() - var/number = 0 - if(!species.has_organ["eyes"]) //No eyes, can't hurt them. - return 2 + return FLASH_PROTECTION_MAJOR if(internal_organs_by_name["eyes"]) // Eyes are fucked, not a 'weak point'. var/obj/item/organ/I = internal_organs_by_name["eyes"] if(I.status & ORGAN_CUT_AWAY) - return 2 - else - return 2 + return FLASH_PROTECTION_MAJOR - if(istype(src.head, /obj/item/clothing/head/welding)) - if(!src.head:up) - number += 2 - if(istype(back, /obj/item/weapon/rig)) - var/obj/item/weapon/rig/O = back - if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES)) - number += 2 - if(istype(src.head, /obj/item/clothing/head/helmet/space)) - number += 2 - if(istype(src.head, /obj/item/clothing/head/helmet/space/emergency)) - number -= 2 - if(istype(src.glasses, /obj/item/clothing/glasses/thermal)) - number -= 1 - if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses)) - number += 1 - if(istype(src.glasses, /obj/item/clothing/glasses/welding)) - var/obj/item/clothing/glasses/welding/W = src.glasses - if(!W.up) - number += 2 - return number + return flash_protection + +//Used by various things that knock people out by applying blunt trauma to the head. +//Checks that the species has a "head" (brain containing organ) and that hit_zone refers to it. +/mob/living/carbon/human/proc/headcheck(var/target_zone, var/brain_tag = "brain") + if(!species.has_organ[brain_tag]) + return 0 + + var/obj/item/organ/affecting = internal_organs_by_name[brain_tag] + + target_zone = check_zone(target_zone) + if(!affecting || affecting.parent_organ != target_zone) + return 0 + + //if the parent organ is significantly larger than the brain organ, then hitting it is not guaranteed + var/obj/item/organ/parent = get_organ(target_zone) + if(!parent) + return 0 + + if(parent.w_class > affecting.w_class + 1) + return prob(100 / 2**(parent.w_class - affecting.w_class - 1)) + + return 1 /mob/living/carbon/human/IsAdvancedToolUser(var/silent) if(species.has_fine_manipulation) return 1 if(!silent) - src << "You don't have the dexterity to use that!" + src << "You don't have the dexterity to use that!" return 0 /mob/living/carbon/human/abiotic(var/full_body = 0) @@ -763,11 +736,19 @@ xylophone=0 return +/mob/living/carbon/human/proc/check_has_mouth() + // Todo, check stomach organ when implemented. + var/obj/item/organ/external/head/H = get_organ("head") + if(!H || !H.can_intake_reagents) + return 0 + return 1 + /mob/living/carbon/human/proc/delayed_vomit() - if(species.flags & IS_SYNTHETIC) - return //Machines don't throw up. - + if(!check_has_mouth()) + return + if(stat == DEAD) + return if(!lastpuke) lastpuke = 1 src << "You feel nauseous..." @@ -961,7 +942,6 @@ V.cure(src) losebreath = 0 - failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. ..() @@ -1080,30 +1060,28 @@ set src in view(1) var/self = 0 - if(usr.stat == 1 || usr.restrained() || !isliving(usr)) return + if(usr.stat || usr.restrained() || !isliving(usr)) return if(usr == src) self = 1 if(!self) - usr.visible_message("\blue [usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\ + usr.visible_message("[usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\ "You begin counting [src]'s pulse") else - usr.visible_message("\blue [usr] begins counting their pulse.",\ + usr.visible_message("[usr] begins counting their pulse.",\ "You begin counting your pulse.") if(src.pulse) - usr << "\blue [self ? "You have a" : "[src] has a"] pulse! Counting..." + usr << "[self ? "You have a" : "[src] has a"] pulse! Counting..." else - usr << "\red [src] has no pulse!" //it is REALLY UNLIKELY that a dead person would check his own pulse + usr << "[src] has no pulse!" //it is REALLY UNLIKELY that a dead person would check his own pulse return - usr << "Don't move until counting is finished." - var/time = world.time - sleep(60) - if(usr.l_move_time >= time) //checks if our mob has moved during the sleep() - usr << "You moved while counting. Try again." + usr << "You must[self ? "" : " both"] remain still until counting is finished." + if(do_mob(usr, src, 60)) + usr << "[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." else - usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." + usr << "You failed to check the pulse. Try again." /mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour) @@ -1251,16 +1229,26 @@ else target_zone = user.zone_sel.selecting - switch(target_zone) - if("head") - if(head && head.flags & THICKMATERIAL) - . = 0 - else - if(wear_suit && wear_suit.flags & THICKMATERIAL) - . = 0 + var/obj/item/organ/external/affecting = get_organ(target_zone) + var/fail_msg + if(!affecting) + . = 0 + fail_msg = "They are missing that limb." + else if (affecting.status & ORGAN_ROBOT) + . = 0 + fail_msg = "That limb is robotic." + else + switch(target_zone) + if("head") + if(head && head.item_flags & THICKMATERIAL) + . = 0 + else + if(wear_suit && wear_suit.item_flags & THICKMATERIAL) + . = 0 if(!. && error_msg && user) - // Might need re-wording. - user << "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into." + if(!fail_msg) + fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into." + user << "[fail_msg]" /mob/living/carbon/human/print_flavor_text(var/shrink = 1) var/list/equipment = list(src.head,src.wear_mask,src.glasses,src.w_uniform,src.wear_suit,src.gloves,src.shoes) @@ -1327,7 +1315,7 @@ return 0 /mob/living/carbon/human/slip(var/slipped_on, stun_duration=8) - if((species.flags & NO_SLIP) || (shoes && (shoes.flags & NOSLIP))) + if((species.flags & NO_SLIP) || (shoes && (shoes.item_flags & NOSLIP))) return 0 ..(slipped_on,stun_duration) @@ -1337,9 +1325,10 @@ set desc = "Pop a joint back into place. Extremely painful." set src in view(1) - if(!isliving(usr) || usr.next_move > world.time) + if(!isliving(usr) || !usr.canClick()) return - usr.next_move = world.time + 20 + + usr.setClickCooldown(20) if(usr.stat > 0) usr << "You are unconcious and cannot do that!" @@ -1394,15 +1383,21 @@ if(update_hud) handle_regular_hud_updates() -/mob/living/carbon/human/Check_Shoegrip() - if(istype(shoes, /obj/item/clothing/shoes/magboots) && (shoes.flags & NOSLIP)) //magboots + dense_object = no floating + +/mob/living/carbon/human/can_stand_overridden() + if(wearing_rig && wearing_rig.ai_can_move_suit(check_for_ai = 1)) + // Actually missing a leg will screw you up. Everything else can be compensated for. + for(var/limbcheck in list("l_leg","r_leg")) + var/obj/item/organ/affecting = get_organ(limbcheck) + if(!affecting) + return 0 return 1 return 0 /mob/living/carbon/human/MouseDrop(var/atom/over_object) var/mob/living/carbon/human/H = over_object - if(holder_type && a_intent == I_HELP && istype(H) && H == usr && H.a_intent == I_HELP && !issmall(H) && Adjacent(H)) - get_scooped(H) + if(holder_type && istype(H) && H.a_intent == I_HELP && !H.lying && !issmall(H) && Adjacent(H)) + get_scooped(H, (usr == src)) return return ..() @@ -1450,22 +1445,6 @@ update_inv_r_hand() return 1 -/mob/living/carbon/human/can_use_hand(var/selected_hand = hand) - var/hand_to_check = "l_hand" - if (!selected_hand) - hand_to_check = "r_hand" - - var/obj/item/organ/external/temp = organs_by_name[hand_to_check] - if (temp && !temp.is_usable()) - src << "You try to move your [temp.name], but cannot!" - return 0 - - if (!temp) - src << "You try to use your hand, but realize it is no longer attached!" - return 0 - - return 1 - /mob/living/carbon/human/AltClickOn(var/atom/A) var/doClickAction = 1 if (istype(get_active_hand(), /obj/item/weapon)) @@ -1475,3 +1454,12 @@ if (doClickAction) ..() +/mob/living/carbon/human/verb/pull_punches() + set name = "Pull Punches" + set desc = "Try not to hurt them." + set category = "IC" + + if(stat) return + pulling_punches = !pulling_punches + src << "You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"]." + return diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 542849eca08..4d75c5f2463 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -1,6 +1,10 @@ /mob/living/carbon/human/proc/get_unarmed_attack(var/mob/living/carbon/human/target, var/hit_zone) for(var/datum/unarmed_attack/u_attack in species.unarmed_attacks) if(u_attack.is_usable(src, target, hit_zone)) + if(pulling_punches) + var/datum/unarmed_attack/soft_variant = u_attack.get_sparring_variant() + if(soft_variant) + return soft_variant return u_attack return null @@ -24,8 +28,7 @@ // Should this all be in Touch()? if(istype(H)) - if((H != src) && check_shields(0, H.name)) - visible_message("\red [H] attempted to touch [src]!") + if(H != src && check_shields(0, null, H, H.zone_sel.selecting, H.name)) H.do_attack_animation(src) return 0 @@ -95,10 +98,16 @@ switch(M.a_intent) if(I_HELP) if(istype(H) && health < config.health_threshold_crit && health > config.health_threshold_dead) - if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH))) + if(!H.check_has_mouth()) + H << "You don't have a mouth, you cannot perform CPR!" + return + if(!check_has_mouth()) + H << "They don't have a mouth, you cannot perform CPR!" + return + if((H.head && (H.head.body_parts_covered & FACE)) || (H.wear_mask && (H.wear_mask.body_parts_covered & FACE))) H << "Remove your mask!" return 0 - if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH))) + if((head && (head.body_parts_covered & FACE)) || (wear_mask && (wear_mask.body_parts_covered & FACE))) H << "Remove [src]'s mask!" return 0 @@ -269,7 +278,7 @@ attack.apply_effects(H, src, armour, rand_damage, hit_zone) // Finally, apply damage to target - apply_damage(real_damage, BRUTE, affecting, armour, sharp=attack.sharp, edge=attack.edge) + apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, sharp=attack.sharp, edge=attack.edge) if(I_DISARM) M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])") @@ -361,30 +370,13 @@ src.visible_message("[user] has [attack_message] [src]!") user.do_attack_animation(src) - var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin") + var/dam_zone = pick(organs_by_name) var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) var/armor_block = run_armor_check(affecting, "melee") apply_damage(damage, BRUTE, affecting, armor_block) updatehealth() return 1 -/mob/living/carbon/human/proc/attack_joint(var/obj/item/W, var/mob/living/user, var/def_zone) - 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.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")]!" - organ.dislocate(1) - 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 diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 9eb87c904a5..e3fba24bf9f 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -8,6 +8,8 @@ var/total_burn = 0 var/total_brute = 0 for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit + if((O.status & ORGAN_ROBOT) && !O.vital) + continue //*non-vital* robot limbs don't count towards shock and crit total_brute += O.brute_dam total_burn += O.burn_dam @@ -68,20 +70,22 @@ /mob/living/carbon/human/getBruteLoss() var/amount = 0 for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_ROBOT) + continue //robot limbs don't count towards shock and crit amount += O.brute_dam return amount /mob/living/carbon/human/getFireLoss() var/amount = 0 for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_ROBOT) + continue //robot limbs don't count towards shock and crit amount += O.burn_dam return amount /mob/living/carbon/human/adjustBruteLoss(var/amount) - if(species && species.brute_mod) - amount = amount*species.brute_mod - + amount = amount*species.brute_mod if(amount > 0) take_overall_damage(amount, 0) else @@ -89,9 +93,7 @@ BITSET(hud_updateflag, HEALTH_HUD) /mob/living/carbon/human/adjustFireLoss(var/amount) - if(species && species.burn_mod) - amount = amount*species.burn_mod - + amount = amount*species.burn_mod if(amount > 0) take_overall_damage(0, amount) else @@ -99,9 +101,7 @@ BITSET(hud_updateflag, HEALTH_HUD) /mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null) - if(species && species.brute_mod) - amount = amount*species.brute_mod - + amount = amount*species.brute_mod if (organ_name in organs_by_name) var/obj/item/organ/external/O = get_organ(organ_name) @@ -114,9 +114,7 @@ BITSET(hud_updateflag, HEALTH_HUD) /mob/living/carbon/human/proc/adjustFireLossByPart(var/amount, var/organ_name, var/obj/damage_source = null) - if(species && species.burn_mod) - amount = amount*species.burn_mod - + amount = amount*species.burn_mod if (organ_name in organs_by_name) var/obj/item/organ/external/O = get_organ(organ_name) @@ -138,15 +136,18 @@ /mob/living/carbon/human/Paralyse(amount) if(HULK in mutations) return + // Notify our AI if they can now control the suit. + if(wearing_rig && !stat && paralysis < amount) //We are passing out right this second. + wearing_rig.notify_ai("Warning: user consciousness failure. Mobility control passed to integrated intelligence system.") ..() /mob/living/carbon/human/getCloneLoss() - if(species.flags & (IS_SYNTHETIC | NO_SCAN)) + if(species.flags & (NO_SCAN)) cloneloss = 0 return ..() /mob/living/carbon/human/setCloneLoss(var/amount) - if(species.flags & (IS_SYNTHETIC | NO_SCAN)) + if(species.flags & (NO_SCAN)) cloneloss = 0 else ..() @@ -154,7 +155,7 @@ /mob/living/carbon/human/adjustCloneLoss(var/amount) ..() - if(species.flags & (IS_SYNTHETIC | NO_SCAN)) + if(species.flags & (NO_SCAN)) cloneloss = 0 return @@ -196,7 +197,8 @@ if(species.flags & NO_BREATHE) oxyloss = 0 else - ..() + amount = amount*species.oxy_mod + ..(amount) /mob/living/carbon/human/setOxyLoss(var/amount) if(species.flags & NO_BREATHE) @@ -210,12 +212,13 @@ return ..() /mob/living/carbon/human/adjustToxLoss(var/amount) - if(species && species.tox_mod) - amount = amount*species.tox_mod + if(species && species.toxins_mod) + amount = amount*species.toxins_mod if(species.flags & NO_POISON) toxloss = 0 else - ..() + amount = amount*species.toxins_mod + ..(amount) /mob/living/carbon/human/setToxLoss(var/amount) if(species.flags & NO_POISON) @@ -358,7 +361,7 @@ This function restores all organs. src.invisibility = 0 //Handle other types of damage - if((damagetype != BRUTE) && (damagetype != BURN)) + if(!stat && damagetype != BRUTE && damagetype != BURN) if(damagetype == HALLOSS && !(species && (species.flags & NO_PAIN))) if ((damage > 25 && prob(20)) || (damage > 50 && prob(60))) emote("scream") @@ -385,14 +388,12 @@ This function restores all organs. switch(damagetype) if(BRUTE) damageoverlaytemp = 20 - if(species && species.brute_mod) - damage = damage*species.brute_mod + damage = damage*species.brute_mod if(organ.take_damage(damage, 0, sharp, edge, used_weapon)) UpdateDamageIcon() if(BURN) damageoverlaytemp = 20 - if(species && species.burn_mod) - damage = damage*species.burn_mod + damage = damage*species.burn_mod if(organ.take_damage(0, damage, sharp, edge, used_weapon)) UpdateDamageIcon() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 4b3f4e840c2..8d620195d61 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -17,29 +17,13 @@ emp_act var/obj/item/organ/external/organ = get_organ() //Shields - if(check_shields(P.damage, "the [P.name]")) - P.on_hit(src, 2, def_zone) - return 2 - - //Laserproof armour - if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor/laserproof)) - if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) - var/reflectchance = 40 - round(P.damage/3) - if(!(def_zone in list("chest", "groin"))) - reflectchance /= 2 - if(prob(reflectchance)) - visible_message("\red \The [P] gets reflected by \the [src]'s [wear_suit.name]!") - - // Find a turf near or on the original location to bounce to - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) - - // redirect the projectile - P.redirect(new_x, new_y, curloc, src) - - return PROJECTILE_CONTINUE // complete projectile permutation + var/shield_check = check_shields(P.damage, P, null, def_zone, "the [P.name]") + if(shield_check) + if(shield_check < 0) + return shield_check + else + P.on_hit(src, 2, def_zone) + return 2 //Shrapnel if(P.can_embed()) @@ -144,37 +128,15 @@ emp_act /mob/living/carbon/human/proc/check_mouth_coverage() var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform) for(var/obj/item/gear in protective_gear) - if(istype(gear) && (gear.body_parts_covered & FACE) && (gear.flags & (MASKCOVERSMOUTH|HEADCOVERSMOUTH))) + if(istype(gear) && (gear.body_parts_covered & FACE) && !(gear.item_flags & FLEXIBLEMATERIAL)) return gear return null -/mob/living/carbon/human/proc/check_shields(var/damage = 0, var/attack_text = "the attack") - if(l_hand && istype(l_hand, /obj/item/weapon))//Current base is the prob(50-d/3) - var/obj/item/weapon/I = l_hand - if(I.IsShield() && (prob(50 - round(damage / 3)))) - visible_message("\red [src] blocks [attack_text] with the [l_hand.name]!") - return 1 - if(r_hand && istype(r_hand, /obj/item/weapon)) - var/obj/item/weapon/I = r_hand - if(I.IsShield() && (prob(50 - round(damage / 3)))) - visible_message("\red [src] blocks [attack_text] with the [r_hand.name]!") - return 1 - if(wear_suit && istype(wear_suit, /obj/item/)) - var/obj/item/I = wear_suit - if(I.IsShield() && (prob(35))) - visible_message("\red The reactive teleport system flings [src] clear of [attack_text]!") - var/list/turfs = new/list() - for(var/turf/T in orange(6)) - if(istype(T,/turf/space)) continue - if(T.density) continue - if(T.x>world.maxx-6 || T.x<6) continue - if(T.y>world.maxy-6 || T.y<6) continue - turfs += T - if(!turfs.len) turfs += pick(/turf in orange(6)) - var/turf/picked = pick(turfs) - if(!isturf(picked)) return - src.loc = picked - return 1 +/mob/living/carbon/human/proc/check_shields(var/damage = 0, var/atom/damage_source = null, var/mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + for(var/obj/item/shield in list(l_hand, r_hand, wear_suit)) + if(!shield) continue + . = shield.handle_shield(src, damage, damage_source, attacker, def_zone, attack_text) + if(.) return return 0 /mob/living/carbon/human/emp_act(severity) @@ -188,12 +150,14 @@ emp_act I.emp_act(severity) ..() +/mob/living/carbon/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) + if(check_attack_throat(I, user)) + return null -//Returns 1 if the attack hit, 0 if it missed. -/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) - if(!I || !user) return 0 + if(user == src) // Attacking yourself can't miss + return target_zone - var/target_zone = def_zone? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_sel.selecting, src) + var/hit_zone = get_zone_with_miss_chance(target_zone, src) if(user == src) // Attacking yourself can't miss target_zone = user.zone_sel.selecting @@ -201,15 +165,44 @@ emp_act visible_message("\red [user] misses [src] with \the [I]!") return 0 - var/obj/item/organ/external/affecting = get_organ(target_zone) + //var/obj/item/organ/external/affecting = get_organ(target_zone) + if(check_shields(I.force, I, user, target_zone, "the [I.name]")) + return null + + var/obj/item/organ/external/affecting = get_organ(hit_zone) if (!affecting || affecting.is_stump()) user << "They are missing that limb!" - return + return null - var/effective_force = I.force - if(user.a_intent == "disarm") effective_force = round(I.force/2) - var/hit_area = affecting.name + return hit_zone + +/mob/living/carbon/human/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) + var/obj/item/organ/external/affecting = get_organ(hit_zone) + if(!affecting) + return //should be prevented by attacked_with_item() but for sanity. + + visible_message("[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!") + + var/blocked = run_armor_check(hit_zone, "melee", I.armor_penetration, "Your armor has protected your [affecting.name].", "Your armor has softened the blow to your [affecting.name].") + standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone) + + return blocked + +/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) + var/obj/item/organ/external/affecting = get_organ(hit_zone) + if(!affecting) + return 0 + + // Handle striking to cripple. + if(user.a_intent == I_DISARM) + effective_force /= 2 //half the effective force + if(!..(I, effective_force, blocked, hit_zone)) + return 0 + + attack_joint(affecting, I, blocked) //but can dislocate joints + else if(!..()) + return 0 // forceglove amplification if(istype(user, /mob/living/carbon/human)) @@ -218,47 +211,27 @@ emp_act var/obj/item/clothing/gloves/force/G = X.gloves effective_force *= G.amplification - if((user != src) && check_shields(effective_force, "the [I.name]")) - return 0 + if(effective_force > 10 || effective_force >= 5 && prob(33)) + forcesay(hit_appends) //forcesay checks stat already - if(istype(I,/obj/item/weapon/card/emag)) - if(!(affecting.status & ORGAN_ROBOT)) - user << "\red That limb isn't robotic." - return 0 - if(affecting.sabotaged) - user << "\red [src]'s [affecting.name] is already sabotaged!" - else - user << "\red You sneakily slide [I] into the dataport on [src]'s [affecting.name] and short out the safeties." - var/obj/item/weapon/card/emag/emag = I - emag.uses-- - affecting.sabotaged = 1 - return 0 + if((I.damtype == BRUTE || I.damtype == HALLOSS) && prob(25 + (effective_force * 2))) + if(!stat) + if(headcheck(hit_zone)) + //Harder to score a stun but if you do it lasts a bit longer + if(prob(effective_force)) + visible_message("[src] [species.knockout_message]") + apply_effect(20, PARALYZE, blocked) + else + //Easier to score a stun but lasts less time + if(prob(effective_force + 10)) + visible_message("[src] has been knocked down!") + apply_effect(6, WEAKEN, blocked) - if(I.attack_verb.len) - visible_message("\red [src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!") - else - visible_message("\red [src] has been attacked in the [hit_area] with [I.name] by [user]!") + //Apply blood + if(!(I.flags & NOBLOODY)) + I.add_blood(src) - var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") - var/weapon_sharp = is_sharp(I) - var/weapon_edge = has_edge(I) - if ((weapon_sharp || weapon_edge) && prob(getarmor(target_zone, "melee"))) - weapon_sharp = 0 - weapon_edge = 0 - - if(armor >= 2) return 0 - if(!effective_force) return 0 - var/Iforce = effective_force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) - - apply_damage(effective_force, I.damtype, affecting, armor, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) - - var/bloody = 0 - if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (effective_force * 2))) - I.add_blood(src) //Make the weapon bloody, not the person. -// if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon -// else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays if(prob(33)) - bloody = 1 var/turf/location = loc if(istype(location, /turf/simulated)) location.add_blood(src) @@ -268,49 +241,41 @@ emp_act H.bloody_body(src) H.bloody_hands(src) - if(!stat) - switch(hit_area) - if("head")//Harder to score a stun but if you do it lasts a bit longer - if(prob(effective_force)) - apply_effect(20, PARALYZE, armor) - visible_message("\red [src] has been knocked unconscious!") - if(bloody)//Apply blood - if(wear_mask) - wear_mask.add_blood(src) - update_inv_wear_mask(0) - if(head) - head.add_blood(src) - update_inv_head(0) - if(glasses && prob(33)) - glasses.add_blood(src) - update_inv_glasses(0) + switch(hit_zone) + if("head") + if(wear_mask) + wear_mask.add_blood(src) + update_inv_wear_mask(0) + if(head) + head.add_blood(src) + update_inv_head(0) + if(glasses && prob(33)) + glasses.add_blood(src) + update_inv_glasses(0) + if("chest") + bloody_body(src) - if("chest")//Easier to score a stun but lasts less time - if(prob((effective_force + 10))) - apply_effect(6, WEAKEN, armor) - visible_message("\red [src] has been knocked down!") + return 1 - if(bloody) - bloody_body(src) +/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/blocked) + if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 2) + return 0 + if(prob(W.force / (blocked+1))) + visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") + organ.dislocate(1) + return 1 + return 0 - if(Iforce > 10 || Iforce >= 5 && prob(33)) - forcesay(hit_appends) //forcesay checks stat already - - //Melee weapon embedded object code. - if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I)) - var/damage = effective_force - if (armor) - damage /= armor+1 - - - if (I.can_embed)//If this weapon is allowed to embed in people - //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3) - var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class - - //Sharp objects will always embed if they do enough damage. - if((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance))) - affecting.embed(I) +/mob/living/carbon/human/emag_act(var/remaining_charges, mob/user, var/emag_source) + var/obj/item/organ/external/affecting = get_organ(user.zone_sel.selecting) + if(!affecting || !(affecting.status & ORGAN_ROBOT)) + user << "That limb isn't robotic." + return -1 + if(affecting.sabotaged) + user << "[src]'s [affecting.name] is already sabotaged!" + return -1 + user << "You sneakily slide [emag_source] into the dataport on [src]'s [affecting.name] and short out the safeties." + affecting.sabotaged = 1 return 1 //this proc handles being hit by a thrown atom @@ -343,20 +308,24 @@ emp_act miss_chance = max(15*(distance-2), 0) zone = get_zone_with_miss_chance(zone, src, miss_chance, ranged_attack=1) + if(zone && O.thrower != src) + var/shield_check = check_shields(throw_damage, O, thrower, zone, "[O]") + if(shield_check == PROJECTILE_FORCE_MISS) + zone = null + else if(shield_check) + return + if(!zone) - visible_message("\blue \The [O] misses [src] narrowly!") + visible_message("\The [O] misses [src] narrowly!") return O.throwing = 0 //it hit, so stop moving - if ((O.thrower != src) && check_shields(throw_damage, "[O]")) - return - var/obj/item/organ/external/affecting = get_organ(zone) var/hit_area = affecting.name src.visible_message("\red [src] has been hit in the [hit_area] by [O].") - var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here + var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here if(armor < 2) apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index bd100a28dd5..438478a9115 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -71,8 +71,6 @@ var/miming = null //Toggle for the mime's abilities. var/special_voice = "" // For changing our voice. Used by a symptom. - var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. - var/last_dam = -1 //Used for determining if we need to process all organs or just some or even none. var/list/bad_external_organs = list()// organs we check until they are good. @@ -86,7 +84,16 @@ var/list/flavor_texts = list() var/gunshot_residue + var/pulling_punches // Are you trying not to hurt your opponent? mob_bump_flag = HUMAN mob_push_flags = ~HEAVY mob_swap_flags = ~HEAVY + + var/flash_protection = 0 // Total level of flash protection + var/equipment_tint_total = 0 // Total level of visualy impairing items + var/equipment_darkness_modifier // Darkvision modifier from equipped items + var/equipment_vision_flags // Extra vision flags from equipped items + var/equipment_see_invis // Max see invibility level granted by equipped items + var/equipment_prescription // Eye prescription granted by equipped items + var/list/equipment_overlays = list() // Extra overlays from equipped items diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm new file mode 100644 index 00000000000..fe95664ca0d --- /dev/null +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -0,0 +1,83 @@ +#define HUMAN_EATING_NO_ISSUE 0 +#define HUMAN_EATING_NO_MOUTH 1 +#define HUMAN_EATING_BLOCKED_MOUTH 2 + +#define add_clothing_protection(A) \ + var/obj/item/clothing/C = A; \ + flash_protection += C.flash_protection; \ + equipment_tint_total += C.tint; + +/mob/living/carbon/human/can_eat(var/food, var/feedback = 1) + var/list/status = can_eat_status() + if(status[1] == HUMAN_EATING_NO_ISSUE) + return 1 + if(feedback) + if(status[1] == HUMAN_EATING_NO_MOUTH) + src << "Where do you intend to put \the [food]? You don't have a mouth!" + else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH) + src << "\The [status[2]] is in the way!" + return 0 + +/mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1) + var/list/status = can_eat_status() + if(status[1] == HUMAN_EATING_NO_ISSUE) + return 1 + if(feedback) + if(status[1] == HUMAN_EATING_NO_MOUTH) + feeder << "Where do you intend to put \the [food]? \The [src] doesn't have a mouth!" + else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH) + feeder << "\The [status[2]] is in the way!" + return 0 + +/mob/living/carbon/human/proc/can_eat_status() + if(!check_has_mouth()) + return list(HUMAN_EATING_NO_MOUTH) + var/obj/item/blocked = check_mouth_coverage() + if(blocked) + return list(HUMAN_EATING_BLOCKED_MOUTH, blocked) + return list(HUMAN_EATING_NO_ISSUE) + +#undef HUMAN_EATING_NO_ISSUE +#undef HUMAN_EATING_NO_MOUTH +#undef HUMAN_EATING_BLOCKED_MOUTH + +/mob/living/carbon/human/proc/update_equipment_vision() + flash_protection = 0 + equipment_tint_total = 0 + equipment_see_invis = 0 + equipment_vision_flags = 0 + equipment_prescription = 0 + equipment_darkness_modifier = 0 + equipment_overlays.Cut() + + if(istype(src.head, /obj/item/clothing/head)) + add_clothing_protection(head) + if(istype(src.glasses, /obj/item/clothing/glasses)) + process_glasses(glasses) + if(istype(src.wear_mask, /obj/item/clothing/mask)) + add_clothing_protection(wear_mask) + if(istype(back,/obj/item/weapon/rig)) + process_rig(back) + +/mob/living/carbon/human/proc/process_glasses(var/obj/item/clothing/glasses/G) + if(G && G.active) + equipment_darkness_modifier += G.darkness_view + equipment_vision_flags |= G.vision_flags + equipment_prescription = equipment_prescription || G.prescription + if(G.overlay) + equipment_overlays |= G.overlay + if(G.see_invisible >= 0) + if(equipment_see_invis) + equipment_see_invis = min(equipment_see_invis, G.see_invisible) + else + equipment_see_invis = G.see_invisible + + add_clothing_protection(G) + G.process_hud(src) + +/mob/living/carbon/human/proc/process_rig(var/obj/item/weapon/rig/O) + if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES)) + if((O.offline && O.offline_vision_restriction == 2) || (!O.offline && O.vision_restriction == 2)) + equipment_tint_total += TINT_BLIND + if(O.visor && O.visor.active && O.visor.vision && O.visor.vision.glasses && (!O.helmet || (head && O.helmet == head))) + process_glasses(O.visor.vision.glasses) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index a88a08b57b8..08ae2b8022d 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -47,6 +47,9 @@ if(shock_stage >= 10) tally += 3 + + if(aiming && aiming.aiming_at) tally += 5 // Iron sights make you slower, it's a well-known fact. + if (drowsyness) tally += 6 if(FAT in src.mutations) @@ -94,18 +97,9 @@ return 0 -/mob/living/carbon/human/Process_Spaceslipping(var/prob_slip = 5) - //If knocked out we might just hit it and stop. This makes it possible to get dead bodies and such. - - if(species.flags & NO_SLIP) - return - - if(stat) - prob_slip = 0 // Changing this to zero to make it line up with the comment, and also, make more sense. - - //Do we have magboots or such on if so no slip - if(istype(shoes, /obj/item/clothing/shoes/magboots) && (shoes.flags & NOSLIP)) - prob_slip = 0 +/mob/living/carbon/human/slip_chance(var/prob_slip = 5) + if(!..()) + return 0 //Check hands and mod slip if(!l_hand) prob_slip -= 2 @@ -113,5 +107,11 @@ if (!r_hand) prob_slip -= 2 else if(r_hand.w_class <= 2) prob_slip -= 1 - prob_slip = round(prob_slip) - return(prob_slip) + return prob_slip + +/mob/living/carbon/human/Check_Shoegrip() + if(species.flags & NO_SLIP) + return 1 + if(shoes && (shoes.item_flags & NOSLIP) && istype(shoes, /obj/item/clothing/shoes/magboots)) //magboots + dense_object = no floating + return 1 + return 0 diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 123aa684c5f..051749edde4 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -43,7 +43,7 @@ E.process() number_wounds += E.number_wounds - if (!lying && world.time - l_move_time < 15) + if (!lying && !buckled && world.time - l_move_time < 15) //Moving around with fractured ribs won't do you any good if (E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15)) var/obj/item/organ/I = pick(E.internal_organs) @@ -172,4 +172,9 @@ //New are added for reagents to random organs. for(var/datum/reagent/A in reagents.reagent_list) var/obj/item/organ/O = pick(organs) - O.trace_chemicals[A.name] = 100 \ No newline at end of file + O.trace_chemicals[A.name] = 100 + +/mob/living/carbon/human/proc/sync_organ_dna() + var/list/all_bits = internal_organs|organs + for(var/obj/item/organ/O in all_bits) + O.set_dna(dna) diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index 9cd765bab26..56b0849b884 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -1,6 +1,10 @@ /mob/living/carbon/human/dummy real_name = "Test Dummy" status_flags = GODMODE|CANPUSH + +/mob/living/carbon/human/resomi/New(var/new_loc) + h_style = "Resomi Plumage" + ..(new_loc, "Resomi") /mob/living/carbon/human/skrell/New(var/new_loc) h_style = "Skrell Male Tentacles" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 2c9d56d1773..dc300db1379 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -113,19 +113,12 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_glasses() else if (W == head) head = null - - var/update_hair = 0 - if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR)) - update_hair = 1 - else if(istype(W, /obj/item)) + if(istype(W, /obj/item)) var/obj/item/I = W - if(I.flags_inv & HIDEMASK) - update_hair = 1 - if(update_hair) - update_hair(0) //rebuild hair - update_inv_ears(0) - update_inv_wear_mask(0) - + if(I.flags_inv & (HIDEMASK|BLOCKHAIR|BLOCKHEADHAIR)) + update_hair(0) //rebuild hair + update_inv_ears(0) + update_inv_wear_mask(0) update_inv_head() else if (W == l_ear) l_ear = null @@ -141,9 +134,11 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_belt() else if (W == wear_mask) wear_mask = null - if((W.flags & BLOCKHAIR) || (W.flags & BLOCKHEADHAIR)) - update_hair(0) //rebuild hair - update_inv_ears(0) + if(istype(W, /obj/item)) + var/obj/item/I = W + if(I.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR)) + update_hair(0) //rebuild hair + update_inv_ears(0) if(internal) if(internals) internals.icon_state = "internal0" @@ -194,8 +189,7 @@ This saves us from having to call add_fingerprint() any time something is put in if(!istype(W)) return if(!has_organ_for_slot(slot)) return if(!species || !species.hud || !(slot in species.hud.equip_slots)) return - W.loc = src - + W.forceMove(src) switch(slot) if(slot_back) src.back = W @@ -203,7 +197,7 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_back(redraw_mob) if(slot_wear_mask) src.wear_mask = W - if((wear_mask.flags & BLOCKHAIR) || (wear_mask.flags & BLOCKHEADHAIR)) + if(wear_mask.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR)) update_hair(redraw_mob) //rebuild hair update_inv_ears(0) W.equipped(src, slot) @@ -235,7 +229,7 @@ This saves us from having to call add_fingerprint() any time something is put in src.l_ear = W if(l_ear.slot_flags & SLOT_TWOEARS) var/obj/item/clothing/ears/offear/O = new(W) - O.loc = src + O.forceMove(src) src.r_ear = O O.layer = 20 W.equipped(src, slot) @@ -244,7 +238,7 @@ This saves us from having to call add_fingerprint() any time something is put in src.r_ear = W if(r_ear.slot_flags & SLOT_TWOEARS) var/obj/item/clothing/ears/offear/O = new(W) - O.loc = src + O.forceMove(src) src.l_ear = O O.layer = 20 W.equipped(src, slot) @@ -259,7 +253,7 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_gloves(redraw_mob) if(slot_head) src.head = W - if((head.flags & BLOCKHAIR) || (head.flags & BLOCKHEADHAIR) || (head.flags_inv & HIDEMASK)) + if(head.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR|HIDEMASK)) update_hair(redraw_mob) //rebuild hair update_inv_ears(0) update_inv_wear_mask(0) @@ -296,12 +290,12 @@ This saves us from having to call add_fingerprint() any time something is put in if(slot_in_backpack) if(src.get_active_hand() == W) src.remove_from_mob(W) - W.loc = src.back + W.forceMove(src.back) if(slot_tie) var/obj/item/clothing/under/uniform = src.w_uniform uniform.attackby(W,src) else - src << "\red You are trying to equip this item to an unsupported inventory slot. How the heck did you manage that? Stop it..." + src << "You are trying to eqip this item to an unsupported inventory slot. If possible, please write a ticket with steps to reproduce. Slot was: [slot]" return if((W == src.l_hand) && (slot != slot_l_hand)) @@ -313,6 +307,9 @@ This saves us from having to call add_fingerprint() any time something is put in W.layer = 20 + if(W.action_button_name) + update_action_buttons() + return 1 //Checks if a given slot can be accessed at this time, either to equip or unequip I @@ -323,17 +320,16 @@ This saves us from having to call add_fingerprint() any time something is put in switch(slot) if(slot_wear_mask) covering = src.head - check_flags = HEADCOVERSMOUTH + check_flags = FACE if(slot_glasses) covering = src.head - check_flags = HEADCOVERSEYES + check_flags = EYES 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 + if(covering && (covering.body_parts_covered & (I.body_parts_covered|check_flags))) + user << "\The [covering] is in the way." + return 0 return 1 /mob/living/carbon/human/get_equipped_item(var/slot) @@ -358,3 +354,30 @@ This saves us from having to call add_fingerprint() any time something is put in if(slot_l_ear) return l_ear if(slot_r_ear) return r_ear return ..() + +/mob/living/carbon/human/get_equipped_items(var/include_carried = 0) + var/list/items = new/list() + + if(back) items += back + if(belt) items += belt + if(l_ear) items += l_ear + if(r_ear) items += r_ear + if(glasses) items += glasses + if(gloves) items += gloves + if(head) items += head + if(shoes) items += shoes + if(wear_id) items += wear_id + if(wear_mask) items += wear_mask + if(wear_suit) items += wear_suit + if(w_uniform) items += w_uniform + + if(include_carried) + if(slot_l_hand) items += l_hand + if(slot_r_hand) items += r_hand + if(slot_l_store) items += l_store + if(slot_r_store) items += r_store + if(slot_legcuffed) items += legcuffed + if(slot_handcuffed) items += handcuffed + if(slot_s_store) items += s_store + + return items diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index b0df23ae76c..6514c219323 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -35,32 +35,27 @@ var/global/list/overlays_cache = null /mob/living/carbon/human/Life() - - set invisibility = 0 - set background = 1 + set background = BACKGROUND_ENABLED - if (monkeyizing) return - if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE + if (transforming) + return - ..() - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - blinded = null fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. //TODO: seperate this out // update the current life tick, can be used to e.g. only do something every 4 ticks life_tick++ - var/datum/gas_mixture/environment = loc.return_air() + // This is not an ideal place for this but it will do for now. + if(wearing_rig && wearing_rig.offline) + wearing_rig = null in_stasis = istype(loc, /obj/structure/closet/body_bag/cryobag) && loc:opened == 0 if(in_stasis) loc:used++ + ..() + if(life_tick%30==5)//Makes huds update every 10 seconds instead of every 30 seconds hud_updateflag = 1022 @@ -68,24 +63,11 @@ //No need to update all of these procs if the guy is dead. if(stat != DEAD && !in_stasis) - if(air_master.current_cycle%4==2 || failed_last_breath || (health <= config.health_threshold_crit)) //First, resolve location and get a breath - breathe() //Only try to take a breath every 4 ticks, unless suffocating - //Updates the number of stored chemicals for powers handle_changeling() - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - //Disabilities - handle_disabilities() - //Organs and blood handle_organs() - handle_blood() stabilize_body_temperature() //Body temperature adjusts itself (self-regulation) //Random events (vomiting etc) @@ -113,32 +95,26 @@ handle_stasis_bag() - if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle + if(!handle_some_updates()) return //We go ahead and process them 5 times for HUD images and other stuff though. - //Handle temperature/pressure differences between body and environment - handle_environment(environment) //Optimized a good bit. - - //Check if we're on fire - handle_fire() - - //Status updates, death etc. - handle_regular_status_updates() //Optimized a bit - update_canmove() - //Update our name based on whether our face is obscured/disfigured name = get_visible_name() - handle_regular_hud_updates() - pulse = handle_pulse() - // Grabbing - for(var/obj/item/weapon/grab/G in src) - G.process() - if(mind && mind.vampire) handle_vampire() + +/mob/living/carbon/human/proc/handle_some_updates() + if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle + return 0 + return 1 + +/mob/living/carbon/human/breathe() + if(!in_stasis) + ..() + // Calculate how vulnerable the human is to under- and overpressure. // Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%). // Suitdamage can modifiy this in 10% steps. @@ -146,7 +122,7 @@ var/pressure_adjustment_coefficient = 1 // Assume no protection at first. - if(wear_suit && (wear_suit.flags & STOPPRESSUREDAMAGE) && head && (head.flags & STOPPRESSUREDAMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed. + if(wear_suit && (wear_suit.item_flags & STOPPRESSUREDAMAGE) && head && (head.item_flags & STOPPRESSUREDAMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed. pressure_adjustment_coefficient = 0 // Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure protection. @@ -186,105 +162,141 @@ else return ONE_ATMOSPHERE + pressure_difference -/mob/living/carbon/human - proc/handle_disabilities() - if (disabilities & EPILEPSY) - if ((prob(1) && paralysis < 1)) - src << "\red You have a seizure!" - for(var/mob/O in viewers(src, null)) - if(O == src) - continue - O.show_message(text("\red [src] starts having a seizure!"), 1) - Paralyse(10) - make_jittery(1000) - if (disabilities & COUGHING) - if ((prob(5) && paralysis <= 1)) - drop_item() - spawn( 0 ) - emote("cough") - return - if (disabilities & TOURETTES) - speech_problem_flag = 1 - if ((prob(10) && paralysis <= 1)) - Stun(10) - spawn( 0 ) - switch(rand(1, 3)) - if(1) - emote("twitch") - if(2 to 3) - say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") - var/old_x = pixel_x - var/old_y = pixel_y - pixel_x += rand(-2,2) - pixel_y += rand(-1,1) - sleep(2) - pixel_x = old_x - pixel_y = old_y - return - if (disabilities & NERVOUS) - speech_problem_flag = 1 - if (prob(10)) - stuttering = max(10, stuttering) - // No. -- cib - /*if (getBrainLoss() >= 60 && stat != 2) - if (prob(3)) - switch(pick(1,2,3)) +/mob/living/carbon/human/handle_disabilities() + ..() + //Vision + var/obj/item/organ/vision + if(species.vision_organ) + vision = internal_organs_by_name[species.vision_organ] + + if(!vision) // Presumably if a species has no vision organs, they see via some other means. + eye_blind = 0 + blinded = 0 + eye_blurry = 0 + else if(vision.is_broken()) // Vision organs cut out or broken? Permablind. + eye_blind = 1 + blinded = 1 + eye_blurry = 1 + else + //blindness + if(!(sdisabilities & BLIND)) + if(equipment_tint_total >= TINT_BLIND) // Covered eyes, heal faster + eye_blurry = max(eye_blurry-2, 0) + + if (disabilities & EPILEPSY) + if ((prob(1) && paralysis < 1)) + src << "\red You have a seizure!" + for(var/mob/O in viewers(src, null)) + if(O == src) + continue + O.show_message(text("[src] starts having a seizure!"), 1) + Paralyse(10) + make_jittery(1000) + if (disabilities & COUGHING) + if ((prob(5) && paralysis <= 1)) + drop_item() + spawn( 0 ) + emote("cough") + return + if (disabilities & TOURETTES) + speech_problem_flag = 1 + if ((prob(10) && paralysis <= 1)) + Stun(10) + spawn( 0 ) + switch(rand(1, 3)) if(1) - say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that meatball traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#")) - if(2) - say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!")) - if(3) - emote("drool") - */ + emote("twitch") + if(2 to 3) + say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") + var/old_x = pixel_x + var/old_y = pixel_y + pixel_x += rand(-2,2) + pixel_y += rand(-1,1) + sleep(2) + pixel_x = old_x + pixel_y = old_y + return + if (disabilities & NERVOUS) + speech_problem_flag = 1 + if (prob(10)) + stuttering = max(10, stuttering) + // No. -- cib + /*if (getBrainLoss() >= 60 && stat != 2) + if (prob(3)) + switch(pick(1,2,3)) + if(1) + say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that meatball traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#")) + if(2) + say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!")) + if(3) + emote("drool") + */ - if(stat != 2) - var/rn = rand(0, 200) - if(getBrainLoss() >= 5) - if(0 <= rn && rn <= 3) - custom_pain("Your head feels numb and painful.") - if(getBrainLoss() >= 15) - if(4 <= rn && rn <= 6) if(eye_blurry <= 0) - src << "\red It becomes hard to see for some reason." - eye_blurry = 10 - if(getBrainLoss() >= 35) - if(7 <= rn && rn <= 9) if(get_active_hand()) - src << "\red Your hand won't respond properly, you drop what you're holding." - drop_item() - if(getBrainLoss() >= 50) - if(10 <= rn && rn <= 12) if(!lying) - src << "\red Your legs won't respond properly, you fall down." - resting = 1 + if(stat != DEAD) + var/rn = rand(0, 200) + if(getBrainLoss() >= 5) + if(0 <= rn && rn <= 3) + custom_pain("Your head feels numb and painful.") + if(getBrainLoss() >= 15) + if(4 <= rn && rn <= 6) if(eye_blurry <= 0) + src << "It becomes hard to see for some reason." + eye_blurry = 10 + if(getBrainLoss() >= 35) + if(7 <= rn && rn <= 9) if(get_active_hand()) + src << "Your hand won't respond properly, you drop what you're holding!" + drop_item() + if(getBrainLoss() >= 45) + if(10 <= rn && rn <= 12) + if(prob(50)) + src << "You suddenly black out!" + Paralyse(10) + else if(!lying) + src << "Your legs won't respond properly, you fall down!" + Weaken(10) - proc/handle_stasis_bag() - // Handle side effects from stasis bag - if(in_stasis) - // First off, there's no oxygen supply, so the mob will slowly take brain damage - adjustBrainLoss(0.1) +/mob/living/carbon/human/proc/handle_stasis_bag() + // Handle side effects from stasis bag + if(in_stasis) + // First off, there's no oxygen supply, so the mob will slowly take brain damage + adjustBrainLoss(0.1) - // Next, the method to induce stasis has some adverse side-effects, manifesting - // as cloneloss - adjustCloneLoss(0.1) + // Next, the method to induce stasis has some adverse side-effects, manifesting + // as cloneloss + adjustCloneLoss(0.1) - proc/handle_mutations_and_radiation() +/mob/living/carbon/human/handle_mutations_and_radiation() + if(in_stasis) + return - if(species.flags & IS_SYNTHETIC || species.name == "Vaurca") //Robots & bugs don't suffer from mutations or radloss. + if(getFireLoss()) + if((COLD_RESISTANCE in mutations) || (prob(1))) + heal_organ_damage(0,1) + + // DNA2 - Gene processing. + // The HULK stuff that was here is now in the hulk gene. + for(var/datum/dna/gene/gene in dna_genes) + if(!gene.block) + continue + if(gene.is_active(src)) + speech_problem_flag = 1 + gene.OnMobLife(src) + + radiation = Clamp(radiation,0,100) + + // #TODO-MERGE: Check vaurca and IPC radiation management + if (radiation) + var/obj/item/organ/diona/nutrients/rad_organ = locate() in internal_organs + if(rad_organ && !rad_organ.is_broken()) + var/rads = radiation/25 + radiation -= rads + nutrition += rads + adjustBruteLoss(-(rads)) + adjustFireLoss(-(rads)) + adjustOxyLoss(-(rads)) + adjustToxLoss(-(rads)) + updatehealth() return - if(getFireLoss()) - if((COLD_RESISTANCE in mutations) || (prob(1))) - heal_organ_damage(0,1) - - // DNA2 - Gene processing. - // The HULK stuff that was here is now in the hulk gene. - for(var/datum/dna/gene/gene in dna_genes) - if(!gene.block) - continue - if(gene.is_active(src)) - speech_problem_flag = 1 - gene.OnMobLife(src) - - radiation = Clamp(radiation,0,100) - if (radiation) //var/obj/item/organ/diona/nutrients/rad_organ = locate() in internal_organs if(src.is_diona()) @@ -330,633 +342,679 @@ /** breathing **/ - handle_chemical_smoke(var/datum/gas_mixture/environment) - if(wear_mask && (wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)) - return - if(glasses && (glasses.flags & BLOCK_GAS_SMOKE_EFFECT)) - return - if(head && (head.flags & BLOCK_GAS_SMOKE_EFFECT)) - return - ..() +/mob/living/carbon/human/handle_chemical_smoke(var/datum/gas_mixture/environment) + if(wear_mask && (wear_mask.item_flags & BLOCK_GAS_SMOKE_EFFECT)) + return + if(glasses && (glasses.item_flags & BLOCK_GAS_SMOKE_EFFECT)) + return + if(head && (head.item_flags & BLOCK_GAS_SMOKE_EFFECT)) + return + ..() - handle_post_breath(datum/gas_mixture/breath) - ..() - //spread some viruses while we are at it - if(breath && virus2.len > 0 && prob(10)) - for(var/mob/living/carbon/M in view(1,src)) - src.spread_disease_to(M) +/mob/living/carbon/human/handle_post_breath(datum/gas_mixture/breath) + ..() + //spread some viruses while we are at it + if(breath && virus2.len > 0 && prob(10)) + for(var/mob/living/carbon/M in view(1,src)) + src.spread_disease_to(M) - get_breath_from_internal(volume_needed=BREATH_VOLUME) +/mob/living/carbon/human/get_breath_from_internal(volume_needed=BREATH_VOLUME) + if(internal) + + var/obj/item/weapon/tank/rig_supply + if(istype(back,/obj/item/weapon/rig)) + var/obj/item/weapon/rig/rig = back + if(!rig.offline && (rig.air_supply && internal == rig.air_supply)) + rig_supply = rig.air_supply + + if (!rig_supply && (!contents.Find(internal) || !((wear_mask && (wear_mask.item_flags & AIRTIGHT)) || (head && (head.item_flags & AIRTIGHT))))) + internal = null + if(internal) + return internal.remove_air_volume(volume_needed) + else if(internals) + internals.icon_state = "internal0" + return null - var/obj/item/weapon/tank/rig_supply - if(istype(back,/obj/item/weapon/rig)) - var/obj/item/weapon/rig/rig = back - if(!rig.offline && (rig.air_supply && internal == rig.air_supply)) - rig_supply = rig.air_supply +/mob/living/carbon/human/get_breath_from_environment(var/volume_needed=BREATH_VOLUME) + var/datum/gas_mixture/breath = ..() - if (!rig_supply && (!contents.Find(internal) || !((wear_mask && (wear_mask.flags & AIRTIGHT)) || (head && (head.flags & AIRTIGHT))))) - internal = null + if(breath) + //exposure to extreme pressures can rupture lungs + var/check_pressure = breath.return_pressure() + if(check_pressure < ONE_ATMOSPHERE / 5 || check_pressure > ONE_ATMOSPHERE * 5) + if(!is_lung_ruptured() && prob(5)) + rupture_lung() - if(internal) - return internal.remove_air_volume(volume_needed) - else if(internals) - internals.icon_state = "internal0" - return null - - get_breath_from_environment(var/volume_needed=BREATH_VOLUME) - var/datum/gas_mixture/breath = ..() - - if(breath) - //exposure to extreme pressures can rupture lungs - var/check_pressure = breath.return_pressure() - if(check_pressure < ONE_ATMOSPHERE / 5 || check_pressure > ONE_ATMOSPHERE * 5) - if(!is_lung_ruptured() && prob(5)) - rupture_lung() - - return breath - - handle_breath(datum/gas_mixture/breath) - - if(status_flags & GODMODE) - return - - //check if we actually need to process breath - if(!breath || (breath.total_moles == 0) || suiciding) - failed_last_breath = 1 - if(suiciding) - adjustOxyLoss(2)//If you are suiciding, you should die a little bit faster - oxygen_alert = max(oxygen_alert, 1) - return 0 - if(health > config.health_threshold_crit) - adjustOxyLoss(HUMAN_MAX_OXYLOSS) - else - adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - - oxygen_alert = max(oxygen_alert, 1) - - return 0 - - var/safe_pressure_min = species.breath_pressure // Minimum safe partial pressure of breathable gas in kPa - - // Lung damage increases the minimum safe pressure. - if(species.has_organ["lungs"]) - var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"] - if(isnull(L)) - safe_pressure_min = INFINITY //No lungs, how are you breathing? - else if(L.is_broken()) - safe_pressure_min *= 1.5 - else if(L.is_bruised()) - safe_pressure_min *= 1.25 - - if(species.has_organ["breathing apparatus"]) - var/obj/item/organ/vaurca/breathingapparatus/L = internal_organs_by_name["breathing apparatus"] - if(isnull(L)) - safe_pressure_min = INFINITY //No wannabe-lungs, how are you breathing? FOR VAURCA - else if(L.is_broken()) - safe_pressure_min *= 1.5 - else if(L.is_bruised()) - safe_pressure_min *= 1.25 - - var/safe_exhaled_max = 10 - var/safe_toxins_max = 0.2 - var/SA_para_min = 1 - var/SA_sleep_min = 5 - var/inhaled_gas_used = 0 - - var/breath_pressure = (breath.total_moles*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - - var/inhaling - var/poison - var/exhaling - - var/breath_type - var/poison_type - var/exhale_type - - var/failed_inhale = 0 - var/failed_exhale = 0 - - if(species.has_organ["filtration bit"] && src.get_species() == "Vaurca") - var/obj/item/organ/vaurca/filtrationbit/F = internal_organs_by_name["filtration bit"] - if(isnull(F)) - poison_type = "oxygen" //if Vaurca does not have filter, oxygen becomes poisonous - - else if(F.is_broken()) - poison_type = "oxygen" //if Vaurca filter breaks, oxygen becomes poisonous. - - else - poison_type = "null" - - else - if(species.poison_type) - poison_type = species.poison_type - else - poison_type = "phoron" - - poison = breath.gas[poison_type] - - if(species.breath_type) - breath_type = species.breath_type - else - breath_type = "oxygen" - inhaling = breath.gas[breath_type] - - if(species.exhale_type) - exhale_type = species.exhale_type - exhaling = breath.gas[exhale_type] - else - exhaling = 0 - - var/inhale_pp = (inhaling/breath.total_moles)*breath_pressure - var/toxins_pp = (poison/breath.total_moles)*breath_pressure - var/exhaled_pp = (exhaling/breath.total_moles)*breath_pressure - - // Not enough to breathe - if(inhale_pp < safe_pressure_min) - if(prob(20)) - spawn(0) emote("gasp") - - var/ratio = inhale_pp/safe_pressure_min - // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) - adjustOxyLoss(max(HUMAN_MAX_OXYLOSS*(1-ratio), 0)) - failed_inhale = 1 - - oxygen_alert = max(oxygen_alert, 1) - else - // We're in safe limits - oxygen_alert = 0 - - inhaled_gas_used = inhaling/6 - - breath.adjust_gas(breath_type, -inhaled_gas_used, update = 0) //update afterwards - - if(exhale_type) - breath.adjust_gas_temp(exhale_type, inhaled_gas_used, bodytemperature, update = 0) //update afterwards - - // Too much exhaled gas in the air - if(exhaled_pp > safe_exhaled_max) - if (!co2_alert|| prob(15)) - var/word = pick("extremely dizzy","short of breath","faint","confused") - src << "You feel [word]." - - adjustOxyLoss(HUMAN_MAX_OXYLOSS) - co2_alert = 1 - failed_exhale = 1 - - else if(exhaled_pp > safe_exhaled_max * 0.7) - if (!co2_alert || prob(1)) - var/word = pick("dizzy","short of breath","faint","momentarily confused") - src << " safe_exhaled_max * 0.6) - if (prob(0.3)) - var/word = pick("a little dizzy","short of breath") - src << " SA_para_min) - - // 3 gives them one second to wake up and run away a bit! - Paralyse(3) - - // Enough to make us sleep as well - if(SA_pp > SA_sleep_min) - Sleeping(5) - - // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning - else if(SA_pp > 0.15) - if(prob(20)) - spawn(0) emote(pick("giggle", "laugh")) - breath.adjust_gas("sleeping_agent", -breath.gas["sleeping_agent"]/6, update = 0) //update after - - // Were we able to breathe? - if (failed_inhale || failed_exhale) - failed_last_breath = 1 - else - failed_last_breath = 0 - adjustOxyLoss(-3) - - - - - // Hot air hurts :( - if((breath.temperature < species.cold_level_1 || breath.temperature > species.heat_level_1) && !(COLD_RESISTANCE in mutations)) - - if(breath.temperature <= species.cold_level_1) - if(prob(20)) - src << "You feel your face freezing and icicles forming in your lungs!" - else if(breath.temperature >= species.heat_level_1) - if(prob(20)) - src << "You feel your face burning and a searing heat in your lungs!" - - if(breath.temperature >= species.heat_level_1) - if(breath.temperature < species.heat_level_2) - apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat") - fire_alert = max(fire_alert, 2) - else if(breath.temperature < species.heat_level_3) - apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat") - fire_alert = max(fire_alert, 2) - else - apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") - fire_alert = max(fire_alert, 2) - - else if(breath.temperature <= species.cold_level_1) - if(breath.temperature > species.cold_level_2) - apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold") - fire_alert = max(fire_alert, 1) - else if(breath.temperature > species.cold_level_3) - apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold") - fire_alert = max(fire_alert, 1) - else - apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") - fire_alert = max(fire_alert, 1) - - - //breathing in hot/cold air also heats/cools you a bit - var/temp_adj = breath.temperature - bodytemperature - if (temp_adj < 0) - temp_adj /= (BODYTEMP_COLD_DIVISOR * 5) //don't raise temperature as much as if we were directly exposed - else - temp_adj /= (BODYTEMP_HEAT_DIVISOR * 5) //don't raise temperature as much as if we were directly exposed - - var/relative_density = breath.total_moles / (MOLES_CELLSTANDARD * BREATH_PERCENTAGE) - temp_adj *= relative_density - - if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX - if (temp_adj < BODYTEMP_COOLING_MAX) temp_adj = BODYTEMP_COOLING_MAX - //world << "Breath: [breath.temperature], [src]: [bodytemperature], Adjusting: [temp_adj]" - bodytemperature += temp_adj - - else if(breath.temperature >= species.heat_discomfort_level) - species.get_environment_discomfort(src,"heat") - else if(breath.temperature <= species.cold_discomfort_level) - species.get_environment_discomfort(src,"cold") - - breath.update_values() - return 1 - - proc/handle_environment(datum/gas_mixture/environment) - - if(!environment) - return - - //Stuff like the xenomorph's plasma regen happens here. - species.handle_environment_special(src) - - //Moved pressure calculations here for use in skip-processing check. - var/pressure = environment.return_pressure() - var/adjusted_pressure = calculate_affecting_pressure(pressure) - - if (is_diona()) - diona_handle_air(get_dionastats(), pressure) - - //Check for contaminants before anything else because we don't want to skip it. - for(var/g in environment.gas) - if(gas_data.flags[g] & XGM_GAS_CONTAMINANT && environment.gas[g] > gas_data.overlay_limit[g] + 1) - pl_effects() - break - - if(!istype(get_turf(src), /turf/space)) //space is not meant to change your body temperature. - var/loc_temp = T0C - if(istype(loc, /obj/mecha)) - var/obj/mecha/M = loc - loc_temp = M.return_temperature() - else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) - loc_temp = loc:air_contents.temperature - else - loc_temp = environment.temperature - - if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1) - pressure_alert = 0 - return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp - - //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection - var/temp_adj = 0 - if(loc_temp < bodytemperature) //Place is colder than we are - var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. - if(thermal_protection < 1) - temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR) //this will be negative - else if (loc_temp > bodytemperature) //Place is hotter than we are - var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. - if(thermal_protection < 1) - temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR) - - //Use heat transfer as proportional to the gas density. However, we only care about the relative density vs standard 101 kPa/20 C air. Therefore we can use mole ratios - var/relative_density = environment.total_moles / MOLES_CELLSTANDARD - bodytemperature += between(BODYTEMP_COOLING_MAX, temp_adj*relative_density, BODYTEMP_HEATING_MAX) - - // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. - if(bodytemperature >= species.heat_level_1) - //Body temperature is too hot. - fire_alert = max(fire_alert, 1) - if(status_flags & GODMODE) return 1 //godmode - - if(bodytemperature < species.heat_level_2) - take_overall_damage(burn=HEAT_DAMAGE_LEVEL_1, used_weapon = "High Body Temperature") - fire_alert = max(fire_alert, 2) - else if(bodytemperature < species.heat_level_3) - take_overall_damage(burn=HEAT_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature") - fire_alert = max(fire_alert, 2) - else - take_overall_damage(burn=HEAT_DAMAGE_LEVEL_3, used_weapon = "High Body Temperature") - fire_alert = max(fire_alert, 2) - - else if(bodytemperature <= species.cold_level_1) - fire_alert = max(fire_alert, 1) - if(status_flags & GODMODE) return 1 //godmode - - if (is_diona() == DIONA_WORKER) - diona_contained_cold_damage() - - if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell) || is_diona()) - if(bodytemperature > species.cold_level_2) - take_overall_damage(burn=COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature") - fire_alert = max(fire_alert, 1) - else if(bodytemperature > species.cold_level_3) - take_overall_damage(burn=COLD_DAMAGE_LEVEL_2, used_weapon = "Low Body Temperature") - fire_alert = max(fire_alert, 1) - else - take_overall_damage(burn=COLD_DAMAGE_LEVEL_3, used_weapon = "Low Body Temperature") - fire_alert = max(fire_alert, 1) - - - - // Account for massive pressure differences. Done by Polymorph - // Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense! - if(status_flags & GODMODE) return 1 //godmode - - if(adjusted_pressure >= species.hazard_high_pressure) - var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) - take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure") - pressure_alert = 2 - else if(adjusted_pressure >= species.warning_high_pressure) - pressure_alert = 1 - else if(adjusted_pressure >= species.warning_low_pressure) - pressure_alert = 0 - else if(adjusted_pressure >= species.hazard_low_pressure) - pressure_alert = -1 - else - if( !(COLD_RESISTANCE in mutations)) - take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") - if(getOxyLoss() < 55) // 11 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute - adjustOxyLoss(4) // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, roughly twenty seconds - pressure_alert = -2 - else - pressure_alert = -1 - - if (is_diona()) - diona_handle_temperature(DS) + return breath +/mob/living/carbon/human/handle_breath(datum/gas_mixture/breath) + if(status_flags & GODMODE) return - proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 + //exposure to extreme pressures can rupture lungs + if(breath && (breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5)) + if(!is_lung_ruptured() && prob(5)) + rupture_lung() + + //check if we actually need to process breath + if(!breath || (breath.total_moles == 0)) + failed_last_breath = 1 + if(health > config.health_threshold_crit) + adjustOxyLoss(HUMAN_MAX_OXYLOSS) else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change + adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - proc/stabilize_body_temperature() - if (species.flags & IS_SYNTHETIC) - bodytemperature += species.synth_temp_gain //just keep putting out heat. - return + oxygen_alert = max(oxygen_alert, 1) + return 0 - var/body_temperature_difference = species.body_temperature - bodytemperature + var/safe_pressure_min = species.breath_pressure // Minimum safe partial pressure of breathable gas in kPa - if (abs(body_temperature_difference) < 0.5) - return //fuck this precision - if (on_fire) - return //too busy for pesky convection + // Lung damage increases the minimum safe pressure. + var/handle_lungs = 0 + var/obj/item/organ/L = null + if(species.has_organ["lungs"] || species.has_organ["breathing apparatus"]) + L = internal_organs_by_name["lungs"] + handle_lungs = 1 + else if(species.has_organ["breathing apparatus"]) + L = internal_organs_by_name["breathing apparatus"] + handle_lungs = 1 - if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects. - if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. - nutrition -= 2 - var/recovery_amt = max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) - //world << "Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]" + if (handle_lungs) + if(isnull(L)) + safe_pressure_min = INFINITY //No lungs, how are you breathing? + else if(L.is_broken()) + safe_pressure_min *= 1.5 + else if(L.is_bruised()) + safe_pressure_min *= 1.25 + + var/safe_exhaled_max = 10 + var/safe_toxins_max = 0.2 + var/SA_para_min = 1 + var/SA_sleep_min = 5 + var/inhaled_gas_used = 0 + + var/breath_pressure = (breath.total_moles*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + + var/inhaling + var/poison + var/exhaling + + var/breath_type + var/poison_type + var/exhale_type + + var/failed_inhale = 0 + var/failed_exhale = 0 + + if(species.breath_type) + breath_type = species.breath_type + else + breath_type = "oxygen" + + inhaling = breath.gas[breath_type] + + if(species.has_organ["filtration bit"] && src.get_species() == "Vaurca") + var/obj/item/organ/vaurca/filtrationbit/F = internal_organs_by_name["filtration bit"] + if(isnull(F)) + poison_type = "oxygen" //if Vaurca does not have filter, oxygen becomes poisonous + else if(F.is_broken()) + poison_type = "oxygen" //if Vaurca filter breaks, oxygen becomes poisonous. + else + poison_type = "null" + else + if(species.poison_type) + poison_type = species.poison_type + else + poison_type = "phoron" + poison = breath.gas[poison_type] + + if(species.exhale_type) + exhale_type = species.exhale_type + exhaling = breath.gas[exhale_type] + else + exhaling = 0 + + var/inhale_pp = (inhaling/breath.total_moles)*breath_pressure + var/toxins_pp = (poison/breath.total_moles)*breath_pressure + var/exhaled_pp = (exhaling/breath.total_moles)*breath_pressure + + // Not enough to breathe + if(inhale_pp < safe_pressure_min) + if(prob(20)) + spawn(0) emote("gasp") + + var/ratio = inhale_pp/safe_pressure_min + // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!) + adjustOxyLoss(max(HUMAN_MAX_OXYLOSS*(1-ratio), 0)) + failed_inhale = 1 + + oxygen_alert = max(oxygen_alert, 1) + else + // We're in safe limits + oxygen_alert = 0 + + inhaled_gas_used = inhaling/6 + + breath.adjust_gas(breath_type, -inhaled_gas_used, update = 0) //update afterwards + + if(exhale_type) + breath.adjust_gas_temp(exhale_type, inhaled_gas_used, bodytemperature, update = 0) //update afterwards + + // Too much exhaled gas in the air + if(exhaled_pp > safe_exhaled_max) + if (!co2_alert|| prob(15)) + var/word = pick("extremely dizzy","short of breath","faint","confused") + src << "You feel [word]." + + adjustOxyLoss(HUMAN_MAX_OXYLOSS) + co2_alert = 1 + failed_exhale = 1 + + else if(exhaled_pp > safe_exhaled_max * 0.7) + if (!co2_alert || prob(1)) + var/word = pick("dizzy","short of breath","faint","momentarily confused") + src << "You feel [word]." + + //scale linearly from 0 to 1 between safe_exhaled_max and safe_exhaled_max*0.7 + var/ratio = 1.0 - (safe_exhaled_max - exhaled_pp)/(safe_exhaled_max*0.3) + + //give them some oxyloss, up to the limit - we don't want people falling unconcious due to CO2 alone until they're pretty close to safe_exhaled_max. + if (getOxyLoss() < 50*ratio) + adjustOxyLoss(HUMAN_MAX_OXYLOSS) + co2_alert = 1 + failed_exhale = 1 + + else if(exhaled_pp > safe_exhaled_max * 0.6) + if (prob(0.3)) + var/word = pick("a little dizzy","short of breath") + src << "You feel [word]." + + else + co2_alert = 0 + + // Too much poison in the air. + if(toxins_pp > safe_toxins_max) + var/ratio = (poison/safe_toxins_max) * 10 + if(reagents) + reagents.add_reagent("toxin", Clamp(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) + breath.adjust_gas(poison_type, -poison/6, update = 0) //update after + phoron_alert = max(phoron_alert, 1) + else + phoron_alert = 0 + + // If there's some other shit in the air lets deal with it here. + if(breath.gas["sleeping_agent"]) + var/SA_pp = (breath.gas["sleeping_agent"] / breath.total_moles) * breath_pressure + + // Enough to make us paralysed for a bit + if(SA_pp > SA_para_min) + + // 3 gives them one second to wake up and run away a bit! + Paralyse(3) + + // Enough to make us sleep as well + if(SA_pp > SA_sleep_min) + Sleeping(5) + + // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning + else if(SA_pp > 0.15) + if(prob(20)) + spawn(0) emote(pick("giggle", "laugh")) + breath.adjust_gas("sleeping_agent", -breath.gas["sleeping_agent"]/6, update = 0) //update after + + // Were we able to breathe? + if (failed_inhale || failed_exhale) + failed_last_breath = 1 + else + failed_last_breath = 0 + adjustOxyLoss(-5) + + + // Hot air hurts :( + if((breath.temperature < species.cold_level_1 || breath.temperature > species.heat_level_1) && !(COLD_RESISTANCE in mutations)) + + if(breath.temperature <= species.cold_level_1) + if(prob(20)) + src << "You feel your face freezing and icicles forming in your lungs!" + else if(breath.temperature >= species.heat_level_1) + if(prob(20)) + src << "You feel your face burning and a searing heat in your lungs!" + + if(breath.temperature >= species.heat_level_1) + if(breath.temperature < species.heat_level_2) + apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat") + fire_alert = max(fire_alert, 2) + else if(breath.temperature < species.heat_level_3) + apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat") + fire_alert = max(fire_alert, 2) + else + apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") + fire_alert = max(fire_alert, 2) + + else if(breath.temperature <= species.cold_level_1) + if(breath.temperature > species.cold_level_2) + apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold") + fire_alert = max(fire_alert, 1) + else if(breath.temperature > species.cold_level_3) + apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold") + fire_alert = max(fire_alert, 1) + else + apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") + fire_alert = max(fire_alert, 1) + + //breathing in hot/cold air also heats/cools you a bit + var/temp_adj = breath.temperature - bodytemperature + if (temp_adj < 0) + temp_adj /= (BODYTEMP_COLD_DIVISOR * 5) //don't raise temperature as much as if we were directly exposed + else + temp_adj /= (BODYTEMP_HEAT_DIVISOR * 5) //don't raise temperature as much as if we were directly exposed + + var/relative_density = breath.total_moles / (MOLES_CELLSTANDARD * BREATH_PERCENTAGE) + temp_adj *= relative_density + + if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX + if (temp_adj < BODYTEMP_COOLING_MAX) temp_adj = BODYTEMP_COOLING_MAX + //world << "Breath: [breath.temperature], [src]: [bodytemperature], Adjusting: [temp_adj]" + bodytemperature += temp_adj + + else if(breath.temperature >= species.heat_discomfort_level) + species.get_environment_discomfort(src,"heat") + else if(breath.temperature <= species.cold_discomfort_level) + species.get_environment_discomfort(src,"cold") + + breath.update_values() + return 1 + +/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment) + if(!environment) + return + + //Stuff like the xenomorph's plasma regen happens here. + species.handle_environment_special(src) + + //Moved pressure calculations here for use in skip-processing check. + var/pressure = environment.return_pressure() + var/adjusted_pressure = calculate_affecting_pressure(pressure) + + if (is_diona()) + diona_handle_air(get_dionastats(), pressure) + + //Check for contaminants before anything else because we don't want to skip it. + for(var/g in environment.gas) + if(gas_data.flags[g] & XGM_GAS_CONTAMINANT && environment.gas[g] > gas_data.overlay_limit[g] + 1) + pl_effects() + break + + if(istype(get_turf(src), /turf/space)) + //Don't bother if the temperature drop is less than 0.1 anyways. Hopefully BYOND is smart enough to turn this constant expression into a constant + if(bodytemperature > (0.1 * HUMAN_HEAT_CAPACITY/(HUMAN_EXPOSED_SURFACE_AREA*STEFAN_BOLTZMANN_CONSTANT))**(1/4) + COSMIC_RADIATION_TEMPERATURE) + //Thermal radiation into space + var/heat_loss = HUMAN_EXPOSED_SURFACE_AREA * STEFAN_BOLTZMANN_CONSTANT * ((bodytemperature - COSMIC_RADIATION_TEMPERATURE)**4) + var/temperature_loss = heat_loss/HUMAN_HEAT_CAPACITY + bodytemperature -= temperature_loss + else + var/loc_temp = T0C + if(istype(loc, /obj/mecha)) + var/obj/mecha/M = loc + loc_temp = M.return_temperature() + else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) + loc_temp = loc:air_contents.temperature + else + loc_temp = environment.temperature + + if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1) + pressure_alert = 0 + return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp + + //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection (convection) + var/temp_adj = 0 + if(loc_temp < bodytemperature) //Place is colder than we are + var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + if(thermal_protection < 1) + temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR) //this will be negative + else if (loc_temp > bodytemperature) //Place is hotter than we are + var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + if(thermal_protection < 1) + temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR) + + //Use heat transfer as proportional to the gas density. However, we only care about the relative density vs standard 101 kPa/20 C air. Therefore we can use mole ratios + var/relative_density = environment.total_moles / MOLES_CELLSTANDARD + bodytemperature += between(BODYTEMP_COOLING_MAX, temp_adj*relative_density, BODYTEMP_HEATING_MAX) + + // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. + if(bodytemperature >= species.heat_level_1) + //Body temperature is too hot. + fire_alert = max(fire_alert, 1) + if(status_flags & GODMODE) return 1 //godmode + + if(bodytemperature < species.heat_level_2) + take_overall_damage(burn=HEAT_DAMAGE_LEVEL_1, used_weapon = "High Body Temperature") + fire_alert = max(fire_alert, 2) + else if(bodytemperature < species.heat_level_3) + take_overall_damage(burn=HEAT_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature") + fire_alert = max(fire_alert, 2) + else + take_overall_damage(burn=HEAT_DAMAGE_LEVEL_3, used_weapon = "High Body Temperature") + fire_alert = max(fire_alert, 2) + + else if(bodytemperature <= species.cold_level_1) + fire_alert = max(fire_alert, 1) + if(status_flags & GODMODE) return 1 //godmode + + if (is_diona() == DIONA_WORKER) + diona_contained_cold_damage() + + if(status_flags & GODMODE) return 1 //godmode + + if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) + if(bodytemperature > species.cold_level_2) + take_overall_damage(burn=COLD_DAMAGE_LEVEL_1, used_weapon = "High Body Temperature") + fire_alert = max(fire_alert, 1) + else if(bodytemperature > species.cold_level_3) + take_overall_damage(burn=COLD_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature") + fire_alert = max(fire_alert, 1) + else + take_overall_damage(burn=COLD_DAMAGE_LEVEL_3, used_weapon = "High Body Temperature") + fire_alert = max(fire_alert, 1) + + // Account for massive pressure differences. Done by Polymorph + // Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense! + if(status_flags & GODMODE) return 1 //godmode + + if(adjusted_pressure >= species.hazard_high_pressure) + var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) + take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure") + pressure_alert = 2 + else if(adjusted_pressure >= species.warning_high_pressure) + pressure_alert = 1 + else if(adjusted_pressure >= species.warning_low_pressure) + pressure_alert = 0 + else if(adjusted_pressure >= species.hazard_low_pressure) + pressure_alert = -1 + else + if( !(COLD_RESISTANCE in mutations)) + take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") + if(getOxyLoss() < 55) // 11 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute + adjustOxyLoss(4) // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, roughly twenty seconds + pressure_alert = -2 + else + pressure_alert = -1 + + if (is_diona()) + diona_handle_temperature(DS) + + return + +/* +/mob/living/carbon/human/proc/adjust_body_temperature(current, loc_temp, boost) + var/temperature = current + var/difference = abs(current-loc_temp) //get difference + var/increments// = difference/10 //find how many increments apart they are + if(difference > 50) + increments = difference/5 + else + increments = difference/10 + var/change = increments*boost // Get the amount to change by (x per increment) + var/temp_change + if(current < loc_temp) + temperature = min(loc_temp, temperature+change) + else if(current > loc_temp) + temperature = max(loc_temp, temperature-change) + temp_change = (temperature - current) + return temp_change +*/ + +/mob/living/carbon/human/proc/stabilize_body_temperature() + if (species.passive_temp_gain) // We produce heat naturally. + bodytemperature += species.passive_temp_gain + if (species.body_temperature == null) + return //this species doesn't have metabolic thermoregulation + + var/body_temperature_difference = species.body_temperature - bodytemperature + + if (abs(body_temperature_difference) < 0.5) + return //fuck this precision + if (on_fire) + return //too busy for pesky metabolic regulation + + if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects. + if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up. + nutrition -= 2 + var/recovery_amt = max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM) + //world << "Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]" // log_debug("Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]") - bodytemperature += recovery_amt - else if(species.cold_level_1 <= bodytemperature && bodytemperature <= species.heat_level_1) - var/recovery_amt = body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR - //world << "Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]" + bodytemperature += recovery_amt + else if(species.cold_level_1 <= bodytemperature && bodytemperature <= species.heat_level_1) + var/recovery_amt = body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR + //world << "Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]" // log_debug("Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]") - bodytemperature += recovery_amt - else if(bodytemperature > species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects. - //We totally need a sweat system cause it totally makes sense...~ - var/recovery_amt = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers - //world << "Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]" + bodytemperature += recovery_amt + else if(bodytemperature > species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects. + //We totally need a sweat system cause it totally makes sense...~ + var/recovery_amt = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers + //world << "Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]" // log_debug("Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]") - bodytemperature += recovery_amt + bodytemperature += recovery_amt //This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, UPPER_TORSO, LOWER_TORSO, etc. See setup.dm for the full list) - proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. - var/thermal_protection_flags = 0 - //Handle normal clothing - if(head) - if(head.max_heat_protection_temperature && head.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= head.heat_protection - if(wear_suit) - if(wear_suit.max_heat_protection_temperature && wear_suit.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= wear_suit.heat_protection - if(w_uniform) - if(w_uniform.max_heat_protection_temperature && w_uniform.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= w_uniform.heat_protection - if(shoes) - if(shoes.max_heat_protection_temperature && shoes.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= shoes.heat_protection - if(gloves) - if(gloves.max_heat_protection_temperature && gloves.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= gloves.heat_protection - if(wear_mask) - if(wear_mask.max_heat_protection_temperature && wear_mask.max_heat_protection_temperature >= temperature) - thermal_protection_flags |= wear_mask.heat_protection +/mob/living/carbon/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. + var/thermal_protection_flags = 0 + //Handle normal clothing + if(head) + if(head.max_heat_protection_temperature && head.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= head.heat_protection + if(wear_suit) + if(wear_suit.max_heat_protection_temperature && wear_suit.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= wear_suit.heat_protection + if(w_uniform) + if(w_uniform.max_heat_protection_temperature && w_uniform.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= w_uniform.heat_protection + if(shoes) + if(shoes.max_heat_protection_temperature && shoes.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= shoes.heat_protection + if(gloves) + if(gloves.max_heat_protection_temperature && gloves.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= gloves.heat_protection + if(wear_mask) + if(wear_mask.max_heat_protection_temperature && wear_mask.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= wear_mask.heat_protection - return thermal_protection_flags + return thermal_protection_flags - get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. - var/thermal_protection_flags = get_heat_protection_flags(temperature) +/mob/living/carbon/human/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. + var/thermal_protection_flags = get_heat_protection_flags(temperature) - var/thermal_protection = 0.0 - if(thermal_protection_flags) - if(thermal_protection_flags & HEAD) - thermal_protection += THERMAL_PROTECTION_HEAD - if(thermal_protection_flags & UPPER_TORSO) - thermal_protection += THERMAL_PROTECTION_UPPER_TORSO - if(thermal_protection_flags & LOWER_TORSO) - thermal_protection += THERMAL_PROTECTION_LOWER_TORSO - if(thermal_protection_flags & LEG_LEFT) - thermal_protection += THERMAL_PROTECTION_LEG_LEFT - if(thermal_protection_flags & LEG_RIGHT) - thermal_protection += THERMAL_PROTECTION_LEG_RIGHT - if(thermal_protection_flags & FOOT_LEFT) - thermal_protection += THERMAL_PROTECTION_FOOT_LEFT - if(thermal_protection_flags & FOOT_RIGHT) - thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT - if(thermal_protection_flags & ARM_LEFT) - thermal_protection += THERMAL_PROTECTION_ARM_LEFT - if(thermal_protection_flags & ARM_RIGHT) - thermal_protection += THERMAL_PROTECTION_ARM_RIGHT - if(thermal_protection_flags & HAND_LEFT) - thermal_protection += THERMAL_PROTECTION_HAND_LEFT - if(thermal_protection_flags & HAND_RIGHT) - thermal_protection += THERMAL_PROTECTION_HAND_RIGHT + var/thermal_protection = 0.0 + if(thermal_protection_flags) + if(thermal_protection_flags & HEAD) + thermal_protection += THERMAL_PROTECTION_HEAD + if(thermal_protection_flags & UPPER_TORSO) + thermal_protection += THERMAL_PROTECTION_UPPER_TORSO + if(thermal_protection_flags & LOWER_TORSO) + thermal_protection += THERMAL_PROTECTION_LOWER_TORSO + if(thermal_protection_flags & LEG_LEFT) + thermal_protection += THERMAL_PROTECTION_LEG_LEFT + if(thermal_protection_flags & LEG_RIGHT) + thermal_protection += THERMAL_PROTECTION_LEG_RIGHT + if(thermal_protection_flags & FOOT_LEFT) + thermal_protection += THERMAL_PROTECTION_FOOT_LEFT + if(thermal_protection_flags & FOOT_RIGHT) + thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT + if(thermal_protection_flags & ARM_LEFT) + thermal_protection += THERMAL_PROTECTION_ARM_LEFT + if(thermal_protection_flags & ARM_RIGHT) + thermal_protection += THERMAL_PROTECTION_ARM_RIGHT + if(thermal_protection_flags & HAND_LEFT) + thermal_protection += THERMAL_PROTECTION_HAND_LEFT + if(thermal_protection_flags & HAND_RIGHT) + thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return min(1,thermal_protection) - //See proc/get_heat_protection_flags(temperature) for the description of this proc. - proc/get_cold_protection_flags(temperature) - var/thermal_protection_flags = 0 - //Handle normal clothing +//See proc/get_heat_protection_flags(temperature) for the description of this proc. +/mob/living/carbon/human/proc/get_cold_protection_flags(temperature) + var/thermal_protection_flags = 0 + //Handle normal clothing - if(head) - if(head.min_cold_protection_temperature && head.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= head.cold_protection - if(wear_suit) - if(wear_suit.min_cold_protection_temperature && wear_suit.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= wear_suit.cold_protection - if(w_uniform) - if(w_uniform.min_cold_protection_temperature && w_uniform.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= w_uniform.cold_protection - if(shoes) - if(shoes.min_cold_protection_temperature && shoes.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= shoes.cold_protection - if(gloves) - if(gloves.min_cold_protection_temperature && gloves.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= gloves.cold_protection - if(wear_mask) - if(wear_mask.min_cold_protection_temperature && wear_mask.min_cold_protection_temperature <= temperature) - thermal_protection_flags |= wear_mask.cold_protection + if(head) + if(head.min_cold_protection_temperature && head.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= head.cold_protection + if(wear_suit) + if(wear_suit.min_cold_protection_temperature && wear_suit.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= wear_suit.cold_protection + if(w_uniform) + if(w_uniform.min_cold_protection_temperature && w_uniform.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= w_uniform.cold_protection + if(shoes) + if(shoes.min_cold_protection_temperature && shoes.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= shoes.cold_protection + if(gloves) + if(gloves.min_cold_protection_temperature && gloves.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= gloves.cold_protection + if(wear_mask) + if(wear_mask.min_cold_protection_temperature && wear_mask.min_cold_protection_temperature <= temperature) + thermal_protection_flags |= wear_mask.cold_protection - return thermal_protection_flags + return thermal_protection_flags - get_cold_protection(temperature) +/mob/living/carbon/human/get_cold_protection(temperature) + if(COLD_RESISTANCE in mutations) + return 1 //Fully protected from the cold. - if(COLD_RESISTANCE in mutations) - return 1 //Fully protected from the cold. + temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. + var/thermal_protection_flags = get_cold_protection_flags(temperature) - temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. - var/thermal_protection_flags = get_cold_protection_flags(temperature) + var/thermal_protection = 0.0 + if(thermal_protection_flags) + if(thermal_protection_flags & HEAD) + thermal_protection += THERMAL_PROTECTION_HEAD + if(thermal_protection_flags & UPPER_TORSO) + thermal_protection += THERMAL_PROTECTION_UPPER_TORSO + if(thermal_protection_flags & LOWER_TORSO) + thermal_protection += THERMAL_PROTECTION_LOWER_TORSO + if(thermal_protection_flags & LEG_LEFT) + thermal_protection += THERMAL_PROTECTION_LEG_LEFT + if(thermal_protection_flags & LEG_RIGHT) + thermal_protection += THERMAL_PROTECTION_LEG_RIGHT + if(thermal_protection_flags & FOOT_LEFT) + thermal_protection += THERMAL_PROTECTION_FOOT_LEFT + if(thermal_protection_flags & FOOT_RIGHT) + thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT + if(thermal_protection_flags & ARM_LEFT) + thermal_protection += THERMAL_PROTECTION_ARM_LEFT + if(thermal_protection_flags & ARM_RIGHT) + thermal_protection += THERMAL_PROTECTION_ARM_RIGHT + if(thermal_protection_flags & HAND_LEFT) + thermal_protection += THERMAL_PROTECTION_HAND_LEFT + if(thermal_protection_flags & HAND_RIGHT) + thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - var/thermal_protection = 0.0 - if(thermal_protection_flags) - if(thermal_protection_flags & HEAD) - thermal_protection += THERMAL_PROTECTION_HEAD - if(thermal_protection_flags & UPPER_TORSO) - thermal_protection += THERMAL_PROTECTION_UPPER_TORSO - if(thermal_protection_flags & LOWER_TORSO) - thermal_protection += THERMAL_PROTECTION_LOWER_TORSO - if(thermal_protection_flags & LEG_LEFT) - thermal_protection += THERMAL_PROTECTION_LEG_LEFT - if(thermal_protection_flags & LEG_RIGHT) - thermal_protection += THERMAL_PROTECTION_LEG_RIGHT - if(thermal_protection_flags & FOOT_LEFT) - thermal_protection += THERMAL_PROTECTION_FOOT_LEFT - if(thermal_protection_flags & FOOT_RIGHT) - thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT - if(thermal_protection_flags & ARM_LEFT) - thermal_protection += THERMAL_PROTECTION_ARM_LEFT - if(thermal_protection_flags & ARM_RIGHT) - thermal_protection += THERMAL_PROTECTION_ARM_RIGHT - if(thermal_protection_flags & HAND_LEFT) - thermal_protection += THERMAL_PROTECTION_HAND_LEFT - if(thermal_protection_flags & HAND_RIGHT) - thermal_protection += THERMAL_PROTECTION_HAND_RIGHT + return min(1,thermal_protection) - return min(1,thermal_protection) +/mob/living/carbon/human/handle_chemicals_in_body() + if(in_stasis) + return - proc/handle_chemicals_in_body() + if(reagents) + chem_effects.Cut() + analgesic = 0 - if(!(species.flags & IS_SYNTHETIC)) //Synths don't process reagents. - chem_effects.Cut() - analgesic = 0 + if(touching) touching.metabolize() + if(ingested) ingested.metabolize() + if(bloodstr) bloodstr.metabolize() - if(touching) touching.metabolize() - if(ingested) ingested.metabolize() - if(bloodstr) bloodstr.metabolize() + if(CE_PAINKILLER in chem_effects) + analgesic = chem_effects[CE_PAINKILLER] - if(CE_PAINKILLER in chem_effects) - analgesic = chem_effects[CE_PAINKILLER] + var/total_phoronloss = 0 + for(var/obj/item/I in src) + if(I.contaminated) + total_phoronloss += vsc.plc.CONTAMINATION_LOSS + if(!(status_flags & GODMODE)) adjustToxLoss(total_phoronloss) - var/total_phoronloss = 0 - for(var/obj/item/I in src) - if(I.contaminated) - total_phoronloss += vsc.plc.CONTAMINATION_LOSS - if(!(status_flags & GODMODE)) adjustToxLoss(total_phoronloss) + if(status_flags & GODMODE) return 0 //godmode - if (intoxication) - handle_intoxication() - else if (alcohol_clumsy)//This var is defined in intoxication.dm, its set true when alcohol has caused clumsiness - mutations.Remove(CLUMSY) - alcohol_clumsy = 0 + var/obj/item/organ/diona/node/light_organ = locate() in internal_organs + if(light_organ && !light_organ.is_broken()) + var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing + if(isturf(loc)) //else, there's considered to be no light + var/turf/T = loc + var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T + if(L) + light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights + else + light_amount = 5 + nutrition += light_amount + traumatic_shock -= light_amount - if(status_flags & GODMODE) return 0 //godmode + if(species.flags & IS_PLANT) + if(nutrition > 450) + nutrition = 450 + if(light_amount >= 3) //if there's enough light, heal + adjustBruteLoss(-(round(light_amount/2))) + adjustFireLoss(-(round(light_amount/2))) + adjustToxLoss(-(light_amount)) + adjustOxyLoss(-(light_amount)) + //TODO: heal wounds, heal broken limbs. - // nutrition decrease - if (nutrition > 0 && stat != 2) - nutrition = max (0, nutrition - HUNGER_FACTOR) + if(species.light_dam) + var/light_amount = 0 + if(isturf(loc)) + var/turf/T = loc + var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T + if(L) + light_amount = L.lum_r + L.lum_g + L.lum_b //hardcapped so it's not abused by having a ton of flashlights + else + light_amount = 10 + if(light_amount > species.light_dam) //if there's enough light, start dying + take_overall_damage(1,1) + else //heal in the dark + heal_overall_damage(1,1) - if (nutrition > 450) - if(overeatduration < 600) //capped so people don't take forever to unfat - overeatduration++ - else - if(overeatduration > 1) - overeatduration -= 2 //doubled the unfat rate + // nutrition decrease + if (nutrition > 0 && stat != 2) + nutrition = max (0, nutrition - HUNGER_FACTOR) + if (nutrition > 450) + if(overeatduration < 600) //capped so people don't take forever to unfat + overeatduration++ + else + if(overeatduration > 1) + overeatduration -= 2 //doubled the unfat rate + if(species.flags & IS_PLANT && (!light_organ || light_organ.is_broken())) + if(nutrition < 200) + take_overall_damage(2,0) + traumatic_shock++ - if(!(species.flags & IS_SYNTHETIC)) handle_trace_chems() + // TODO: stomach and bloodstream organ. + if(!isSynthetic()) + handle_trace_chems() - updatehealth() + updatehealth() - return //TODO: DEFERRED + return //TODO: DEFERRED - proc/handle_regular_status_updates() +/mob/living/carbon/human/handle_regular_status_updates() + if(!handle_some_updates()) + return 0 - if(status_flags & GODMODE) return 0 + if(status_flags & GODMODE) return 0 - //SSD check, if a logged player is awake put them back to sleep! - if(species.show_ssd && !client && !teleop) - Sleeping(2) + //SSD check, if a logged player is awake put them back to sleep! + if(species.show_ssd && !client && !teleop) + Sleeping(2) + if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + blinded = 1 + silent = 0 + else //ALIVE. LIGHTS ARE ON + updatehealth() //TODO - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + if(health <= config.health_threshold_dead || (species.has_organ["brain"] && !has_brain())) + death() blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON @@ -974,266 +1032,239 @@ if(hallucination) //Machines do not hallucinate. - if (species.flags & IS_SYNTHETIC) - hallucination = 0 - else - if(hallucination >= 20) - if(prob(3)) - fake_attack(src) - if(!handling_hal) - spawn handle_hallucinations() //The not boring kind! - if(client && prob(5)) - client.dir = pick(2,4,8) - var/client/C = client - spawn(rand(20,50)) - if(C) - C.dir = 1 + if (hallucination >= 20 && !(species.flags & (NO_POISON|IS_PLANT))) + if(prob(3)) + fake_attack(src) + if(!handling_hal) + spawn handle_hallucinations() //The not boring kind! + if(client && prob(5)) + client.dir = pick(2,4,8) + var/client/C = client + spawn(rand(20,50)) + if(C) + C.dir = 1 - if(hallucination<=2) - hallucination = 0 - halloss = 0 - else - hallucination -= 2 + if(hallucination<=2) + hallucination = 0 + halloss = 0 + else + hallucination -= 2 else for(var/atom/a in hallucinations) qdel(a) - if(halloss > 100) - src << "You're in too much pain to keep going..." - src.visible_message("[src] slumps to the ground, too weak to continue fighting.") - Paralyse(10) - setHalLoss(99) + if(halloss > 100) + src << "[species.halloss_message_self]" + src.visible_message("[src] [species.halloss_message].") + Paralyse(10) + setHalLoss(99) - if(paralysis) - AdjustParalysis(-1) - blinded = 1 - stat = UNCONSCIOUS - animate_tail_reset() - if(halloss > 0) - adjustHalLoss(-3) - else if(sleeping) - speech_problem_flag = 1 - handle_dreams() - adjustHalLoss(-3) - if (mind) - //Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of stoxin or similar. - if(client || sleeping > 3) - AdjustSleeping(-1) - blinded = 1 - stat = UNCONSCIOUS - animate_tail_reset() - if( prob(2) && health && !hal_crit ) - spawn(0) - emote("snore") - if(mind) - if(mind.vampire) - if(istype(loc, /obj/structure/closet/coffin)) - adjustBruteLoss(-1) - adjustFireLoss(-1) - adjustToxLoss(-1) - //CONSCIOUS - else - stat = CONSCIOUS + if(paralysis || sleeping) + blinded = 1 + stat = UNCONSCIOUS + animate_tail_reset() + adjustHalLoss(-3) - //Periodically double-check embedded_flag - if(embedded_flag && !(life_tick % 10)) - if(!embedded_needs_process()) - embedded_flag = 0 + if(paralysis) + AdjustParalysis(-1) - //Eyes - //Check rig first because it's two-check and other checks will override it. - if(istype(back,/obj/item/weapon/rig)) - var/obj/item/weapon/rig/O = back - if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES)) - if((O.offline && O.offline_vision_restriction == 2) || (!O.offline && O.vision_restriction == 2)) - blinded = 1 - - // Check everything else. - if(!species.has_organ["eyes"]) // Presumably if a species has no eyes, they see via something else. - eye_blind = 0 - blinded = 0 - eye_blurry = 0 - else if(!has_eyes()) // Eyes cut out? Permablind. - eye_blind = 1 - blinded = 1 - eye_blurry = 1 - else if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own - blinded = 1 - else if(eye_blind) // Blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - blinded = 1 - else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster - eye_blurry = max(eye_blurry-3, 0) - blinded = 1 - else if(eye_blurry) // Blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) - - //Ears - if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own - ear_deaf = max(ear_deaf, 1) - else if(ear_deaf) //deafness, heals slowly over time - ear_deaf = max(ear_deaf-1, 0) - else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster - ear_damage = max(ear_damage-0.15, 0) - ear_deaf = max(ear_deaf, 1) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - ear_damage = max(ear_damage-0.05, 0) - - //Resting - if(resting) - dizziness = max(0, dizziness - 15) - jitteriness = max(0, jitteriness - 15) - adjustHalLoss(-3) - else - dizziness = max(0, dizziness - 3) - jitteriness = max(0, jitteriness - 3) - adjustHalLoss(-1) - - //Other - handle_statuses() - - if (drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) - if (prob(5)) - sleeping += 1 - Paralyse(5) - - confused = max(0, confused - 1) - - // If you're dirty, your gloves will become dirty, too. - if(gloves && germ_level > gloves.germ_level && prob(10)) - gloves.germ_level += 1 - - return 1 - - proc/handle_regular_hud_updates() - if(!overlays_cache) - overlays_cache = list() - overlays_cache.len = 24 - overlays_cache[1] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage1") - overlays_cache[2] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage2") - overlays_cache[3] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage3") - overlays_cache[4] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage4") - overlays_cache[5] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage5") - overlays_cache[6] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage6") - overlays_cache[7] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage7") - overlays_cache[8] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage8") - overlays_cache[9] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage9") - overlays_cache[10] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage10") - overlays_cache[11] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay1") - overlays_cache[12] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay2") - overlays_cache[13] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay3") - overlays_cache[14] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay4") - overlays_cache[15] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay5") - overlays_cache[16] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay6") - overlays_cache[17] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay7") - overlays_cache[18] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay1") - overlays_cache[19] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay2") - overlays_cache[20] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay3") - overlays_cache[21] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay4") - overlays_cache[22] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay5") - overlays_cache[23] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay6") - overlays_cache[24] = image('icons/mob/screen1_full.dmi', "icon_state" = "frenzyoverlay") - - if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head - handle_hud_list() - - // now handle what we see on our screen - - if(!client) - return 0 - - for(var/image/hud in client.images) - if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe - client.images.Remove(hud) - - client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science) - - update_action_buttons() - - if(damageoverlay.overlays) - damageoverlay.overlays = list() - - if(stat == UNCONSCIOUS) - //Critical damage passage overlay - if(health <= 0) - var/image/I - switch(health) - if(-20 to -10) - I = overlays_cache[1] - if(-30 to -20) - I = overlays_cache[2] - if(-40 to -30) - I = overlays_cache[3] - if(-50 to -40) - I = overlays_cache[4] - if(-60 to -50) - I = overlays_cache[5] - if(-70 to -60) - I = overlays_cache[6] - if(-80 to -70) - I = overlays_cache[7] - if(-90 to -80) - I = overlays_cache[8] - if(-95 to -90) - I = overlays_cache[9] - if(-INFINITY to -95) - I = overlays_cache[10] - damageoverlay.overlays += I + else if(sleeping) + speech_problem_flag = 1 + handle_dreams() + if (mind) + //Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of stoxin or similar. + if(client || sleeping > 3) + AdjustSleeping(-1) + if( prob(2) && health && !hal_crit ) + spawn(0) + emote("snore") + //CONSCIOUS else - //Oxygen damage overlay - update_oxy_overlay() + stat = CONSCIOUS - // Vampire frenzy overlay. - if (mind.vampire) - if (mind.vampire.status & VAMP_FRENZIED) - var/image/I = overlays_cache[24] - damageoverlay.overlays += I + // Check everything else. - //Fire and Brute damage overlay (BSSR) - var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp - damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. - if(hurtdamage) - var/image/I - switch(hurtdamage) - if(10 to 25) - I = overlays_cache[18] - if(25 to 40) - I = overlays_cache[19] - if(40 to 55) - I = overlays_cache[20] - if(55 to 70) - I = overlays_cache[21] - if(70 to 85) - I = overlays_cache[22] - if(85 to INFINITY) - I = overlays_cache[23] + //Periodically double-check embedded_flag + if(embedded_flag && !(life_tick % 10)) + if(!embedded_needs_process()) + embedded_flag = 0 + + //Ears + if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own + ear_deaf = max(ear_deaf, 1) + else if(ear_deaf) //deafness, heals slowly over time + ear_deaf = max(ear_deaf-1, 0) + else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster + ear_damage = max(ear_damage-0.15, 0) + ear_deaf = max(ear_deaf, 1) + else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs + ear_damage = max(ear_damage-0.05, 0) + + //Resting + if(resting) + dizziness = max(0, dizziness - 15) + jitteriness = max(0, jitteriness - 15) + adjustHalLoss(-3) + else + dizziness = max(0, dizziness - 3) + jitteriness = max(0, jitteriness - 3) + adjustHalLoss(-1) + + //Other + handle_statuses() + + if (drowsyness) + drowsyness-- + eye_blurry = max(2, eye_blurry) + if (prob(5)) + sleeping += 1 + Paralyse(5) + + confused = max(0, confused - 1) + + // If you're dirty, your gloves will become dirty, too. + if(gloves && germ_level > gloves.germ_level && prob(10)) + gloves.germ_level += 1 + + return 1 + +/mob/living/carbon/human/handle_regular_hud_updates() + if(!overlays_cache) + overlays_cache = list() + overlays_cache.len = 24 + overlays_cache[1] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage1") + overlays_cache[2] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage2") + overlays_cache[3] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage3") + overlays_cache[4] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage4") + overlays_cache[5] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage5") + overlays_cache[6] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage6") + overlays_cache[7] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage7") + overlays_cache[8] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage8") + overlays_cache[9] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage9") + overlays_cache[10] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage10") + overlays_cache[11] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay1") + overlays_cache[12] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay2") + overlays_cache[13] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay3") + overlays_cache[14] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay4") + overlays_cache[15] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay5") + overlays_cache[16] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay6") + overlays_cache[17] = image('icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay7") + overlays_cache[18] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay1") + overlays_cache[19] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay2") + overlays_cache[20] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay3") + overlays_cache[21] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay4") + overlays_cache[22] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay5") + overlays_cache[23] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay6") + overlays_cache[24] = image('icons/mob/screen1_full.dmi', "icon_state" = "frenzyoverlay") + + if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head + handle_hud_list() + + // now handle what we see on our screen + + if(!..()) + return + + if(damageoverlay.overlays) + damageoverlay.overlays = list() + + if(stat == UNCONSCIOUS) + //Critical damage passage overlay + if(health <= 0) + var/image/I + switch(health) + if(-20 to -10) + I = overlays_cache[1] + if(-30 to -20) + I = overlays_cache[2] + if(-40 to -30) + I = overlays_cache[3] + if(-50 to -40) + I = overlays_cache[4] + if(-60 to -50) + I = overlays_cache[5] + if(-70 to -60) + I = overlays_cache[6] + if(-80 to -70) + I = overlays_cache[7] + if(-90 to -80) + I = overlays_cache[8] + if(-95 to -90) + I = overlays_cache[9] + if(-INFINITY to -95) + I = overlays_cache[10] + damageoverlay.overlays += I + else + //Oxygen damage overlay + if(oxyloss) + var/image/I + switch(oxyloss) + if(10 to 20) + I = overlays_cache[11] + if(20 to 25) + I = overlays_cache[12] + if(25 to 30) + I = overlays_cache[13] + if(30 to 35) + I = overlays_cache[14] + if(35 to 40) + I = overlays_cache[15] + if(40 to 45) + I = overlays_cache[16] + if(45 to INFINITY) + I = overlays_cache[17] + damageoverlay.overlays += I + + // Vampire frenzy overlay. + if (mind.vampire) + if (mind.vampire.status & VAMP_FRENZIED) + var/image/I = overlays_cache[24] damageoverlay.overlays += I + //Fire and Brute damage overlay (BSSR) + var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp + damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. + if(hurtdamage) + var/image/I + switch(hurtdamage) + if(10 to 25) + I = overlays_cache[18] + if(25 to 40) + I = overlays_cache[19] + if(40 to 55) + I = overlays_cache[20] + if(55 to 70) + I = overlays_cache[21] + if(70 to 85) + I = overlays_cache[22] + if(85 to INFINITY) + I = overlays_cache[23] + damageoverlay.overlays += I + if( stat == DEAD ) sight = SEE_TURFS|SEE_MOBS|SEE_OBJS|SEE_SELF see_in_dark = 8 if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO if(healths) healths.icon_state = "health7" //DEAD healthmeter - if(client) - if(client.view != world.view) // If mob dies while zoomed in with device, unzoom them. - for(var/obj/item/item in contents) - if(item.zoom) - item.zoom() - break + // #TODO-MERGE: Check the indentation of this file! It's awful! + if(healths) + if(client.view != world.view) // If mob dies while zoomed in with device, unzoom them. + for(var/obj/item/item in contents) + if(item.zoom) + item.zoom() + break - /* - if(locate(/obj/item/weapon/gun/energy/sniperrifle, contents)) - var/obj/item/weapon/gun/energy/sniperrifle/s = locate() in src - if(s.zoom) - s.zoom() - if(locate(/obj/item/device/binoculars, contents)) - var/obj/item/device/binoculars/b = locate() in src - if(b.zoom) - b.zoom() - */ + /* + if(locate(/obj/item/weapon/gun/energy/sniperrifle, contents)) + var/obj/item/weapon/gun/energy/sniperrifle/s = locate() in src + if(s.zoom) + s.zoom() + if(locate(/obj/item/device/binoculars, contents)) + var/obj/item/device/binoculars/b = locate() in src + if(b.zoom) + b.zoom() + */ else if(is_ventcrawling == 0) // Stops sight returning to normal if inside a vent @@ -1283,262 +1314,209 @@ // if(rest) //Not used with new UI // if(resting || lying || sleeping) rest.icon_state = "rest1" // else rest.icon_state = "rest0" - if(toxin) - if(hal_screwyhud == 4 || phoron_alert) toxin.icon_state = "tox1" - else toxin.icon_state = "tox0" - if(oxygen) - if(hal_screwyhud == 3 || oxygen_alert) oxygen.icon_state = "oxy1" - else oxygen.icon_state = "oxy0" - if(fire) - if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat. - else fire.icon_state = "fire0" + if(toxin) + if(hal_screwyhud == 4 || phoron_alert) toxin.icon_state = "tox1" + else toxin.icon_state = "tox0" + if(oxygen) + if(hal_screwyhud == 3 || oxygen_alert) oxygen.icon_state = "oxy1" + else oxygen.icon_state = "oxy0" + if(fire) + if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat. + else fire.icon_state = "fire0" - if(bodytemp) - if (!species) - switch(bodytemperature) //310.055 optimal body temp - if(370 to INFINITY) bodytemp.icon_state = "temp4" - if(350 to 370) bodytemp.icon_state = "temp3" - if(335 to 350) bodytemp.icon_state = "temp2" - if(320 to 335) bodytemp.icon_state = "temp1" - if(300 to 320) bodytemp.icon_state = "temp0" - if(295 to 300) bodytemp.icon_state = "temp-1" - if(280 to 295) bodytemp.icon_state = "temp-2" - if(260 to 280) bodytemp.icon_state = "temp-3" - else bodytemp.icon_state = "temp-4" - else - var/temp_step - if (bodytemperature >= species.body_temperature) - temp_step = (species.heat_level_1 - species.body_temperature)/4 - - if (bodytemperature >= species.heat_level_1) - bodytemp.icon_state = "temp4" - else if (bodytemperature >= species.body_temperature + temp_step*3) - bodytemp.icon_state = "temp3" - else if (bodytemperature >= species.body_temperature + temp_step*2) - bodytemp.icon_state = "temp2" - else if (bodytemperature >= species.body_temperature + temp_step*1) - bodytemp.icon_state = "temp1" - else - bodytemp.icon_state = "temp0" - - else if (bodytemperature < species.body_temperature) - temp_step = (species.body_temperature - species.cold_level_1)/4 - - if (bodytemperature <= species.cold_level_1) - bodytemp.icon_state = "temp-4" - else if (bodytemperature <= species.body_temperature - temp_step*3) - bodytemp.icon_state = "temp-3" - else if (bodytemperature <= species.body_temperature - temp_step*2) - bodytemp.icon_state = "temp-2" - else if (bodytemperature <= species.body_temperature - temp_step*1) - bodytemp.icon_state = "temp-1" - else - bodytemp.icon_state = "temp0" - if(blind) - if(blinded) blind.invisibility = 0 - else blind.invisibility = 101 - - if(disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription - if(glasses) //to every /obj/item - var/obj/item/clothing/glasses/G = glasses - if(!G.prescription) - client.screen += global_hud.vimpaired - else - client.screen += global_hud.vimpaired - - if(eye_blurry) client.screen += global_hud.blurry - if(druggy) client.screen += global_hud.druggy - - if(config.welder_vision) - var/found_welder - if(istype(glasses, /obj/item/clothing/glasses/welding)) - var/obj/item/clothing/glasses/welding/O = glasses - if(!O.up) - found_welder = 1 - if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blinders)) - found_welder = 1 - if(!found_welder && istype(head, /obj/item/clothing/head/welding)) - var/obj/item/clothing/head/welding/O = head - if(!O.up) - found_welder = 1 - if(!found_welder && istype(back, /obj/item/weapon/rig)) - var/obj/item/weapon/rig/O = back - if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES)) - if((O.offline && O.offline_vision_restriction == 1) || (!O.offline && O.vision_restriction == 1)) - found_welder = 1 - if(found_welder) - client.screen |= global_hud.darkMask - - if(machine) - var/viewflags = machine.check_eye(src) - if(viewflags < 0) - reset_view(null, 0) - else if(viewflags) - sight = viewflags //when viewing from a machine, use only the sight flags that the machine provides - else if(eyeobj) - if(eyeobj.owner != src) - - reset_view(null) - else - src.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS + if(bodytemp) + if (!species) + switch(bodytemperature) //310.055 optimal body temp + if(370 to INFINITY) bodytemp.icon_state = "temp4" + if(350 to 370) bodytemp.icon_state = "temp3" + if(335 to 350) bodytemp.icon_state = "temp2" + if(320 to 335) bodytemp.icon_state = "temp1" + if(300 to 320) bodytemp.icon_state = "temp0" + if(295 to 300) bodytemp.icon_state = "temp-1" + if(280 to 295) bodytemp.icon_state = "temp-2" + if(260 to 280) bodytemp.icon_state = "temp-3" + else bodytemp.icon_state = "temp-4" else - var/isRemoteObserve = 0 - if((mRemote in mutations) && remoteview_target) - if(remoteview_target.stat==CONSCIOUS) - isRemoteObserve = 1 - if(!isRemoteObserve && client && !client.adminobs) - remoteview_target = null - reset_view(null, 0) - return 1 + //TODO: precalculate all of this stuff when the species datum is created + var/base_temperature = species.body_temperature + if(base_temperature == null) //some species don't have a set metabolic temperature + base_temperature = (species.heat_level_1 + species.cold_level_1)/2 - proc/process_glasses(var/obj/item/clothing/glasses/G) - if(G && G.active) - see_in_dark += G.darkness_view - if(G.overlay) - client.screen |= G.overlay - if(G.vision_flags) - sight |= G.vision_flags - if(!druggy && !seer) - see_invisible = SEE_INVISIBLE_MINIMUM - if(G.see_invisible >= 0) - see_invisible = G.see_invisible - /* HUD shit goes here, as long as it doesn't modify sight flags */ - // The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl - var/obj/item/clothing/glasses/hud/O = G - if(istype(G, /obj/item/clothing/glasses/sunglasses/sechud)) - var/obj/item/clothing/glasses/sunglasses/sechud/S = G - O = S.hud - if(istype(O)) - O.process_hud(src) - if(!druggy && !seer) see_invisible = SEE_INVISIBLE_LIVING + var/temp_step + if (bodytemperature >= base_temperature) + temp_step = (species.heat_level_1 - base_temperature)/4 - proc/handle_random_events() - // Puke if toxloss is too high - if(!stat) - if (getToxLoss() >= 45) - delayed_vomit() + if (bodytemperature >= species.heat_level_1) + bodytemp.icon_state = "temp4" + else if (bodytemperature >= base_temperature + temp_step*3) + bodytemp.icon_state = "temp3" + else if (bodytemperature >= base_temperature + temp_step*2) + bodytemp.icon_state = "temp2" + else if (bodytemperature >= base_temperature + temp_step*1) + bodytemp.icon_state = "temp1" + else + bodytemp.icon_state = "temp0" - //0.1% chance of playing a scary sound to someone who's in complete darkness - if(isturf(loc) && rand(1,1000) == 1) - var/turf/T = loc - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - if(L && L.lum_r + L.lum_g + L.lum_b == 0) - playsound_local(src,pick(scarySounds),50, 1, -1) + else if (bodytemperature < base_temperature) + temp_step = (base_temperature - species.cold_level_1)/4 + if (bodytemperature <= species.cold_level_1) + bodytemp.icon_state = "temp-4" + else if (bodytemperature <= base_temperature - temp_step*3) + bodytemp.icon_state = "temp-3" + else if (bodytemperature <= base_temperature - temp_step*2) + bodytemp.icon_state = "temp-2" + else if (bodytemperature <= base_temperature - temp_step*1) + bodytemp.icon_state = "temp-1" + else + bodytemp.icon_state = "temp0" + return 1 +/mob/living/carbon/human/handle_random_events() + if(in_stasis) + return - proc/handle_changeling() - if(mind && mind.changeling) - mind.changeling.regenerate() + // Puke if toxloss is too high + if(!stat) + if (getToxLoss() >= 45 && nutrition > 20) + vomit() - handle_shock() - ..() - if(status_flags & GODMODE) return 0 //godmode - if(species && species.flags & NO_PAIN) return + //0.1% chance of playing a scary sound to someone who's in complete darkness + if(isturf(loc) && rand(1,1000) == 1) + var/turf/T = loc + var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T + if(L && L.lum_r + L.lum_g + L.lum_b == 0) + playsound_local(src,pick(scarySounds),50, 1, -1) - if(health < config.health_threshold_softcrit)// health 0 makes you immediately collapse - shock_stage = max(shock_stage, 61) +/mob/living/carbon/human/handle_stomach() + spawn(0) + for(var/mob/living/M in stomach_contents) + if(M.loc != src) + stomach_contents.Remove(M) + continue + if(iscarbon(M)|| isanimal(M)) + if(M.stat == 2) + M.death(1) + stomach_contents.Remove(M) + qdel(M) + continue + if(air_master.current_cycle%3==1) + if(!(M.status_flags & GODMODE)) + M.adjustBruteLoss(5) + nutrition += 10 - if(traumatic_shock >= 80) - shock_stage += 1 - else if(health < config.health_threshold_softcrit) - shock_stage = max(shock_stage, 61) - else - shock_stage = min(shock_stage, 160) - shock_stage = max(shock_stage-1, 0) - return +/mob/living/carbon/human/proc/handle_changeling() + if(mind && mind.changeling) + mind.changeling.regenerate() - if(shock_stage == 10) - src << "[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!" +/mob/living/carbon/human/handle_shock() + ..() + if(status_flags & GODMODE) return 0 //godmode + if(species && species.flags & NO_PAIN) return - if(shock_stage >= 30) - if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.") - eye_blurry = max(2, eye_blurry) - stuttering = max(stuttering, 5) + if(health < config.health_threshold_softcrit)// health 0 makes you immediately collapse + shock_stage = max(shock_stage, 61) - if(shock_stage == 40) + if(traumatic_shock >= 80) + shock_stage += 1 + else if(health < config.health_threshold_softcrit) + shock_stage = max(shock_stage, 61) + else + shock_stage = min(shock_stage, 160) + shock_stage = max(shock_stage-1, 0) + return + + if(shock_stage == 10) + src << "[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!" + + if(shock_stage >= 30) + if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.") + eye_blurry = max(2, eye_blurry) + stuttering = max(stuttering, 5) + + if(shock_stage == 40) + src << "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!" + + if (shock_stage >= 60) + if(shock_stage == 60) emote("me",1,"'s body becomes limp.") + if (prob(2)) src << "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!" - - if (shock_stage >= 60) - if(shock_stage == 60) emote("me",1,"'s body becomes limp.") - if (prob(2)) - src << "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!" - Weaken(20) - - if(shock_stage >= 80) - if (prob(5)) - src << "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!" - Weaken(20) - - if(shock_stage >= 120) - if (prob(2)) - src << "[pick("You black out", "You feel like you could die any moment now", "You're about to lose consciousness")]!" - Paralyse(5) - - if(shock_stage == 150) - emote("me",1,"can no longer stand, collapsing!") Weaken(20) - if(shock_stage >= 150) + if(shock_stage >= 80) + if (prob(5)) + src << "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!" Weaken(20) - proc/handle_pulse() + if(shock_stage >= 120) + if (prob(2)) + src << "[pick("You black out", "You feel like you could die any moment now", "You're about to lose consciousness")]!" + Paralyse(5) - if(life_tick % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) + if(shock_stage == 150) + emote("me",1,"can no longer stand, collapsing!") + Weaken(20) - if(species && species.flags & NO_BLOOD) return PULSE_NONE //No blood, no pulse. + if(shock_stage >= 150) + Weaken(20) - if(stat == DEAD) - return PULSE_NONE //that's it, you're dead, nothing can influence your pulse +/mob/living/carbon/human/proc/handle_pulse() + if(life_tick % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) - var/temp = PULSE_NORM + if(species && species.flags & NO_BLOOD) + return PULSE_NONE //No blood, no pulse. - if(round(vessel.get_reagent_amount("blood")) <= BLOOD_VOLUME_BAD) //how much blood do we have - temp = PULSE_THREADY //not enough :( + if(stat == DEAD) + return PULSE_NONE //that's it, you're dead, nothing can influence your pulse - if(status_flags & FAKEDEATH) - temp = PULSE_NONE //pretend that we're dead. unlike actual death, can be inflienced by meds + var/temp = PULSE_NORM - //handles different chems' influence on pulse - for(var/datum/reagent/R in reagents.reagent_list) - if(R.id in bradycardics) - if(temp <= PULSE_THREADY && temp >= PULSE_NORM) - temp-- - if(R.id in tachycardics) - if(temp <= PULSE_FAST && temp >= PULSE_NONE) - temp++ - if(R.id in heartstopper) //To avoid using fakedeath + if(round(vessel.get_reagent_amount("blood")) <= BLOOD_VOLUME_BAD) //how much blood do we have + temp = PULSE_THREADY //not enough :( + + if(status_flags & FAKEDEATH) + temp = PULSE_NONE //pretend that we're dead. unlike actual death, can be inflienced by meds + + //handles different chems' influence on pulse + for(var/datum/reagent/R in reagents.reagent_list) + if(R.id in bradycardics) + if(temp <= PULSE_THREADY && temp >= PULSE_NORM) + temp-- + if(R.id in tachycardics) + if(temp <= PULSE_FAST && temp >= PULSE_NONE) + temp++ + if(R.id in heartstopper) //To avoid using fakedeath + var/obj/item/organ/heart/H = internal_organs_by_name["heart"] + if(rand(0,6) == 3) + H.take_damage(5) + if(R.id in cheartstopper) //Conditional heart-stoppage + if(R.volume >= R.overdose) var/obj/item/organ/heart/H = internal_organs_by_name["heart"] if(rand(0,6) == 3) H.take_damage(5) - if(R.id in cheartstopper) //Conditional heart-stoppage - if(R.volume >= R.overdose) - var/obj/item/organ/heart/H = internal_organs_by_name["heart"] - if(rand(0,6) == 3) - H.take_damage(5) - return temp + return temp - proc/handle_heartbeat() - if(pulse == PULSE_NONE || !species.has_organ["heart"]) - return +/mob/living/carbon/human/proc/handle_heartbeat() + if(pulse == PULSE_NONE || !species.has_organ["heart"]) + return - var/obj/item/organ/heart/H = internal_organs_by_name["heart"] + var/obj/item/organ/heart/H = internal_organs_by_name["heart"] - if(!H || H.robotic >=2 ) - return + if(!H || H.robotic >=2 ) + return - if(pulse >= PULSE_2FAST || shock_stage >= 10 || istype(get_turf(src), /turf/space)) - //PULSE_THREADY - maximum value for pulse, currently it 5. - //High pulse value corresponds to a fast rate of heartbeat. - //Divided by 2, otherwise it is too slow. - var/rate = (PULSE_THREADY - pulse)/2 + if(pulse >= PULSE_2FAST || shock_stage >= 10 || istype(get_turf(src), /turf/space)) + //PULSE_THREADY - maximum value for pulse, currently it 5. + //High pulse value corresponds to a fast rate of heartbeat. + //Divided by 2, otherwise it is too slow. + var/rate = (PULSE_THREADY - pulse)/2 - if(heartbeat >= rate) - heartbeat = 0 - src << sound('sound/effects/singlebeat.ogg',0,0,0,50) - else - heartbeat++ + if(heartbeat >= rate) + heartbeat = 0 + src << sound('sound/effects/singlebeat.ogg',0,0,0,50) + else + heartbeat++ /* Called by life(), instead of having the individual hud items update icons each tick and check for status changes @@ -1550,7 +1528,7 @@ /mob/living/carbon/human/proc/handle_hud_list() if (BITTEST(hud_updateflag, HEALTH_HUD)) var/image/holder = hud_list[HEALTH_HUD] - if(stat == 2) + if(stat == DEAD) holder.icon_state = "hudhealth-100" // X_X else var/percentage_health = RoundHealth((health-config.health_threshold_crit)/(maxHealth-config.health_threshold_crit)*100) @@ -1566,11 +1544,12 @@ hud_list[HEALTH_HUD] = holder if (BITTEST(hud_updateflag, LIFE_HUD)) - var/image/holder = hud_list[STATUS_HUD] + var/image/holder = hud_list[LIFE_HUD] if(stat == DEAD) holder.icon_state = "huddead" else holder.icon_state = "hudhealthy" + hud_list[LIFE_HUD] = holder if (BITTEST(hud_updateflag, STATUS_HUD)) var/foundVirus = 0 @@ -1583,13 +1562,10 @@ break var/image/holder = hud_list[STATUS_HUD] - var/image/holder2 = hud_list[STATUS_HUD_OOC] - if(stat == 2) + if(stat == DEAD) holder.icon_state = "huddead" - holder2.icon_state = "huddead" else if(status_flags & XENO_HOST) holder.icon_state = "hudxeno" - holder2.icon_state = "hudxeno" else if(foundVirus) holder.icon_state = "hudill" /* else if(has_brain_worms()) @@ -1597,14 +1573,21 @@ if(B.controlling) holder.icon_state = "hudbrainworm" else - holder.icon_state = "hudhealthy" - holder2.icon_state = "hudbrainworm" */ + holder.icon_state = "hudhealthy"*/ else holder.icon_state = "hudhealthy" - if(virus2.len) - holder2.icon_state = "hudill" - else - holder2.icon_state = "hudhealthy" + + var/image/holder2 = hud_list[STATUS_HUD_OOC] + if(stat == DEAD) + holder2.icon_state = "huddead" + else if(status_flags & XENO_HOST) + holder2.icon_state = "hudxeno" + else if(has_brain_worms()) + holder2.icon_state = "hudbrainworm" + else if(virus2.len) + holder2.icon_state = "hudill" + else + holder2.icon_state = "hudhealthy" hud_list[STATUS_HUD] = holder hud_list[STATUS_HUD_OOC] = holder2 @@ -1722,6 +1705,37 @@ restore_blood() ..() +/mob/living/carbon/human/handle_vision() + if(client) + client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science) + if(machine) + var/viewflags = machine.check_eye(src) + if(viewflags < 0) + reset_view(null, 0) + else if(viewflags) + sight |= viewflags + else if(eyeobj) + if(eyeobj.owner != src) + reset_view(null) + else + var/isRemoteObserve = 0 + if((mRemote in mutations) && remoteview_target) + if(remoteview_target.stat==CONSCIOUS) + isRemoteObserve = 1 + if(!isRemoteObserve && client && !client.adminobs) + remoteview_target = null + reset_view(null, 0) + + update_equipment_vision() + species.handle_vision(src) + +/mob/living/carbon/human/update_sight() + ..() + if(stat == DEAD) + return + if(XRAY in mutations) + sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS + /mob/living/carbon/human/proc/handle_stamina() if (species.stamina == -1)//If species stamina is -1, it has special mechanics which will be handled elsewhere return//so quit this function diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 1fd82ed230f..685b122590d 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -6,9 +6,6 @@ message = sanitize(message) ..(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) if(client) @@ -132,11 +129,11 @@ if(silent || (sdisabilities & MUTE)) message = "" speech_problem_flag = 1 - else if(istype(wear_mask, /obj/item/clothing/mask/horsehead)) - var/obj/item/clothing/mask/horsehead/hoers = wear_mask - if(hoers.voicechange) - message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") - verb = pick("whinnies","neighs", "says") + else if(istype(wear_mask, /obj/item/clothing/mask)) + var/obj/item/clothing/mask/M = wear_mask + if(M.voicechange) + message = pick(M.say_messages) + verb = pick(M.say_verbs) speech_problem_flag = 1 if(message != "") 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 864bc937d6e..1bcda4d00fd 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm @@ -19,7 +19,8 @@ remains_type = /obj/effect/decal/cleanable/ash death_message = "dissolves into ash..." - flags = IS_RESTRICTED | NO_BLOOD | NO_SCAN | NO_SLIP | NO_POISON + flags = NO_BLOOD | NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT + spawn_flags = IS_RESTRICTED /datum/species/shadow/handle_death(var/mob/living/carbon/human/H) spawn(1) 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 89f0374fb01..566ca71e5e0 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -6,6 +6,7 @@ deform = 'icons/mob/human_races/r_def_vox.dmi' default_language = "Vox-pidgin" language = "Ceti Basic" + num_alternate_languages = 1 unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong) rarity_value = 4 blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ @@ -32,12 +33,15 @@ cold_level_3 = 0 eyes = "vox_eyes_s" + gluttonous = GLUT_SMALLER breath_type = "nitrogen" poison_type = "oxygen" siemens_coefficient = 0.2 - flags = IS_RESTRICTED | NO_SCAN | HAS_EYE_COLOR + flags = NO_SCAN | NO_MINOR_CUT + spawn_flags = IS_RESTRICTED + appearance_flags = HAS_EYE_COLOR blood_color = "#2299FC" flesh_color = "#808D11" @@ -119,9 +123,11 @@ continue var/mob/living/carbon/human/target = M if(istype(target)) - if(target.head && (target.head.flags & HEADCOVERSMOUTH) && (target.head.flags & AIRTIGHT)) + if(target.internals) continue - if(target.wear_mask && (target.wear_mask.flags & MASKCOVERSMOUTH) && (target.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)) + if(target.head && (target.head.body_parts_covered & FACE) && (target.head.flags & AIRTIGHT)) + continue + if(target.wear_mask && (target.wear_mask.body_parts_covered & FACE) && (target.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)) continue M << "A terrible stench emanates from \the [H]." diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index cf18b9e9f4b..21fa847af3c 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -21,33 +21,42 @@ var/prone_icon // If set, draws this from icobase when mob is prone. var/eyes = "eyes_s" // Icon for eyes. + var/has_floating_eyes // Eyes will overlay over darkness (glow) var/blood_color = "#A10808" // Red. var/flesh_color = "#FFC896" // Pink. var/base_color // Used by changelings. Should also be used for icon previes.. var/tail // Name of tail state in species effects icon file. var/tail_animation // If set, the icon to obtain tail animation states from. + var/tail_hair var/race_key = 0 // Used for mob icon cache string. var/icon/icon_template // Used for mob icon generation for non-32x32 species. - var/is_small + var/mob_size = MOB_MEDIUM var/show_ssd = "fast asleep" + var/virus_immune + var/short_sighted // Language/culture vars. - var/default_language = "Ceti Basic" // Default language is used when 'say' is used without modifiers. - var/language = "Ceti Basic" // Default racial language, if any. - var/secondary_langs = list() // The names of secondary languages that are available to this species. + var/default_language = "Ceti Basic" // Default language is used when 'say' is used without modifiers. + var/language = "Ceti Basic" // Default racial language, if any. + var/list/secondary_langs = list() // The names of secondary languages that are available to this species. var/list/speech_sounds // A list of sounds to potentially play when speaking. var/list/speech_chance // The likelihood of a speech sound playing. + var/num_alternate_languages = 0 // How many secondary languages are available to select at character creation + var/name_language = "Galactic Common" // The language to use when determining names for this species, or null to use the first name/last name generator // Combat vars. var/total_health = 100 // Point at which the mob will enter crit. - var/list/unarmed_types = list( // Possible unarmed attacks that the mob will use in combat. + var/list/unarmed_types = list( // Possible unarmed attacks that the mob will use in combat, /datum/unarmed_attack, /datum/unarmed_attack/bite ) var/list/unarmed_attacks = null // For empty hand harm-intent attack - var/brute_mod = 1 // Physical damage multiplier. - var/burn_mod = 1 // Burn damage multiplier. - var/tox_mod = 1 // Toxin damage multiplier. + var/brute_mod = 1 // Physical damage multiplier. + var/burn_mod = 1 // Burn damage multiplier. + var/oxy_mod = 1 // Oxyloss modifier + var/toxins_mod = 1 // Toxloss modifier + var/radiation_mod = 1 // Radiation modifier + var/flash_mod = 1 // Stun from blindness modifier. var/vision_flags = SEE_SELF // Same flags as glasses. // Death vars. @@ -59,6 +68,9 @@ var/dusted_anim = "dust-h" var/death_sound var/death_message = "seizes up and falls limp, their eyes dead and lifeless..." + var/knockout_message = "has been knocked unconscious!" + var/halloss_message = "slumps to the ground, too weak to continue fighting." + var/halloss_message_self = "You're in too much pain to keep going..." // Environment tolerance/life processes vars. var/reagent_tag //Used for metabolizing reagents. @@ -72,7 +84,7 @@ var/heat_level_1 = 360 // Heat damage level 1 above this point. var/heat_level_2 = 400 // Heat damage level 2 above this point. var/heat_level_3 = 1000 // Heat damage level 3 above this point. - var/synth_temp_gain = 0 // IS_SYNTHETIC species will gain this much temperature every second + var/passive_temp_gain = 0 // Species will gain this much temperature every second var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. @@ -90,7 +102,7 @@ ) var/list/cold_discomfort_strings = list( "You feel chilly.", - "You shiver suddely.", + "You shiver suddenly.", "Your chilly flesh stands out in goosebumps." ) @@ -99,18 +111,20 @@ var/hud_type // Body/form vars. - var/list/inherent_verbs // Species-specific verbs. - var/has_fine_manipulation = 1 // Can use small items. - var/siemens_coefficient = 1 // The lower, the thicker the skin and better the insulation. - var/darksight = 2 // Native darksight distance. - var/flags = 0 // Various specific features. - var/slowdown = 0 // Passive movement speed malus (or boost, if negative) - var/primitive_form // Lesser form, if any (ie. monkey for humans) - var/greater_form // Greater form, if any, ie. human for monkeys. + var/list/inherent_verbs // Species-specific verbs. + var/has_fine_manipulation = 1 // Can use small items. + var/siemens_coefficient = 1 // The lower, the thicker the skin and better the insulation. + var/darksight = 2 // Native darksight distance. + var/flags = 0 // Various specific features. + var/appearance_flags = 0 // Appearance/display related features. + var/spawn_flags = 0 // Flags that specify who can spawn as this species + var/slowdown = 0 // Passive movement speed malus (or boost, if negative) + var/primitive_form // Lesser form, if any (ie. monkey for humans) + var/greater_form // Greater form, if any, ie. human for monkeys. var/holder_type - var/gluttonous // Can eat some mobs. 1 for mice, 2 for monkeys, 3 for people. - var/rarity_value = 1 // Relative rarity/collector value for this species. - var/ethanol_resistance = 1 // How well the mob resists alcohol, lower values get drunk faster, higher values need to drink more + var/gluttonous // Can eat some mobs. Values can be GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING. + var/rarity_value = 1 // Relative rarity/collector value for this species. + var/ethanol_resistance = 1 // How well the mob resists alcohol, lower values get drunk faster, higher values need to drink more var/stamina = 100 // The maximum stamina this species has. Determines how long it can sprint var/stamina_recovery = 3 // Flat amount of stamina species recovers per proc @@ -128,6 +142,7 @@ "appendix" = /obj/item/organ/appendix, "eyes" = /obj/item/organ/eyes ) + var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them. var/list/has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest), @@ -148,12 +163,21 @@ var/push_flags = ~HEAVY // What can we push? var/swap_flags = ~HEAVY // What can we swap place with? + var/pass_flags = 0 + +/datum/species/proc/get_eyes(var/mob/living/carbon/human/H) + return + /datum/species/New() if(hud_type) hud = new hud_type() else hud = new() + //If the species has eyes, they are the default vision organ + if(!vision_organ && has_organ["eyes"]) + vision_organ = "eyes" + unarmed_attacks = list() for(var/u_type in unarmed_types) unarmed_attacks += new u_type() @@ -185,8 +209,17 @@ if(covered) H << "[pick(heat_discomfort_strings)]" +/datum/species/proc/sanitize_name(var/name) + return sanitizeName(name) + /datum/species/proc/get_random_name(var/gender) - var/datum/language/species_language = all_languages[language] + if(!name_language) + if(gender == FEMALE) + return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + else + return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + + var/datum/language/species_language = all_languages[name_language] if(!species_language) species_language = all_languages[default_language] if(!species_language) @@ -231,7 +264,7 @@ O.organ_tag = organ_tag H.internal_organs_by_name[organ_tag] = O - if(flags & IS_SYNTHETIC) + if(H.isSynthetic()) for(var/obj/item/organ/external/E in H.organs) if(E.status & ORGAN_CUT_AWAY || E.is_stump()) continue E.robotize() @@ -275,6 +308,8 @@ H.mob_bump_flag = bump_flag H.mob_swap_flags = swap_flags H.mob_push_flags = push_flags + H.pass_flags = pass_flags + H.mob_size = mob_size /datum/species/proc/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) //Handles any species-specific death events (such as dionaea nymph spawns). return @@ -317,6 +352,49 @@ /datum/species/proc/handle_npc(var/mob/living/carbon/human/H) return +/datum/species/proc/get_vision_flags(var/mob/living/carbon/human/H) + return vision_flags + +// #TODO-MERGE: Search for blind.layer refs, change to blind.invisibility +/datum/species/proc/handle_vision(var/mob/living/carbon/human/H) + H.update_sight() + H.sight |= get_vision_flags(H) + H.sight |= H.equipment_vision_flags + + if(H.stat == DEAD) + return 1 + + if(!H.druggy) + H.see_in_dark = (H.sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : min(darksight + H.equipment_darkness_modifier, 8) + if(H.seer) + var/obj/effect/rune/R = locate() in H.loc + if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"]) + H.see_invisible = SEE_INVISIBLE_CULT + if(H.see_invisible != SEE_INVISIBLE_CULT && H.equipment_see_invis) + H.see_invisible = min(H.see_invisible, H.equipment_see_invis) + + if(H.equipment_tint_total >= TINT_BLIND) + H.eye_blind = max(H.eye_blind, 1) + + if(H.blind) + H.blind.layer = (H.eye_blind ? 18 : 0) + + if(!H.client)//no client, no screen to update + return 1 + + if(config.welder_vision) + if(short_sighted || (H.equipment_tint_total >= TINT_HEAVY)) + H.client.screen += global_hud.darkMask + else if((!H.equipment_prescription && (H.disabilities & NEARSIGHTED)) || H.equipment_tint_total == TINT_MODERATE) + H.client.screen += global_hud.vimpaired + if(H.eye_blurry) H.client.screen += global_hud.blurry + if(H.druggy) H.client.screen += global_hud.druggy + + for(var/overlay in H.equipment_overlays) + H.client.screen |= overlay + + return 1 + /datum/species/proc/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost) cost *= H.sprint_cost_factor if (H.stamina == -1) @@ -346,4 +424,3 @@ return 0 H.hud_used.move_intent.update_move_icon(H) return 1 - diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index 466b1bd2aba..365109d7cf0 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -2,7 +2,6 @@ attack_verb = list("bit", "chomped on") attack_sound = 'sound/weapons/bite.ogg' shredding = 0 - damage = 5 sharp = 1 edge = 1 @@ -11,7 +10,6 @@ attack_noun = list("tendril") eye_attack_text = "a tendril" eye_attack_text_victim = "a tendril" - damage = 5 /datum/unarmed_attack/claws attack_verb = list("scratched", "clawed", "slashed") @@ -20,7 +18,6 @@ eye_attack_text_victim = "sharp claws" attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - damage = 5 sharp = 1 edge = 1 @@ -57,19 +54,30 @@ /datum/unarmed_attack/claws/strong attack_verb = list("slashed") - damage = 10 + damage = 5 shredding = 1 /datum/unarmed_attack/bite/strong attack_verb = list("mauled") - damage = 15 + damage = 8 shredding = 1 /datum/unarmed_attack/slime_glomp attack_verb = list("glomped") attack_noun = list("body") - damage = 0 + damage = 2 /datum/unarmed_attack/slime_glomp/apply_effects() //Todo, maybe have a chance of causing an electrical shock? - return \ No newline at end of file + return + +/datum/unarmed_attack/stomp/weak + attack_verb = list("jumped on") + +/datum/unarmed_attack/stomp/weak/get_unarmed_damage() + return damage + +/datum/unarmed_attack/stomp/weak/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + var/obj/item/organ/external/affecting = target.get_organ(zone) + user.visible_message("[user] jumped up and down on \the [target]'s [affecting.name]!") + playsound(user.loc, attack_sound, 25, 1, -1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm index 3a8b133f585..9212e9e199b 100644 --- a/code/modules/mob/living/carbon/human/species/species_hud.dm +++ b/code/modules/mob/living/carbon/human/species/species_hud.dm @@ -17,18 +17,18 @@ // to be drawn for the mob. This is fairly delicate, try to avoid messing with it // unless you know exactly what it does. var/list/gear = list( - "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH), - "o_clothing" = list("loc" = ui_oclothing, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), - "mask" = list("loc" = ui_mask, "name" = "Mask", "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH), + "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), + "o_clothing" = list("loc" = ui_oclothing, "name" = "Suit", "slot" = slot_wear_suit, "state" = "suit", "toggle" = 1), + "mask" = list("loc" = ui_mask, "name" = "Mask", "slot" = slot_wear_mask, "state" = "mask", "toggle" = 1), "gloves" = list("loc" = ui_gloves, "name" = "Gloves", "slot" = slot_gloves, "state" = "gloves", "toggle" = 1), "eyes" = list("loc" = ui_glasses, "name" = "Glasses", "slot" = slot_glasses, "state" = "glasses","toggle" = 1), "l_ear" = list("loc" = ui_l_ear, "name" = "Left Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), "r_ear" = list("loc" = ui_r_ear, "name" = "Right Ear", "slot" = slot_r_ear, "state" = "ears", "toggle" = 1), "head" = list("loc" = ui_head, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), "shoes" = list("loc" = ui_shoes, "name" = "Shoes", "slot" = slot_shoes, "state" = "shoes", "toggle" = 1), - "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "belt", "dir" = 8), - "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), - "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id", "dir" = NORTH), + "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "suitstore"), + "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back"), + "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id"), "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt") @@ -55,13 +55,13 @@ /datum/hud_data/diona has_internals = 0 gear = list( - "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH), - "o_clothing" = list("loc" = ui_shoes, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), + "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), + "o_clothing" = list("loc" = ui_shoes, "name" = "Suit", "slot" = slot_wear_suit, "state" = "suit", "toggle" = 1), "l_ear" = list("loc" = ui_gloves, "name" = "Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), "head" = list("loc" = ui_oclothing, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), - "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "belt", "dir" = 8), - "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), - "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id", "dir" = NORTH), + "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "suitstore"), + "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back"), + "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id"), "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt") @@ -69,6 +69,6 @@ /datum/hud_data/monkey gear = list( - "mask" = list("loc" = ui_shoes, "name" = "Mask", "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH), - "back" = list("loc" = ui_sstore1, "name" = "Back", "slot" = slot_back, "state" = "back", "dir" = NORTH), - ) \ No newline at end of file + "mask" = list("loc" = ui_shoes, "name" = "Mask", "slot" = slot_wear_mask, "state" = "mask", "toggle" = 1), + "back" = list("loc" = ui_sstore1, "name" = "Back", "slot" = slot_back, "state" = "back"), + ) diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm index 9b4387be017..ecfc88ea11b 100644 --- a/code/modules/mob/living/carbon/human/species/station/golem.dm +++ b/code/modules/mob/living/carbon/human/species/station/golem.dm @@ -7,7 +7,8 @@ language = "Ceti Basic" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch) - flags = IS_RESTRICTED | NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN | NO_POISON | NO_SLIP + flags = NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN | NO_POISON | NO_MINOR_CUT + spawn_flags = IS_RESTRICTED siemens_coefficient = 0 rarity_value = 5 diff --git a/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm new file mode 100644 index 00000000000..b33d4e8ef71 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm @@ -0,0 +1,57 @@ +/datum/species/human/gravworlder + name = "grav-adapted Human" + name_plural = "grav-adapted Humans" + blurb = "Heavier and stronger than a baseline human, gravity-adapted people have \ + thick radiation-resistant skin with a high lead content, denser bones, and recessed \ + eyes beneath a prominent brow in order to shield them from the glare of a dangerously \ + bright, alien sun. This comes at the cost of mobility, flexibility, and increased \ + oxygen requirements to support their robust metabolism." + icobase = 'icons/mob/human_races/subspecies/r_gravworlder.dmi' + + flash_mod = 0.9 + oxy_mod = 1.1 + radiation_mod = 0.5 + brute_mod = 0.85 + slowdown = 1 + +/datum/species/human/spacer + name = "space-adapted Human" + name_plural = "space-adapted Humans" + blurb = "Lithe and frail, these sickly folk were engineered for work in environments that \ + lack both light and atmosphere. As such, they're quite resistant to asphyxiation as well as \ + toxins, but they suffer from weakened bone structure and a marked vulnerability to bright lights." + icobase = 'icons/mob/human_races/subspecies/r_spacer.dmi' + + oxy_mod = 0.8 + toxins_mod = 0.9 + flash_mod = 1.2 + brute_mod = 1.1 + burn_mod = 1.1 + +/datum/species/human/vatgrown + name = "vat-grown Human" + name_plural = "vat-grown Humans" + blurb = "With cloning on the forefront of human scientific advancement, cheap mass production \ + of bodies is a very real and rather ethically grey industry. Vat-grown humans tend to be paler than \ + baseline, with no appendix and fewer inherited genetic disabilities, but a weakened metabolism." + icobase = 'icons/mob/human_races/subspecies/r_vatgrown.dmi' + + toxins_mod = 1.1 + has_organ = list( + "heart" = /obj/item/organ/heart, + "lungs" = /obj/item/organ/lungs, + "liver" = /obj/item/organ/liver, + "kidneys" = /obj/item/organ/kidneys, + "brain" = /obj/item/organ/brain, + "eyes" = /obj/item/organ/eyes + ) + +/* +// These guys are going to need full resprites of all the suits/etc so I'm going to +// define them and commit the sprites, but leave the clothing for another day. +/datum/species/human/chimpanzee + name = "uplifted Chimpanzee" + name_plural = "uplifted Chimpanzees" + blurb = "Ook ook." + icobase = 'icons/mob/human_races/subspecies/r_upliftedchimp.dmi' +*/ 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 b3261eb88a1..ef2b76d1edb 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -12,7 +12,7 @@ language = null default_language = "Chimpanzee" greater_form = "Human" - is_small = 1 + mob_size = MOB_SMALL has_fine_manipulation = 0 show_ssd = null @@ -27,19 +27,20 @@ inherent_verbs = list(/mob/living/proc/ventcrawl) hud_type = /datum/hud_data/monkey meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey - holder_type = /obj/item/weapon/holder/monkey rarity_value = 0.1 total_health = 75 brute_mod = 1.5 burn_mod = 1.5 - flags = IS_RESTRICTED + spawn_flags = IS_RESTRICTED bump_flag = MONKEY swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN + pass_flags = PASSTABLE + holder_type = /obj/item/weapon/holder /datum/species/monkey/handle_npc(var/mob/living/carbon/human/H) if(H.stat != CONSCIOUS) return @@ -64,7 +65,6 @@ flesh_color = "#AFA59E" base_color = "#333333" tail = "farwatail" - holder_type = /obj/item/weapon/holder/monkey/farwa /datum/species/monkey/skrell name = "Neaera" @@ -80,7 +80,6 @@ blood_color = "#1D2CBF" reagent_tag = IS_SKRELL tail = null - holder_type = /obj/item/weapon/holder/monkey/neaera /datum/species/monkey/unathi name = "Stok" @@ -96,4 +95,3 @@ flesh_color = "#34AF10" base_color = "#066000" reagent_tag = IS_UNATHI - holder_type = /obj/item/weapon/holder/monkey/stok diff --git a/code/modules/mob/living/carbon/human/species/station/resomi.dm b/code/modules/mob/living/carbon/human/species/station/resomi.dm new file mode 100644 index 00000000000..9cdf3b82e53 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/resomi.dm @@ -0,0 +1,114 @@ +/datum/species/resomi + name = "Resomi" + name_plural = "Resomii" + blurb = "A race of feathered raptors who developed on a cold world, almost \ + outside of the Goldilocks zone. Extremely fragile, they developed hunting skills \ + that emphasized taking out their prey without themselves getting hit. They are an \ + advanced post-scarcity culture on good terms with Skrellian and Human interests." + + num_alternate_languages = 2 + secondary_langs = list("Resomi") + name_language = "Resomi" + + blood_color = "#D514F7" + flesh_color = "#5F7BB0" + base_color = "#001144" + tail = "resomitail" + tail_hair = "feathers" + + icobase = 'icons/mob/human_races/r_resomi.dmi' + deform = 'icons/mob/human_races/r_resomi.dmi' + damage_overlays = 'icons/mob/human_races/masks/dam_resomi.dmi' + damage_mask = 'icons/mob/human_races/masks/dam_mask_resomi.dmi' + blood_mask = 'icons/mob/human_races/masks/blood_resomi.dmi' + + eyes = "eyes_resomi" + slowdown = -1 + total_health = 50 + brute_mod = 1.35 + burn_mod = 1.35 + mob_size = MOB_SMALL + holder_type = /obj/item/weapon/holder/human + short_sighted = 1 + gluttonous = GLUT_TINY + + spawn_flags = CAN_JOIN | IS_WHITELISTED + appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR + bump_flag = MONKEY + swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL + push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN + + cold_level_1 = 180 + cold_level_2 = 130 + cold_level_3 = 70 + heat_level_1 = 320 + heat_level_2 = 370 + heat_level_3 = 600 + heat_discomfort_level = 292 + heat_discomfort_strings = list( + "Your feathers prickle in the heat.", + "You feel uncomfortably warm.", + ) + cold_discomfort_level = 180 + + has_limbs = list( + "chest" = list("path" = /obj/item/organ/external/chest), + "groin" = list("path" = /obj/item/organ/external/groin), + "head" = list("path" = /obj/item/organ/external/head), + "l_arm" = list("path" = /obj/item/organ/external/arm), + "r_arm" = list("path" = /obj/item/organ/external/arm/right), + "l_leg" = list("path" = /obj/item/organ/external/leg), + "r_leg" = list("path" = /obj/item/organ/external/leg/right), + "l_hand" = list("path" = /obj/item/organ/external/hand/resomi), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/resomi), + "l_foot" = list("path" = /obj/item/organ/external/foot/resomi), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/resomi) + ) + + has_organ = list( + "heart" = /obj/item/organ/heart, + "lungs" = /obj/item/organ/lungs, + "liver" = /obj/item/organ/liver, + "kidneys" = /obj/item/organ/kidneys, + "brain" = /obj/item/organ/brain, + "eyes" = /obj/item/organ/eyes + ) + + unarmed_types = list( + /datum/unarmed_attack/bite/sharp, + /datum/unarmed_attack/claws, + /datum/unarmed_attack/stomp/weak + ) + + var/shock_cap = 30 + var/hallucination_cap = 25 + +// I'm... so... ronrery, so ronery... +/datum/species/resomi/handle_environment_special(var/mob/living/carbon/human/H) + + // If they're dead or unconcious they're a bit beyond this kind of thing. + if(H.stat) + return + + // No point processing if we're already stressing the hell out. + if(H.hallucination >= hallucination_cap && H.shock_stage >= shock_cap) + return + + // Check for company. + for(var/mob/living/M in viewers(H)) + if(M == H || M.stat == DEAD || M.invisibility > H.see_invisible) + continue + if(M.faction == "neutral" || M.faction == H.faction) + return + + // No company? Suffer :( + if(H.shock_stage < shock_cap) + H.shock_stage += 1 + if(H.shock_stage >= shock_cap && H.hallucination < hallucination_cap) + H.hallucination += 2.5 + +/datum/species/resomi/get_vision_flags(var/mob/living/carbon/human/H) + if(!(H.sdisabilities & DEAF) && !H.ear_deaf) + return SEE_SELF|SEE_MOBS + else + return SEE_SELF diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm index a1639dd38db..eed9ff1cd69 100644 --- a/code/modules/mob/living/carbon/human/species/station/slime.dm +++ b/code/modules/mob/living/carbon/human/species/station/slime.dm @@ -1,15 +1,16 @@ /datum/species/slime name = "Slime" name_plural = "slimes" - is_small = 1 + mob_size = MOB_SMALL icobase = 'icons/mob/human_races/r_slime.dmi' deform = 'icons/mob/human_races/r_slime.dmi' - language = "Sol Common" //todo? + language = null //todo? unarmed_types = list(/datum/unarmed_attack/slime_glomp) - flags = IS_RESTRICTED | NO_BLOOD | NO_SCAN | NO_SLIP | NO_BREATHE - siemens_coefficient = 3 + flags = NO_SCAN | NO_SLIP | NO_BREATHE | NO_MINOR_CUT + spawn_flags = IS_RESTRICTED + siemens_coefficient = 3 //conductive darksight = 3 rarity_value = 5 @@ -31,17 +32,17 @@ push_flags = MONKEY|SLIME|SIMPLE_ANIMAL has_limbs = list( - "chest" = list("path" = /obj/item/organ/external/chest/slime), - "groin" = list("path" = /obj/item/organ/external/groin/slime), - "head" = list("path" = /obj/item/organ/external/head/slime), - "l_arm" = list("path" = /obj/item/organ/external/arm/slime), - "r_arm" = list("path" = /obj/item/organ/external/arm/right/slime), - "l_leg" = list("path" = /obj/item/organ/external/leg/slime), - "r_leg" = list("path" = /obj/item/organ/external/leg/right/slime), - "l_hand" = list("path" = /obj/item/organ/external/hand/slime), - "r_hand" = list("path" = /obj/item/organ/external/hand/right/slime), - "l_foot" = list("path" = /obj/item/organ/external/foot/slime), - "r_foot" = list("path" = /obj/item/organ/external/foot/right/slime) + "chest" = list("path" = /obj/item/organ/external/chest/unbreakable), + "groin" = list("path" = /obj/item/organ/external/groin/unbreakable), + "head" = list("path" = /obj/item/organ/external/head/unbreakable), + "l_arm" = list("path" = /obj/item/organ/external/arm/unbreakable), + "r_arm" = list("path" = /obj/item/organ/external/arm/right/unbreakable), + "l_leg" = list("path" = /obj/item/organ/external/leg/unbreakable), + "r_leg" = list("path" = /obj/item/organ/external/leg/right/unbreakable), + "l_hand" = list("path" = /obj/item/organ/external/hand/unbreakable), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/unbreakable), + "l_foot" = list("path" = /obj/item/organ/external/foot/unbreakable), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/unbreakable) ) /datum/species/slime/handle_death(var/mob/living/carbon/human/H) 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 89f8e01a598..fde8f7a3292 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -2,7 +2,6 @@ name = "Human" short_name = "hum" name_plural = "Humans" - language = "Sol Common" primitive_form = "Monkey" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite) blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \ @@ -10,8 +9,15 @@ While the central Sol government maintains control of its far-flung people, powerful corporate \ interests, rampant cyber and bio-augmentation and secretive factions make life on most human \ worlds tumultous at best." + num_alternate_languages = 2 + secondary_langs = list("Sol Common") + name_language = null // Use the first-name last-name generator rather than a language scrambler - flags = CAN_JOIN | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR + spawn_flags = CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR + +/datum/species/human/get_bodytype() + return "Human" stamina = 130 // Humans can sprint for longer than any other species stamina_recovery = 5 @@ -24,14 +30,18 @@ name_plural = "Unathi" icobase = 'icons/mob/human_races/r_lizard.dmi' deform = 'icons/mob/human_races/r_def_lizard.dmi' - language = "Sinta'unathi" tail = "sogtail" tail_animation = 'icons/mob/species/unathi/tail.dmi' unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) primitive_form = "Stok" darksight = 3 gluttonous = 1 + slowdown = 0.5 + brute_mod = 0.8 ethanol_resistance = 0.4 + num_alternate_languages = 2 + secondary_langs = list("Sinta'unathi") + name_language = "Sinta'unathi" stamina = 120 // Unathi have the shortest but fastest sprint of all sprint_speed_factor = 3.2 stamina_recovery = 5 @@ -59,7 +69,8 @@ ) - flags = CAN_JOIN | IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + spawn_flags = CAN_JOIN | IS_WHITELISTED + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR flesh_color = "#34AF10" @@ -97,6 +108,10 @@ darksight = 8 slowdown = -1 brute_mod = 1.2 + gluttonous = GLUT_TINY + num_alternate_languages = 2 + secondary_langs = list("Siik'maas") + name_language = "Siik'maas" ethanol_resistance = 0.8//Gets drunk a little faster rarity_value = 2 @@ -114,7 +129,7 @@ cold_level_1 = 200 //Default 260 cold_level_2 = 140 //Default 200 - cold_level_3 = 80 //Default 120 + cold_level_3 = 80 //Default 120 heat_level_1 = 330 //Default 360 heat_level_2 = 380 //Default 400 @@ -122,7 +137,8 @@ primitive_form = "Farwa" - flags = CAN_JOIN | IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + spawn_flags = CAN_JOIN | IS_WHITELISTED + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR flesh_color = "#AFA59E" base_color = "#333333" @@ -146,7 +162,6 @@ icobase = 'icons/mob/human_races/r_skrell.dmi' deform = 'icons/mob/human_races/r_def_skrell.dmi' eyes = "skrell_eyes_s" - language = "Skrellian" primitive_form = "Neaera" unarmed_types = list(/datum/unarmed_attack/punch) blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \ @@ -154,10 +169,13 @@ of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \ herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \ the secrets of their empire to their allies." - + num_alternate_languages = 2 + secondary_langs = list("Skrellian") + name_language = null rarity_value = 3 - flags = CAN_JOIN | IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_SLIP | HAS_SKIN_COLOR + spawn_flags = CAN_JOIN | IS_WHITELISTED + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR flesh_color = "#8CD7A3" blood_color = "#1D2CBF" @@ -177,7 +195,7 @@ icobase = 'icons/mob/human_races/r_diona.dmi' deform = 'icons/mob/human_races/r_def_plant.dmi' language = "Ceti Basic" - default_language = "Rootsong" + default_language = LANGUAGE_ROOTSPEAK unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/diona) //primitive_form = "Nymph" slowdown = 7 @@ -186,9 +204,10 @@ siemens_coefficient = 0.3 eyes = "blank_eyes" show_ssd = "completely quiescent" + num_alternate_languages = 1 + name_language = "Rootspeak" ethanol_resistance = -1//Can't get drunk - blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \ species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \ there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \ @@ -235,7 +254,9 @@ body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP + flags = NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP | NO_MINOR_CUT + appearance_flags = 0 + spawn_flags = CAN_JOIN | IS_WHITELISTED blood_color = "#97dd7c" flesh_color = "#907E4A" @@ -306,38 +327,81 @@ short_name = "ipc" name_plural = "machines" + blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \ + robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \ + to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \ + generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \ + inhuman in outlook and perspective." + icobase = 'icons/mob/human_races/r_machine.dmi' deform = 'icons/mob/human_races/r_machine.dmi' - language = "Tradeband" + + language = "Encoded Audio Language" unarmed_types = list(/datum/unarmed_attack/punch) rarity_value = 2 + num_alternate_languages = 1 // potentially could be 2? + name_language = "Encoded Audio Language" ethanol_resistance = -1//Can't get drunk eyes = "blank_eyes" + // #TODO-MERGE: Check for balance and self-repair. If self-repair is a thing, RIP balance. brute_mod = 0.5 - burn_mod = 1 + burn_mod = 1.0 show_ssd = "flashing a 'system offline' glyph on their monitor" + death_message = "gives one shrill beep before falling lifeless." + knockout_message = "encounters a hardware fault and suddenly reboots!" + halloss_message = "encounters a hardware fault and suddenly reboots." + halloss_message_self = "ERROR: Unrecoverable machine check exception.
      System halted, rebooting..." warning_low_pressure = 50 - hazard_low_pressure = 0 + hazard_low_pressure = -1 cold_level_1 = 50 cold_level_2 = -1 cold_level_3 = -1 - heat_level_1 = 500 //gives them about 25 seconds in space before taking damage + heat_level_1 = 500 // Gives them about 25 seconds in space before taking damage heat_level_2 = 1000 heat_level_3 = 2000 - synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. + body_temperature = null + passive_temp_gain = 10 // This should cause IPCs to stabilize at ~80 C in a 20 C environment. - flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC | NO_POISON + flags = NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON + spawn_flags = CAN_JOIN | IS_WHITELISTED blood_color = "#1F181F" flesh_color = "#575757" + virus_immune = 1 + reagent_tag = IS_MACHINE - has_organ = list() //TODO: Positronic brain. + has_organ = list( + "brain" = /obj/item/organ/mmi_holder/posibrain, + "cell" = /obj/item/organ/cell, + "optics" = /obj/item/organ/optical_sensor + ) + vision_organ = "optics" + + has_limbs = list( + "chest" = list("path" = /obj/item/organ/external/chest/ipc), + "groin" = list("path" = /obj/item/organ/external/groin/ipc), + "head" = list("path" = /obj/item/organ/external/head/ipc), + "l_arm" = list("path" = /obj/item/organ/external/arm/ipc), + "r_arm" = list("path" = /obj/item/organ/external/arm/right/ipc), + "l_leg" = list("path" = /obj/item/organ/external/leg/ipc), + "r_leg" = list("path" = /obj/item/organ/external/leg/right/ipc), + "l_hand" = list("path" = /obj/item/organ/external/hand/ipc), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc), + "l_foot" = list("path" = /obj/item/organ/external/foot/ipc), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) + ) + + + heat_discomfort_level = 373.15 + heat_discomfort_strings = list( + "Your CPU temperature probes warn you that you are approaching critical heat levels!" + ) stamina = -1 // Machines use power and generate heat, stamina is not a thing sprint_speed_factor = 1 // About as capable of speed as a human @@ -356,16 +420,15 @@ playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0) return 0 - - -/datum/species/machine/equip_survival_gear(var/mob/living/carbon/human/H) - /datum/species/machine/handle_death(var/mob/living/carbon/human/H) ..() - if(flags & IS_SYNTHETIC) - H.h_style = "" - spawn(100) - if(H) H.update_hair() + H.h_style = "" + spawn(100) + if(H) H.update_hair() + +/datum/species/machine/sanitize_name(var/new_name) + return sanitizeName(new_name, allow_numbers = 1) + /datum/species/bug name = "Vaurca" @@ -381,7 +444,7 @@ eyes = "vaurca_eyes" //makes it so that eye colour is not changed when skin colour is. brute_mod = 0.5 //note to self: remove is_synthetic checks for brmod and burnmod burn_mod = 1.5 //2x was a bit too much. we'll see how this goes. - tox_mod = 3 //they're not used to all our weird human bacteria. + toxins_mod = 3 //they're not used to all our weird human bacteria. warning_low_pressure = 50 hazard_low_pressure = 0 ethanol_resistance = 2 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 deleted file mode 100644 index c60d8bca1d7..00000000000 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm +++ /dev/null @@ -1,159 +0,0 @@ -// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability -// It functions almost identically (see code/datums/diseases/alien_embryo.dm) - -/obj/item/alien_embryo - name = "alien embryo" - desc = "All slimy and yuck." - icon = 'icons/mob/alien.dmi' - icon_state = "larva0_dead" - var/mob/living/affected_mob - var/stage = 0 - -/obj/item/alien_embryo/New() - if(istype(loc, /mob/living)) - affected_mob = loc - processing_objects.Add(src) - spawn(0) - AddInfectionImages(affected_mob) - else - qdel(src) - -/obj/item/alien_embryo/Destroy() - if(affected_mob) - affected_mob.status_flags &= ~(XENO_HOST) - spawn(0) - RemoveInfectionImages(affected_mob) - ..() - -/obj/item/alien_embryo/process() - if(!affected_mob) return - if(loc != affected_mob) - affected_mob.status_flags &= ~(XENO_HOST) - processing_objects.Remove(src) - spawn(0) - RemoveInfectionImages(affected_mob) - affected_mob = null - return - - if(stage < 5 && prob(3)) - stage++ - spawn(0) - RefreshInfectionImage(affected_mob) - - switch(stage) - if(2, 3) - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - affected_mob << "\red Your throat feels sore." - if(prob(1)) - affected_mob << "\red Mucous runs down the back of your throat." - if(4) - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(2)) - affected_mob << "\red Your muscles ache." - if(prob(20)) - affected_mob.take_organ_damage(1) - if(prob(2)) - affected_mob << "\red Your stomach hurts." - if(prob(20)) - affected_mob.adjustToxLoss(1) - affected_mob.updatehealth() - if(5) - affected_mob << "\red You feel something tearing its way out of your stomach..." - affected_mob.adjustToxLoss(10) - affected_mob.updatehealth() - if(prob(50)) - AttemptGrow() - -/obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1) - var/list/candidates = get_alien_candidates() - var/picked = null - - // To stop clientless larva, we will check that our host has a client - // if we find no ghosts to become the alien. If the host has a client - // he will become the alien but if he doesn't then we will set the stage - // to 2, so we don't do a process heavy check everytime. - - if(candidates.len) - picked = pick(candidates) - else if(affected_mob.client) - picked = affected_mob.key - else - stage = 4 // Let's try again later. - return - - if(affected_mob.lying) - affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_lie") - else - affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_stand") - spawn(6) - var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc) - new_xeno.key = picked - new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention - if(gib_on_success) - affected_mob.gib() - qdel(src) - -/*---------------------------------------- -Proc: RefreshInfectionImage() -Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens. -----------------------------------------*/ -/obj/item/alien_embryo/proc/RefreshInfectionImage() - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs) - continue - - if(alien.client) - for(var/image/I in alien.client.images) - if(dd_hasprefix_case(I.icon_state, "infected")) - qdel(I) - for(var/mob/living/L in mob_list) - if(iscorgi(L) || iscarbon(L)) - if(L.status_flags & XENO_HOST) - var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[stage]") - alien.client.images += I - -/*---------------------------------------- -Proc: AddInfectionImages(C) -Des: Checks if the passed mob (C) is infected with the alien egg, then gives each alien client an infected image at C. -----------------------------------------*/ -/obj/item/alien_embryo/proc/AddInfectionImages(var/mob/living/C) - if(C) - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs) - continue - - if(alien.client) - if(C.status_flags & XENO_HOST) - var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]") - alien.client.images += I - -/*---------------------------------------- -Proc: RemoveInfectionImage(C) -Des: Removes the alien infection image from all aliens in the world located in passed mob (C). -----------------------------------------*/ - -/obj/item/alien_embryo/proc/RemoveInfectionImages(var/mob/living/C) - - if(C) - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs) - continue - - if(alien.client) - for(var/image/I in alien.client.images) - if(I.loc == C) - if(dd_hasprefix_case(I.icon_state, "infected")) - 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 ddd48248a2a..0b7a35cd1bf 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 @@ -15,7 +15,7 @@ var/const/MAX_ACTIVE_TIME = 400 icon_state = "facehugger" item_state = "facehugger" w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4 - flags = MASKCOVERSMOUTH | MASKCOVERSEYES | AIRTIGHT + flags = PROXMOVE body_parts_covered = FACE|EYES throw_range = 5 @@ -32,10 +32,11 @@ var/const/MAX_ACTIVE_TIME = 400 ..() -/obj/item/clothing/mask/facehugger/attack(mob/living/M as mob, mob/user as mob) - ..() +/obj/item/clothing/mask/facehugger/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + . = ..() user.drop_from_inventory(src) - Attach(M) + if(hit_zone == "head") + Attach(target) /obj/item/clothing/mask/facehugger/New() if(config.aliens_allowed) @@ -236,6 +237,6 @@ var/const/MAX_ACTIVE_TIME = 400 if(ishuman(C)) var/mob/living/carbon/human/H = C - if(H.head && H.head.flags & HEADCOVERSMOUTH) + if(H.head && (H.head.body_parts_covered & FACE) && !(H.head.item_flags & FLEXIBLEMATERIAL)) return 0 return 1 diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index bc72354c4af..34dd42ef8bc 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -88,13 +88,13 @@ verbs -= /mob/living/carbon/human/proc/lay_egg return - if(locate(/obj/effect/alien/egg) in get_turf(src)) + if(locate(/obj/structure/alien/egg) in get_turf(src)) src << "There's already an egg here." return if(check_alien_ability(75,1,"egg sac")) visible_message("[src] has laid an egg!") - new /obj/effect/alien/egg(loc) + new /obj/structure/alien/egg(loc) return @@ -121,7 +121,7 @@ if(check_alien_ability(50,1,"resin spinner")) visible_message("[src] has planted some alien weeds!") - new /obj/effect/alien/weeds/node(loc) + new /obj/structure/alien/node(loc) return /mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N @@ -144,15 +144,17 @@ var/turf/simulated/wall/W = O if(W.material.flags & MATERIAL_UNMELTABLE) cannot_melt = 1 - else if(istype(O, /turf/simulated/floor/engine)) - cannot_melt = 1 + else if(istype(O, /turf/simulated/floor)) + var/turf/simulated/floor/F = O + if(F.flooring && (F.flooring.flags & TURF_ACID_IMMUNE)) + cannot_melt = 1 if(cannot_melt) src << "You cannot dissolve this object." return if(check_alien_ability(200,0,"acid gland")) - new /obj/effect/alien/acid(get_turf(O), O) + new /obj/effect/acid(get_turf(O), O) visible_message("[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!") return @@ -171,12 +173,29 @@ visible_message("[src] spits neurotoxin at [target]!", "You spit neurotoxin at [target].") + //I'm not motivated enough to revise this. Prjectile code in general needs update. + // Maybe change this to use throw_at? ~ Z + var/turf/T = loc + var/turf/U = (istype(target, /atom/movable) ? target.loc : target) + + if(!U || !T) + return + while(U && !istype(U,/turf)) + U = U.loc + if(!istype(T, /turf)) + return + if (U == T) + usr.bullet_act(new /obj/item/projectile/energy/neurotoxin(usr.loc), get_organ_target()) + return + if(!istype(U, /turf)) + return + var/obj/item/projectile/energy/neurotoxin/A = new /obj/item/projectile/energy/neurotoxin(usr.loc) A.launch(target, get_organ_target()) /mob/living/carbon/human/proc/resin() // -- TLE set name = "Secrete Resin (75)" - set desc = "Secrete tough malleable resin." + set desc = "Secrete tough, malleable resin." set category = "Abilities" var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist @@ -191,9 +210,51 @@ if("resin door") new /obj/structure/simple_door/resin(loc) if("resin wall") - new /obj/effect/alien/resin/wall(loc) + new /obj/structure/alien/resin/wall(loc) if("resin membrane") - new /obj/effect/alien/resin/membrane(loc) + new /obj/structure/alien/resin/membrane(loc) if("resin nest") new /obj/structure/bed/nest(loc) return + +mob/living/carbon/human/proc/xeno_infest(mob/living/carbon/human/M as mob in oview()) + set name = "Infest (500)" + set desc = "Link a victim to the hivemind." + set category = "Abilities" + + if(!M.Adjacent(src)) + src << "They are too far away." + return + + if(!M.mind) + src << "This mindless flesh adds nothing to the hive." + return + + if(M.species.get_bodytype() == "Xenomorph" || !isnull(M.internal_organs_by_name["hive node"])) + src << "They are already part of the hive." + return + + var/obj/item/organ/affecting = M.get_organ("chest") + if(!affecting || (affecting.status & ORGAN_ROBOT)) + src << "This form is not compatible with our physiology." + return + + src.visible_message("\The [src] crouches over \the [M], extending a hideous protuberance from its head!") + + if(!do_after(src, 150)) + return + + if(!M || !M.Adjacent(src)) + src << "They are too far away." + return + + if(M.species.get_bodytype() == "Xenomorph" || !isnull(M.internal_organs_by_name["hive node"]) || !affecting || (affecting.status & ORGAN_ROBOT)) + return + + if(!check_alien_ability(500,1,"egg sac")) + return + + src.visible_message("\The [src] regurgitates something into \the [M]'s torso!") + M << "A hideous lump of alien mass strains your ribcage as it settles within!" + var/obj/item/organ/xenos/hivenode/node = new(affecting) + node.replaced(M,affecting) \ No newline at end of file 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 f082af91e40..279bbbdbc8e 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 @@ -11,12 +11,12 @@ has_fine_manipulation = 0 siemens_coefficient = 0 - gluttonous = 2 + gluttonous = GLUT_ANYTHING eyes = "blank_eyes" - brute_mod = 0.5 // Hardened carapace. - burn_mod = 2 // Weak to fire. + brute_mod = 0.25 // Hardened carapace. + burn_mod = 1.1 // Weak to fire. warning_low_pressure = 50 hazard_low_pressure = -1 @@ -25,7 +25,8 @@ cold_level_2 = -1 cold_level_3 = -1 - flags = IS_RESTRICTED | NO_BREATHE | NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON + flags = NO_BREATHE | NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT + spawn_flags = IS_RESTRICTED reagent_tag = IS_XENOS @@ -97,11 +98,11 @@ var/datum/gas_mixture/environment = T.return_air() if(!environment) return - if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T) - if(!regenerate(H)) - var/obj/item/organ/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"] - P.stored_plasma += weeds_plasma_rate - P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma) + var/obj/effect/plant/plant = locate() in T + if((environment.gas["phoron"] > 0 || (plant && plant.seed && plant.seed.name == "xenomorph")) && !regenerate(H)) + var/obj/item/organ/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"] + P.stored_plasma += weeds_plasma_rate + P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma) ..() /datum/species/xenos/proc/regenerate(var/mob/living/carbon/human/H) @@ -139,14 +140,6 @@ return 0 -/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H) - H.AddInfectionImages() - ..() - -/datum/species/xenos/handle_logout_special(var/mob/living/carbon/human/H) - H.RemoveInfectionImages() - ..() - /datum/species/xenos/drone name = "Xenomorph Drone" caste_name = "drone" @@ -281,7 +274,8 @@ /mob/living/carbon/human/proc/transfer_plasma, /mob/living/carbon/human/proc/corrosive_acid, /mob/living/carbon/human/proc/neurotoxin, - /mob/living/carbon/human/proc/resin + /mob/living/carbon/human/proc/resin, + /mob/living/carbon/human/proc/xeno_infest ) /datum/species/xenos/queen/handle_login_special(var/mob/living/carbon/human/H) 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 6cb8a464756..504577c7d33 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -22,28 +22,3 @@ proc/create_new_xenomorph(var/alien_caste,var/target) /mob/living/carbon/human/xqueen/New(var/new_loc) h_style = "Bald" ..(new_loc, "Xenomorph Queen") - -// I feel like we should generalize/condense down all the various icon-rendering antag procs. -/*---------------------------------------- -Proc: AddInfectionImages() -Des: Gives the client of the alien an image on each infected mob. -----------------------------------------*/ -/mob/living/carbon/human/proc/AddInfectionImages() - if (client) - for (var/mob/living/C in mob_list) - if(C.status_flags & XENO_HOST) - var/obj/item/alien_embryo/A = locate() in C - var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]") - client.images += I - return - -/*---------------------------------------- -Proc: RemoveInfectionImages() -Des: Removes all infected images from the alien. -----------------------------------------*/ -/mob/living/carbon/human/proc/RemoveInfectionImages() - if (client) - for(var/image/I in client.images) - if(dd_hasprefix_case(I.icon_state, "infected")) - qdel(I) - return diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index a4b3a747382..629706272fa 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -3,8 +3,7 @@ if(!slot_to_strip || !istype(user) || (isanimal(user) && !istype(user, /mob/living/simple_animal/hostile) ) ) return 0 - // TODO : Change to incapacitated() on merge. - if(user.stat || user.lying || user.resting || user.buckled || !user.Adjacent(src) || user.restrained()) + if(user.incapacitated() || !user.Adjacent(src)) user << browse(null, text("window=mob[src.name]")) return 0 diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index e541920cb4f..5630f97711b 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -1,3 +1,5 @@ +var/global/list/sparring_attack_cache = list() + //Species unarmed attacks /datum/unarmed_attack var/attack_verb = list("attack") // Empty hand hurt intent verb. @@ -8,10 +10,19 @@ var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent. var/sharp = 0 var/edge = 0 - + + var/deal_halloss + var/sparring_variant_type = /datum/unarmed_attack/light_strike + var/eye_attack_text var/eye_attack_text_victim +/datum/unarmed_attack/proc/get_sparring_variant() + if(sparring_variant_type) + if(!sparring_attack_cache[sparring_variant_type]) + sparring_attack_cache[sparring_variant_type] = new sparring_variant_type() + return sparring_attack_cache[sparring_variant_type] + /datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if(user.restrained()) return 0 @@ -87,7 +98,7 @@ /datum/unarmed_attack/proc/handle_eye_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target) var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] eyes.take_damage(rand(3,4), 1) - + user.visible_message("[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!") target << "You experience[(target.species.flags & NO_PAIN)? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(target.species.flags & NO_PAIN)? "." : "!"]" @@ -237,3 +248,13 @@ switch(attack_damage) if(1 to 4) user.visible_message("[pick("[user] stomped on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!") if(5) user.visible_message("[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/ + +/datum/unarmed_attack/light_strike + deal_halloss = 3 + attack_noun = list("tap","light strike") + attack_verb = list("tapped", "lightly struck") + damage = 2 + shredding = 0 + damage = 0 + sharp = 0 + edge = 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 31695dacc3b..d3871827293 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -168,6 +168,8 @@ Please contact me on #coderbus IRC. ~Carn x icon = stand_icon for(var/image/I in overlays_standing) overlays += I + if(species.has_floating_eyes) + overlays |= species.get_eyes(src) if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone. var/matrix/M = matrix() @@ -252,6 +254,7 @@ var/global/list/damage_icon_parts = list() 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]" if(lip_style) icon_key += "[lip_style]" @@ -273,6 +276,16 @@ var/global/list/damage_icon_parts = list() icon_key += "3" else icon_key += "1" + if(part) + icon_key += "[part.species.race_key]" + icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" + icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" + if(part.s_col && part.s_col.len >= 3) + icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]" + if(part.body_hair && part.h_col && part.h_col.len >= 3) + icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]" + else + icon_key += "#000000" icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" var/icon/base_icon @@ -325,10 +338,10 @@ var/global/list/damage_icon_parts = list() stand_icon.Blend(base_icon,ICON_OVERLAY) //Underwear - if(underwear && species.flags & HAS_UNDERWEAR) + if(underwear && species.appearance_flags & HAS_UNDERWEAR) stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear), ICON_OVERLAY) - if(undershirt && species.flags & HAS_UNDERWEAR) + if(undershirt && species.appearance_flags & HAS_UNDERWEAR) stand_icon.Blend(new /icon('icons/mob/human.dmi', undershirt), ICON_OVERLAY) if(update_icons) @@ -348,7 +361,7 @@ var/global/list/damage_icon_parts = list() return //masks and helmets can obscure our hair. - if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) + if( (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR))) if(update_icons) update_icons() return @@ -364,7 +377,7 @@ var/global/list/damage_icon_parts = list() face_standing.Blend(facial_s, ICON_OVERLAY) - if(h_style && !(head && (head.flags & BLOCKHEADHAIR))) + if(h_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] if(hair_style && (src.species.get_bodytype() in hair_style.species_allowed)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") @@ -420,22 +433,11 @@ var/global/list/damage_icon_parts = list() overlays_standing[MUTATIONS_LAYER] = null if(update_icons) update_icons() -//Call when target overlay should be added/removed -/mob/living/carbon/human/update_targeted(var/update_icons=1) - if (targeted_by && target_locked) - overlays_standing[TARGETED_LAYER] = target_locked - else if (!targeted_by && target_locked) - qdel(target_locked) - if (!targeted_by) - overlays_standing[TARGETED_LAYER] = null - if(update_icons) update_icons() - - /* --------------------------------------- */ //For legacy support. /mob/living/carbon/human/regenerate_icons() ..() - if(monkeyizing) return + if(transforming) return update_mutations(0) update_body(0) @@ -507,6 +509,7 @@ var/global/list/damage_icon_parts = list() //need to append _s to the icon state for legacy compatibility var/image/standing = image(icon = under_icon, icon_state = under_state) + standing.color = w_uniform.color //apply blood overlay if(w_uniform.blood_DNA) @@ -580,6 +583,7 @@ var/global/list/damage_icon_parts = list() bloodsies.color = gloves.blood_color standing.overlays += bloodsies gloves.screen_loc = ui_gloves + standing.color = gloves.color overlays_standing[GLOVES_LAYER] = standing else if(blood_DNA) @@ -697,6 +701,7 @@ var/global/list/damage_icon_parts = list() var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood") bloodsies.color = shoes.blood_color standing.overlays += bloodsies + standing.color = shoes.color overlays_standing[SHOES_LAYER] = standing else if(feet_blood_DNA) @@ -741,8 +746,11 @@ var/global/list/damage_icon_parts = list() t_icon = head.icon_override else if(head.sprite_sheets && head.sprite_sheets[species.get_bodytype()]) t_icon = head.sprite_sheets[species.get_bodytype()] - else if(head.item_icons && (icon_head in head.item_icons)) - t_icon = head.item_icons[icon_head] + + else if(head.item_icons && (slot_head_str in head.item_icons)) + t_icon = head.item_icons[slot_head_str] + else + t_icon = INV_HEAD_DEF_ICON if (!standing) //Determine the state to use @@ -761,6 +769,7 @@ var/global/list/damage_icon_parts = list() if(hat.on && light_overlay_cache["[hat.light_overlay]"]) standing.overlays |= light_overlay_cache["[hat.light_overlay]"] + standing.color = head.color overlays_standing[HEAD_LAYER] = standing if(update_icons) update_icons() @@ -854,6 +863,7 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = wear_suit.sprite_sheets[species.get_bodytype()], "icon_state" = "[wear_suit.icon_state]") else standing = image("icon" = 'icons/mob/suit.dmi', "icon_state" = "[wear_suit.icon_state]") + standing.color = wear_suit.color if(wear_suit.blood_DNA) var/obj/item/clothing/suit/S = wear_suit @@ -861,6 +871,12 @@ var/global/list/damage_icon_parts = list() bloodsies.color = wear_suit.blood_color standing.overlays += bloodsies + // Accessories - copied from uniform, BOILERPLATE because fuck this system. + var/obj/item/clothing/suit/suit = wear_suit + if(istype(suit) && suit.accessories.len) + for(var/obj/item/clothing/accessory/A in suit.accessories) + standing.overlays |= A.get_mob_overlay() + overlays_standing[SUIT_LAYER] = standing update_tail_showing(0) @@ -902,6 +918,7 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = wear_mask.sprite_sheets[species.get_bodytype()], "icon_state" = "[wear_mask.icon_state]") else standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]") + standing.color = wear_mask.color if( !istype(wear_mask, /obj/item/clothing/mask/smokable/cigarette) && wear_mask.blood_DNA ) var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood") @@ -956,6 +973,10 @@ var/global/list/damage_icon_parts = list() else overlay_state = back.icon_state + //apply color + var/image/standing = image(icon = overlay_icon, icon_state = overlay_state) + standing.color = back.color + //create the image overlays_standing[BACK_LAYER] = image(icon = overlay_icon, icon_state = overlay_state) @@ -976,14 +997,32 @@ var/global/list/damage_icon_parts = list() drop_r_hand() drop_l_hand() stop_pulling() //TODO: should be handled elsewhere - overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1") + + var/image/standing + if(handcuffed.icon_override) + standing = image("icon" = handcuffed.icon_override, "icon_state" = "handcuff1") + else if(handcuffed.sprite_sheets && handcuffed.sprite_sheets[species.get_bodytype()]) + standing = image("icon" = handcuffed.sprite_sheets[species.get_bodytype()], "icon_state" = "handcuff1") + else + standing = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1") + overlays_standing[HANDCUFF_LAYER] = standing + else overlays_standing[HANDCUFF_LAYER] = null if(update_icons) update_icons() /mob/living/carbon/human/update_inv_legcuffed(var/update_icons=1) if(legcuffed) - overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1") + + var/image/standing + if(legcuffed.icon_override) + standing = image("icon" = legcuffed.icon_override, "icon_state" = "legcuff1") + else if(legcuffed.sprite_sheets && legcuffed.sprite_sheets[species.get_bodytype()]) + standing = image("icon" = legcuffed.sprite_sheets[species.get_bodytype()], "icon_state" = "legcuff1") + else + standing = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1") + overlays_standing[LEGCUFF_LAYER] = standing + if(src.m_intent != "walk") src.m_intent = "walk" if(src.hud_used && src.hud_used.move_intent) @@ -1089,15 +1128,17 @@ var/global/list/damage_icon_parts = list() update_icons() /mob/living/carbon/human/proc/get_tail_icon() - var/icon_key = "[species.race_key][r_skin][g_skin][b_skin]" - + var/icon_key = "[species.race_key][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]" var/icon/tail_icon = tail_icon_cache[icon_key] if(!tail_icon) - //generate a new one tail_icon = new/icon(icon = (species.tail_animation? species.tail_animation : 'icons/effects/species.dmi')) tail_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) - + // The following will not work with animated tails. + if(species.tail_hair) + var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.tail]_[species.tail_hair]") + hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + tail_icon.Blend(hair_icon, ICON_OVERLAY) tail_icon_cache[icon_key] = tail_icon return tail_icon diff --git a/code/modules/mob/living/carbon/metroid/examine.dm b/code/modules/mob/living/carbon/metroid/examine.dm index 03f315404b7..ecc09992aa5 100644 --- a/code/modules/mob/living/carbon/metroid/examine.dm +++ b/code/modules/mob/living/carbon/metroid/examine.dm @@ -26,6 +26,6 @@ if(10) msg += "It is radiating with massive levels of electrical activity!\n" - msg += "*---------*
      " + msg += "*---------*" user << msg return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/hud.dm b/code/modules/mob/living/carbon/metroid/hud.dm index c5282b9a839..da6729c3dcf 100644 --- a/code/modules/mob/living/carbon/metroid/hud.dm +++ b/code/modules/mob/living/carbon/metroid/hud.dm @@ -1,2 +1,2 @@ -/mob/living/carbon/slime/regular_hud_updates() +/mob/living/carbon/slime/handle_regular_hud_updates() 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 1271bb7da33..77832a39bf2 100644 --- a/code/modules/mob/living/carbon/metroid/items.dm +++ b/code/modules/mob/living/carbon/metroid/items.dm @@ -8,7 +8,7 @@ throwforce = 0 throw_speed = 3 throw_range = 6 - origin_tech = "biotech=4" + origin_tech = list(TECH_BIO = 4) var/Uses = 1 // uses before it goes inert var/enhanced = 0 //has it been enhanced before? flags = OPENCONTAINER @@ -282,87 +282,3 @@ /mob/living/carbon/slime/has_eyes() return 0 -//////////////////////////////Old shit from metroids/RoRos, and the old cores, would not take much work to re-add them//////////////////////// - -/* -// Basically this slime Core catalyzes reactions that normally wouldn't happen anywhere -/obj/item/slime_core - name = "slime extract" - desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." - icon = 'icons/mob/slimes.dmi' - icon_state = "slime extract" - force = 1.0 - w_class = 1.0 - throwforce = 1.0 - throw_speed = 2 - throw_range = 6 - origin_tech = "biotech=4" - var/POWERFLAG = 0 // sshhhhhhh - var/Flush = 30 - var/Uses = 5 // uses before it goes inert - -/obj/item/slime_core/New() - ..() - create_reagents(100) - POWERFLAG = rand(1,10) - Uses = rand(7, 25) - //flags |= NOREACT -/* - spawn() - Life() - - proc/Life() - while(src) - sleep(25) - Flush-- - if(Flush <= 0) - reagents.clear_reagents() - Flush = 30 -*/ - - - -/obj/item/weapon/reagent_containers/food/snacks/egg/slime - name = "slime egg" - desc = "A small, gelatinous egg." - icon = 'icons/mob/mob.dmi' - icon_state = "slime egg-growing" - bitesize = 12 - origin_tech = "biotech=4" - var/grown = 0 - -/obj/item/weapon/reagent_containers/food/snacks/egg/slime/New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("slimejelly", 1) - spawn(rand(1200,1500))//the egg takes a while to "ripen" - Grow() - -/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Grow() - grown = 1 - icon_state = "slime egg-grown" - processing_objects.Add(src) - return - -/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Hatch() - processing_objects.Remove(src) - var/turf/T = get_turf(src) - src.visible_message(" The [name] pulsates and quivers!") - spawn(rand(50,100)) - src.visible_message(" The [name] bursts open!") - new/mob/living/carbon/slime(T) - qdel(src) - - -/obj/item/weapon/reagent_containers/food/snacks/egg/slime/process() - var/turf/location = get_turf(src) - var/datum/gas_mixture/environment = location.return_air() - if (environment.phoron > MOLES_PHORON_VISIBLE)//phoron exposure causes the egg to hatch - src.Hatch() - -/obj/item/weapon/reagent_containers/food/snacks/egg/slime/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype( W, /obj/item/weapon/pen/crayon )) - return - else - ..() -*/ diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 56857dc74ad..7d364d2b8a6 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -2,13 +2,12 @@ set invisibility = 0 set background = 1 - if (src.monkeyizing) + if (src.transforming) return ..() if(stat != DEAD) - handle_chemicals_in_body() handle_nutrition() if(is_ventcrawling == 0) // Stops sight returning to normal if inside a vent @@ -21,18 +20,7 @@ handle_AI() handle_speech_and_mood() - var/datum/gas_mixture/environment - if(src.loc) - environment = loc.return_air() - - regular_hud_updates() - - if(environment) - handle_environment(environment) // Handle temperature/pressure differences between body and environment - - handle_regular_status_updates() // Status updates, death etc. - -/mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment) +/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment) if(!environment) adjustToxLoss(rand(10,20)) return @@ -55,11 +43,14 @@ //Account for massive pressure differences - if(bodytemperature < hurt_temperature) // start calculating temperature damage etc - if(bodytemperature <= die_temperature) - if(bodytemperature <= 50) + if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc + + if(bodytemperature <= hurt_temperature) + if(bodytemperature <= die_temperature) adjustToxLoss(200) else + // could be more fancy, but doesn't worth the complexity: when the slimes goes into a cold area + // the damage is mostly determined by how fast its body cools adjustToxLoss(30) updatehealth() @@ -83,7 +74,7 @@ temp_change = (temperature - current) return temp_change -/mob/living/carbon/slime/proc/handle_chemicals_in_body() +/mob/living/carbon/slime/handle_chemicals_in_body() chem_effects.Cut() analgesic = 0 @@ -98,7 +89,7 @@ return //TODO: DEFERRED -/mob/living/carbon/slime/proc/handle_regular_status_updates() +/mob/living/carbon/slime/handle_regular_status_updates() src.blinded = null @@ -549,4 +540,4 @@ return 0 /mob/living/carbon/slime/slip() //Can't slip something without legs. - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index dee6d36b90a..99ffce0eebb 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -198,41 +198,12 @@ updatehealth() -/mob/living/carbon/slime/blob_act() - if (stat == 2) - return - var/shielded = 0 - - var/damage = null - if (stat != 2) - damage = rand(10,30) - - if(shielded) - damage /= 4 - - show_message(" The blob attacks you!") - - adjustFireLoss(damage) - - updatehealth() - return - - /mob/living/carbon/slime/u_equip(obj/item/W as obj) return /mob/living/carbon/slime/attack_ui(slot) return -/mob/living/carbon/slime/meteorhit(O as obj) - visible_message("[src] has been hit by [O]") - - adjustBruteLoss((istype(O, /obj/effect/meteor/small) ? 10 : 25)) - adjustFireLoss(30) - - updatehealth() - return - /mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob) ..() diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index df4700547f1..b22536f01b5 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -27,10 +27,11 @@ spawn() escape_legcuffs() /mob/living/carbon/proc/escape_handcuffs() - if(!(last_special <= world.time)) return + //if(!(last_special <= world.time)) return - next_move = world.time + 100 - last_special = world.time + 100 + //This line represent a significant buff to grabs... + // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay + setClickCooldown(100) if(can_break_cuffs()) //Don't want to do a lot of logic gating here. break_handcuffs() @@ -46,8 +47,13 @@ breakouttime = HC.breakouttime displaytime = breakouttime / 600 //Minutes + var/mob/living/carbon/human/H = src + if(istype(H) && H.gloves && istype(H.gloves,/obj/item/clothing/gloves/rig)) + breakouttime /= 2 + displaytime /= 2 + visible_message( - "[src] attempts to remove \the [HC]!", + "\The [src] attempts to remove \the [HC]!", "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" ) @@ -55,16 +61,16 @@ if(!handcuffed || buckled) return visible_message( - "[src] manages to remove \the [handcuffed]!", + "\The [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 + if(!canClick()) + return - next_move = world.time + 100 - last_special = world.time + 100 + setClickCooldown(100) if(can_break_cuffs()) //Don't want to do a lot of logic gating here. break_legcuffs() @@ -154,14 +160,12 @@ return ..() /mob/living/carbon/escape_buckle() + setClickCooldown(100) 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)" diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index abd2796b8ea..e4188474df4 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -24,6 +24,7 @@ adjustCloneLoss(damage/(blocked+1)) if(HALLOSS) adjustHalLoss(damage/(blocked+1)) + flash_weak_pain() updatehealth() return 1 @@ -40,7 +41,7 @@ -/mob/living/proc/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) +/mob/living/proc/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0, var/check_protection = 1) if(!effect || (blocked >= 2)) return 0 switch(effecttype) if(STUN) @@ -52,7 +53,7 @@ if(AGONY) adjustHalLoss(effect) //Changed this to use the wrapper function, it shouldn't directly alter the value if(IRRADIATE) - var/rad_protection = getarmor(null, "rad")/100 + var/rad_protection = check_protection ? getarmor(null, "rad")/100 : 0 radiation += max((1-rad_protection)*effect/(blocked+1),0)//Rads auto check armor if(STUTTER) if(status_flags & CANSTUN) // stun is usually associated with stutter diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm new file mode 100644 index 00000000000..3ba7835b92e --- /dev/null +++ b/code/modules/mob/living/life.dm @@ -0,0 +1,187 @@ +/mob/living/Life() + set invisibility = 0 + set background = BACKGROUND_ENABLED + + ..() + + if (transforming) + return + if(!loc) + return + var/datum/gas_mixture/environment = loc.return_air() + + if(stat != DEAD) + //Breathing, if applicable + handle_breathing() + + //Mutations and radiation + handle_mutations_and_radiation() + + //Chemicals in the body + handle_chemicals_in_body() + + //Blood + handle_blood() + + //Random events (vomiting etc) + handle_random_events() + + . = 1 + + //Handle temperature/pressure differences between body and environment + if(environment) + handle_environment(environment) + + //Check if we're on fire + handle_fire() + + //stuff in the stomach + handle_stomach() + + update_pulling() + + for(var/obj/item/weapon/grab/G in src) + G.process() + + blinded = 0 // Placing this here just show how out of place it is. + // human/handle_regular_status_updates() needs a cleanup, as blindness should be handled in handle_disabilities() + if(handle_regular_status_updates()) // Status & health update, are we dead or alive etc. + handle_disabilities() // eye, ear, brain damages + handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc + + handle_actions() + + update_canmove() + + handle_regular_hud_updates() + +/mob/living/proc/handle_breathing() + return + +/mob/living/proc/handle_mutations_and_radiation() + return + +/mob/living/proc/handle_chemicals_in_body() + return + +/mob/living/proc/handle_blood() + return + +/mob/living/proc/handle_random_events() + return + +/mob/living/proc/handle_environment(var/datum/gas_mixture/environment) + return + +// Defined in devour.dm +// /mob/living/proc/handle_stomach() +// return + +/mob/living/proc/update_pulling() + if(pulling) + if(incapacitated()) + stop_pulling() + +//This updates the health and status of the mob (conscious, unconscious, dead) +/mob/living/proc/handle_regular_status_updates() + updatehealth() + if(stat != DEAD) + if(paralysis) + stat = UNCONSCIOUS + else if (status_flags & FAKEDEATH) + stat = UNCONSCIOUS + else + stat = CONSCIOUS + return 1 + +//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc.. +/mob/living/proc/handle_status_effects() + if(paralysis) + paralysis = max(paralysis-1,0) + if(stunned) + stunned = max(stunned-1,0) + if(!stunned) + update_icons() + + if(weakened) + weakened = max(weakened-1,0) + if(!weakened) + update_icons() + +/mob/living/proc/handle_disabilities() + //Eyes + if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own + eye_blind = max(eye_blind, 1) + else if(eye_blind) //blindness, heals slowly over time + eye_blind = max(eye_blind-1,0) + else if(eye_blurry) //blurry eyes heal slowly + eye_blurry = max(eye_blurry-1, 0) + + //Ears + if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own + setEarDamage(-1, max(ear_deaf, 1)) + else + // deafness heals slowly over time, unless ear_damage is over 100 + if(ear_damage < 100) + adjustEarDamage(-0.05,-1) + +//this handles hud updates. Calls update_vision() and handle_hud_icons() +/mob/living/proc/handle_regular_hud_updates() + if(!client) return 0 + + handle_hud_icons() + handle_vision() + + return 1 + +/mob/living/proc/handle_vision() + client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science) + update_sight() + + if(stat == DEAD) + return + + if(blind) + if(eye_blind) + blind.layer = 18 + else + blind.layer = 0 + if (disabilities & NEARSIGHTED) + client.screen += global_hud.vimpaired + if (eye_blurry) + client.screen += global_hud.blurry + if (druggy) + client.screen += global_hud.druggy + if(machine) + var/viewflags = machine.check_eye(src) + if(viewflags < 0) + reset_view(null, 0) + else if(viewflags) + sight |= viewflags + else if(eyeobj) + if(eyeobj.owner != src) + reset_view(null) + else if(!client.adminobs) + reset_view(null) + +/mob/living/proc/update_sight() + if(stat == DEAD) + update_dead_sight() + else + sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = initial(see_in_dark) + see_invisible = initial(see_invisible) + +/mob/living/proc/update_dead_sight() + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + +/mob/living/proc/handle_hud_icons() + handle_hud_icons_health() + handle_hud_glasses() + +/mob/living/proc/handle_hud_icons_health() + return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d5b643a1d7c..0872fd8ba00 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -64,20 +64,6 @@ default behaviour is: now_pushing = 0 return - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - var/dense = 0 - if(loc.density) - dense = 1 - for(var/atom/movable/A in loc) - if(A == src) - continue - if(A.density) - if(A.flags&ON_BORDER) - dense = !A.CanPass(src, src.loc) - else - dense = 1 - if(dense) break - //Leaping mobs just land on the tile, no pushing, no anything. if(status_flags & LEAPING) loc = tmob.loc @@ -85,7 +71,7 @@ default behaviour is: now_pushing = 0 return - if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !dense && can_move_mob(tmob, 1, 0)) // mutual brohugs all around! + if(can_swap_with(tmob)) // mutual brohugs all around! var/turf/oldloc = loc forceMove(tmob.loc) tmob.forceMove(oldloc) @@ -98,6 +84,9 @@ default behaviour is: if(!can_move_mob(tmob, 0, 0)) now_pushing = 0 return + if(a_intent == I_HELP || src.restrained()) + now_pushing = 0 + return if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) if(prob(40) && !(FAT in src.mutations)) src << "You fail to push [tmob]'s fat ass out of the way." @@ -140,6 +129,33 @@ default behaviour is: return return +/proc/swap_density_check(var/mob/swapper, var/mob/swapee) + var/turf/T = get_turf(swapper) + if(T.density) + return 1 + for(var/atom/movable/A in T) + if(A == swapper) + continue + if(!A.CanPass(swapee, T, 1)) + return 1 + +/mob/living/proc/can_swap_with(var/mob/living/tmob) + if(tmob.buckled || buckled) + return 0 + //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller + if(!(tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained()))) + return 0 + if(!tmob.canmove || !canmove) + return 0 + + if(swap_density_check(src, tmob)) + return 0 + + if(swap_density_check(tmob, src)) + return 0 + + return can_move_mob(tmob, 1, 0) + /mob/living/verb/succumb() set hidden = 1 if ((src.health < 0 && src.health > -95.0)) @@ -391,8 +407,8 @@ default behaviour is: /mob/living/proc/revive() // Stop killing yourself. Please. - if(suiciding) - suiciding = 0 +// if(suiciding) +// suiciding = 0 rejuvenate() if(buckled) @@ -459,6 +475,9 @@ default behaviour is: BITSET(hud_updateflag, HEALTH_HUD) BITSET(hud_updateflag, STATUS_HUD) BITSET(hud_updateflag, LIFE_HUD) + + failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath. + return /mob/living/proc/UpdateDamageIcon() @@ -501,10 +520,6 @@ default behaviour is: if(!( isturf(pulling.loc) )) stop_pulling() return - else - if(Debug) - log_debug("pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]") - log_debug("REPORT THIS") ///// if(pulling && pulling.anchored) @@ -589,8 +604,8 @@ default behaviour is: set name = "Resist" set category = "IC" - if(!(stat || next_move > world.time)) - next_move = world.time + 20 + if(!stat && canClick()) + setClickCooldown(20) resist_grab() if(!weakened) process_resist() @@ -617,17 +632,24 @@ default behaviour is: 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.forceMove(get_turf(H)) + M << "\The [H] wriggles out of your grip!" + src << "You wriggle out of \the [M]'s grip!" - if(istype(M)) + // Update whether or not this mob needs to pass emotes to contents. 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 + else if(istype(H.loc,/obj/item/clothing/accessory/holster)) + var/obj/item/clothing/accessory/holster/holster = H.loc + if(holster.holstered == H) + holster.clear_holster() + src << "You extricate yourself from \the [holster]." + H.forceMove(get_turf(H)) + else if(istype(H.loc,/obj/item)) + src << "You struggle free of \the [H.loc]." + H.forceMove(get_turf(H)) /mob/living/proc/escape_buckle() if(buckled) @@ -685,3 +707,78 @@ default behaviour is: if(W in internal_organs) return ..() + +/mob/living/touch_map_edge() + + //check for nuke disks + if(client && stat != DEAD) //if they are clientless and dead don't bother, the parent will treat them as any other container + if(ticker && istype(ticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear + var/datum/game_mode/nuclear/G = ticker.mode + if(G.check_mob(src)) + if(x <= TRANSITIONEDGE) + inertia_dir = 4 + else if(x >= world.maxx -TRANSITIONEDGE) + inertia_dir = 8 + else if(y <= TRANSITIONEDGE) + inertia_dir = 1 + else if(y >= world.maxy -TRANSITIONEDGE) + inertia_dir = 2 + src << "Something you are carrying is preventing you from leaving." + return + + ..() + +//damage/heal the mob ears and adjust the deaf amount +/mob/living/adjustEarDamage(var/damage, var/deaf) + ear_damage = max(0, ear_damage + damage) + ear_deaf = max(0, ear_deaf + deaf) + +//pass a negative argument to skip one of the variable +/mob/living/setEarDamage(var/damage, var/deaf) + if(damage >= 0) + ear_damage = damage + if(deaf >= 0) + ear_deaf = deaf + +/mob/proc/can_be_possessed_by(var/mob/dead/observer/possessor) + return istype(possessor) && possessor.client + +/mob/living/can_be_possessed_by(var/mob/dead/observer/possessor) + if(!..()) + return 0 + if(!possession_candidate) + possessor << "That animal cannot be possessed." + return 0 + if(jobban_isbanned(possessor, "Animal")) + possessor << "You are banned from animal roles." + return 0 + if(!possessor.MayRespawn(1,ANIMAL_SPAWN_DELAY)) + return 0 + return 1 + +/mob/living/proc/do_possession(var/mob/dead/observer/possessor) + + if(!(istype(possessor) && possessor.ckey)) + return 0 + + if(src.ckey || src.client) + possessor << "\The [src] already has a player." + return 0 + + message_admins("[key_name_admin(possessor)] has taken control of \the [src].") + log_admin("[key_name(possessor)] took control of \the [src].") + src.ckey = possessor.ckey + qdel(possessor) + + if(round_is_spooky(6)) // Six or more active cultists. + src << "You reach out with tendrils of ectoplasm and invade the mind of \the [src]..." + src << "You have assumed direct control of \the [src]." + src << "Due to the spookiness of the round, you have taken control of the poor animal as an invading, possessing spirit - roleplay accordingly." + src.universal_speak = 1 + src.universal_understand = 1 + //src.cultify() // Maybe another time. + return + + src << "You are now \the [src]!" + src << "Remember to stay in character for a mob of this type!" + return 1 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index d393dc8cd0d..33605a423b4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -10,27 +10,39 @@ 1 - halfblock 2 - fullblock */ -#define MOB_FIRE_LIGHT_RANGE 3 //These control the intensity and range of light given off by a mob which is on fire -#define MOB_FIRE_LIGHT_POWER 2 +#define MOB_FIRE_LIGHT_RANGE 3 //These control the intensity and range of light given off by a mob which is on fire +#define MOB_FIRE_LIGHT_POWER 2 + +/mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/armour_pen = 0, var/absorb_text = null, var/soften_text = null) + if(armour_pen >= 100) + return 0 //might as well just skip the processing -/mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/absorb_text = null, var/soften_text = null) var/armor = getarmor(def_zone, attack_flag) var/absorb = 0 + + //Roll armour if(prob(armor)) absorb += 1 if(prob(armor)) absorb += 1 + + //Roll penetration + if(prob(armour_pen)) + absorb -= 1 + if(prob(armour_pen)) + absorb -= 1 + if(absorb >= 2) if(absorb_text) show_message("[absorb_text]") else - show_message("\red Your armor absorbs the blow!") + show_message("Your armor absorbs the blow!") return 2 if(absorb == 1) if(absorb_text) show_message("[soften_text]",4) else - show_message("\red Your armor softens the blow!") + show_message("Your armor softens the blow!") return 1 return 0 @@ -41,7 +53,6 @@ /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone) - flash_weak_pain() //Being hit while using a cloaking device var/obj/item/weapon/cloaking_device/C = locate((/obj/item/weapon/cloaking_device) in src) @@ -67,7 +78,7 @@ return //Armor - var/absorb = run_armor_check(def_zone, P.check_armour) + var/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration) var/proj_sharp = is_sharp(P) var/proj_edge = has_edge(P) if ((proj_sharp || proj_edge) && prob(getarmor(def_zone, P.check_armour))) @@ -103,6 +114,42 @@ O.emp_act(severity) ..() +/mob/living/proc/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) + return target_zone + +//Called when the mob is hit with an item in combat. Returns the blocked result +/mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) + visible_message("[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] with [I.name] by [user]!") + + var/blocked = run_armor_check(hit_zone, "melee") + standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone) + + if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too + var/turf/simulated/location = get_turf(src) + if(istype(location)) location.add_blood_floor(src) + + return blocked + +//returns 0 if the effects failed to apply for some reason, 1 otherwise. +/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) + if(!effective_force || blocked >= 2) + return 0 + + //Hulk modifier + if(HULK in user.mutations) + effective_force *= 2 + + //Apply weapon damage + var/weapon_sharp = is_sharp(I) + var/weapon_edge = has_edge(I) + if(prob(max(getarmor(hit_zone, "melee") - I.armor_penetration, 0))) //melee armour provides a chance to turn sharp/edge weapon attacks into blunt ones + weapon_sharp = 0 + weapon_edge = 0 + + apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + + return 1 + //this proc handles being hit by a thrown atom /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve if(istype(AM,/obj/)) @@ -258,7 +305,77 @@ return max(2.25*round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_stacks/FIRE_MAX_FIRESUIT_STACKS)**2), 700) /mob/living/proc/reagent_permeability() - return 1 + return round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_stacks/FIRE_MAX_FIRESUIT_STACKS)**2) -#undef MOB_FIRE_LIGHT_RANGE //These control the intensity and range of light given off by a mob which is on fire -#undef MOB_FIRE_LIGHT_POWER +/mob/living/proc/handle_actions() + //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent + for(var/datum/action/A in actions) + if(A.CheckRemoval(src)) + A.Remove(src) + for(var/obj/item/I in src) + if(I.action_button_name) + if(!I.action) + if(I.action_button_is_hands_free) + I.action = new/datum/action/item_action/hands_free + else + I.action = new/datum/action/item_action + I.action.name = I.action_button_name + I.action.target = I + I.action.Grant(src) + return + +/mob/living/update_action_buttons() + if(!hud_used) return + if(!client) return + + if(hud_used.hud_shown != 1) //Hud toggled to minimal + return + + client.screen -= hud_used.hide_actions_toggle + for(var/datum/action/A in actions) + if(A.button) + client.screen -= A.button + + if(hud_used.action_buttons_hidden) + if(!hud_used.hide_actions_toggle) + hud_used.hide_actions_toggle = new(hud_used) + hud_used.hide_actions_toggle.UpdateIcon() + + if(!hud_used.hide_actions_toggle.moved) + hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1) + //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1) + + client.screen += hud_used.hide_actions_toggle + return + + var/button_number = 0 + for(var/datum/action/A in actions) + button_number++ + if(A.button == null) + var/obj/screen/movable/action_button/N = new(hud_used) + N.owner = A + A.button = N + + var/obj/screen/movable/action_button/B = A.button + + B.UpdateIcon() + + B.name = A.UpdateName() + + client.screen += B + + if(!B.moved) + B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) + //hud_used.SetButtonCoords(B,button_number) + + if(button_number > 0) + if(!hud_used.hide_actions_toggle) + hud_used.hide_actions_toggle = new(hud_used) + hud_used.hide_actions_toggle.InitialiseIcon(src) + if(!hud_used.hide_actions_toggle.moved) + hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) + //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1) + client.screen += hud_used.hide_actions_toggle + +#undef MOB_FIRE_LIGHT_RANGE //These control the intensity and range of light given off by a mob which is on fire +#undef MOB_FIRE_LIGHT_POWER diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index f781b57f227..1625d85b629 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -1,4 +1,5 @@ /mob/living + see_in_dark = 2 see_invisible = SEE_INVISIBLE_LIVING //Health and life related vars @@ -33,13 +34,19 @@ var/mob_push_flags = 0 var/mob_always_swap = 0 + var/mob/living/cameraFollow = null + var/list/datum/action/actions = list() + var/tod = null // Time of death var/update_slimes = 1 var/silent = null // Can't talk. Value goes down every life proc. - var/mob_size // Used by lockers. var/on_fire = 0 //The "Are we on fire?" var var/fire_stacks var/footstep = 0 + + var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. + var/possession_candidate // Can be possessed by ghosts if unplayed. + var/list/stomach_contents = list()//This is moved here from carbon defines var/composition_reagent var/composition_reagent_quantity diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index cca2cbb7f83..f19ccaabd8b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -1,49 +1,51 @@ var/list/department_radio_keys = list( - ":r" = "right ear", "#r" = "right ear", ".r" = "right ear", - ":l" = "left ear", "#l" = "left ear", ".l" = "left ear", - ":i" = "intercom", "#i" = "intercom", ".i" = "intercom", - ":h" = "department", "#h" = "department", ".h" = "department", - ":+" = "special", "#+" = "special", ".+" = "special", //activate radio-specific special functions - ":c" = "Command", "#c" = "Command", ".c" = "Command", - ":n" = "Science", "#n" = "Science", ".n" = "Science", - ":m" = "Medical", "#m" = "Medical", ".m" = "Medical", - ":e" = "Engineering", "#e" = "Engineering", ".e" = "Engineering", - ":s" = "Security", "#s" = "Security", ".s" = "Security", - ":w" = "whisper", "#w" = "whisper", ".w" = "whisper", - ":t" = "Mercenary", "#t" = "Mercenary", ".t" = "Mercenary", - ":u" = "Supply", "#u" = "Supply", ".u" = "Supply", - ":v" = "Service", "#v" = "Service", ".v" = "Service", - ":p" = "AI Private", "#p" = "AI Private", ".p" = "AI Private", + ":r" = "right ear", ".r" = "right ear", + ":l" = "left ear", ".l" = "left ear", + ":i" = "intercom", ".i" = "intercom", + ":h" = "department", ".h" = "department", + ":+" = "special", ".+" = "special", //activate radio-specific special functions + ":c" = "Command", ".c" = "Command", + ":n" = "Science", ".n" = "Science", + ":m" = "Medical", ".m" = "Medical", + ":e" = "Engineering", ".e" = "Engineering", + ":s" = "Security", ".s" = "Security", + ":w" = "whisper", ".w" = "whisper", + ":t" = "Mercenary", ".t" = "Mercenary", + ":u" = "Supply", ".u" = "Supply", + ":v" = "Service", ".v" = "Service", + ":p" = "AI Private", ".p" = "AI Private", + ":z" = "Entertainment",".z" = "Entertainment", - ":R" = "right ear", "#R" = "right ear", ".R" = "right ear", - ":L" = "left ear", "#L" = "left ear", ".L" = "left ear", - ":I" = "intercom", "#I" = "intercom", ".I" = "intercom", - ":H" = "department", "#H" = "department", ".H" = "department", - ":C" = "Command", "#C" = "Command", ".C" = "Command", - ":N" = "Science", "#N" = "Science", ".N" = "Science", - ":M" = "Medical", "#M" = "Medical", ".M" = "Medical", - ":E" = "Engineering", "#E" = "Engineering", ".E" = "Engineering", - ":S" = "Security", "#S" = "Security", ".S" = "Security", - ":W" = "whisper", "#W" = "whisper", ".W" = "whisper", - ":T" = "Mercenary", "#T" = "Mercenary", ".T" = "Mercenary", - ":U" = "Supply", "#U" = "Supply", ".U" = "Supply", - ":V" = "Service", "#V" = "Service", ".V" = "Service", - ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private", + ":R" = "right ear", ".R" = "right ear", + ":L" = "left ear", ".L" = "left ear", + ":I" = "intercom", ".I" = "intercom", + ":H" = "department", ".H" = "department", + ":C" = "Command", ".C" = "Command", + ":N" = "Science", ".N" = "Science", + ":M" = "Medical", ".M" = "Medical", + ":E" = "Engineering", ".E" = "Engineering", + ":S" = "Security", ".S" = "Security", + ":W" = "whisper", ".W" = "whisper", + ":T" = "Mercenary", ".T" = "Mercenary", + ":U" = "Supply", ".U" = "Supply", + ":V" = "Service", ".V" = "Service", + ":P" = "AI Private", ".P" = "AI Private", + ":Z" = "Entertainment",".Z" = "Entertainment", //kinda localization -- rastaf0 //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. - ":ź" = "right ear", "#ź" = "right ear", ".ź" = "right ear", - ":ä" = "left ear", "#ä" = "left ear", ".ä" = "left ear", - ":ų" = "intercom", "#ų" = "intercom", ".ų" = "intercom", - ":Å¡" = "department", "#Å¡" = "department", ".Å¡" = "department", - ":Å„" = "Command", "#Å„" = "Command", ".Å„" = "Command", - ":ņ" = "Science", "#ņ" = "Science", ".ņ" = "Science", - ":ü" = "Medical", "#ü" = "Medical", ".ü" = "Medical", - ":ó" = "Engineering", "#ó" = "Engineering", ".ó" = "Engineering", - ":Å«" = "Security", "#Å«" = "Security", ".Å«" = "Security", - ":ö" = "whisper", "#ö" = "whisper", ".ö" = "whisper", - ":Ã¥" = "Mercenary", "#Ã¥" = "Mercenary", ".Ã¥" = "Mercenary", - ":é" = "Supply", "#é" = "Supply", ".é" = "Supply", + ":ê" = "right ear", ".ê" = "right ear", + ":ä" = "left ear", ".ä" = "left ear", + ":ø" = "intercom", ".ø" = "intercom", + ":ð" = "department", ".ð" = "department", + ":ñ" = "Command", ".ñ" = "Command", + ":ò" = "Science", ".ò" = "Science", + ":ü" = "Medical", ".ü" = "Medical", + ":ó" = "Engineering", ".ó" = "Engineering", + ":û" = "Security", ".û" = "Security", + ":ö" = "whisper", ".ö" = "whisper", + ":å" = "Mercenary", ".å" = "Mercenary", + ":é" = "Supply", ".é" = "Supply", ) @@ -139,10 +141,6 @@ 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") message = process_chat_markup(message, list("~", "_")) @@ -168,26 +166,23 @@ proc/get_radio_key_from_channel(var/channel) else speaking = get_default_language() - if (speaking) - // This is broadcast to all mobs with the language, - // irrespective of distance or anything else. - if(speaking.flags & HIVEMIND) - speaking.broadcast(src,trim(message)) - return 1 - //If we've gotten this far, keep going! - if(speaking.flags & COMMON_VERBS) - verb = say_quote(message) - else - verb = speaking.get_spoken_verb(copytext(message, length(message))) + // This is broadcast to all mobs with the language, + // irrespective of distance or anything else. + if(speaking && (speaking.flags & HIVEMIND)) + speaking.broadcast(src,trim(message)) + return 1 - if (speaking.flags & SIGNLANG) - message_mode = null - else - verb = say_quote(message) + verb = say_quote(message, speaking) + + if(is_muzzled()) + src << "You're muzzled and cannot speak!" + return message = trim_left(message) if(!(speaking && (speaking.flags & NO_STUTTER))) + message = handle_autohiss(message, speaking) + var/list/handle_s = handle_speech_problems(message, verb) message = handle_s[1] verb = handle_s[2] @@ -246,17 +241,15 @@ proc/get_radio_key_from_channel(var/channel) italics = 1 sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact - var/list/hear = hear(message_range, T) + var/list/hear = get_mobs_or_objects_in_view(message_range,src) var/list/hearturfs = list() for(var/I in hear) - if(istype(I, /mob/)) + if(ismob(I)) var/mob/M = I listening += M hearturfs += M.locs[1] - for(var/obj/O in M.contents) - listening_obj |= O - else if(istype(I, /obj/)) + else if(isobj(I)) var/obj/O = I hearturfs += O.locs[1] listening_obj |= O diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ed441350c84..78a142972da 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -24,8 +24,10 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/show_laws_verb, /mob/living/silicon/ai/proc/toggle_acceleration, /mob/living/silicon/ai/proc/toggle_camera_light, - /mob/living/silicon/ai/proc/ai_examine - ) + /mob/living/silicon/ai/proc/ai_examine, + /mob/living/silicon/ai/proc/multitool_mode, + /mob/living/silicon/ai/proc/toggle_hologram_movement +) //Not sure why this is necessary... /proc/AutoUpdateAI(obj/subject) @@ -56,13 +58,13 @@ var/list/ai_verbs_default = list( var/obj/item/device/pda/ai/aiPDA = null 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/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 = "" var/control_disabled = 0 var/datum/announcement/priority/announcement var/obj/machinery/ai_powersupply/psupply = null // Backwards reference to AI's powersupply object. + var/hologram_follow = 1 //This is used for the AI eye, to determine if a holopad's hologram should follow it or not //NEWMALF VARIABLES var/malfunctioning = 0 // Master var that determines if AI is malfunctioning. @@ -80,7 +82,13 @@ var/list/ai_verbs_default = list( var/bombing_station = 0 // Set to 1 if station nuke auto-destruct is activated var/override_CPUStorage = 0 // Bonus/Penalty CPU Storage. For use by admins/testers. var/override_CPURate = 0 // Bonus/Penalty CPU generation rate. For use by admins/testers. - var/list/cameraRecords = list() //For storing what is shown to the cameras + var/list/cameraRecords = list() //For storing what is shown to the cameras + + var/datum/ai_icon/selected_sprite // The selected icon set + var/custom_sprite = 0 // Whether the selected icon is custom + var/carded + + var/multitool_mode = 0 /mob/living/silicon/ai/proc/add_ai_verbs() src.verbs |= ai_verbs_default @@ -127,8 +135,7 @@ var/list/ai_verbs_default = list( aiRadio = new(src) common_radio = aiRadio aiRadio.myAi = src - additional_law_channels += "Binary" - additional_law_channels += "Holopad" + additional_law_channels["Holopad"] = ":h" aiCamera = new/obj/item/device/camera/siliconcam/ai_camera(src) @@ -145,7 +152,8 @@ var/list/ai_verbs_default = list( add_language("Tradeband", 1) add_language("Gutter", 0) add_language("Hivenet", 0) - add_language("Rootsong", 0) + add_language(LANGUAGE_ROOTSPEAK, 0) + add_language(LANGUAGE_EAL, 1) if(!safety)//Only used by AIize() to successfully spawn an AI. if (!B)//If there is no player/brain inside. @@ -173,14 +181,13 @@ var/list/ai_verbs_default = list( ai_list += src ..() - return /mob/living/silicon/ai/proc/on_mob_init() src << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." src << "To look at other parts of the station, click on yourself to get a camera menu." src << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." src << "To use something, simply click on it." - src << "Use say :b to speak to your cyborgs through binary. Use say :h to speak from an active holopad." + src << "Use say [get_language_prefix()]b to speak to your cyborgs through binary. Use say :h to speak from an active holopad." src << "For department channels, use the following say commands:" var/radio_text = "" @@ -198,8 +205,16 @@ var/list/ai_verbs_default = list( src << "These laws may be changed by other players, or by you being the traitor." job = "AI" + setup_icon() /mob/living/silicon/ai/Destroy() + qdel(aiPDA) + qdel(aiMulti) + qdel(aiRadio) + aiPDA = null + aiMulti = null + aiRadio = null + ai_list -= src qdel(eyeobj) @@ -219,6 +234,27 @@ var/list/ai_verbs_default = list( return ..() +/mob/living/silicon/ai/proc/setup_icon() + var/file = file2text("config/custom_sprites.txt") + var/lines = text2list(file, "\n") + + for(var/line in lines) + // split & clean up + var/list/Entry = text2list(line, ":") + for(var/i = 1 to Entry.len) + Entry[i] = trim(Entry[i]) + + if(Entry.len < 2) + continue; + + if(Entry[1] == src.ckey && Entry[2] == src.real_name) + icon = CUSTOM_ITEM_SYNTH + custom_sprite = 1 + selected_sprite = new/datum/ai_icon("Custom", "[src.ckey]-ai", "4", "[ckey]-ai-crash", "#FFFFFF", "#FFFFFF", "#FFFFFF") + else + selected_sprite = default_ai_icon + updateicon() + /mob/living/silicon/ai/pointed(atom/A as mob|obj|turf in view()) set popup_menu = 0 set src = usr.contents @@ -282,57 +318,11 @@ var/list/ai_verbs_default = list( set name = "Set AI Core Display" if(stat || aiRestorePowerRoutine) return - if(!custom_sprite) //Check to see if custom sprite time, checking the appopriate file to change a var - var/file = file2text("config/custom_sprites.txt") - var/lines = text2list(file, "\n") - - for(var/line in lines) - // split & clean up - var/list/Entry = text2list(line, ":") - for(var/i = 1 to Entry.len) - Entry[i] = trim(Entry[i]) - - if(Entry.len < 2) - continue; - - if(Entry[1] == src.ckey && Entry[2] == src.real_name) - custom_sprite = 1 //They're in the list? Custom sprite time - icon = CUSTOM_ITEM_ROBOT - - //if(icon_state == initial(icon_state)) - var/icontype = "" - if (custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available - else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Rainbow", "Blue", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Soviet", "Trapped", "Heartline", "Chatterbox", "Helios", "Dug Too Deep", "Goon", "Database", "Glitchman", "Lonestar", "Nanotrasen") - switch(icontype) - if("Custom") icon_state = "[src.ckey]-ai" - if("Rainbow") icon_state = "ai-clown" - if("Monochrome") icon_state = "ai-mono" - if("Inverted") icon_state = "ai-u" - if("Firewall") icon_state = "ai-magma" - if("Green") icon_state = "ai-wierd" - if("Red") icon_state = "ai-red" - if("Static") icon_state = "ai-static" - if("Text") icon_state = "ai-text" - if("Smiley") icon_state = "ai-smiley" - if("Matrix") icon_state = "ai-matrix" - if("Angry") icon_state = "ai-angryface" - if("Dorf") icon_state = "ai-dorf" - if("Bliss") icon_state = "ai-bliss" - if("Triumvirate") icon_state = "ai-triumvirate" - if("Triumvirate Static") icon_state = "ai-triumvirate-malf" - if("Soviet") icon_state = "ai-redoctober" - if("Trapped") icon_state = "ai-hades" - if("Heartline") icon_state = "ai-heartline" - if("Chatterbox") icon_state = "ai-president" - if("Helios") icon_state = "ai-helios" - if("Dug Too Deep") icon_state = "ai-toodeep" - if("Goon") icon_state = "ai-goon" - if("Database") icon_state = "ai-database" - if("Glitchman") icon_state = "ai-glitchman" - if("Lonestar") icon_state = "ai-lonestar" - if("Nanotrasen") icon_state = "ai-nanotrasen" - else icon_state = "ai" + if (!custom_sprite) + var/new_sprite = input("Select an icon!", "AI", selected_sprite) as null|anything in ai_icons + if(new_sprite) selected_sprite = new_sprite + updateicon() // this verb lets the ai see the stations manifest /mob/living/silicon/ai/proc/ai_roster() @@ -423,12 +413,12 @@ var/list/ai_verbs_default = list( if(emergency_message_cooldown) usr << "Arrays recycling. Please stand by." return - var/input = sanitize(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.", "")) + var/input = sanitize(input(usr, "Please choose a message to transmit to [boss_short] 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]") + log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") emergency_message_cooldown = 1 spawn(300) emergency_message_cooldown = 0 @@ -491,14 +481,9 @@ var/list/ai_verbs_default = list( return -/mob/living/silicon/ai/meteorhit(obj/O as obj) - for(var/mob/M in viewers(src, null)) - M.show_message(text("\red [] has been hit by []", src, O), 1) - //Foreach goto(19) +/mob/living/silicon/ai/ex_act(severity) if (health > 0) - adjustBruteLoss(30) - if ((O.icon_state == "flaming")) - adjustFireLoss(40) + adjustBruteLoss(min(30/severity, health)) updatehealth() return @@ -717,6 +702,14 @@ var/list/ai_verbs_default = list( set desc = "Augment visual feed with internal sensor overlays" toggle_sensor_mode() +/mob/living/silicon/ai/proc/toggle_hologram_movement() + set name = "Toggle Hologram Movement" + set category = "AI Commands" + set desc = "Toggles hologram movement based on moving with your virtual eye." + + hologram_follow = !hologram_follow + usr << "Your hologram will now [hologram_follow ? "follow" : "no longer follow"] you." + /mob/living/silicon/ai/proc/check_unable(var/flags = 0, var/feedback = 1) if(stat == DEAD) if(feedback) src << "You are dead!" @@ -744,146 +737,35 @@ var/list/ai_verbs_default = list( return ..() -// NEWMALF FUNCTIONS/PROCEDURES +/mob/living/silicon/ai/proc/multitool_mode() + set name = "Toggle Multitool Mode" + set category = "AI Commands" -// Sets up malfunction-related variables, research system and such. -/mob/living/silicon/ai/proc/setup_for_malf() - var/mob/living/silicon/ai/user = src - // Setup Variables - malfunctioning = 1 - research = new/datum/malf_research() - research.owner = src - hacked_apcs = list() - recalc_cpu() + multitool_mode = !multitool_mode + src << "Multitool mode: [multitool_mode ? "E" : "Dise"]ngaged" - verbs += new/datum/game_mode/malfunction/verb/ai_select_hardware() - verbs += new/datum/game_mode/malfunction/verb/ai_select_research() - verbs += new/datum/game_mode/malfunction/verb/ai_help() +/mob/living/silicon/ai/updateicon() + if(!selected_sprite) selected_sprite = default_ai_icon - // And greet user with some OOC info. - user << "You are malfunctioning, you do not have to follow any laws." - user << "Use ai-help command to view relevant information about your abilities" - -// Safely remove malfunction status, fixing hacked APCs and resetting variables. -/mob/living/silicon/ai/proc/stop_malf() - var/mob/living/silicon/ai/user = src - // Generic variables - malfunctioning = 0 - sleep(10) - research = null - // Fix hacked APCs - if(hacked_apcs) - for(var/obj/machinery/power/apc/A in hacked_apcs) - A.hacker = null - hacked_apcs = null - // Reset our verbs - src.verbs = null - add_ai_verbs() - // Let them know. - user << "You are no longer malfunctioning. Your abilities have been removed." - -// Called every tick. Checks if AI is malfunctioning. If yes calls Process on research datum which handles all logic. -/mob/living/silicon/ai/proc/malf_process() - if(!malfunctioning) - return - if(!research) - if(!errored) - errored = 1 - error("malf_process() called on AI without research datum. Report this.") - message_admins("ERROR: malf_process() called on AI without research datum. If admin modified one of the AI's vars revert the change and don't modify variables directly, instead use ProcCall or admin panels.") - spawn(1200) - errored = 0 - return - recalc_cpu() - if(APU_power || aiRestorePowerRoutine != 0) - research.process(1) + if(stat == DEAD) + icon_state = selected_sprite.dead_icon + set_light(3, 1, selected_sprite.dead_light) + else if(aiRestorePowerRoutine) + icon_state = selected_sprite.nopower_icon + set_light(1, 1, selected_sprite.nopower_light) else - research.process(0) + icon_state = selected_sprite.alive_icon + set_light(1, 1, selected_sprite.alive_light) -// Recalculates CPU time gain and storage capacities. -/mob/living/silicon/ai/proc/recalc_cpu() - // AI Starts with these values. - var/cpu_gain = 0.01 - var/cpu_storage = 10 +// Pass lying down or getting up to our pet human, if we're in a rig. +/mob/living/silicon/ai/lay_down() + set name = "Rest" + set category = "IC" - // Off-Station APCs should not count towards CPU generation. - for(var/obj/machinery/power/apc/A in hacked_apcs) - if(A.z in config.station_levels) - cpu_gain += 0.004 - cpu_storage += 10 - - research.max_cpu = cpu_storage + override_CPUStorage - if(hardware && istype(hardware, /datum/malf_hardware/dual_ram)) - research.max_cpu = research.max_cpu * 1.5 - research.stored_cpu = min(research.stored_cpu, research.max_cpu) - - research.cpu_increase_per_tick = cpu_gain + override_CPURate - if(hardware && istype(hardware, /datum/malf_hardware/dual_cpu)) - research.cpu_increase_per_tick = research.cpu_increase_per_tick * 2 - -// Starts AI's APU generator -/mob/living/silicon/ai/proc/start_apu(var/shutup = 0) - if(!hardware || !istype(hardware, /datum/malf_hardware/apu_gen)) - if(!shutup) - src << "You do not have an APU generator and you shouldn't have this verb. Report this." - return - if(hardware_integrity() < 50) - if(!shutup) - src << "Starting APU... FAULT(System Damaged)" - return - if(!shutup) - src << "Starting APU... ONLINE" - APU_power = 1 - -// Stops AI's APU generator -/mob/living/silicon/ai/proc/stop_apu(var/shutup = 0) - if(!hardware || !istype(hardware, /datum/malf_hardware/apu_gen)) - return - - if(APU_power) - APU_power = 0 - if(!shutup) - src << "Shutting down APU... DONE" - -// Returns percentage of AI's remaining backup capacitor charge (maxhealth - oxyloss). -/mob/living/silicon/ai/proc/backup_capacitor() - return ((200 - getOxyLoss()) / 2) - -// Returns percentage of AI's remaining hardware integrity (maxhealth - (bruteloss + fireloss)) -/mob/living/silicon/ai/proc/hardware_integrity() - return (health-config.health_threshold_dead)/2 - -// Shows capacitor charge and hardware integrity information to the AI in Status tab. -/mob/living/silicon/ai/show_system_integrity() - if(!src.stat) - stat(null, text("Hardware integrity: [hardware_integrity()]%")) - stat(null, text("Internal capacitor: [backup_capacitor()]%")) - else - stat(null, text("Systems nonfunctional")) - -// Shows AI Malfunction related information to the AI. -/mob/living/silicon/ai/show_malf_ai() - if(src.is_malf()) - if(src.hacked_apcs) - stat(null, "Hacked APCs: [src.hacked_apcs.len]") - stat(null, "System Status: [src.hacking ? "Busy" : "Stand-By"]") - if(src.research) - stat(null, "Available CPU: [src.research.stored_cpu] TFlops") - stat(null, "Maximal CPU: [src.research.max_cpu] TFlops") - stat(null, "CPU generation rate: [src.research.cpu_increase_per_tick * 10] TFlops/s") - stat(null, "Current research focus: [src.research.focus ? src.research.focus.name : "None"]") - if(src.research.focus) - stat(null, "Research completed: [round(src.research.focus.invested, 0.1)]/[round(src.research.focus.price)]") - if(system_override == 1) - stat(null, "SYSTEM OVERRIDE INITIATED") - else if(system_override == 2) - stat(null, "SYSTEM OVERRIDE COMPLETED") - -// Cleaner proc for creating powersupply for an AI. -/mob/living/silicon/ai/proc/create_powersupply() - if(psupply) - qdel(psupply) - psupply = new/obj/machinery/ai_powersupply(src) + resting = 0 + var/obj/item/weapon/rig/rig = src.get_rig() + if(rig) + rig.force_rest(src) /mob/living/silicon/ai/proc/addCameraRecord(var/itemName,var/info) if(!itemName || !info) diff --git a/code/modules/mob/living/silicon/ai/ai_movement.dm b/code/modules/mob/living/silicon/ai/ai_movement.dm new file mode 100644 index 00000000000..456d11a9817 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_movement.dm @@ -0,0 +1,2 @@ +/mob/living/silicon/ai/SelfMove(turf/n, direct) + return 0 diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 8f9f0d1d5d5..0c33834db74 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -3,46 +3,11 @@ if(stat == DEAD) return - if (src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no. - icon_state = "[ckey]-ai-crash" - else - icon_state = "ai-crash" - if(src.eyeobj) src.eyeobj.setLoc(get_turf(src)) remove_ai_verbs(src) - var/callshuttle = 0 - for(var/obj/machinery/computer/communications/commconsole in world) - if(commconsole.z == 2) - continue - if(istype(commconsole.loc,/turf)) - break - callshuttle++ - - for(var/obj/item/weapon/circuitboard/communications/commboard in world) - if(commboard.z == 2) - continue - if(istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage)) - break - callshuttle++ - - for(var/mob/living/silicon/ai/shuttlecaller in player_list) - if(shuttlecaller.z == 2) - continue - if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf)) - break - callshuttle++ - - if(ticker.mode.name == "revolution") - callshuttle = 0 - - if(callshuttle == 3) //if all three conditions are met - emergency_shuttle.call_evac() - log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.") - message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1) - for(var/obj/machinery/ai_status_display/O in world) spawn( 0 ) O.mode = 2 @@ -50,4 +15,5 @@ var/obj/item/device/aicard/card = loc card.update_icon() - return ..(gibbed,"gives one shrill beep before falling lifeless.") + . = ..(gibbed,"gives one shrill beep before falling lifeless.") + density = 1 diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index e11d799af5e..58433a0b285 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -28,7 +28,7 @@ if (src.stat == UNCONSCIOUS) msg += "It is non-responsive and displaying the text: \"RUNTIME: Sensory Overload, stack 26/3\".\n" msg += "
      " - msg += "*---------*
      " + msg += "*---------*" if(hardware && (hardware.owner == src)) msg += "
      " msg += hardware.get_examine_desc() diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm new file mode 100644 index 00000000000..83689c9dd4d --- /dev/null +++ b/code/modules/mob/living/silicon/ai/icons.dm @@ -0,0 +1,155 @@ +var/datum/ai_icon/default_ai_icon = new/datum/ai_icon/blue() +var/list/datum/ai_icon/ai_icons + +/datum/ai_icon + var/name + var/alive_icon + var/alive_light = "#FFFFFF" + var/nopower_icon = "4" + var/nopower_light = "#FFFFFF" + var/dead_icon = "ai-crash" + var/dead_light = "#000099" + +/datum/ai_icon/New(var/name, var/alive_icon, var/nopower_icon, var/dead_icon, var/alive_light, var/nopower_light, var/dead_light) + if(name) + src.name = name + src.alive_icon = alive_icon + src.nopower_icon = nopower_icon + src.dead_icon = dead_icon + src.alive_light = alive_light + src.nopower_light = nopower_light + src.dead_light = dead_light + if(!ai_icons) + ai_icons = list() + init_subtypes(/datum/ai_icon, ai_icons) + ..() + +/datum/ai_icon/red + name = "Red" + alive_icon = "ai-red" + alive_light = "#F04848" + +/datum/ai_icon/green + name = "Green" + alive_icon = "ai-wierd" + alive_light = "#00FF99" + +/datum/ai_icon/blue + name = "Blue" + alive_icon = "ai" + alive_light = "#81DDFF" + +/datum/ai_icon/angry + name = "Angry" + alive_icon = "ai-angryface" + alive_light = "#FFFF33" + +/datum/ai_icon/bliss + name = "Bliss" + alive_icon = "ai-bliss" + alive_light = "#5C7A4A" + +/datum/ai_icon/chatterbox + name = "Chatterbox" + alive_icon = "ai-president" + alive_light = "#40666B" + +/datum/ai_icon/database + name = "Database" + alive_icon = "ai-database" + +/datum/ai_icon/dorf + name = "Dorf" + alive_icon = "ai-dorf" + +/datum/ai_icon/dugtodeep + name = "Dug Too Deep" + alive_icon = "ai-toodeep" + alive_light = "#81DDFF" + +/datum/ai_icon/firewall + name = "Firewall" + alive_icon = "ai-magma" + alive_light = "#FF4126" + +/datum/ai_icon/glitchman + name = "Glitchman" + alive_icon = "ai-glitchman" + +/datum/ai_icon/goon + name = "Goon" + alive_icon = "ai-goon" + alive_light = "#3E5C80" + +/datum/ai_icon/heartline + name = "Heartline" + alive_icon = "ai-heartline" + dead_icon = "ai-heartline_dead" + +/datum/ai_icon/helios + name = "Helios" + alive_icon = "ai-helios" + alive_light = "#F2CF73" + +/datum/ai_icon/inverted + name = "Inverted" + alive_icon = "ai-u" + alive_light = "#81DDFF" + +/datum/ai_icon/lonestar + name = "Lonestar" + alive_icon = "ai-lonestar" + alive_light = "#58751C" + +/datum/ai_icon/matrix + name = "Matrix" + alive_icon = "ai-matrix" + alive_light = "#449944" + +/datum/ai_icon/monochrome + name = "Monochrome" + alive_icon = "ai-mono" + alive_light = "#585858" + +/datum/ai_icon/nanotrasen + name = "Nanotrasen" + alive_icon = "ai-nanotrasen" + alive_light = "#000029" + +/datum/ai_icon/rainbow + name = "Rainbow" + alive_icon = "ai-clown" + alive_light = "#E50213" + +/datum/ai_icon/smiley + name = "Smiley" + alive_icon = "ai-smiley" + alive_light = "#F3DD00" + +/datum/ai_icon/soviet + name = "Soviet" + alive_icon = "ai-redoctober" + alive_light = "#FF4307" + +/datum/ai_icon/Static + name = "Static" + alive_icon = "ai-static" + alive_light = "#4784C1" + +/datum/ai_icon/text + name = "Text" + alive_icon = "ai-text" + +/datum/ai_icon/trapped + name = "Trapped" + alive_icon = "ai-hades" + +/datum/ai_icon/triumvirate_static + name = "Triumvirate" + alive_icon = "ai-triumvirate" + alive_light = "#020B2B" + +/datum/ai_icon/triumvirate_static + name = "Triumvirate Static" + alive_icon = "ai-static" + alive_light = "#020B2B" diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index 4e2285bbb64..0ea59bb7347 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -2,7 +2,7 @@ var/global/list/empty_playable_ai_cores = list() /hook/roundstart/proc/spawn_empty_ai() if("AI" in ticker.mode.disabled_jobs) - return 1 // Don't make empty AI's on malf. + return 1 // Don't make empty AI's if you can't have them (also applies to Malf) for(var/obj/effect/landmark/start/S in landmarks_list) if(S.name != "AI") continue diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 27539b286f4..434ce5b50e0 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -38,34 +38,23 @@ src << "APU GENERATOR FAILURE! (System Damaged)" stop_apu(1) - var/blind = 0 - var/area/loc = null - if (istype(T, /turf)) - loc = T.loc - if (istype(loc, /area)) - if (!loc.power_equip && !istype(src.loc,/obj/item) && !APU_power) - blind = 1 - - if (!blind) - src.sight |= SEE_TURFS - src.sight |= SEE_MOBS - src.sight |= SEE_OBJS - src.see_in_dark = 8 - src.see_invisible = SEE_INVISIBLE_LIVING - + if (!is_blinded()) if (aiRestorePowerRoutine==2) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 src.blind.invisibility = 101 + updateicon() return else if (aiRestorePowerRoutine==3) src << "Alert cancelled. Power has been restored." aiRestorePowerRoutine = 0 src.blind.invisibility = 101 + updateicon() return else if (APU_power) aiRestorePowerRoutine = 0 src.blind.invisibility = 101 + updateicon() return else var/area/current_area = get_area(src) @@ -74,25 +63,13 @@ if (aiRestorePowerRoutine==0) aiRestorePowerRoutine = 1 - //Blind the AI - - src.blind.screen_loc = "1,1 to 15,15" - if (src.blind.invisibility != 0) - src.blind.invisibility = 0 - src.sight = src.sight&~SEE_TURFS - src.sight = src.sight&~SEE_MOBS - src.sight = src.sight&~SEE_OBJS - src.see_in_dark = 0 - src.see_invisible = SEE_INVISIBLE_LIVING - //Now to tell the AI why they're blind and dying slowly. - src << "You've lost power!" spawn(20) src << "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection." sleep(50) - if (loc.power_equip) + if (current_area.power_equip) if (!istype(T, /turf/space)) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 @@ -122,7 +99,7 @@ else src << "Lost connection with the APC!" src:aiRestorePowerRoutine = 2 return - if (loc.power_equip) + if (current_area.power_equip) if (!istype(T, /turf/space)) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 @@ -143,11 +120,12 @@ aiRestorePowerRoutine = 3 src << "Here are your current laws:" show_laws() + updateicon() sleep(50) theAPC = null process_queued_alarms() - regular_hud_updates() + handle_regular_hud_updates() switch(src.sensor_mode) if (SEC_HUD) process_sec_hud(src,0,src.eyeobj) @@ -172,3 +150,23 @@ /mob/living/silicon/ai/rejuvenate() ..() add_ai_verbs(src) + +/mob/living/silicon/ai/update_sight() + if(is_blinded()) + updateicon() + src.blind.screen_loc = ui_entire_screen + if (src.blind.invisibility != 0) + src.blind.invisibility = 0 + src.sight = src.sight&~SEE_TURFS + src.sight = src.sight&~SEE_MOBS + src.sight = src.sight&~SEE_OBJS + src.see_in_dark = 0 + src.see_invisible = SEE_INVISIBLE_LIVING + else + update_dead_sight() + +/mob/living/silicon/ai/proc/is_blinded() + var/area/A = get_area(src) + if (A && !A.power_equip && !istype(src.loc,/obj/item) && !APU_power) + return 1 + return 0 diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 9d83e1dec08..6851467b551 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/ai/Login() //ThisIsDumb(TM) TODO: tidy this up �_� ~Carn +/mob/living/silicon/ai/Login() //ThisIsDumb(TM) TODO: tidy this up ¬_¬ ~Carn ..() for(var/obj/effect/rune/rune in rune_list) client.images += rune.blood_image @@ -6,12 +6,12 @@ flash = new /obj/screen() flash.icon_state = "blank" flash.name = "flash" - flash.screen_loc = "1,1 to 15,15" + flash.screen_loc = ui_entire_screen flash.layer = 17 blind = new /obj/screen() blind.icon_state = "black" blind.name = " " - blind.screen_loc = "1,1 to 15,15" + blind.screen_loc = ui_entire_screen blind.invisibility = 101 client.screen.Add( blind, flash ) diff --git a/code/modules/mob/living/silicon/ai/malf.dm b/code/modules/mob/living/silicon/ai/malf.dm new file mode 100644 index 00000000000..275d02acac6 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/malf.dm @@ -0,0 +1,140 @@ +// NEWMALF FUNCTIONS/PROCEDURES + +// Sets up malfunction-related variables, research system and such. +/mob/living/silicon/ai/proc/setup_for_malf() + var/mob/living/silicon/ai/user = src + // Setup Variables + malfunctioning = 1 + research = new/datum/malf_research() + research.owner = src + hacked_apcs = list() + recalc_cpu() + + verbs += new/datum/game_mode/malfunction/verb/ai_select_hardware() + verbs += new/datum/game_mode/malfunction/verb/ai_select_research() + verbs += new/datum/game_mode/malfunction/verb/ai_help() + + // And greet user with some OOC info. + user << "You are malfunctioning, you do not have to follow any laws." + user << "Use ai-help command to view relevant information about your abilities" + +// Safely remove malfunction status, fixing hacked APCs and resetting variables. +/mob/living/silicon/ai/proc/stop_malf() + var/mob/living/silicon/ai/user = src + // Generic variables + malfunctioning = 0 + sleep(10) + research = null + // Fix hacked APCs + if(hacked_apcs) + for(var/obj/machinery/power/apc/A in hacked_apcs) + A.hacker = null + hacked_apcs = null + // Reset our verbs + src.verbs = null + add_ai_verbs() + // Let them know. + user << "You are no longer malfunctioning. Your abilities have been removed." + +// Called every tick. Checks if AI is malfunctioning. If yes calls Process on research datum which handles all logic. +/mob/living/silicon/ai/proc/malf_process() + if(!malfunctioning) + return + if(!research) + if(!errored) + errored = 1 + error("malf_process() called on AI without research datum. Report this.") + message_admins("ERROR: malf_process() called on AI without research datum. If admin modified one of the AI's vars revert the change and don't modify variables directly, instead use ProcCall or admin panels.") + spawn(1200) + errored = 0 + return + recalc_cpu() + if(APU_power || aiRestorePowerRoutine != 0) + research.process(1) + else + research.process(0) + +// Recalculates CPU time gain and storage capacities. +/mob/living/silicon/ai/proc/recalc_cpu() + // AI Starts with these values. + var/cpu_gain = 0.01 + var/cpu_storage = 10 + + // Off-Station APCs should not count towards CPU generation. + for(var/obj/machinery/power/apc/A in hacked_apcs) + if(A.z in config.station_levels) + cpu_gain += 0.004 + cpu_storage += 10 + + research.max_cpu = cpu_storage + override_CPUStorage + if(hardware && istype(hardware, /datum/malf_hardware/dual_ram)) + research.max_cpu = research.max_cpu * 1.5 + research.stored_cpu = min(research.stored_cpu, research.max_cpu) + + research.cpu_increase_per_tick = cpu_gain + override_CPURate + if(hardware && istype(hardware, /datum/malf_hardware/dual_cpu)) + research.cpu_increase_per_tick = research.cpu_increase_per_tick * 2 + +// Starts AI's APU generator +/mob/living/silicon/ai/proc/start_apu(var/shutup = 0) + if(!hardware || !istype(hardware, /datum/malf_hardware/apu_gen)) + if(!shutup) + src << "You do not have an APU generator and you shouldn't have this verb. Report this." + return + if(hardware_integrity() < 50) + if(!shutup) + src << "Starting APU... FAULT(System Damaged)" + return + if(!shutup) + src << "Starting APU... ONLINE" + APU_power = 1 + +// Stops AI's APU generator +/mob/living/silicon/ai/proc/stop_apu(var/shutup = 0) + if(!hardware || !istype(hardware, /datum/malf_hardware/apu_gen)) + return + + if(APU_power) + APU_power = 0 + if(!shutup) + src << "Shutting down APU... DONE" + +// Returns percentage of AI's remaining backup capacitor charge (maxhealth - oxyloss). +/mob/living/silicon/ai/proc/backup_capacitor() + return ((200 - getOxyLoss()) / 2) + +// Returns percentage of AI's remaining hardware integrity (maxhealth - (bruteloss + fireloss)) +/mob/living/silicon/ai/proc/hardware_integrity() + return (health-config.health_threshold_dead)/2 + +// Shows capacitor charge and hardware integrity information to the AI in Status tab. +/mob/living/silicon/ai/show_system_integrity() + if(!src.stat) + stat("Hardware integrity", "[hardware_integrity()]%") + stat("Internal capacitor", "[backup_capacitor()]%") + else + stat("Systems nonfunctional") + +// Shows AI Malfunction related information to the AI. +/mob/living/silicon/ai/show_malf_ai() + if(src.is_malf()) + if(src.hacked_apcs) + stat("Hacked APCs", "[src.hacked_apcs.len]") + stat("System Status", "[src.hacking ? "Busy" : "Stand-By"]") + if(src.research) + stat("Available CPU", "[src.research.stored_cpu] TFlops") + stat("Maximal CPU", "[src.research.max_cpu] TFlops") + stat("CPU generation rate", "[src.research.cpu_increase_per_tick * 10] TFlops/s") + stat("Current research focus", "[src.research.focus ? src.research.focus.name : "None"]") + if(src.research.focus) + stat("Research completed", "[round(src.research.focus.invested, 0.1)]/[round(src.research.focus.price)]") + if(system_override == 1) + stat("SYSTEM OVERRIDE INITIATED") + else if(system_override == 2) + stat("SYSTEM OVERRIDE COMPLETED") + +// Cleaner proc for creating powersupply for an AI. +/mob/living/silicon/ai/proc/create_powersupply() + if(psupply) + qdel(psupply) + psupply = new/obj/machinery/ai_powersupply(src) diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm index bbbfe19dadb..86ae4097cda 100644 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ b/code/modules/mob/living/silicon/decoy/decoy.dm @@ -9,4 +9,7 @@ src.icon = 'icons/mob/AI.dmi' src.icon_state = "ai" src.anchored = 1 - src.canmove = 0 \ No newline at end of file + src.canmove = 0 + +/mob/living/silicon/decoy/initialize() + return diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 90236d2e521..c3b6964e0f4 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -1,6 +1,6 @@ /mob/living/silicon var/datum/ai_laws/laws = null - var/list/additional_law_channels = list("State") + var/list/additional_law_channels = list("State" = "") /mob/living/silicon/proc/laws_sanity_check() if (!src.laws) @@ -59,11 +59,14 @@ /mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws) var/prefix = "" - switch(lawchannel) - if(MAIN_CHANNEL) prefix = ";" - if("Binary") prefix = ":b " - else - prefix = get_radio_key_from_channel(lawchannel == "Holopad" ? "department" : lawchannel) + " " + if(MAIN_CHANNEL == lawchannel) + prefix = ";" + else if(lawchannel == "Binary") + prefix = "[get_language_prefix()]b" + else if((lawchannel in additional_law_channels)) + prefix = additional_law_channels[lawchannel] + else + prefix = get_radio_key_from_channel(lawchannel) dostatelaws(lawchannel, prefix, laws) @@ -97,6 +100,7 @@ channels += MAIN_CHANNEL channels += common_radio.channels channels += additional_law_channels + channels += "Binary" return channels /mob/living/silicon/proc/lawsync() diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm index c78a3071176..e6860db981e 100644 --- a/code/modules/mob/living/silicon/pai/examine.dm +++ b/code/modules/mob/living/silicon/pai/examine.dm @@ -7,7 +7,7 @@ if(!src.client) msg += "\nIt appears to be in stand-by mode." //afk if(UNCONSCIOUS) msg += "\nIt doesn't seem to be responding." if(DEAD) msg += "\nIt looks completely unsalvageable." - msg += "\n*---------*
      " + msg += "\n*---------*" if(print_flavor_text()) msg += "\n[print_flavor_text()]\n" diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index ce77a191687..87190120d4a 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -11,7 +11,7 @@ qdel(src.cable) src.cable = null - regular_hud_updates() + handle_regular_hud_updates() if(src.secHUD == 1) process_sec_hud(src, 1) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 5517d5463dc..18682cde0e4 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -4,15 +4,10 @@ icon_state = "repairbot" emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person) - small = 1 pass_flags = PASSTABLE | PASSDOORHATCH density = 0 mob_size = 1//As a holographic projection, a pAI is massless except for its card device - mob_size = 1 - - mob_size = 1 - var/network = "SS13" var/obj/machinery/camera/current = null var/ram = 100 // Used as currency to purchase different abilities @@ -81,7 +76,7 @@ /mob/living/silicon/pai/New(var/obj/item/device/paicard/newlocation) var/obj/item/device/paicard/paicard - if (istype(newlocation, /obj/item/device/paicard)) + if (istype(newlocation)) paicard = newlocation else //If we get here, then we must have been created by adminspawning. @@ -148,13 +143,6 @@ return -1 return 0 -/mob/living/silicon/pai/blob_act() - if (src.stat != 2) - src.adjustBruteLoss(60) - src.updatehealth() - return 1 - return 0 - /mob/living/silicon/pai/restrained() if(istype(src.loc,/obj/item/device/paicard)) return 0 @@ -194,17 +182,6 @@ if(3) src << "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all." -// See software.dm for Topic() -/mob/living/silicon/pai/meteorhit(obj/O as obj) - for(var/mob/M in viewers(src, null)) - M.show_message(text("\red [] has been hit by []", src, O), 1) - if (src.health > 0) - src.adjustBruteLoss(30) - if ((O.icon_state == "flaming")) - src.adjustFireLoss(40) - src.updatehealth() - return - /mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C) if (!C) src.unset_machine() @@ -314,8 +291,6 @@ var/obj/item/device/pda/holder = card.loc holder.pai = null - canmove = 1 - src.client.perspective = EYE_PERSPECTIVE src.client.eye = src src.forceMove(get_turf(card)) @@ -388,12 +363,16 @@ set name = "Rest" set category = "IC" + // Pass lying down or getting up to our pet human, if we're in a rig. if(istype(src.loc,/obj/item/device/paicard)) resting = 0 + var/obj/item/weapon/rig/rig = src.get_rig() + if(istype(rig)) + rig.force_rest(src) else resting = !resting icon_state = resting ? "[chassis]_rest" : "[chassis]" - src << "\blue You are now [resting ? "resting" : "getting up"]" + src << "You are now [resting ? "resting" : "getting up"]" canmove = !resting @@ -432,28 +411,43 @@ //stop resting resting = 0 - //This seems redundant but not including the forced loc setting messes the behavior up. + // If we are being held, handle removing our holder from their inv. + var/obj/item/weapon/holder/H = loc + if(istype(H)) + var/mob/living/M = H.loc + if(istype(M)) + M.drop_from_inventory(H) + H.loc = get_turf(src) + src.loc = get_turf(H) + + // Move us into the card and move the card to the ground. src.loc = card card.loc = get_turf(card) src.forceMove(card) card.forceMove(card.loc) - canmove = 0 + canmove = 1 + resting = 0 icon_state = "[chassis]" -/mob/living/silicon/pai/start_pulling(var/atom/movable/AM) - - if(istype(AM,/obj/item)) - var/obj/item/O = AM - if(O.w_class == 1) - ..() - else - src << "You are too small to pull that." - else - src << "You are too small to pull that." - return - // No binary for pAIs. /mob/living/silicon/pai/binarycheck() return 0 +// Handle being picked up. +/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber, var/self_drop) + var/obj/item/weapon/holder/H = ..(grabber, self_drop) + if(!istype(H)) + return + H.icon_state = "pai-[icon_state]" + grabber.update_inv_l_hand() + grabber.update_inv_r_hand() + return H +/mob/living/silicon/pai/MouseDrop(atom/over_object) + var/mob/living/carbon/H = over_object + if(!istype(H) || !Adjacent(H)) return ..() + if(H.a_intent == "help") + get_scooped(H) + return + else + return ..() diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 8f0f7f896af..c23416361f7 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -350,7 +350,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates else asked.Remove(O.key) if(O.client) - if(O.client.prefs.be_special & BE_PAI) + if(BE_PAI in O.client.prefs.be_special_role) question(O.client) /datum/paiController/proc/question(var/client/C) @@ -363,4 +363,4 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(response == "Yes") recruitWindow(C.mob) else if (response == "Never for this round") - C.prefs.be_special ^= BE_PAI + C.prefs.be_special_role -= BE_PAI diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 62e55da7a6e..3b080393d54 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -472,13 +472,13 @@ user.add_language("Siik'maas") user.add_language("Skrellian") // user.add_language("Vaurcese") - user.add_language("Rootsong") + user.add_language(LANGUAGE_ROOTSPEAK) else user.remove_language("Sinta'unathi") user.remove_language("Siik'maas") user.remove_language("Skrellian") //user.add_language("Hivenet") //I can buy an AI core and its cyborgs having access to the local hivenet for security reasons, but a pAI? - user.add_language("Rootsong") + user.add_language(LANGUAGE_ROOTSPEAK) is_active(mob/living/silicon/pai/user) return user.translator_on @@ -514,7 +514,7 @@ else if(href_list["freq"]) var/new_frequency = (P.sradio.frequency + text2num(href_list["freq"])) - if(new_frequency < 1200 || new_frequency > 1600) + if(new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ) new_frequency = sanitize_frequency(new_frequency) P.sradio.set_frequency(new_frequency) return 1 diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 75556cf3041..536d5bcc768 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -12,8 +12,8 @@ w_class = 2.0 throw_speed = 5 throw_range = 10 + origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 1, TECH_ENGINEERING = 2) matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) - origin_tech = "magnets=2;biotech=1;engineering=2" var/mode = 1; /obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob) @@ -26,54 +26,70 @@ user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\blue Body Temperature: ???", 1) return - if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" - return - if(!istype(M, /mob/living/silicon/robot) && !(ishuman(M) && (M:species.flags & IS_SYNTHETIC))) + + var/scan_type + if(istype(M, /mob/living/silicon/robot)) + scan_type = "robot" + else if(istype(M, /mob/living/carbon/human)) + scan_type = "prosthetics" + else user << "\red You can't analyze non-robotic things!" return - user.visible_message(" [user] has analyzed [M]'s components."," You have analyzed [M]'s components.") - var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() - var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() - user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]") - user.show_message("\t Key: Electronics/Brute", 1) - user.show_message("\t Damage Specifics: [BU] - [BR]") - if(M.tod && M.stat == DEAD) - user.show_message("\blue Time of Disable: [M.tod]") + user.visible_message("\The [user] has analyzed [M]'s components.","You have analyzed [M]'s components.") + switch(scan_type) + if("robot") + var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() + var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() + user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]") + user.show_message("\t Key: Electronics/Brute", 1) + user.show_message("\t Damage Specifics: [BU] - [BR]") + if(M.tod && M.stat == DEAD) + user.show_message("\blue Time of Disable: [M.tod]") + var/mob/living/silicon/robot/H = M + var/list/damaged = H.get_damaged_components(1,1,1) + user.show_message("\blue Localized Damage:",1) + if(length(damaged)>0) + for(var/datum/robot_component/org in damaged) + user.show_message(text("\blue \t []: [][] - [] - [] - []", \ + capitalize(org.name), \ + (org.installed == -1) ? "DESTROYED " :"",\ + (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ + (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ + (org.toggled) ? "Toggled ON" : "Toggled OFF",\ + (org.powered) ? "Power ON" : "Power OFF"),1) + else + user.show_message("\blue \t Components are OK.",1) + if(H.emagged && prob(5)) + user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1) + user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) - if (istype(M, /mob/living/silicon/robot)) - var/mob/living/silicon/robot/H = M - var/list/damaged = H.get_damaged_components(1,1,1) - user.show_message("\blue Localized Damage:",1) - if(length(damaged)>0) - for(var/datum/robot_component/org in damaged) - user.show_message(text("\blue \t []: [][] - [] - [] - []", \ - capitalize(org.name), \ - (org.installed == -1) ? "DESTROYED " :"",\ - (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ - (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ - (org.toggled) ? "Toggled ON" : "Toggled OFF",\ - (org.powered) ? "Power ON" : "Power OFF"),1) - else - user.show_message("\blue \t Components are OK.",1) - if(H.emagged && prob(5)) - user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1) + if("prosthetics") + var/mob/living/carbon/human/H = M + user << "Analyzing Results for \the [H]:" + user << "Key: Electronics/Brute" - if (ishuman(M) && (M:species.flags & IS_SYNTHETIC)) - var/mob/living/carbon/human/H = M - var/list/damaged = H.get_damaged_organs(1,1) - user.show_message("\blue Localized Damage, Brute/Electronics:",1) - if(length(damaged)>0) - for(var/obj/item/organ/external/org in damaged) - user.show_message(text("\blue \t []: [] - []", \ - capitalize(org.name), \ - (org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \ - (org.burn_dam > 0) ? "[org.burn_dam]" :0),1) - else - user.show_message("\blue \t Components are OK.",1) - - user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + user << "External prosthetics:" + var/organ_found + if(H.internal_organs.len) + for(var/obj/item/organ/external/E in H.organs) + if(!(E.status & ORGAN_ROBOT)) + continue + organ_found = 1 + user << "[E.name]: [E.brute_dam] [E.burn_dam]" + if(!organ_found) + user << "No prosthetics located." + user << "
      " + user << "Internal prosthetics:" + organ_found = null + if(H.internal_organs.len) + for(var/obj/item/organ/O in H.internal_organs) + if(!(O.status & ORGAN_ROBOT)) + continue + organ_found = 1 + user << "[O.name]: [O.damage]" + if(!organ_found) + user << "No prosthetics located." src.add_fingerprint(user) return diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 50ba32e2e47..1ed45bdb806 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -251,8 +251,6 @@ /obj/item/robot_parts/robot_component icon = 'icons/obj/robot_component.dmi' icon_state = "working" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=5000) var/brute = 0 var/burn = 0 var/icon_state_broken = "broken" @@ -287,7 +285,6 @@ icon = 'icons/obj/tank.dmi' icon_state = "jetpack-black" icon_state_broken = "jetpack-black" - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"phoron"=15000,"uranium" = 20000) /obj/item/robot_parts/robot_component/radio name = "radio" diff --git a/code/modules/mob/living/silicon/robot/custom_sprites.dm b/code/modules/mob/living/silicon/robot/custom_sprites.dm index 360308ccec4..c3632cd62e7 100644 --- a/code/modules/mob/living/silicon/robot/custom_sprites.dm +++ b/code/modules/mob/living/silicon/robot/custom_sprites.dm @@ -25,6 +25,6 @@ var/list/robot_custom_icons var/rname = robot_custom_icons[ckey] if(rname && rname == real_name) custom_sprite = 1 - icon = CUSTOM_ITEM_ROBOT + icon = CUSTOM_ITEM_SYNTH if(icon_state == "robot") icon_state = "[ckey]-Standard" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 46eb624381b..66f9d4d4732 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -1,3 +1,23 @@ +var/list/mob_hat_cache = list() +/proc/get_hat_icon(var/obj/item/hat, var/offset_x = 0, var/offset_y = 0) + var/t_state = hat.icon_state + if(hat.item_state_slots && hat.item_state_slots[slot_head_str]) + t_state = hat.item_state_slots[slot_head_str] + else if(hat.item_state) + t_state = hat.item_state + var/key = "[t_state]_[offset_x]_[offset_y]" + if(!mob_hat_cache[key]) // Not ideal as there's no guarantee all hat icon_states + var/t_icon = INV_HEAD_DEF_ICON // are unique across multiple dmis, but whatever. + if(hat.icon_override) + t_icon = hat.icon_override + else if(hat.item_icons && (slot_head_str in hat.item_icons)) + t_icon = hat.item_icons[slot_head_str] + var/image/I = image(icon = t_icon, icon_state = t_state) + I.pixel_x = offset_x + I.pixel_y = offset_y + mob_hat_cache[key] = I + return mob_hat_cache[key] + /mob/living/silicon/robot/drone name = "drone" real_name = "drone" @@ -16,8 +36,11 @@ req_access = list(access_engine, access_robotics) integrated_light_power = 3 local_transmit = 1 + possession_candidate = 1 mob_size = 4 - small = 1 + + can_pull_size = 3 + can_pull_mobs = MOB_PULL_SMALLER mob_bump_flag = SIMPLE_ANIMAL //mob_swap_flags = SIMPLE_ANIMAL @@ -29,11 +52,54 @@ 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 + var/obj/item/hat + var/hat_x_offset = 0 + var/hat_y_offset = -13 holder_type = /obj/item/weapon/holder/drone +/mob/living/silicon/robot/drone/can_be_possessed_by(var/mob/dead/observer/possessor) + if(!istype(possessor) || !possessor.client || !possessor.ckey) + return 0 + if(!config.allow_drone_spawn) + src << "Playing as drones is not currently permitted." + return 0 + if(too_many_active_drones()) + src << "The maximum number of active drones has been reached.." + return 0 + if(jobban_isbanned(possessor,"Cyborg")) + usr << "You are banned from playing synthetics and cannot spawn as a drone." + return 0 + if(!possessor.MayRespawn(1,DRONE_SPAWN_DELAY)) + return 0 + return 1 + +/mob/living/silicon/robot/drone/do_possession(var/mob/dead/observer/possessor) + if(!(istype(possessor) && possessor.ckey)) + return 0 + if(src.ckey || src.client) + possessor << "\The [src] already has a player." + return 0 + message_admins("[key_name_admin(possessor)] has taken control of \the [src].") + log_admin("[key_name(possessor)] took control of \the [src].") + transfer_personality(possessor.client) + qdel(possessor) + return 1 + +/mob/living/silicon/robot/drone/Destroy() + if(hat) + hat.loc = get_turf(src) + ..() + +/mob/living/silicon/robot/drone/construction + icon_state = "constructiondrone" + law_type = /datum/ai_laws/construction_drone + module_type = /obj/item/weapon/robot_module/drone/construction + hat_x_offset = 1 + hat_y_offset = -12 + can_pull_size = 5 + can_pull_mobs = MOB_PULL_SAME + /mob/living/silicon/robot/drone/New() ..() @@ -61,11 +127,11 @@ /mob/living/silicon/robot/drone/init() aiCamera = new/obj/item/device/camera/siliconcam/drone_camera(src) - + additional_law_channels["Drone"] = ":d" if(!laws) laws = new law_type if(!module) module = new module_type(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!'" + flavor_text = "It's a tiny little repair drone. The casing is stamped with an corporate logo and the subscript: '[company_name] Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'" playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) //Redefining some robot procs... @@ -85,6 +151,8 @@ overlays += "eyes-[icon_state]" else overlays -= "eyes" + if(hat) // Let the drones wear hats. + overlays |= get_hat_icon(hat, hat_x_offset, hat_y_offset) /mob/living/silicon/robot/drone/choose_icon() return @@ -92,10 +160,25 @@ /mob/living/silicon/robot/drone/pick_module() return -//Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..(). -/mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob) +/mob/living/silicon/robot/drone/proc/wear_hat(var/obj/item/new_hat) + if(hat) + return + hat = new_hat + new_hat.forceMove(src) + updateicon() - if(istype(W, /obj/item/borg/upgrade/)) +//Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..(). +/mob/living/silicon/robot/drone/attackby(var/obj/item/weapon/W, var/mob/user) + + if(user.a_intent == "help" && istype(W, /obj/item/clothing/head)) + if(hat) + user << "\The [src] is already wearing \the [hat]." + return + user.unEquip(W) + wear_hat(W) + user.visible_message("\The [user] puts \the [W] on \the [src].") + return + else if(istype(W, /obj/item/borg/upgrade/)) user << "\The [src] is not compatible with \the [W]." return @@ -103,41 +186,6 @@ 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 << "There's not much point subverting this heap of junk." - return - - if(emagged) - 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 << "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-- - - message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.") - log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.") - var/time = time2text(world.realtime,"hh:mm:ss") - lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") - - emagged = 1 - lawupdate = 0 - connected_ai = null - clear_supplied_laws() - clear_inherent_laws() - laws = new /datum/ai_laws/syndicate_override - set_zeroth_law("Only [user] and people \he designates as being such are operatives.") - - src << "Obey these laws:" - laws.show_laws(src) - src << "ALERT: [user] is your new master. Obey \his commands and your new laws." - return - else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(stat == 2) @@ -151,12 +199,7 @@ return 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) - drones++ - if(drones < config.max_maint_drones) - request_player() + request_player() return else @@ -174,6 +217,37 @@ ..() +/mob/living/silicon/robot/drone/emag_act(var/remaining_charges, var/mob/user) + if(!client || stat == 2) + user << "There's not much point subverting this heap of junk." + return + + if(emagged) + 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 << "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." + + message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.") + log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.") + var/time = time2text(world.realtime,"hh:mm:ss") + lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") + + emagged = 1 + lawupdate = 0 + connected_ai = null + clear_supplied_laws() + clear_inherent_laws() + laws = new /datum/ai_laws/syndicate_override + set_zeroth_law("Only [user.real_name] and people \he designates as being such are operatives.") + + src << "Obey these laws:" + laws.show_laws(src) + src << "ALERT: [user.real_name] is your new master. Obey your new laws and \his commands." + return 1 + //DRONE LIFE/DEATH //For some goddamn reason robots have this hardcoded. Redefining it for our fragile friends here. @@ -198,7 +272,7 @@ ..() //DRONE MOVEMENT. -/mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip) +/mob/living/silicon/robot/drone/slip_chance(var/prob_slip) return 0 //CONSOLE PROCS @@ -228,28 +302,13 @@ //Reboot procs. /mob/living/silicon/robot/drone/proc/request_player() - for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "Cyborg")) - continue - if(O.client) - if(O.client.prefs.be_special & BE_PAI) - question(O.client) - -/mob/living/silicon/robot/drone/proc/question(var/client/C) - spawn(0) - if(!C || jobban_isbanned(C,"Cyborg")) return - var/response = alert(C, "Someone is attempting to reboot a maintenance drone. Would you like to play as one?", "Maintenance drone reboot", "Yes", "No", "Never for this round") - if(!C || ckey) - return - if(response == "Yes") - transfer_personality(C) - else if (response == "Never for this round") - C.prefs.be_special ^= BE_PAI + if(too_many_active_drones()) + return + var/datum/ghosttrap/G = get_ghost_trap("maintenance drone") + G.request_player(src, "Someone is attempting to reboot a maintenance drone.", 30 SECONDS) /mob/living/silicon/robot/drone/proc/transfer_personality(var/client/player) - if(!player) return - src.ckey = player.ckey if(player.mob && player.mob.mind) @@ -287,13 +346,6 @@ /mob/living/silicon/robot/drone/remove_robot_verbs() src.verbs -= silicon_subsystems -/mob/living/silicon/robot/drone/construction - icon_state = "constructiondrone" - 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/welcome_drone() src << "You are a construction drone, an autonomous engineering and fabrication system.." src << "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible." @@ -307,3 +359,10 @@ /mob/living/silicon/robot/drone/construction/updatename() real_name = "construction drone ([rand(100,999)])" name = real_name + +/proc/too_many_active_drones() + var/drones = 0 + for(var/mob/living/silicon/robot/drone/D in mob_list) + if(D.key && D.client) + drones++ + return drones >= config.max_maint_drones diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index cad4baf9f6c..e5aa936a086 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -10,28 +10,28 @@ mail_destination = "" return - src << "\blue You configure your internal beacon, tagging yourself for delivery to '[new_tag]'." + src << "You configure your internal beacon, tagging yourself for delivery to '[new_tag]'." mail_destination = new_tag //Auto flush if we use this verb inside a disposal chute. var/obj/machinery/disposal/D = src.loc if(istype(D)) - src << "\blue \The [D] acknowledges your signal." + src << "\The [D] acknowledges your signal." D.flush_count = D.flush_every_ticks return -//Actual picking-up event. -/mob/living/silicon/robot/drone/attack_hand(mob/living/carbon/human/M as mob) - - if(M.a_intent == I_HELP) - M.visible_message("\blue[M] pets \the [src]!
      ") - ..() - /mob/living/silicon/robot/drone/MouseDrop(atom/over_object) - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) - return ..() - get_scooped(H) - return \ No newline at end of file + if(!istype(H) || !Adjacent(H)) return ..() + if(H.a_intent == "help") + get_scooped(H) + return + else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) + hat.loc = get_turf(src) + H.put_in_hands(hat) + H.visible_message("\The [H] removes \the [src]'s [hat].") + hat = null + updateicon() + else + return ..() \ 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 c707f85c68b..349f27114b0 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -2,9 +2,10 @@ name = "Maintenance Drone Control" desc = "Used to monitor the station's drone population and the assembler that services them." icon = 'icons/obj/computer.dmi' - icon_state = "power" + icon_keyboard = "power_key" + icon_screen = "power" req_access = list(access_engine_equip) - circuit = "/obj/item/weapon/circuitboard/drone_control" + circuit = /obj/item/weapon/circuitboard/drone_control //Used when pinging drones. var/drone_call_area = "Engineering" @@ -29,7 +30,7 @@ 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 += "
      [D.real_name] ([D.stat == 2 ? "INACTIVE" : "ACTIVE"])" dat += "
      Cell charge: [D.cell.charge]/[D.cell.maxcharge]." dat += "
      Currently located in: [get_area(D)]." dat += "
      Resync | Shutdown
      " 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 cde9aa421ba..8f9a7830727 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -77,9 +77,9 @@ /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/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, 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 99fbe1c576f..7d1a8bf4980 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -78,66 +78,55 @@ flick("h_lathe_leave",src) time_last_drone = world.time - var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src)) + if(player.mob && player.mob.mind) player.mob.mind.reset() + var/mob/living/silicon/robot/drone/new_drone = PoolOrNew(drone_type, get_turf(src)) new_drone.transfer_personality(player) new_drone.master_fabricator = src drone_progress = 0 -/mob/dead/verb/join_as_drone() - +/mob/dead/observer/verb/join_as_drone() set category = "Ghost" set name = "Join As Drone" set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone." + try_drone_spawn(src) +/proc/try_drone_spawn(var/mob/user, var/obj/machinery/drone_fabricator/fabricator) if(ticker.current_state < GAME_STATE_PLAYING) - src << "The game hasn't started yet!" + user << "The game hasn't started yet!" return if(!(config.allow_drone_spawn)) - src << "That verb is not currently permitted." + user << "That verb is not currently permitted." return - if (!src.stat || !client) + if(jobban_isbanned(user,"Cyborg")) + user << "You are banned from playing synthetics and cannot spawn as a drone." return - if (usr != src) - return 0 //something is terribly wrong - - if(jobban_isbanned(src,"Cyborg")) - usr << "You are banned from playing synthetics and cannot spawn as a drone." + // #TODO-MERGE: refactor teh various respawn timers into MayRespawn + if(!user.MayRespawn(1, DRONE_SPAWN_DELAY)) return - if(!MayRespawn(1)) - return + if(!fabricator) - var/deathtime = world.time - get_death_time(MINISYNTH)//get/set death_time functions are in mob_helpers.dm - if(istype(src,/mob/dead/observer)) - var/mob/dead/observer/G = src - if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - usr << "Upon using the antagHUD you forfeighted the ability to join the round." - return - - - if (deathtime < RESPAWN_MINISYNTH) - var/timedifference_text = time2text(RESPAWN_MINISYNTH - deathtime,"mm:ss") - var/basetime = time2text(RESPAWN_MINISYNTH,"mm:ss") - usr << "You may only spawn again as a drone more than [basetime] minutes after your death. You have [timedifference_text] left." - 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.drone_progress >= 100) + var/list/all_fabricators = list() + for(var/obj/machinery/drone_fabricator/DF in machines) + if((DF.stat & NOPOWER) || !DF.produce_drones || DF.drone_progress < 100) + continue all_fabricators[DF.fabricator_tag] = DF - if(!all_fabricators.len) - src << "There are no available drone spawn points, sorry." - return + if(!all_fabricators.len) + user << "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) + var/choice = input(user,"Which fabricator do you wish to use?") as null|anything in all_fabricators + if(!choice || !all_fabricators[choice]) + return + fabricator = all_fabricators[choice] + + if(user && fabricator && !((fabricator.stat & NOPOWER) || !fabricator.produce_drones || fabricator.drone_progress < 100)) + fabricator.create_drone(user.client) + return 1 + return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 3cdf49e178d..75394288a6e 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -36,9 +36,9 @@ param = null if (param) - message = "[src] salutes to [param]." + message = "salutes to [param]." else - message = "[src] salutes." + message = "salutes." m_type = 1 if ("bow") if (!src.buckled) @@ -52,39 +52,39 @@ param = null if (param) - message = "[src] bows to [param]." + message = "bows to [param]." else - message = "[src] bows." + message = "bows." m_type = 1 if ("clap") if (!src.restrained()) - message = "[src] claps." + message = "claps." m_type = 2 if ("flap") if (!src.restrained()) - message = "[src] flaps \his wings." + message = "flaps its wings." m_type = 2 if ("aflap") if (!src.restrained()) - message = "[src] flaps \his wings ANGRILY!" + message = "flaps its wings ANGRILY!" m_type = 2 if ("twitch") - message = "[src] twitches violently." + message = "twitches violently." m_type = 1 if ("twitch_s") - message = "[src] twitches." + message = "twitches." m_type = 1 if ("nod") - message = "[src] nods." + message = "nods." m_type = 1 if ("deathgasp") - message = "[src] shudders violently for a moment, then becomes motionless, its eyes slowly darkening." + message = "shudders violently for a moment, then becomes motionless, its eyes slowly darkening." m_type = 1 if ("glare") @@ -98,9 +98,9 @@ param = null if (param) - message = "[src] glares at [param]." + message = "glares at [param]." else - message = "[src] glares." + message = "glares." if ("stare") var/M = null @@ -113,9 +113,9 @@ param = null if (param) - message = "[src] stares at [param]." + message = "stares at [param]." else - message = "[src] stares." + message = "stares." if ("look") var/M = null @@ -129,9 +129,9 @@ param = null if (param) - message = "[src] looks at [param]." + message = "looks at [param]." else - message = "[src] looks." + message = "looks." m_type = 1 if("beep") @@ -145,9 +145,9 @@ param = null if (param) - message = "[src] beeps at [param]." + message = "beeps at [param]." else - message = "[src] beeps." + message = "beeps." playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) m_type = 1 @@ -162,9 +162,9 @@ param = null if (param) - message = "[src] pings at [param]." + message = "pings at [param]." else - message = "[src] pings." + message = "pings." playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) m_type = 1 @@ -179,15 +179,15 @@ param = null if (param) - message = "[src] buzzes at [param]." + message = "buzzes at [param]." else - message = "[src] buzzes." + message = "buzzes." playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) m_type = 1 if("law") if (istype(module,/obj/item/weapon/robot_module/security)) - message = "[src] shows its legal authorization barcode." + message = "shows its legal authorization barcode." playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0) m_type = 2 @@ -209,5 +209,6 @@ src << "\blue Unusable emote '[act]'. Say *help for a list." if ((message && src.stat == 0)) - send_emote(message, m_type) + custom_emote(m_type,message) + return diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 2dc3b4e3916..9740c02f870 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -22,7 +22,7 @@ src << "Laws synced with AI, be sure to note any changes." // TODO: Update to new antagonist system. if(mind && mind.special_role == "traitor" && mind.original == src) - src << "Remember, your AI does NOT share or know about your law 0." + src << "Remember, your AI does NOT share or know about your law 0." else src << "No AI selected to sync laws with, disabling lawsync protocol." lawupdate = 0 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 77eed9a66ad..f2d3010547c 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -2,7 +2,7 @@ set invisibility = 0 set background = 1 - if (src.monkeyizing) + if (src.transforming) return src.blinded = null @@ -10,6 +10,7 @@ //Status updates, death etc. clamp_values() handle_regular_status_updates() + handle_actions() if(client) handle_regular_hud_updates() @@ -49,7 +50,10 @@ cell_use_power(50) if(lights_on) - cell_use_power(30) // 30W light. Normal lights would use ~15W, but increased for balance reasons. + if(intenselight) + cell_use_power(100) // Upgraded light. Double intensity, much larger power usage. + else + cell_use_power(30) // 30W light. Normal lights would use ~15W, but increased for balance reasons. src.has_power = 1 else @@ -60,7 +64,7 @@ lights_on = 0 set_light(0) -/mob/living/silicon/robot/proc/handle_regular_status_updates() +/mob/living/silicon/robot/handle_regular_status_updates() if(src.camera && !scrambledcodes) if(src.stat == 2 || wires.IsIndexCut(BORG_WIRE_CAMERA)) @@ -143,7 +147,7 @@ return 1 -/mob/living/silicon/robot/proc/handle_regular_hud_updates() +/mob/living/silicon/robot/handle_regular_hud_updates() if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY)) src.sight |= SEE_TURFS @@ -176,7 +180,7 @@ src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness // has a "invisible" value of 15 - regular_hud_updates() + ..() var/obj/item/borg/sight/hud/hud = (locate(/obj/item/borg/sight/hud) in src) if(hud && hud.hud) @@ -317,7 +321,7 @@ killswitch_time -- if(killswitch_time <= 0) if(src.client) - src << "\red Killswitch Activated" + src << "Killswitch Activated" killswitch = 0 spawn(5) gib() @@ -328,7 +332,7 @@ weaponlock_time -- if(weaponlock_time <= 0) if(src.client) - src << "\red Weapon Lock Timed Out!" + src << "Weapon Lock Timed Out!" weapon_lock = 0 weaponlock_time = 120 @@ -336,3 +340,12 @@ if(paralysis || stunned || weakened || buckled || lockcharge || !is_component_functioning("actuator")) canmove = 0 else canmove = 1 return canmove + +/mob/living/silicon/robot/update_fire() + overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") + if(on_fire) + overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") + +/mob/living/silicon/robot/fire_act() + if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them + IgniteMob() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index eac71acfcdd..9d9117b9330 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -5,4 +5,6 @@ winset(src, null, "mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5") - return \ No newline at end of file + // Forces synths to select an icon relevant to their module + if(!icon_selected) + choose_icon(icon_selection_tries, module_sprites) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index dd5e2a37002..1a69f7637a6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -25,8 +25,10 @@ //Icon stuff - var/icontype //Persistent icontype tracking allows for cleaner icon updates - var/module_sprites[0] //Used to store the associations between sprite names and sprite index. + var/icontype //Persistent icontype tracking allows for cleaner icon updates + var/module_sprites[0] //Used to store the associations between sprite names and sprite index. + var/icon_selected = 1 //If icon selection has been completed yet + var/icon_selection_tries = 0//Remaining attempts to select icon before a selection is forced //Hud stuff @@ -64,6 +66,8 @@ var/obj/item/device/pda/ai/rbPDA = null + var/obj/item/weapon/stock_parts/matter_bin/storage = null + var/opened = 0 var/emagged = 0 var/wiresexposed = 0 @@ -90,6 +94,7 @@ var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them. var/tracking_entities = 0 //The number of known entities currently accessing the internal camera var/braintype = "Cyborg" + var/intenselight = 0 // Whether cyborg's integrated light was upgraded var/list/robot_verbs_default = list( /mob/living/silicon/robot/proc/sensor_mode, @@ -102,6 +107,7 @@ spark_system.attach(src) add_language("Robot Talk", 1) + add_language(LANGUAGE_EAL, 1) wires = new(src) @@ -157,10 +163,18 @@ hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") +/mob/living/silicon/robot/proc/recalculate_synth_capacities() + if(!module || !module.synths) + return + var/mult = 1 + if(storage) + mult += storage.rating + for(var/datum/matter_synth/M in module.synths) + M.set_multiplier(mult) + /mob/living/silicon/robot/proc/init() aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) laws = new /datum/ai_laws/nanotrasen() - additional_law_channels += "Binary" var/new_ai = select_active_ai_with_fewest_borgs() if(new_ai) lawupdate = 1 @@ -219,13 +233,21 @@ mmi = null if(connected_ai) connected_ai.connected_robots -= src - ..() + qdel(wires) + wires = null + return ..() /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]" + if(new_sprites && new_sprites.len) + module_sprites = new_sprites.Copy() + //Custom_sprite check and entry + if (custom_sprite == 1) + module_sprites["Custom"] = "[src.ckey]-[modtype]" + icontype = "Custom" + else + icontype = module_sprites[1] + icon_state = module_sprites[icontype] + updateicon() return module_sprites /mob/living/silicon/robot/proc/pick_module() @@ -236,7 +258,7 @@ if((crisis_override && security_level == SEC_LEVEL_RED) || security_level == SEC_LEVEL_DELTA) //no fun allowed anymore. src << "\red Crisis mode active. Combat module available." modules+="Combat" - modtype = input("Please, select a module!", "Robot", null, null) in modules + modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules if(module) return @@ -249,8 +271,7 @@ hands.icon_state = lowertext(modtype) feedback_inc("cyborg_[lowertext(modtype)]",1) updatename() - set_module_sprites(module.sprites) - choose_icon(module_sprites.len + 1, module_sprites) + recalculate_synth_capacities() notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) /mob/living/silicon/robot/proc/updatename(var/prefix as text) @@ -330,10 +351,7 @@ lights_on = !lights_on usr << "You [lights_on ? "enable" : "disable"] your integrated light." - if(lights_on) - set_light(integrated_light_power) // 1.5x luminosity of flashlight - else - set_light(0) + update_robot_light() /mob/living/silicon/robot/verb/self_diagnosis_verb() set category = "Robot Commands" @@ -373,6 +391,15 @@ C.toggled = 1 src << "\red You enable [C.name]." +/mob/living/silicon/robot/proc/update_robot_light() + if(lights_on) + if(intenselight) + set_light(integrated_light_power * 2, integrated_light_power) + else + set_light(integrated_light_power) + else + set_light(0) + // this function displays jetpack pressure in the stat panel /mob/living/silicon/robot/proc/show_jetpack_pressure() // if you have a jetpack, show the internal tank pressure @@ -400,22 +427,11 @@ stat(null, text("Lights: [lights_on ? "ON" : "OFF"]")) if(module) for(var/datum/matter_synth/ms in module.synths) - stat("[ms.name]: [ms.energy]/[ms.max_energy]") + stat("[ms.name]: [ms.energy]/[ms.max_energy_multiplied]") /mob/living/silicon/robot/restrained() return 0 -/mob/living/silicon/robot/meteorhit(obj/O as obj) - for(var/mob/M in viewers(src, null)) - M.show_message(text("\red [src] has been hit by [O]"), 1) - //Foreach goto(19) - if (health > 0) - adjustBruteLoss(30) - if ((O.icon_state == "flaming")) - adjustFireLoss(40) - updatehealth() - return - /mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj) ..(Proj) if(prob(75) && Proj.damage > 0) spark_system.start() @@ -465,6 +481,7 @@ user << "You need to light the welding tool, first!" return if (WT.remove_fuel(0)) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) adjustBruteLoss(-30) updatehealth() add_fingerprint(user) @@ -480,6 +497,7 @@ return var/obj/item/stack/cable_coil/coil = W if (coil.use(1)) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) adjustFireLoss(-30) updatehealth() for(var/mob/O in viewers(user, null)) @@ -540,6 +558,17 @@ user << "You open the cover." opened = 1 updateicon() + else if (istype(W, /obj/item/weapon/stock_parts/matter_bin) && opened) // Installing/swapping a matter bin + if(storage) + user << "You replace \the [storage] with \the [W]" + storage.forceMove(get_turf(src)) + storage = null + else + user << "You install \the [W]" + user.drop_item() + storage = W + W.forceMove(src) + recalculate_synth_capacities() else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside var/datum/robot_component/C = components["power cell"] @@ -599,71 +628,6 @@ else user << "\red Access denied." - else if(istype(W, /obj/item/weapon/card/emag)) // trying to unlock with an emag card - if(!opened)//Cover is closed - if(locked) - if(prob(90)) - var/obj/item/weapon/card/emag/emag = W - emag.uses-- - user << "You emag the cover lock." - locked = 0 - else - user << "You fail to emag the cover lock." - src << "Hack attempt detected." - else - user << "The cover is already unlocked." - return - - if(opened)//Cover is open - if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice - if(wiresexposed) - user << "You must close the panel first" - return - else - sleep(6) - if(prob(50)) - emagged = 1 - lawupdate = 0 - disconnect_from_ai() - user << "You emag [src]'s interface." - message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") - log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") - clear_supplied_laws() - clear_inherent_laws() - laws = new /datum/ai_laws/syndicate_override - var/time = time2text(world.realtime,"hh:mm:ss") - lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") - set_zeroth_law("Only [user] and people \he designates as being such are operatives.") - src << "\red ALERT: Foreign software detected." - sleep(5) - src << "\red Initiating diagnostics..." - sleep(20) - src << "\red SynBorg v1.7.1 loaded." - sleep(5) - src << "\red LAW SYNCHRONISATION ERROR" - sleep(5) - src << "\red Would you like to send a report to NanoTraSoft? Y/N" - sleep(10) - src << "\red > N" - sleep(20) - src << "\red ERRORERRORERROR" - src << "Obey these laws:" - laws.show_laws(src) - src << "\red \b ALERT: [user] is your new master. Obey \his commands and your new laws." - if(src.module) - var/rebuild = 0 - for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules) - 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." - src << "Hack attempt detected." - return - else if(istype(W, /obj/item/borg/upgrade/)) var/obj/item/borg/upgrade/U = W if(!opened) @@ -748,7 +712,7 @@ /mob/living/silicon/robot/updateicon() overlays.Cut() - if(stat == 0) + if(stat == CONSCIOUS) overlays += "eyes-[module_sprites[icontype]]" if(opened) @@ -770,14 +734,6 @@ icon_state = module_sprites[icontype] return -//Call when target overlay should be added/removed -/mob/living/silicon/robot/update_targeted() - if(!targeted_by && target_locked) - qdel(target_locked) - updateicon() - if (targeted_by && target_locked) - overlays += target_locked - /mob/living/silicon/robot/proc/installed_modules() if(weapon_lock) src << "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]" @@ -977,38 +933,30 @@ return /mob/living/silicon/robot/proc/choose_icon(var/triesleft, var/list/module_sprites) - if(triesleft<1 || !module_sprites.len) - return - else - triesleft-- - - 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 - - if(icontype) - icon_state = module_sprites[icontype] - else + if(!module_sprites.len) src << "Something is badly wrong with the sprite selection. Harass a coder." - icon_state = module_sprites[1] return + icon_selected = 0 + src.icon_selection_tries = triesleft + if(module_sprites.len == 1 || !client) + if(!(icontype in module_sprites)) + icontype = module_sprites[1] + else + icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chance\s." : "This is your last try."]", "Robot", icontype, null) in module_sprites + icon_state = module_sprites[icontype] updateicon() - if (triesleft >= 1) + if (module_sprites.len > 1 && triesleft >= 1 && client) + icon_selection_tries-- var/choice = input("Look at your icon - is this what you want?") in list("Yes","No") if(choice=="No") - choose_icon(triesleft, module_sprites) + choose_icon(icon_selection_tries, module_sprites) return - else - triesleft = 0 - return - else - src << "Your icon has been set. You now require a module reset to change it." + + icon_selected = 1 + icon_selection_tries = 0 + src << "Your icon has been set. You now require a module reset to change it." /mob/living/silicon/robot/proc/sensor_mode() //Medical/Security HUD controller for borgs set name = "Set Sensor Augmentation" @@ -1075,3 +1023,70 @@ connected_ai.connected_robots |= src notify_ai(ROBOT_NOTIFICATION_NEW_UNIT) sync() + +/mob/living/silicon/robot/emag_act(var/remaining_charges, var/mob/user) + if(!opened)//Cover is closed + if(locked) + if(prob(90)) + user << "You emag the cover lock." + locked = 0 + else + user << "You fail to emag the cover lock." + src << "Hack attempt detected." + return 1 + else + user << "The cover is already unlocked." + return + + if(opened)//Cover is open + if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice + if(wiresexposed) + user << "You must close the panel first" + return + else + sleep(6) + if(prob(50)) + emagged = 1 + lawupdate = 0 + disconnect_from_ai() + user << "You emag [src]'s interface." + message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") + log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") + clear_supplied_laws() + clear_inherent_laws() + laws = new /datum/ai_laws/syndicate_override + var/time = time2text(world.realtime,"hh:mm:ss") + lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") + set_zeroth_law("Only [user.real_name] and people \he designates as being such are operatives.") + . = 1 + spawn() + src << "ALERT: Foreign software detected." + sleep(5) + src << "Initiating diagnostics..." + sleep(20) + src << "SynBorg v1.7.1 loaded." + sleep(5) + src << "LAW SYNCHRONISATION ERROR" + sleep(5) + src << "Would you like to send a report to NanoTraSoft? Y/N" + sleep(10) + src << "> N" + sleep(20) + src << "ERRORERRORERROR" + src << "Obey these laws:" + laws.show_laws(src) + src << "ALERT: [user.real_name] is your new master. Obey your new laws and his commands." + if(src.module) + var/rebuild = 0 + for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules) + 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." + src << "Hack attempt detected." + return 1 + return diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index a1a3e471149..6e9df95a11a 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -28,13 +28,10 @@ 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]." - else - user << "\The [loaded_item] was not reliable enough to advance research." + 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) @@ -59,8 +56,6 @@ 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 @@ -110,13 +105,6 @@ 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" @@ -268,3 +256,97 @@ desc = "By retracting limbs and tucking in its head, a combat android can roll at high speeds." icon = 'icons/obj/decals.dmi' icon_state = "shock" + +/obj/item/weapon/inflatable_dispenser + name = "inflatables dispenser" + desc = "Small device which allows rapid deployment and removal of inflatables." + icon = 'icons/obj/storage.dmi' + icon_state = "inf_deployer" + w_class = 3 + + // By default stores up to 10 walls and 5 doors. May be changed. + var/stored_walls = 10 + var/stored_doors = 5 + var/max_walls = 10 + var/max_doors = 5 + var/mode = 0 // 0 - Walls 1 - Doors + +/obj/item/weapon/inflatable_dispenser/examine(var/mob/user) + if(!..(user)) + return + user << "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored." + user << "It is set to deploy [mode ? "doors" : "walls"]" + +/obj/item/weapon/inflatable_dispenser/attack_self() + mode = !mode + usr << "You set \the [src] to deploy [mode ? "doors" : "walls"]." + +/obj/item/weapon/inflatable_dispenser/afterattack(var/atom/A, var/mob/user) + ..(A, user) + if(!user) + return + if(!user.Adjacent(A)) + user << "You can't reach!" + return + if(istype(A, /turf)) + try_deploy_inflatable(A, user) + if(istype(A, /obj/item/inflatable) || istype(A, /obj/structure/inflatable)) + pick_up(A, user) + +/obj/item/weapon/inflatable_dispenser/proc/try_deploy_inflatable(var/turf/T, var/mob/living/user) + if(mode) // Door deployment + if(!stored_doors) + user << "\The [src] is out of doors!" + return + + if(T && istype(T)) + new /obj/structure/inflatable/door(T) + stored_doors-- + + else // Wall deployment + if(!stored_walls) + user << "\The [src] is out of walls!" + return + + if(T && istype(T)) + new /obj/structure/inflatable/wall(T) + stored_walls-- + + playsound(T, 'sound/items/zip.ogg', 75, 1) + user << "You deploy the inflatable [mode ? "door" : "wall"]!" + +/obj/item/weapon/inflatable_dispenser/proc/pick_up(var/obj/A, var/mob/living/user) + if(istype(A, /obj/structure/inflatable)) + if(istype(A, /obj/structure/inflatable/wall)) + if(stored_walls >= max_walls) + user << "\The [src] is full." + return + stored_walls++ + qdel(A) + else + if(stored_doors >= max_doors) + user << "\The [src] is full." + return + stored_doors++ + qdel(A) + playsound(loc, 'sound/machines/hiss.ogg', 75, 1) + visible_message("\The [user] deflates \the [A] with \the [src]!") + return + if(istype(A, /obj/item/inflatable)) + if(istype(A, /obj/item/inflatable/wall)) + if(stored_walls >= max_walls) + user << "\The [src] is full." + return + stored_walls++ + qdel(A) + else + if(stored_doors >= max_doors) + usr << "\The [src] is full!" + return + stored_doors++ + qdel(A) + visible_message("\The [user] picks up \the [A] with \the [src]!") + return + + user << "You fail to pick up \the [A] with \the [src]" + return diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 120768ed3ef..dbc824be5b5 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -49,9 +49,13 @@ var/global/list/robot_modules = list( if(R.radio) R.radio.recalculateChannels() -/obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) - R.module = null + R.set_module_sprites(sprites) + R.choose_icon(R.module_sprites.len + 1, R.module_sprites) + for(var/obj/item/I in modules) + I.canremove = 0 + +/obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) remove_camera_networks(R) remove_languages(R) remove_subsystems(R) @@ -59,15 +63,14 @@ var/global/list/robot_modules = list( if(R.radio) R.radio.recalculateChannels() - - qdel(src) + R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) /obj/item/weapon/robot_module/Destroy() - for(var/obj/O in modules) - qdel(O) + for(var/module in modules) + qdel(module) + for(var/synth in synths) + qdel(synth) modules.Cut() - for(var/datum/matter_synth/S in synths) - qdel(S) synths.Cut() qdel(emag) qdel(jetpack) @@ -159,11 +162,11 @@ var/global/list/robot_modules = list( sprites = list( "Basic" = "robot_old", "Android" = "droid", "Default" = "robot", - "Drone" = "drone-standard" + "Drone" = "drone-standard", + "Eyebot" = "eyebot-standard" ) /obj/item/weapon/robot_module/standard/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/melee/baton/loaded(src) src.modules += new /obj/item/weapon/extinguisher(src) @@ -171,7 +174,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/healthanalyzer(src) src.emag = new /obj/item/weapon/melee/energy/sword(src) - return + ..() /obj/item/weapon/robot_module/medical name = "medical robot module" @@ -179,16 +182,18 @@ var/global/list/robot_modules = list( networks = list(NETWORK_MEDICAL) subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) can_be_pushed = 0 + sprites = list( + "Basic" = "Medbot", + "Standard" = "surgeon", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Drone - Medical" = "drone-medical", + "Drone - Chemistry" = "drone-chemistry", + "Eyebot" = "eyebot-medical" + ) /obj/item/weapon/robot_module/medical/general name = "medical robot module" - sprites = list( - "Basic" = "Medbot", - "Standard" = "surgeon", - "Advanced Droid" = "droid-medical", - "Needles" = "medicalrobot", - "Drone" = "drone-surgery" - ) /obj/item/weapon/robot_module/medical/general/New() ..() @@ -226,7 +231,7 @@ var/global/list/robot_modules = list( src.modules += N src.modules += B - return + ..() /obj/item/weapon/robot_module/medical/general/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) if(src.emag) @@ -236,14 +241,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/medical/rescue name = "rescue robot module" - sprites = list( - "Basic" = "Medbot", - "Standard" = "surgeon", - "Advanced Droid" = "droid-medical", - "Needles" = "medicalrobot", - "Drone - Medical" = "drone-medical", - "Drone - Chemistry" = "drone-chemistry" - ) + supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) /obj/item/weapon/robot_module/medical/rescue/New() @@ -258,7 +256,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) - src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/inflatable_dispenser(src) // Allows usage of inflatables. Since they are basically robotic alternative to EMTs, they should probably have them. src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" @@ -282,7 +280,7 @@ var/global/list/robot_modules = list( src.modules += B src.modules += S - return + ..() /obj/item/weapon/robot_module/medical/rescue/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules @@ -304,12 +302,14 @@ var/global/list/robot_modules = list( channels = list("Engineering" = 1) networks = list(NETWORK_ENGINEERING) subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) + supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) sprites = list( "Basic" = "Engineering", "Antique" = "engineerrobot", "Landmate" = "landmate", "Landmate - Treaded" = "engiborg+tread", - "Drone" = "drone-engineer" + "Drone" = "drone-engineer", + "Eyebot" = "eyebot-engineering" ) supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) @@ -354,7 +354,6 @@ var/global/list/robot_modules = list( src.modules += RG /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) src.modules += new /obj/item/weapon/extinguisher(src) @@ -368,14 +367,19 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/analyzer(src) src.modules += new /obj/item/taperoll/engineering(src) src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) + src.modules += new /obj/item/weapon/inflatable_dispenser(src) src.emag = new /obj/item/borg/stun(src) - var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) + var/datum/matter_synth/metal = new /datum/matter_synth/metal(60000) var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) + var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(20000) var/datum/matter_synth/wire = new /datum/matter_synth/wire() synths += metal synths += glass + synths += plasteel synths += wire var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) @@ -399,7 +403,7 @@ var/global/list/robot_modules = list( C.synths = list(wire) src.modules += C - var/obj/item/stack/tile/steel/cyborg/S = new /obj/item/stack/tile/steel/cyborg(src) + var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) S.synths = list(metal) src.modules += S @@ -407,7 +411,11 @@ var/global/list/robot_modules = list( RG.synths = list(metal, glass) src.modules += RG - return + var/obj/item/stack/material/cyborg/plasteel/PL = new (src) + PL.synths = list(plasteel) + src.modules += PL + + ..() /obj/item/weapon/robot_module/security name = "security robot module" @@ -415,7 +423,7 @@ var/global/list/robot_modules = list( 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) + supported_upgrades = list(/obj/item/borg/upgrade/tasercooler,/obj/item/robot_parts/robot_component/jetpack) /obj/item/weapon/robot_module/security/general sprites = list( @@ -424,12 +432,12 @@ var/global/list/robot_modules = list( "Black Knight" = "securityrobot", "Bloodhound" = "bloodhound", "Bloodhound - Treaded" = "secborg+tread", - "Drone" = "drone-sec" + "Drone" = "drone-sec", + "Eyebot" = "eyebot-security" ) supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) /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) src.modules += new /obj/item/weapon/handcuffs/cyborg(src) @@ -437,8 +445,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) src.modules += new /obj/item/taperoll/police(src) src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) - - return + ..() /obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() @@ -453,17 +460,17 @@ var/global/list/robot_modules = list( B.bcell.give(amount) /obj/item/weapon/robot_module/janitor - name = "janitorial robot module" + name = "custodial robot module" channels = list("Service" = 1) sprites = list( "Basic" = "JanBot2", "Mopbot" = "janitorrobot", "Mop Gear Rex" = "mopgearrex", - "Drone" = "drone-janitor" + "Drone" = "drone-janitor", + "Eyebot" = "eyebot-janitor" ) /obj/item/weapon/robot_module/janitor/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/soap/nanotrasen(src) src.modules += new /obj/item/weapon/storage/bag/trash(src) @@ -472,7 +479,7 @@ var/global/list/robot_modules = list( src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("lube", 250) src.emag.name = "Lube spray" - return + ..() /obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() @@ -491,6 +498,7 @@ var/global/list/robot_modules = list( LANGUAGE_SIIK_MAAS = 1, LANGUAGE_SIIK_TAJR = 0, LANGUAGE_SKRELLIAN = 1, + LANGUAGE_RESOMI = 1, LANGUAGE_ROOTSONG = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_GUTTER = 1 @@ -503,11 +511,11 @@ var/global/list/robot_modules = list( "Rich" = "maximillion", "Default" = "Service2", "Drone - Service" = "drone-service", - "Drone - Hydro" = "drone-hydro" + "Drone - Hydro" = "drone-hydro", + "Eyebot" = "eyebot-standard" ) /obj/item/weapon/robot_module/clerical/butler/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/gripper/service(src) src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) @@ -531,14 +539,14 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/tray/robotray(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src) - src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) + src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) var/datum/reagents/R = new/datum/reagents(50) src.emag.reagents = R R.my_atom = src.emag R.add_reagent("beer2", 50) src.emag.name = "Mickey Finn's Special Brew" - return + ..() /obj/item/weapon/robot_module/clerical/general name = "clerical robot module" @@ -548,24 +556,25 @@ var/global/list/robot_modules = list( "Bro" = "Brobot", "Rich" = "maximillion", "Default" = "Service2", - "Drone" = "drone-service" + "Drone" = "drone-service", + "Eyebot" = "eyebot-standard" ) /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/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) - var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag + var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag B.reagents.add_reagent("beer2", 2 * amount) /obj/item/weapon/robot_module/miner @@ -576,12 +585,12 @@ var/global/list/robot_modules = list( "Basic" = "Miner_old", "Advanced Droid" = "droid-miner", "Treadhead" = "Miner", - "Drone" = "drone-miner" + "Drone" = "drone-miner", + "Eyebot" = "eyebot-miner" ) supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) /obj/item/weapon/robot_module/miner/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/material(src) src.modules += new /obj/item/weapon/wrench(src) @@ -593,18 +602,18 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/mining_scanner(src) src.modules += new /obj/item/weapon/crowbar(src) 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" + "Drone" = "drone-science", + "Eyebot" = "eyebot-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) @@ -635,7 +644,7 @@ var/global/list/robot_modules = list( N.synths = list(nanite) src.modules += N - return + ..() /obj/item/weapon/robot_module/syndicate name = "syndicate robot module" @@ -647,9 +656,12 @@ var/global/list/robot_modules = list( LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 1 ) + sprites = list( + "Dread" = "securityrobot", + ) + var/id /obj/item/weapon/robot_module/syndicate/New(var/mob/living/silicon/robot/R) - ..() loc = R src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/thermal(src) @@ -671,8 +683,13 @@ var/global/list/robot_modules = list( JC.install()//This install function will setup the actual jetpack which functions return - +/* /obj/item/weapon/robot_module/combat + src.modules -= id + id = null + return ..() +*/ +/obj/item/weapon/robot_module/security/combat name = "combat robot module" channels = list("Security" = 1) networks = list(NETWORK_SECURITY) @@ -682,7 +699,6 @@ var/global/list/robot_modules = list( supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) /obj/item/weapon/robot_module/combat/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/hud/sec(src) src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src) @@ -690,15 +706,14 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/borg/combat/shield(src) src.modules += new /obj/item/borg/combat/mobility(src) src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src) - return + ..() /obj/item/weapon/robot_module/drone name = "drone module" no_slip = 1 networks = list(NETWORK_ENGINEERING) -/obj/item/weapon/robot_module/drone/New() - ..() +/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot) src.modules += new /obj/item/weapon/weldingtool(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) @@ -709,6 +724,13 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/gripper(src) src.modules += new /obj/item/weapon/soap(src) src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) + + robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src) + src.modules += robot.internals + src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) src.emag.name = "Plasma Cutter" @@ -746,7 +768,7 @@ var/global/list/robot_modules = list( C.synths = list(wire) src.modules += C - var/obj/item/stack/tile/steel/cyborg/S = new /obj/item/stack/tile/steel/cyborg(src) + var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) S.synths = list(metal) src.modules += S @@ -766,14 +788,16 @@ var/global/list/robot_modules = list( P.synths = list(plastic) src.modules += P + ..() + /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/device/lightreplacer/LR = locate() in src.modules diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index a5c65e94109..5897fc6624f 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/robot/Process_Spaceslipping(var/prob_slip) +/mob/living/silicon/robot/slip_chance(var/prob_slip) if(module && module.no_slip) return 0 ..(prob_slip) diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm new file mode 100644 index 00000000000..af46cd6fcf5 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -0,0 +1,28 @@ +/mob/living/silicon/robot/syndicate + lawupdate = 0 + scrambledcodes = 1 + icon_state = "securityrobot" + modtype = "Security" + lawchannel = "State" + idcard_type = /obj/item/weapon/card/id/syndicate + +/mob/living/silicon/robot/syndicate/New() + if(!cell) + cell = new /obj/item/weapon/cell(src) + cell.maxcharge = 25000 + cell.charge = 25000 + + ..() + +/mob/living/silicon/robot/syndicate/init() + aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + + laws = new /datum/ai_laws/syndicate_override + overlays.Cut() + init_id() + new /obj/item/weapon/robot_module/syndicate(src) + + radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio) + radio.recalculateChannels() + + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index f67081c8e6a..8c3a3c52b36 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -20,29 +20,42 @@ var/local_transmit //If set, can only speak to others of the same type within a short range. var/sensor_mode = 0 //Determines the current HUD. - var/mob/living/cameraFollow = null var/next_alarm_notice var/list/datum/alarm/queued_alarms = new() + var/list/access_rights + var/obj/item/weapon/card/id/idcard + var/idcard_type = /obj/item/weapon/card/id/synthetic + #define SEC_HUD 1 //Security HUD mode #define MED_HUD 2 //Medical HUD mode /mob/living/silicon/New() silicon_mob_list |= src ..() + // #TODO-MERGE: Search for all isntances of Galactic Common and REPLACE THE FUCK OUT OF THEM! add_language("Ceti Basic") + init_id() + var/datum/language/L = locate(/datum/language/common) in languages default_language = L + init_subsystems() /mob/living/silicon/Destroy() silicon_mob_list -= src for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) - AH.unregister(src) + AH.unregister_alarm(src) ..() +/mob/living/silicon/proc/init_id() + if(idcard) + return + idcard = new idcard_type(src) + set_id_info(idcard) + /mob/living/silicon/proc/SetName(pickedName as text) real_name = pickedName name = real_name @@ -91,13 +104,6 @@ /mob/living/silicon/IsAdvancedToolUser() return 1 -/mob/living/silicon/blob_act() - if (src.stat != 2) - src.adjustBruteLoss(60) - src.updatehealth() - return 1 - return 0 - /mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) if(!Proj.nodamage) @@ -228,7 +234,7 @@ 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]

      " + dat += "[L.name] ([get_language_prefix()][L.key])[synth ? default_str : null]
      Speech Synthesizer: [synth ? "YES" : "NOT SUPPORTED"]
      [L.desc]

      " src << browse(dat, "window=checklanguage") return @@ -352,6 +358,11 @@ /mob/living/silicon/proc/is_malf_or_traitor() return is_traitor() || is_malf() +/mob/living/silicon/adjustEarDamage() + return + +/mob/living/silicon/setEarDamage() + return /mob/living/silicon/reset_view() ..() diff --git a/code/modules/mob/living/silicon/subystems.dm b/code/modules/mob/living/silicon/subystems.dm index 21ce3dd31f8..8f0f77a0984 100644 --- a/code/modules/mob/living/silicon/subystems.dm +++ b/code/modules/mob/living/silicon/subystems.dm @@ -1,11 +1,14 @@ /mob/living/silicon var/register_alarms = 1 - var/obj/nano_module/alarm_monitor/all/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/datum/nano_module/alarm_monitor/all/alarm_monitor + var/datum/nano_module/atmos_control/atmos_control + var/datum/nano_module/crew_monitor/crew_monitor + var/datum/nano_module/law_manager/law_manager + var/datum/nano_module/power_monitor/power_monitor + var/datum/nano_module/rcon/rcon + +/mob/living/silicon/ai + var/datum/nano_module/computer_ntnetmonitor/ntnet_monitor /mob/living/silicon var/list/silicon_subsystems = list( @@ -20,13 +23,41 @@ /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/proc/subsystem_rcon, + /mob/living/silicon/ai/proc/subsystem_ntnet_monitor ) /mob/living/silicon/robot/syndicate register_alarms = 0 silicon_subsystems = list(/mob/living/silicon/proc/subsystem_law_manager) +/mob/living/silicon/Destroy() + qdel(alarm_monitor) + alarm_monitor = null + + qdel(atmos_control) + atmos_control = null + + qdel(crew_monitor) + crew_monitor = null + + qdel(law_manager) + law_manager = null + + qdel(power_monitor) + power_monitor = null + + qdel(rcon) + rcon = null + + return ..() + +/mob/living/silicon/ai/Destroy() + qdel(ntnet_monitor) + ntnet_monitor = null + + return ..() + /mob/living/silicon/proc/init_subsystems() alarm_monitor = new(src) atmos_control = new(src) @@ -39,9 +70,13 @@ return for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) - AH.register(src, /mob/living/silicon/proc/receive_alarm) + AH.register_alarm(src, /mob/living/silicon/proc/receive_alarm) queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order +/mob/living/silicon/ai/init_subsystems() + ..() + ntnet_monitor = new(src) + /******************** * Alarm Monitor * ********************/ @@ -78,6 +113,15 @@ law_manager.ui_interact(usr, state = conscious_state) +/******************** +* NTNet Monitor * +********************/ +/mob/living/silicon/ai/proc/subsystem_ntnet_monitor() + set name = "NTNet Monitoring" + set category = "Subystems" + + ntnet_monitor.ui_interact(usr, state = conscious_state) + /******************** * Power Monitor * ********************/ diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index 3acc431a9db..d6524193e26 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -8,6 +8,7 @@ response_disarm = "prods" response_harm = "stomps on" icon_state = "brainslug" + item_state = "brainslug" icon_living = "brainslug" icon_dead = "brainslug_dead" speed = 5 @@ -173,41 +174,8 @@ //Procs for grabbing players. /mob/living/simple_animal/borer/proc/request_player() - for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "Borer")) - continue - if(O.client) - if(O.client.prefs.be_special & BE_ALIEN) - question(O.client) - -/mob/living/simple_animal/borer/proc/question(var/client/C) - spawn(0) - if(!C) return - var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round") - if(!C || ckey) - return - if(response == "Yes") - transfer_personality(C) - else if (response == "Never for this round") - C.prefs.be_special ^= BE_ALIEN - -/mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate) - - if(!candidate || !candidate.mob || !candidate.mob.mind) - return - - src.mind = candidate.mob.mind - candidate.mob.mind.current = src - src.ckey = candidate.ckey - - if(src.mind) - src.mind.assigned_role = "Cortical Borer" - src.mind.special_role = "Cortical Borer" - - src << "You are a cortical borer! You are a brain slug that worms its way \ - into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, \ - your host and your eventual spawn safe and warm." - src << "You can speak to your victim with say, to other borers with say :x, and use your Abilities tab to access powers." + var/datum/ghosttrap/G = get_ghost_trap("cortical borer") + G.request_player(src, "A cortical borer needs a player.") /mob/living/simple_animal/borer/cannot_use_vents() - return \ No newline at end of file + return diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index 0e2f420e02b..c7638a0b03d 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -27,7 +27,8 @@ show_stat_health = 1 faction = "cult" supernatural = 1 - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_NOLIGHTING var/nullblock = 0 mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY @@ -59,7 +60,7 @@ if(istype(user, /mob/living/simple_animal/construct/builder)) if(getBruteLoss() > 0) adjustBruteLoss(-5) - user.visible_message("\The [user]
      mends some of \the [src]'s wounds.
      ") + user.visible_message("\The [user] mends some of \the [src]'s wounds.") else if (health < maxHealth) user << "Healing \the [src] any further is beyond your abilities." @@ -101,7 +102,7 @@ melee_damage_lower = 30 melee_damage_upper = 30 attacktext = "smashed their armoured gauntlet into" - mob_size = 20 + mob_size = MOB_LARGE speed = 3 environment_smash = 2 attack_sound = 'sound/weapons/heavysmash.ogg' diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 7e182c6f09d..b03fe79b143 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -9,7 +9,7 @@ desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefacts power." w_class = 2 slot_flags = SLOT_BELT - origin_tech = "bluespace=4;materials=4" + origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 4) var/imprinted = "empty" //////////////////////////////Capturing//////////////////////////////////////////////////////// diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 3b5fd2d9fbf..22ec87fc34e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -3,6 +3,7 @@ name = "cat" desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers." icon_state = "cat2" + item_state = "cat2" icon_living = "cat2" icon_dead = "cat2_dead" speak = list("Meow!","Esp!","Purr!","HSSSSS") @@ -29,6 +30,7 @@ var/mob/living/simple_animal/mouse/mousetarget = null seek_speed = 5 pass_flags = PASSTABLE + possession_candidate = 1 /mob/living/simple_animal/cat/Life() //MICE! @@ -235,6 +237,7 @@ desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally." gender = FEMALE icon_state = "cat" + item_state = "cat" icon_living = "cat" icon_dead = "cat_dead" befriend_job = "Chief Medical Officer" @@ -248,6 +251,7 @@ name = "kitten" desc = "D'aaawwww" icon_state = "kitten" + item_state = "kitten" icon_living = "kitten" icon_dead = "kitten_dead" gender = NEUTER @@ -262,6 +266,7 @@ desc = "That's Bones the cat. He's a laid back, black cat. Meow." gender = MALE icon_state = "cat3" + item_state = "cat3" icon_living = "cat3" icon_dead = "cat3_dead" var/friend_name = "Erstatz Vryroxes" diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index e9823dc7850..e37ab9450d3 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -22,10 +22,10 @@ max_nutrition = 250//Dogs are insatiable eating monsters. This scales with their mob size too stomach_size_mult = 30 seek_speed = 6 + possession_candidate = 1 var/obj/item/inventory_head var/obj/item/inventory_back - var/facehugger /mob/living/simple_animal/corgi/New() ..() @@ -103,13 +103,6 @@ var/icon/back_icon = image('icons/mob/corgi_back.dmi',back_icon_state) if(back_icon) overlays += back_icon - - if(facehugger) - if(istype(src, /mob/living/simple_animal/corgi/puppy)) - overlays += image('icons/mob/mask.dmi',"facehugger_corgipuppy") - else - overlays += image('icons/mob/mask.dmi',"facehugger_corgi") - return diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 76cacd0ae4c..6f8fa4fae97 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -5,7 +5,7 @@ icon_state = "crab" icon_living = "crab" icon_dead = "crab_dead" - small = 1 + mob_size = MOB_SMALL speak_emote = list("clicks") emote_hear = list("clicks") emote_see = list("clacks") @@ -21,6 +21,7 @@ hunger_enabled = 0 var/obj/item/inventory_head var/obj/item/inventory_mask + possession_candidate = 1 /mob/living/simple_animal/crab/Life() ..() 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 35df6be047f..3a4a2bf2f43 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -174,7 +174,6 @@ maxHealth = 1 var/amount_grown = 0 pass_flags = PASSTABLE | PASSGRILLE - small = 1 holder_type = /obj/item/weapon/holder/chick autoseek_food = 0 beg_for_food = 0 @@ -225,7 +224,6 @@ var/global/chicken_count = 0 var/eggsleft = 0 var/body_color pass_flags = PASSTABLE - small = 1 holder_type = /obj/item/weapon/holder/chicken density = 0 mob_size = 2 @@ -240,12 +238,13 @@ var/global/chicken_count = 0 pixel_x = rand(-6, 6) pixel_y = rand(0, 10) chicken_count += 1 - if (body_color == "brown") - holder_type = /obj/item/weapon/holder/chicken/brown - if (body_color == "black") - holder_type = /obj/item/weapon/holder/chicken/black - if (body_color == "white") - holder_type = /obj/item/weapon/holder/chicken/white + switch (body_color) + if ("brown") + holder_type = /obj/item/weapon/holder/chicken/brown + if ("black") + holder_type = /obj/item/weapon/holder/chicken/black + if ("white") + holder_type = /obj/item/weapon/holder/chicken/white /mob/living/simple_animal/chicken/death() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 717d7cae9e8..0a57f51ed17 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -5,7 +5,6 @@ icon_state = "lizard" icon_living = "lizard" icon_dead = "lizard-dead" - small = 1 speak_emote = list("hisses") health = 5 maxHealth = 5 @@ -15,7 +14,8 @@ response_help = "pets" response_disarm = "shoos" response_harm = "stomps on" - mob_size = 1 + mob_size = MOB_MINISCULE + possession_candidate = 1 holder_type = /obj/item/weapon/holder/lizard density = 0 seek_speed = 0.75 @@ -34,4 +34,4 @@ /mob/living/simple_animal/lizard/death() .=..() - desc = "It doesn't hiss anymore." \ No newline at end of file + desc = "It doesn't hiss anymore." diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 07e3f9a7894..c0846bb3f1c 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -4,6 +4,7 @@ desc = "It's a small rodent." icon = 'icons/mob/mouse.dmi' icon_state = "mouse_gray" + item_state = "mouse_gray" icon_living = "mouse_gray" icon_dead = "mouse_gray_dead" speak = list("Squeek!","SQUEEK!","Squeek?") @@ -20,7 +21,6 @@ var/last_squealgain = 0// #TODO-FUTURE: Remove from life() once something else is created pass_flags = PASSTABLE - small = 1 speak_chance = 5 turns_per_move = 5 see_in_dark = 6 @@ -39,13 +39,15 @@ maxbodytemp = 323 //Above 50 Degrees Celcius universal_speak = 0 universal_understand = 1 - mob_size = 1 holder_type = /obj/item/weapon/holder/mouse digest_factor = 0.05 min_scan_interval = 2 max_scan_interval = 20 seek_speed = 1 + can_pull_size = 1 + can_pull_mobs = MOB_PULL_NONE + /mob/living/simple_animal/mouse/Life() ..() @@ -95,6 +97,7 @@ if(!body_color) body_color = pick( list("brown","gray","white") ) icon_state = "mouse_[body_color]" + item_state = "mouse_[body_color]" icon_living = "mouse_[body_color]" icon_dead = "mouse_[body_color]_dead" desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." @@ -125,16 +128,22 @@ /mob/living/simple_animal/mouse/proc/splat() src.health = 0 - src.stat = DEAD + src.death() src.icon_dead = "mouse_[body_color]_splat" src.icon_state = "mouse_[body_color]_splat" - layer = MOB_LAYER if(client) client.time_died_as_mouse = world.time -/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things - src << "You are too small to pull anything." - return +/mob/living/simple_animal/mouse/MouseDrop(atom/over_object) + + var/mob/living/carbon/H = over_object + if(!istype(H) || !Adjacent(H)) return ..() + + if(H.a_intent == "help") + get_scooped(H) + return + else + return ..() @@ -209,7 +218,7 @@ if(client) client.time_died_as_mouse = world.time - .=..() + ..() /mob/living/simple_animal/mouse/lay_down() set name = "Rest" diff --git a/code/modules/mob/living/simple_animal/friendly/mushroom.dm b/code/modules/mob/living/simple_animal/friendly/mushroom.dm index 6430767d6af..3d2c7f7254b 100644 --- a/code/modules/mob/living/simple_animal/friendly/mushroom.dm +++ b/code/modules/mob/living/simple_animal/friendly/mushroom.dm @@ -6,7 +6,7 @@ icon_state = "mushroom" icon_living = "mushroom" icon_dead = "mushroom_dead" - small = 1 + mob_size = MOB_SMALL speak_chance = 0 turns_per_move = 1 maxHealth = 5 diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index 86fc135330b..2aa9f5c6499 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -16,6 +16,11 @@ mob_size = 3 composition_reagent = "slimejelly" +/mob/living/simple_animal/slime/can_force_feed(var/feeder, var/food, var/feedback) + if(feedback) + feeder << "Where do you intend to put \the [food]? \The [src] doesn't have a mouth!" + return 0 + /mob/living/simple_animal/adultslime name = "pet slime" desc = "A lovable, domesticated slime." diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index f65d471bcb3..55b7c66e4c5 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -5,7 +5,7 @@ max_co2 = 0 minbodytemp = 0 maxbodytemp = 500 - mob_size = 5 + mob_size = MOB_SMALL var/obj/item/device/radio/borg/radio = null var/mob/living/silicon/ai/connected_ai = null @@ -40,7 +40,6 @@ var/obj/item/held_item = null //Storage for single item they can hold. speed = -1 //Spiderbots gotta go fast. pass_flags = PASSTABLE | PASSDOORHATCH - small = 1 speak_emote = list("beeps","clicks","chirps") /mob/living/simple_animal/spiderbot/New() @@ -130,28 +129,19 @@ else user << "You swipe your card with no effect." return 0 - else if (istype(O, /obj/item/weapon/card/emag)) - if (emagged) - user << "\The [src] is already overloaded - better run!" - return 0 - else - var/obj/item/weapon/card/emag/emag = O - emag.uses-- - emagged = 1 - user << "You short out the security protocols and overload \the [src]'s cell, priming it to explode in a short time." - spawn(0) - sleep(100) - if(!src) return - src << "Your cell seems to be outputting a lot of power..." - sleep(200) - if(!src) return - src << "Internal heat sensors are spiking! Something is badly wrong with your cell!" - sleep(300) - if(!src) return - src.explode() - return + else - attacked_with_item(O, user) + O.attack(src, user, user.zone_sel.selecting) + +/mob/living/simple_animal/spiderbot/emag_act(var/remaining_charges, var/mob/user) + if (emagged) + user << "[src] is already overloaded - better run." + return 0 + else + user << "You short out the security protocols and overload [src]'s cell, priming it to explode in a short time." + spawn(100) src << "Your cell seems to be outputting a lot of power..." + spawn(200) src << "Internal heat sensors are spiking! Something is badly wrong with your cell!" + spawn(300) src.explode() /mob/living/simple_animal/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj) @@ -311,4 +301,4 @@ if (!underdoor) spawn(3)//A slight delay to let us finish walking out from under the door - layer = initial(layer) \ No newline at end of file + layer = initial(layer) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 5485b27d416..3308e635310 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -139,7 +139,6 @@ emote_see = list("sniffs the air cautiously","looks around") emote_hear = list("snuffles") pass_flags = PASSTABLE - small = 1 density = 0 mob_size = 3 @@ -172,7 +171,6 @@ icon_dead = "yithian_dead" icon = 'icons/jungle.dmi' pass_flags = PASSTABLE - small = 1 density = 0 mob_size = 2 @@ -184,6 +182,5 @@ icon_dead = "tindalos_dead" icon = 'icons/jungle.dmi' pass_flags = PASSTABLE - small = 1 density = 0 - mob_size = 1.5 \ No newline at end of file + mob_size = 1.5 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index f5f005be2ef..3eeb8cb1a23 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -64,16 +64,30 @@ poison_per_bite = 5 move_to_delay = 4 -/mob/living/simple_animal/hostile/giant_spider/AttackingTarget() +/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent) + get_light_and_color(parent) ..() - if(isliving(target_mob)) - var/mob/living/L = target_mob + +/mob/living/simple_animal/hostile/giant_spider/AttackingTarget() + var/target = ..() + if(isliving(target)) + var/mob/living/L = target if(L.reagents) L.reagents.add_reagent("toxin", poison_per_bite) if(prob(poison_per_bite)) L << "\red You feel a tiny prick." L.reagents.add_reagent(poison_type, 5) +/mob/living/simple_animal/hostile/giant_spider/nurse/AttackingTarget() + var/target = ..() + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(prob(poison_per_bite)) + var/obj/item/organ/external/O = pick(H.organs) + if(!(O.status & ORGAN_ROBOT)) + var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/, list(O, src)) + O.implants += eggs + /mob/living/simple_animal/hostile/giant_spider/Life() ..() if(!stat) @@ -118,7 +132,7 @@ var/obj/effect/spider/stickyweb/W = locate() in get_turf(src) if(!W) busy = SPINNING_WEB - src.visible_message("\blue \the [src] begins to secrete a sticky substance.") + src.visible_message("\The [src] begins to secrete a sticky substance.") stop_automated_movement = 1 spawn(40) if(busy == SPINNING_WEB) @@ -130,13 +144,13 @@ var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) if(!E && fed > 0) busy = LAYING_EGGS - src.visible_message("\blue \the [src] begins to lay a cluster of eggs.") + src.visible_message("\The [src] begins to lay a cluster of eggs.") stop_automated_movement = 1 spawn(50) if(busy == LAYING_EGGS) E = locate() in get_turf(src) if(!E) - new /obj/effect/spider/eggcluster(src.loc) + PoolOrNew(/obj/effect/spider/eggcluster, list(loc, src)) fed-- busy = 0 stop_automated_movement = 0 @@ -158,7 +172,7 @@ else if(busy == MOVING_TO_TARGET && cocoon_target) if(get_dist(src, cocoon_target) <= 1) busy = SPINNING_COCOON - src.visible_message("\blue \the [src] begins to secrete a sticky substance around \the [cocoon_target].") + src.visible_message("\The [src] begins to secrete a sticky substance around \the [cocoon_target].") stop_automated_movement = 1 walk(src,0) spawn(50) @@ -173,7 +187,7 @@ continue large_cocoon = 1 fed++ - src.visible_message("\red \the [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.") + src.visible_message("\The [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.") M.loc = C C.pixel_x = M.pixel_x C.pixel_y = M.pixel_y @@ -200,4 +214,4 @@ #undef SPINNING_WEB #undef LAYING_EGGS #undef MOVING_TO_TARGET -#undef SPINNING_COCOON \ No newline at end of file +#undef SPINNING_COCOON diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index d3f7cb29b27..6d8dc6f7d8c 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -13,6 +13,7 @@ var/break_stuff_probability = 10 stop_automated_movement_when_pulled = 0 var/destroy_surroundings = 1 + a_intent = I_HURT hunger_enabled = 0//Until automated eating mechanics are enabled, disable hunger for hostile mobs var/shuttletarget = null var/enroute = 0 @@ -194,12 +195,9 @@ var/obj/item/projectile/A = new projectiletype(user:loc) playsound(user, projectilesound, 100, 1) if(!A) return - var/def_zone = get_exposed_defense_zone(target) A.launch(target, def_zone) - return - /mob/living/simple_animal/hostile/proc/DestroySurroundings() if(prob(break_stuff_probability)) for(var/dir in cardinal) // North, South, East, West 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 869bf93b8e6..24fb12633fc 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -214,7 +214,7 @@ //spawn 1-4 boards of a random type var/spawnees = 0 var/num_boards = rand(1,4) - var/list/options = list(1,2,4,8,16,32,64,128,256, 512) + var/list/options = list(1,2,4,8,16,32,64,128,256,512) for(var/i=0, i max_nutrition * 0.9) return 0//full @@ -398,7 +398,6 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) //TODO: refactor mob attackby(), attacked_by(), and friends. /mob/living/simple_animal/proc/attacked_with_item(var/obj/item/O, var/mob/user) - user.changeNext_move(8) if(!O.force) visible_message("[user] gently taps [src] with \the [O].") return @@ -481,14 +480,6 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) return (0) return 1 -//Call when target overlay should be added/removed -/mob/living/simple_animal/update_targeted() - if(!targeted_by && target_locked) - qdel(target_locked) - overlays = null - if (targeted_by && target_locked) - overlays += target_locked - /mob/living/simple_animal/say(var/message) var/verb = "says" if(speak_emote.len) @@ -512,7 +503,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) for(var/i=0;i[user] chops up \the [src]!
      ") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) qdel(src) @@ -605,4 +596,14 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) get_scooped(H, usr) return - return ..() \ No newline at end of file + return ..() + + +/mob/living/simple_animal/handle_fire() + return +/mob/living/simple_animal/update_fire() + return +/mob/living/simple_animal/IgniteMob() + return +/mob/living/simple_animal/ExtinguishMob() + return diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index f1bb76c85d7..7658f28ce1e 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -17,10 +17,10 @@ spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!") if(matches) if(M.client) - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") else - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") /mob/Login() diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index 71ccf5a52b7..e7e845bc40e 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -19,5 +19,4 @@ else if ((admins_number - admins_number_afk) <= 0) discord_bot.send_to_admins("[key_name(src)] logged out - only AFK admins ([admins_number_afk]) are online.") ..() - return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 17456c9e9db..95002223f49 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -51,7 +51,6 @@ pain = null item_use_icon = null gun_move_icon = null - gun_run_icon = null gun_setting_icon = null spell_masters = null zone_sel = null @@ -90,7 +89,7 @@ src << msg return -// Show a message to all mobs in sight of this one +// Show a message to all mobs and objects in sight of this one // This would be for visible actions by the src mob // message is the message output to anyone who can see e.g. "[src] does something!" // self_message (optional) is what the src mob sees e.g. "You do something!" @@ -114,9 +113,6 @@ else if(M.see_invisible < invisibility) // Cannot view the invisible, but you can hear it. if(blind_message) M.show_message(blind_message, 2) - else - M.show_message(message, 1, blind_message, 2) - // Designed for mobs contained inside things, where a normal visible message wont actually be visible // Useful for visible actions by pAIs, and held mobs @@ -140,27 +136,25 @@ if (!self_served) src.show_message(self_message, 1, blind_message, 2) - - - +// #TODO-MERGE: Check visible_message original define. // Show a message to all mobs in sight of this atom // Use for objects performing visible actions // message is output to anyone who can see, e.g. "The [src] does something!" // blind_message (optional) is what blind people will hear e.g. "You hear something!" -/atom/proc/visible_message(var/message, var/blind_message) - var/list/messageturfs = list()//List of turfs we broadcast to. - var/list/messagemobs = list()//List of living mobs nearby who can hear it, and distant ghosts who've chosen to hear it - for (var/turf in view(world.view, get_turf(src))) - messageturfs += turf - - for(var/mob/M in player_list) - if (!M.client || istype(M, /mob/new_player)) - continue - if(get_turf(M) in messageturfs) - messagemobs += M - - for(var/mob/M in messagemobs) - M.show_message( message, 1, blind_message, 2) +// /atom/proc/visible_message(var/message, var/blind_message) +// var/list/messageturfs = list()//List of turfs we broadcast to. +// var/list/messagemobs = list()//List of living mobs nearby who can hear it, and distant ghosts who've chosen to hear it +// for (var/turf in view(world.view, get_turf(src))) +// messageturfs += turf +// +// for(var/mob/M in player_list) +// if (!M.client || istype(M, /mob/new_player)) +// continue +// if(get_turf(M) in messageturfs) +// messagemobs += M +// +// for(var/mob/M in messagemobs) +// M.show_message( message, 1, blind_message, 2) // Returns an amount of power drawn from the object (-1 if it's not viable). @@ -170,33 +164,31 @@ /atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0) return -1 -// Show a message to all mobs in earshot of this one +// Show a message to all mobs and objects in earshot of this one // This would be for audible actions by the src mob // message is the message output to anyone who can hear. // self_message (optional) is what the src mob hears. // deaf_message (optional) is what deaf people will see. // hearing_distance (optional) is the range, how many tiles away the message can be heard. /mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message) - var/range = 7 - if(hearing_distance) - range = hearing_distance - var/msg = message - for(var/mob/M in get_mobs_in_view(range, src)) - if(self_message && M==src) - msg = self_message - M.show_message( msg, 2, deaf_message, 1) -// Show a message to all mobs in earshot of this atom -// Use for objects performing audible actions -// message is the message output to anyone who can hear. -// deaf_message (optional) is what deaf people will see. -// hearing_distance (optional) is the range, how many tiles away the message can be heard. -/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance) - var/range = 7 + var/range = world.view if(hearing_distance) range = hearing_distance - for(var/mob/M in get_mobs_in_view(range, src)) - M.show_message( message, 2, deaf_message, 1) + var/list/hear = get_mobs_or_objects_in_view(range,src) + + for(var/I in hear) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 2, deaf_message, 1) + else if(ismob(I)) + var/mob/M = I + var/msg = message + if(self_message && M==src) + msg = self_message + M.show_message( msg, 2, deaf_message, 1) /mob/proc/findname(msg) @@ -214,6 +206,38 @@ //handle_typing_indicator() //You said the typing indicator would be fine. The test determined that was a lie. return +#define UNBUCKLED 0 +#define PARTIALLY_BUCKLED 1 +#define FULLY_BUCKLED 2 +/mob/proc/buckled() + // Preliminary work for a future buckle rewrite, + // where one might be fully restrained (like an elecrical chair), or merely secured (shuttle chair, keeping you safe but not otherwise restrained from acting) + if(!buckled) + return UNBUCKLED + return restrained() ? FULLY_BUCKLED : PARTIALLY_BUCKLED + +/mob/proc/is_physically_disabled() + return incapacitated(INCAPACITATION_DISABLED) + +/mob/proc/incapacitated(var/incapacitation_flags = INCAPACITATION_DEFAULT) + if ((incapacitation_flags & INCAPACITATION_DISABLED) && (stat || paralysis || stunned || weakened || resting || sleeping || (status_flags & FAKEDEATH))) + return 1 + + if((incapacitation_flags & INCAPACITATION_RESTRAINED) && restrained()) + return 1 + + if((incapacitation_flags & (INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY))) + var/buckling = buckled() + if(buckling >= PARTIALLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_PARTIALLY)) + return 1 + if(buckling == FULLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_FULLY)) + return 1 + + return 0 + +#undef UNBUCKLED +#undef PARTIALLY_BUCKLED +#undef FULLY_BUCKLED /mob/proc/restrained() return @@ -232,8 +256,23 @@ client.eye = loc return -// This is not needed short of simple_animal and carbon/alien / carbon/human, who reimplement it. + /mob/proc/show_inv(mob/user as mob) + user.set_machine(src) + var/dat = {" +
      [name]
      +

      +
      Head(Mask): [(wear_mask ? wear_mask : "Nothing")] +
      Left Hand: [(l_hand ? l_hand : "Nothing")] +
      Right Hand: [(r_hand ? r_hand : "Nothing")] +
      Back: [(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")] +
      [(internal ? text("Remove Internal") : "")] +
      Empty Pockets +
      Refresh +
      Close +
      "} + user << browse(dat, text("window=mob[];size=325x500", name)) + onclose(user, "mob[name]") return //mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine() @@ -326,8 +365,6 @@ if (W) W.attack_self(src) update_inv_r_hand() - if(next_move < world.time) - next_move = world.time + 2 return /* @@ -413,33 +450,20 @@ if (!( config.abandon_allowed )) usr << "Respawn is disabled." return - if ((stat != 2 || !( ticker ))) + if ((stat != DEAD || !( ticker ))) usr << "You must be dead to use this!" return if (ticker.mode.deny_respawn) //BS12 EDIT usr << "Respawn is disabled for this roundtype." return - else + else if(!MayRespawn(1, config.respawn_delay)) + return - 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." - return - - var/deathtime = world.time - get_death_time(CREW)//get/set death_time functions are in mob_helpers.dm - if (deathtime < RESPAWN_CREW) - var/timedifference_text = time2text(RESPAWN_CREW - deathtime,"mm:ss") - var/basetime = time2text(RESPAWN_CREW,"mm:ss") - usr << "You may only respawn than [basetime] minutes after your death. You have [timedifference_text] left." - - return - else - usr << "You can respawn now, enjoy your new life!" + usr << "You can respawn now, enjoy your new life!" log_game("[usr.name]/[usr.key] used abandon mob.") - usr << "\blue Make sure to play a different character, and please roleplay correctly!" + usr << "Make sure to play a different character, and please roleplay correctly!" if(!client) log_game("[usr.key] AM failed due to disconnect.") @@ -488,7 +512,7 @@ src << browse('html/changelog.html', "window=changes;size=675x650") if(prefs.lastchangelog != changelog_hash) prefs.lastchangelog = changelog_hash - prefs.handle_preferences_save(src) + prefs.save_preferences() winset(src, "rpane.changelog", "background-color=none;font-style=;") /mob/verb/observe() @@ -628,24 +652,44 @@ pullin.icon_state = "pull0" /mob/proc/start_pulling(var/atom/movable/AM) + if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! return if (AM.anchored) - usr << "It won't budge!" + src << "It won't budge!" return - var/mob/living/M - if(istype(AM, /mob/living)) - M = AM - if (!M.attempt_pull(src)) + var/mob/M = AM + if(ismob(AM)) + + if(!can_pull_mobs || !can_pull_size) + src << "It won't budge!" return + if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER)) + src << "It won't budge!" + return + + if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER)) + src << "It won't budge!" + return + + // If your size is larger than theirs and you have some + // kind of mob pull value AT ALL, you will be able to pull + // them, so don't bother checking that explicitly. + if(!iscarbon(src)) M.LAssailant = null else M.LAssailant = usr + else if(isobj(AM)) + var/obj/I = AM + if(!can_pull_size || can_pull_size < I.w_class) + src << "It won't budge!" + return + if(pulling) var/pulling_old = pulling stop_pulling() @@ -740,48 +784,60 @@ if(!canmove) return 0 if(stat) return 0 if(anchored) return 0 - if(monkeyizing) return 0 + if(transforming) return 0 return 1 +// Not sure what to call this. Used to check if humans are wearing an AI-controlled exosuit and hence don't need to fall over yet. +/mob/proc/can_stand_overridden() + return 0 + +/mob/proc/cannot_stand() + return incapacitated(INCAPACITATION_DEFAULT & (~INCAPACITATION_RESTRAINED)) + //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. /mob/proc/update_canmove() - if(istype(buckled, /obj/vehicle)) - var/obj/vehicle/V = buckled - if(stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH)) - lying = 1 - canmove = 0 - pixel_y = V.mob_offset_y - 5 - else - if(buckled.buckle_lying != -1) lying = buckled.buckle_lying - canmove = 1 - pixel_y = V.mob_offset_y - else if(buckled) - anchored = 1 - canmove = 0 - if(istype(buckled)) - if(buckled.buckle_lying != -1) - lying = buckled.buckle_lying - if(buckled.buckle_movable) - anchored = 0 - canmove = 1 - else if( stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH)) - lying = 1 - canmove = 0 - else if(stunned) - canmove = 0 - else if(captured) - anchored = 1 - canmove = 0 - lying = 0 - else + if(!resting && cannot_stand() && can_stand_overridden()) lying = 0 canmove = 1 + else + if(istype(buckled, /obj/vehicle)) + var/obj/vehicle/V = buckled + if(is_physically_disabled()) + lying = 1 + canmove = 0 + pixel_y = V.mob_offset_y - 5 + else + if(buckled.buckle_lying != -1) lying = buckled.buckle_lying + canmove = 1 + pixel_y = V.mob_offset_y + else if(buckled) + anchored = 1 + canmove = 0 + if(istype(buckled)) + if(buckled.buckle_lying != -1) + lying = buckled.buckle_lying + if(buckled.buckle_movable) + anchored = 0 + canmove = 1 + + else if(cannot_stand()) + lying = 1 + canmove = 0 + else if(stunned) + canmove = 0 + else if(captured) + anchored = 1 + canmove = 0 + lying = 0 + else + lying = 0 + canmove = 1 if(lying) density = 0 - drop_l_hand() - drop_r_hand() + if(l_hand) unEquip(l_hand) + if(r_hand) unEquip(r_hand) else density = initial(density) @@ -815,22 +871,22 @@ /mob/verb/eastface() set hidden = 1 - return facedir(EAST) + return facedir(client.client_dir(EAST)) /mob/verb/westface() set hidden = 1 - return facedir(WEST) + return facedir(client.client_dir(WEST)) /mob/verb/northface() set hidden = 1 - return facedir(NORTH) + return facedir(client.client_dir(NORTH)) /mob/verb/southface() set hidden = 1 - return facedir(SOUTH) + return facedir(client.client_dir(SOUTH)) //This might need a rename but it should replace the can this mob use things check @@ -936,9 +992,9 @@ mob/proc/yank_out_object() set desc = "Remove an embedded item at the cost of bleeding and pain." set src in view(1) - if(!isliving(usr) || usr.next_move > world.time) + if(!isliving(usr) || !usr.canClick()) return - usr.next_move = world.time + 20 + usr.setClickCooldown(20) if(usr.stat == 1) usr << "You are unconscious and cannot do that!" @@ -1006,6 +1062,12 @@ mob/proc/yank_out_object() var/mob/living/carbon/human/human_user = U human_user.bloody_hands(H) + else if(issilicon(src)) + var/mob/living/silicon/robot/R = src + R.embedded -= selection + R.adjustBruteLoss(5) + R.adjustFireLoss(10) + selection.forceMove(get_turf(src)) if(!(U.l_hand && U.r_hand)) U.put_in_hands(selection) @@ -1113,19 +1175,25 @@ mob/proc/yank_out_object() /mob/verb/northfaceperm() set hidden = 1 - set_face_dir(NORTH) + set_face_dir(client.client_dir(NORTH)) /mob/verb/southfaceperm() set hidden = 1 - set_face_dir(SOUTH) + set_face_dir(client.client_dir(SOUTH)) /mob/verb/eastfaceperm() set hidden = 1 - set_face_dir(EAST) + set_face_dir(client.client_dir(EAST)) /mob/verb/westfaceperm() set hidden = 1 - set_face_dir(WEST) + set_face_dir(client.client_dir(WEST)) + +/mob/proc/adjustEarDamage() + return + +/mob/proc/setEarDamage() + return //Throwing stuff diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2aff2a8a4ae..118a98ca3e4 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -2,7 +2,7 @@ density = 1 layer = 4.0 animate_movement = 2 -// flags = NOREACT + flags = PROXMOVE var/datum/mind/mind var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak @@ -57,7 +57,7 @@ var/disabilities = 0 //Carbon var/atom/movable/pulling = null var/next_move = null - var/monkeyizing = null //Carbon + var/transforming = null //Carbon var/other = 0.0 var/hand = null var/eye_blind = null //Carbon @@ -90,7 +90,6 @@ var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas. var/lastpuke = 0 var/unacidable = 0 - var/small = 0 var/list/pinned = list() // List of things pinning this creature to walls (see living_defense.dm) var/list/embedded = list() // Embedded items, since simple mobs don't have organs. var/list/languages = list() // For speaking/listening. @@ -152,6 +151,8 @@ var/const/deafness = 2//Carbon var/const/muteness = 4//Carbon + var/can_pull_size = 10 // Maximum w_class the mob can pull. + var/can_pull_mobs = MOB_PULL_LARGER // Whether or not the mob can pull other mobs. var/datum/dna/dna = null//Carbon var/radiation = 0.0//Carbon @@ -224,3 +225,4 @@ var/list/shouldnt_see = list() //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes var/list/active_genes=list() + var/mob_size = MOB_MEDIUM diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index a27607da1a8..391e199acd4 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -227,7 +227,7 @@ return if(state == GRAB_UPGRADING) return - if(assailant.next_move > world.time) + if(!assailant.canClick()) return if(world.time < (last_action + UPGRADE_COOLDOWN)) return @@ -265,7 +265,7 @@ hud.name = "kill" affecting.Stun(10) //10 ticks of ensured grab else if(state < GRAB_UPGRADING) - assailant.visible_message("[assailant] starts to tighten \his grip on [affecting]'s neck!") + assailant.visible_message("[assailant] starts to tighten \his grip on [affecting]'s neck!") hud.icon_state = "kill1" state = GRAB_KILL @@ -274,10 +274,10 @@ assailant.attack_log += "\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey])" msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]") - assailant.next_move = world.time + 10 + affecting.setClickCooldown(10) affecting.losebreath += 1 affecting.set_dir(WEST) - adjust_position() + adjust_position() //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() diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index 2bef43250d2..5e66345e2db 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -68,7 +68,7 @@ attacker << "You require a better grab to do this." return for(var/obj/item/protection in list(target.head, target.wear_mask, target.glasses)) - if(protection && (protection.flags & HEADCOVERSEYES)) + if(protection && (protection.body_parts_covered & EYES)) attacker << "You're going to need to remove the eye covering first." return if(!target.has_eyes()) @@ -91,15 +91,15 @@ var/damage = 20 var/obj/item/clothing/hat = attacker.head if(istype(hat)) - damage += hat.force * 10 + damage += hat.force * 3 var/armor = target.run_armor_check("head", "melee") - target.apply_damage(damage*rand(90, 110)/100, BRUTE, "head", armor) - attacker.apply_damage(10*rand(90, 110)/100, BRUTE, "head", attacker.run_armor_check("head", "melee")) + target.apply_damage(damage, BRUTE, "head", armor) + attacker.apply_damage(10, BRUTE, "head", attacker.run_armor_check("head", "melee")) - if(!armor && prob(damage)) + if(!armor && target.headcheck("head") && prob(damage)) target.apply_effect(20, PARALYZE) - target.visible_message("[target] has been knocked unconscious!") + target.visible_message("[target] [target.species.knockout_message]") playsound(attacker.loc, "swing_hit", 25, 1, -1) attacker.attack_log += text("\[[time_stamp()]\] Headbutted [target.name] ([target.ckey])") diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 222be7ba558..170ddc67f69 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -1,9 +1,36 @@ // fun if you want to typecast humans/monkeys/etc without writing long path-filled lines. -/proc/ishuman(A) +/proc/isxenomorph(A) if(istype(A, /mob/living/carbon/human)) - return 1 + var/mob/living/carbon/human/H = A + return istype(H.species, /datum/species/xenos) return 0 +/proc/issmall(A) + if(A && istype(A, /mob/living)) + var/mob/living/L = A + return L.mob_size <= MOB_SMALL + return 0 + +/mob/living/proc/isSynthetic() + return 0 + +/mob/living/carbon/human/isSynthetic() + // If they are 100% robotic, they count as synthetic. + for(var/obj/item/organ/external/E in organs) + if(!(E.status & ORGAN_ROBOT)) + return 0 + return 1 + +/mob/living/silicon/isSynthetic() + return 1 + +/mob/proc/isMonkey() + return 0 + +/mob/living/carbon/human/isMonkey() + return istype(species, /datum/species/monkey) + + /proc/ishuman_species(A) if(istype(A, /mob/living/carbon/human) && (A:get_species() == "Human")) return 1 @@ -39,113 +66,7 @@ return 1 return 0 -/proc/isalien(A) - if(istype(A, /mob/living/carbon/alien)) - return 1 - return 0 -/proc/isxenomorph(A) - if(istype(A, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = A - return istype(H.species, /datum/species/xenos) - return 0 - -/proc/issmall(A) - if(A && istype(A, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = A - if(H.species && H.species.is_small) - return 1 - return 0 - -/proc/isbrain(A) - if(A && istype(A, /mob/living/carbon/brain)) - return 1 - return 0 - -/proc/isslime(A) - if(istype(A, /mob/living/carbon/slime)) - return 1 - return 0 - -/proc/isrobot(A) - if(istype(A, /mob/living/silicon/robot)) - return 1 - return 0 - -/proc/isanimal(A) - if(istype(A, /mob/living/simple_animal)) - return 1 - return 0 - -/proc/iscorgi(A) - if(istype(A, /mob/living/simple_animal/corgi)) - return 1 - return 0 - -/proc/iscrab(A) - if(istype(A, /mob/living/simple_animal/crab)) - return 1 - return 0 - -/proc/iscat(A) - if(istype(A, /mob/living/simple_animal/cat)) - return 1 - return 0 - -/proc/ismouse(A) - if(istype(A, /mob/living/simple_animal/mouse)) - return 1 - return 0 - -/proc/isbear(A) - if(istype(A, /mob/living/simple_animal/hostile/bear)) - return 1 - return 0 - -/proc/iscarp(A) - if(istype(A, /mob/living/simple_animal/hostile/carp)) - return 1 - return 0 - -/proc/isclown(A) - if(istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) - return 1 - return 0 - -/mob/proc/isSilicon() - return 0 - -/mob/living/silicon/isSilicon() - return 1 - -/proc/isAI(A) - if(istype(A, /mob/living/silicon/ai)) - return 1 - return 0 - -/mob/proc/isMobAI() - return 0 - -/mob/living/silicon/ai/isMobAI() - return 1 - -/mob/proc/isSynthetic() - return 0 - -/mob/living/carbon/human/isSynthetic() - return species.flags & IS_SYNTHETIC - -/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) /mob/proc/is_diona() //returns which type of diona we are, or zero @@ -158,52 +79,12 @@ return DIONA_NYMPH return 0 -/proc/ispAI(A) - if(istype(A, /mob/living/silicon/pai)) - return 1 - return 0 - -/proc/isdrone(A) - if(istype(A, /mob/living/silicon/robot/drone)) - return 1 - return 0 - -/proc/iscarbon(A) - if(istype(A, /mob/living/carbon)) - return 1 - return 0 - -/proc/issilicon(A) - if(istype(A, /mob/living/silicon)) - return 1 - return 0 - -/proc/isliving(A) - if(istype(A, /mob/living)) - return 1 - return 0 - -proc/isobserver(A) - if(istype(A, /mob/dead/observer)) - return 1 - return 0 - -proc/isorgan(A) - if(istype(A, /obj/item/organ/external)) - return 1 - return 0 - proc/isdeaf(A) if(istype(A, /mob)) var/mob/M = A return (M.sdisabilities & DEAF) || M.ear_deaf return 0 -proc/isnewplayer(A) - if(istype(A, /mob/new_player)) - return 1 - return 0 - proc/hasorgans(A) // Fucking really?? return ishuman(A) @@ -457,7 +338,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /proc/shake_camera(mob/M, duration, strength=1, var/taper = 0) - if(!M || !M.client || M.shakecamera) + if(!M || !M.client || M.shakecamera || M.stat || isEye(M) || isAI(M)) return M.shakecamera = 1 @@ -610,9 +491,9 @@ proc/is_blind(A) var/lname if(subject) if(subject != M) - follow = "(follow) " + follow = "([ghost_follow_link(subject, M)]) " if(M.stat != DEAD && M.client.holder) - follow = "(JMP) " + follow = "([admin_jump_link(subject, M.client.holder)]) " var/mob/dead/observer/DM if(istype(subject, /mob/dead/observer)) DM = subject @@ -680,6 +561,12 @@ proc/is_blind(A) /mob/proc/is_client_active(var/active = 1) return client && client.inactivity < active MINUTES +/mob/proc/can_eat() + return 1 + +/mob/proc/can_force_feed() + return 1 + #define SAFE_PERP -50 /mob/living/proc/assess_perp(var/obj/access_obj, var/check_access, var/auth_weapons, var/check_records, var/check_arrest) if(stat == DEAD) @@ -699,7 +586,7 @@ proc/is_blind(A) return SAFE_PERP //Agent cards lower threatlevel. - var/obj/item/weapon/card/id/id = GetIdCard(src) + var/obj/item/weapon/card/id/id = GetIdCard() if(id && istype(id, /obj/item/weapon/card/id/syndicate)) threatcount -= 2 // A proper CentCom id is hard currency. @@ -1103,8 +990,7 @@ var/list/wierd_mobs_inclusive = list( /mob/living/simple_animal/construct, else if (mob_listed(src, synthetic_mobs_inclusive,0)) mobtypes |= TYPE_SYNTHETIC else - var/datum/species/S = src.get_species(1) - if (S && (S.flags & IS_SYNTHETIC)) + if (isSynthetic()) mobtypes |= TYPE_SYNTHETIC if (mob_listed(src, wierd_mobs_specific,1)) @@ -1219,13 +1105,20 @@ var/list/wierd_mobs_inclusive = list( /mob/living/simple_animal/construct, else return "its"//Something went wrong - -/mob/proc/isHoldingShield() - var/obj/item/test = l_hand - if (istype(test, /obj/item) && test.IsShield()) - return 1 - test = r_hand - if (istype(test, /obj/item) && test.IsShield()) - return 1 - return 0 #undef SAFE_PERP + +/mob/proc/get_multitool(var/obj/item/device/multitool/P) + if(istype(P)) + return P + +mob/dead/observer/get_multitool() + return can_admin_interact() && ..(ghost_multitool) + +/mob/living/carbon/human/get_multitool() + return ..(get_active_hand()) + +/mob/living/silicon/robot/get_multitool() + return ..(get_active_hand()) + +/mob/living/silicon/ai/get_multitool() + return ..(aiMulti) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 9ce5ab098e3..aaf1b0cc4a2 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -10,6 +10,9 @@ return (!mover.density || !density || lying) return +/mob/proc/setMoveCooldown(var/timeout) + if(client) + client.move_delay = max(world.time + timeout, client.move_delay) /client/North() ..() @@ -27,35 +30,43 @@ ..() +/client/proc/client_dir(input, direction=-1) + return turn(input, direction*dir2angle(dir)) + /client/Northeast() - swap_hand() - return - - -/client/Southeast() - attack_self() - return - - -/client/Southwest() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.toggle_throw_mode() - else - usr << "\red This mob type cannot throw items." - return - - + diagonal_action(NORTHEAST) /client/Northwest() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.get_active_hand()) - usr << "\red You have nothing to drop in your hand." + diagonal_action(NORTHWEST) +/client/Southeast() + diagonal_action(SOUTHEAST) +/client/Southwest() + diagonal_action(SOUTHWEST) + +/client/proc/diagonal_action(direction) + switch(client_dir(direction, 1)) + if(NORTHEAST) + swap_hand() + return + if(SOUTHEAST) + attack_self() + return + if(SOUTHWEST) + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.toggle_throw_mode() + else + usr << "\red This mob type cannot throw items." + return + if(NORTHWEST) + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(!C.get_active_hand()) + usr << "\red You have nothing to drop in your hand." + return + drop_item() + else + usr << "\red This mob type cannot drop items." return - drop_item() - else - usr << "\red This mob type cannot drop items." - return //This gets called when you press the delete button. /client/verb/delete_key_pressed() @@ -208,7 +219,7 @@ if(mob.eyeobj) return mob.EyeMove(n,direct) - if(mob.monkeyizing) return//This is sota the goto stop mobs from moving var + if(mob.transforming) return//This is sota the goto stop mobs from moving var if(isliving(mob)) var/mob/living/L = mob @@ -236,7 +247,6 @@ if(Process_Grab()) return - if(!mob.canmove) return @@ -249,7 +259,6 @@ if((istype(mob.loc, /turf/space)) || (mob.lastarea.has_gravity == 0)) if(!mob.Process_Spacemove(0)) return 0 - if(isobj(mob.loc) || ismob(mob.loc))//Inside an object, tell it we moved var/atom/O = mob.loc return O.relaymove(mob, direct) @@ -269,11 +278,7 @@ src << "\blue You're pinned to a wall by [mob.pinned[1]]!" return 0 - - move_delay = world.time - leftover//set move delay - mob.last_move_intent = world.time + 10 - if (mob.buckled) if(istype(mob.buckled, /obj/vehicle)) @@ -483,8 +488,8 @@ return 0 //Check to see if we slipped - if(prob(Process_Spaceslipping(5))) - src << "\blue You slipped!" + if(prob(slip_chance(5)) && !buckled) + src << "You slipped!" src.inertia_dir = src.last_move step(src, src.inertia_dir) return 0 @@ -494,46 +499,30 @@ /mob/proc/Check_Dense_Object() //checks for anything to push off in the vicinity. also handles magboots on gravity-less floors tiles - var/dense_object = 0 - var/shoegrip + var/shoegrip = Check_Shoegrip() - for(var/turf/turf in oview(1,src)) - if(istype(turf,/turf/space)) - continue + for(var/turf/simulated/T in trange(1,src)) //we only care for non-space turfs + if(T.density) //walls work + return 1 + else + var/area/A = T.loc + if(A.has_gravity || shoegrip) + return 1 - if(istype(turf,/turf/simulated/floor)) // Floors don't count if they don't have gravity - var/area/A = turf.loc - if(istype(A) && A.has_gravity == 0) - if(shoegrip == null) - shoegrip = Check_Shoegrip() //Shoegrip is only ever checked when a zero-gravity floor is encountered to reduce load - if(!shoegrip) - continue + for(var/obj/O in orange(1, src)) + if(istype(O, /obj/structure/lattice)) + return 1 + if(O && O.density && O.anchored) + return 1 - dense_object++ - break - - if(!dense_object && (locate(/obj/structure/lattice) in oview(1, src))) - dense_object++ - - //Lastly attempt to locate any dense objects we could push off of - //TODO: If we implement objects drifing in space this needs to really push them - //Due to a few issues only anchored and dense objects will now work. - if(!dense_object) - for(var/obj/O in oview(1, src)) - if((O) && (O.density) && (O.anchored)) - dense_object++ - break - - return dense_object + return 0 /mob/proc/Check_Shoegrip() return 0 -/mob/proc/Process_Spaceslipping(var/prob_slip = 5) - //Setup slipage - //If knocked out we might just hit it and stop. This makes it possible to get dead bodies and such. +/mob/proc/slip_chance(var/prob_slip = 5) if(stat) - prob_slip = 0 // Changing this to zero to make it line up with the comment. - - prob_slip = round(prob_slip) - return(prob_slip) + return 0 + if(Check_Shoegrip()) + return 0 + return prob_slip diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 5c42ab1dccd..dfb32488f00 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -1,3 +1,26 @@ +/var/obj/effect/lobby_image = new/obj/effect/lobby_image() + +/obj/effect/lobby_image + name = "Baystation12" + desc = "This shouldn't be read" + icon = 'icons/misc/title.dmi' + screen_loc = "WEST,SOUTH" + +/obj/effect/lobby_image/initialize() + var/list/known_icon_states = icon_states(icon) + for(var/lobby_screen in config.lobby_screens) + if(!(lobby_screen in known_icon_states)) + error("Lobby screen '[lobby_screen]' did not exist in the icon set [icon].") + config.lobby_screens -= lobby_screen + + if(config.lobby_screens.len) + icon_state = pick(config.lobby_screens) + else + icon_state = known_icon_states[1] + +/mob/new_player + var/client/my_client // Need to keep track of this ourselves, since by the time Logout() is called the client has already been nulled + /mob/new_player/Login() update_Login_details() //handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying @@ -8,24 +31,12 @@ mind.active = 1 mind.current = src - if(length(newplayer_start)) - loc = pick(newplayer_start) - else - loc = locate(1,1,1) - lastarea = loc - + loc = null + client.screen += lobby_image + my_client = client sight |= SEE_TURFS player_list |= src -/* - var/list/watch_locations = list() - for(var/obj/effect/landmark/landmark in landmarks_list) - if(landmark.tag == "landmark*new_player") - watch_locations += landmark.loc - - if(watch_locations.len>0) - loc = pick(watch_locations) -*/ new_player_panel() spawn(40) if(client) diff --git a/code/modules/mob/new_player/logout.dm b/code/modules/mob/new_player/logout.dm index ad1c9b3098d..99bd567cd54 100644 --- a/code/modules/mob/new_player/logout.dm +++ b/code/modules/mob/new_player/logout.dm @@ -1,7 +1,13 @@ /mob/new_player/Logout() ready = 0 + + // see login.dm + if(my_client) + my_client.screen -= lobby_image + my_client = null + ..() 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. qdel(src) - return \ No newline at end of file + return diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0605eb519b2..65cc6c4d5f7 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -77,7 +77,7 @@ stat("Game Mode:", "[master_mode]") // Old setting for showing the game mode if(ticker.current_state == GAME_STATE_PREGAME) - stat("Time To Start:", "[ticker.pregame_timeleft][going ? "" : " (DELAYED)"]") + stat("Time To Start:", "[ticker.pregame_timeleft][round_progressing ? "" : " (DELAYED)"]") stat("Players: [totalPlayers]", "Players Ready: [totalPlayersReady]") totalPlayers = 0 totalPlayersReady = 0 @@ -145,14 +145,14 @@ usr << "\red The round is either not ready, or has already finished..." return - if(client.prefs.species != "Human" && !check_rights(R_ADMIN, 0)) - if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) + if(!check_rights(R_ADMIN, 0)) + var/datum/species/S = all_species[client.prefs.species] + if((S.spawn_flags & IS_WHITELISTED) && !is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) src << alert("You are currently not whitelisted to play [client.prefs.species].") return 0 - var/datum/species/S = all_species[client.prefs.species] - if(!(S.flags & IS_WHITELISTED)) - src << alert("Your current species,[client.prefs.species], is not available for play on the station.") + if(!(S.spawn_flags & CAN_JOIN)) + src << alert("Your current species, [client.prefs.species], is not available for play on the station.") return 0 LateChoices() @@ -169,15 +169,14 @@ usr << "The station is currently exploding. Joining would go poorly." return - if(client.prefs.species != "Human") - if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) - src << alert("You are currently not whitelisted to play [client.prefs.species].") - return 0 + var/datum/species/S = all_species[client.prefs.species] + if((S.spawn_flags & IS_WHITELISTED) && !is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) + src << alert("You are currently not whitelisted to play [client.prefs.species].") + return 0 - var/datum/species/S = all_species[client.prefs.species] - if(!(S.flags & CAN_JOIN)) - src << alert("Your current species, [client.prefs.species], is not available for play on the station.") - return 0 + if(!(S.spawn_flags & CAN_JOIN)) + src << alert("Your current species, [client.prefs.species], is not available for play on the station.") + return 0 AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint) return @@ -332,23 +331,7 @@ return //Find our spawning point. - var/join_message - var/datum/spawnpoint/S - - if(spawning_at) - S = spawntypes[spawning_at] - - if(S && istype(S)) - if(S.check_job_spawning(rank)) - character.loc = pick(S.turfs) - join_message = S.msg - else - character << "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead." - character.loc = pick(latejoin) - join_message = "has arrived on the station" - else - character.loc = pick(latejoin) - join_message = "has arrived on the station" + var/join_message = job_master.LateSpawn(character, rank) character.lastarea = get_area(loc) // Moving wheelchair if they have one @@ -370,12 +353,6 @@ qdel(src) - proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) - if (ticker.current_state == GAME_STATE_PLAYING) - if(character.mind.role_alt_title) - rank = character.mind.role_alt_title - global_announcer.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") - proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) if (ticker.current_state == GAME_STATE_PLAYING) if(character.mind.role_alt_title) @@ -399,9 +376,11 @@ else // Crew transfer initiated dat += "The station is currently undergoing crew transfer procedures.
      " - dat += "Choose from the following open positions:
      " + dat += "Choose from the following open/valid positions:
      " for(var/datum/job/job in job_master.occupations) if(job && IsJobAvailable(job.title)) + if(job.minimum_character_age && (client.prefs.age < job.minimum_character_age)) + continue var/active = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active for(var/mob/M in player_list) //Added isliving check here, so it won't check ghosts and qualify them as active @@ -435,12 +414,12 @@ new_character.lastarea = get_area(loc) - var/datum/language/chosen_language - if(client.prefs.language) - chosen_language = all_languages["[client.prefs.language]"] - if(chosen_language) - if(is_alien_whitelisted(src, client.prefs.language) || !config.usealienwhitelist || !(chosen_language.flags & WHITELISTED) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs))) - new_character.add_language("[client.prefs.language]") + for(var/lang in client.prefs.alternate_languages) + var/datum/language/chosen_language = all_languages[lang] + if(chosen_language) + if(!config.usealienwhitelist || !(chosen_language.flags & WHITELISTED) || is_alien_whitelisted(src, lang) || has_admin_rights() \ + || (new_character.species && (chosen_language.name in new_character.species.secondary_langs))) + new_character.add_language(lang) if(ticker.random_players) new_character.gender = pick(MALE, FEMALE) @@ -462,7 +441,7 @@ new_character.name = real_name new_character.dna.ready_dna(new_character) new_character.dna.b_type = client.prefs.b_type - + new_character.sync_organ_dna() if(client.prefs.disabilities) // Set defer to 1 if you add more crap here so it only recalculates struc_enzymes once. - N3X new_character.dna.SetSEState(GLASSESBLOCK,1,0) @@ -495,11 +474,11 @@ src << browse(null, "window=playersetup") //closes the player setup window proc/has_admin_rights() - return client.holder.rights & R_ADMIN + return check_rights(R_ADMIN, 0, src) proc/is_species_whitelisted(datum/species/S) if(!S) return 1 - return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(S.flags & IS_WHITELISTED) + return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(S.spawn_flags & IS_WHITELISTED) /mob/new_player/get_species(var/reference = 0) var/datum/species/chosen_species diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 4f0f6d627b8..c1eb755f6db 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,20 +1,28 @@ datum/preferences //The mob should have a gender you want before running this proc. Will run fine without H proc/randomize_appearance_for(var/mob/living/carbon/human/H) - if(H) - if(H.gender == MALE) - gender = MALE - else - gender = FEMALE - s_tone = random_skin_tone() + gender = pick(MALE, FEMALE) + var/datum/species/current_species = all_species[species] + + if(current_species) + if(current_species.appearance_flags & HAS_SKIN_TONE) + s_tone = random_skin_tone() + if(current_species.appearance_flags & HAS_EYE_COLOR) + randomize_eyes_color() + if(current_species.appearance_flags & HAS_SKIN_COLOR) + randomize_skin_color() + if(current_species.appearance_flags & HAS_UNDERWEAR) + if(gender == FEMALE) + underwear = underwear_f[pick(underwear_f)] + else + underwear = underwear_m[pick(underwear_m)] + undershirt = undershirt_t[pick(undershirt_t)] + h_style = random_hair_style(gender, species) f_style = random_facial_hair_style(gender, species) randomize_hair_color("hair") randomize_hair_color("facial") - randomize_eyes_color() - randomize_skin_color() - underwear = rand(1,underwear_m.len) - undershirt = rand(1,undershirt_t.len) + backbag = 2 age = rand(getMinAge(),getMaxAge()) if(H) @@ -212,11 +220,11 @@ datum/preferences preview_icon.Blend(temp, ICON_OVERLAY) // Skin color - if(current_species && (current_species.flags & HAS_SKIN_COLOR)) + if(current_species && (current_species.appearance_flags & HAS_SKIN_COLOR)) preview_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) // Skin tone - if(current_species && (current_species.flags & HAS_SKIN_TONE)) + if(current_species && (current_species.appearance_flags & HAS_SKIN_TONE)) if (s_tone >= 0) preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) else @@ -233,7 +241,7 @@ datum/preferences var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s") - if ((current_species && (current_species.flags & HAS_EYE_COLOR))) + if ((current_species && (current_species.appearance_flags & HAS_EYE_COLOR))) eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] @@ -249,11 +257,11 @@ datum/preferences eyes_s.Blend(facial_s, ICON_OVERLAY) var/icon/underwear_s = null - if(underwear && current_species.flags & HAS_UNDERWEAR) + if(underwear && current_species.appearance_flags & HAS_UNDERWEAR) underwear_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = underwear) var/icon/undershirt_s = null - if(undershirt && current_species.flags & HAS_UNDERWEAR) + if(undershirt && current_species.appearance_flags & HAS_UNDERWEAR) undershirt_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = undershirt) var/icon/clothes_s = null diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm index 66244e1d1f6..9d1c4679589 100644 --- a/code/modules/mob/new_player/skill.dm +++ b/code/modules/mob/new_player/skill.dm @@ -56,8 +56,8 @@ datum/skill/construction datum/skill/knowledge/law ID = "law" - name = "NanoTrasen Law" - desc = "Your knowledge of NanoTrasen law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for captains." + name = "Corporate Law" + desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for captains." field = "Security" secondary = 1 diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index e211ff856f2..fa419bcb58f 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -61,6 +61,21 @@ name = "Short Hair 2" icon_state = "hair_shorthair3" + resomi + name = "Resomi Plumage" + icon_state = "resomi_default" + species_allowed = list("Resomi") + + resomi_ears + name = "Resomi Ears" + icon_state = "resomi_ears" + species_allowed = list("Resomi") + + resomi_excited + name = "Resomi Spiky" + icon_state = "resomi_spiky" + species_allowed = list("Resomi") + cut name = "Cut Hair" icon_state = "hair_c" @@ -465,6 +480,10 @@ name = "Volaju" icon_state = "hair_volaju" + bald + name = "Bald" + icon_state = "bald" + eighties name = "80's" icon_state = "hair_80s" diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 82b3e14276d..f591fa9afb3 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -157,11 +157,12 @@ //parses the language code (e.g. :j) from text, such as that supplied to say. //returns the language object only if the code corresponds to a language that src can speak, otherwise null. /mob/proc/parse_language(var/message) - if(length(message) >= 1 && copytext(message,1,2) == "!") + var/prefix = copytext(message,1,2) + if(length(message) >= 1 && prefix == "!") return all_languages["Noise"] - if(length(message) >= 2) - var/language_prefix = lowertext(copytext(message, 1 ,3)) + if(length(message) >= 2 && is_language_prefix(prefix)) + var/language_prefix = lowertext(copytext(message, 2 ,3)) var/datum/language/L = language_keys[language_prefix] if (can_speak(L)) return L diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 1f7220f6995..7e88e115a3a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,12 +1,12 @@ /mob/living/carbon/human/proc/monkeyize() - if (monkeyizing) + if (transforming) return for(var/obj/item/W in src) if (W==w_uniform) // will be torn continue drop_from_inventory(W) regenerate_icons() - monkeyizing = 1 + transforming = 1 canmove = 0 stunned = 1 icon = null @@ -21,7 +21,7 @@ sleep(48) //animation = null - monkeyizing = 0 + transforming = 0 stunned = 0 update_canmove() invisibility = initial(invisibility) @@ -46,7 +46,7 @@ return ..() /mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb - if (monkeyizing) + if (transforming) return for(var/t in organs) qdel(t) @@ -54,11 +54,11 @@ return ..(move) /mob/living/carbon/AIize() - if (monkeyizing) + if (transforming) return for(var/obj/item/W in src) drop_from_inventory(W) - monkeyizing = 1 + transforming = 1 canmove = 0 icon = null invisibility = 101 @@ -98,8 +98,6 @@ loc_landmark = sloc O.loc = loc_landmark.loc - for (var/obj/item/device/radio/intercom/comm in O.loc) - comm.ai += O O.on_mob_init() @@ -112,12 +110,12 @@ //human -> robot /mob/living/carbon/human/proc/Robotize() - if (monkeyizing) + if (transforming) return for(var/obj/item/W in src) drop_from_inventory(W) regenerate_icons() - monkeyizing = 1 + transforming = 1 canmove = 0 icon = null invisibility = 101 @@ -165,12 +163,9 @@ //human -> alien /mob/living/carbon/human/proc/Alienize() - if (monkeyizing) - return for(var/obj/item/W in src) drop_from_inventory(W) regenerate_icons() - monkeyizing = 1 canmove = 0 icon = null invisibility = 101 @@ -188,12 +183,12 @@ return /mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num) - if (monkeyizing) + if (transforming) return for(var/obj/item/W in src) drop_from_inventory(W) regenerate_icons() - monkeyizing = 1 + transforming = 1 canmove = 0 icon = null invisibility = 101 @@ -222,12 +217,12 @@ return /mob/living/carbon/human/proc/corgize() - if (monkeyizing) + if (transforming) return for(var/obj/item/W in src) drop_from_inventory(W) regenerate_icons() - monkeyizing = 1 + transforming = 1 canmove = 0 icon = null invisibility = 101 @@ -251,13 +246,13 @@ usr << "\red Sorry but this mob type is currently unavailable." return - if(monkeyizing) + if(transforming) return for(var/obj/item/W in src) drop_from_inventory(W) regenerate_icons() - monkeyizing = 1 + transforming = 1 canmove = 0 icon = null invisibility = 101 @@ -343,6 +338,3 @@ //Not in here? Must be untested! return 0 - - - diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 53d68def64f..b6179c544ce 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -78,7 +78,7 @@ mob/var/obj/effect/decal/typing_indicator set category = "Preferences" set desc = "Toggles showing an indicator when you are typing emote or say message." prefs.toggles ^= SHOW_TYPING - prefs.handle_preferences_save(src) + prefs.save_preferences() src << "You will [(prefs.toggles & SHOW_TYPING) ? "no longer" : "now"] display a typing indicator." // Clear out any existing typing indicator. diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm new file mode 100644 index 00000000000..81f2025aea2 --- /dev/null +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -0,0 +1,68 @@ +var/global/ntnrc_uid = 0 + +/datum/ntnet_conversation/ + var/id = null + var/title = "Untitled Conversation" + var/datum/computer_file/program/chatclient/operator // "Administrator" of this channel. Creator starts as channel's operator, + var/list/messages = list() + var/list/clients = list() + var/password + +/datum/ntnet_conversation/New() + id = ntnrc_uid + ntnrc_uid++ + if(ntnet_global) + ntnet_global.chat_channels.Add(src) + ..() + +/datum/ntnet_conversation/proc/add_message(var/message, var/username) + message = "[worldtime2text()] [username]: [message]" + messages.Add(message) + trim_message_list() + +/datum/ntnet_conversation/proc/add_status_message(var/message) + messages.Add("[worldtime2text()] -!- [message]") + trim_message_list() + +/datum/ntnet_conversation/proc/trim_message_list() + if(messages.len <= 50) + return + for(var/message in messages) + messages -= message + if(messages <= 50) + return + +/datum/ntnet_conversation/proc/add_client(var/datum/computer_file/program/chatclient/C) + if(!istype(C)) + return + clients.Add(C) + add_status_message("[C.username] has joined the channel.") + // No operator, so we assume the channel was empty. Assign this user as operator. + if(!operator) + changeop(C) + +/datum/ntnet_conversation/proc/remove_client(var/datum/computer_file/program/chatclient/C) + if(!istype(C) || !(C in clients)) + return + clients.Remove(C) + add_status_message("[C.username] has left the channel.") + + // Channel operator left, pick new operator + if(C == operator) + operator = null + if(clients.len) + var/datum/computer_file/program/chatclient/newop = pick(clients) + changeop(newop) + + +/datum/ntnet_conversation/proc/changeop(var/datum/computer_file/program/chatclient/newop) + if(istype(newop)) + operator = newop + add_status_message("Channel operator status transferred to [newop.username].") + +/datum/ntnet_conversation/proc/change_title(var/newtitle, var/datum/computer_file/program/chatclient/client) + if(operator != client) + return 0 // Not Authorised + + add_status_message("[client.username] has changed channel title from [title] to [newtitle]") + title = newtitle \ No newline at end of file diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm new file mode 100644 index 00000000000..4593df5f1b8 --- /dev/null +++ b/code/modules/modular_computers/NTNet/NTNet.dm @@ -0,0 +1,148 @@ +var/global/datum/ntnet/ntnet_global = new() + + +// This is the NTNet datum. There can be only one NTNet datum in game at once. Modular computers read data from this. +/datum/ntnet/ + var/list/relays = list() + var/list/logs = list() + var/list/available_station_software = list() + var/list/available_antag_software = list() + var/list/chat_channels = list() + var/list/fileservers = list() + // Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly. + // High values make displaying logs much laggier. + var/setting_maxlogcount = 100 + + // These only affect wireless. LAN (consoles) are unaffected since it would be possible to create scenario where someone turns off NTNet, and is unable to turn it back on since it refuses connections + var/setting_softwaredownload = 1 + var/setting_peertopeer = 1 + var/setting_communication = 1 + var/setting_systemcontrol = 1 + var/setting_disabled = 0 // Setting to 1 will disable all wireless, independently on relays status. + + var/intrusion_detection_enabled = 1 // Whether the IDS warning system is enabled + var/intrusion_detection_alarm = 0 // Set when there is an IDS warning due to malicious (antag) software. + + +// If new NTNet datum is spawned, it replaces the old one. +/datum/ntnet/New() + if(ntnet_global && (ntnet_global != src)) + ntnet_global = src // There can be only one. + for(var/obj/machinery/ntnet_relay/R in machines) + relays.Add(R) + R.NTNet = src + build_software_lists() + add_log("NTNet logging system activated.") + +// Simplified logging: Adds a log. log_string is mandatory parameter, source is optional. +/datum/ntnet/proc/add_log(var/log_string, var/obj/item/weapon/computer_hardware/network_card/source = null) + var/log_text = "[worldtime2text()] - " + if(source) + log_text += "[source.get_network_tag()] - " + else + log_text += "*SYSTEM* - " + log_text += log_string + logs.Add(log_text) + + if(logs.len > setting_maxlogcount) + // We have too many logs, remove the oldest entries until we get into the limit + for(var/L in logs) + if(logs.len > setting_maxlogcount) + logs.Remove(L) + else + break + +// Checks whether NTNet operates. If parameter is passed checks whether specific function is enabled. +/datum/ntnet/proc/check_function(var/specific_action = 0) + if(!relays || !relays.len) // No relays found. NTNet is down + return 0 + + var/operating = 0 + + // Check all relays. If we have at least one working relay, network is up. + for(var/obj/machinery/ntnet_relay/R in relays) + if(R.is_operational()) + operating = 1 + break + + if(setting_disabled) + return 0 + + if(specific_action == NTNET_SOFTWAREDOWNLOAD) + return (operating && setting_softwaredownload) + if(specific_action == NTNET_PEERTOPEER) + return (operating && setting_peertopeer) + if(specific_action == NTNET_COMMUNICATION) + return (operating && setting_communication) + if(specific_action == NTNET_SYSTEMCONTROL) + return (operating && setting_systemcontrol) + return operating + +// Builds lists that contain downloadable software. +/datum/ntnet/proc/build_software_lists() + available_station_software = list() + available_antag_software = list() + for(var/F in typesof(/datum/computer_file/program)) + var/datum/computer_file/program/prog = new F + // Invalid type (shouldn't be possible but just in case), invalid filetype (not executable program) or invalid filename (unset program) + if(!prog || !istype(prog) || prog.filename == "UnknownProgram" || prog.filetype != "PRG") + continue + // Check whether the program should be available for station/antag download, if yes, add it to lists. + if(prog.available_on_ntnet) + available_station_software.Add(prog) + if(prog.available_on_syndinet) + available_antag_software.Add(prog) + +// Attempts to find a downloadable file according to filename var +/datum/ntnet/proc/find_ntnet_file_by_name(var/filename) + for(var/datum/computer_file/program/P in available_station_software) + if(filename == P.filename) + return P + for(var/datum/computer_file/program/P in available_antag_software) + if(filename == P.filename) + return P + +// Resets the IDS alarm +/datum/ntnet/proc/resetIDS() + intrusion_detection_alarm = 0 + +/datum/ntnet/proc/toggleIDS() + resetIDS() + intrusion_detection_enabled = !intrusion_detection_enabled + +// Removes all logs +/datum/ntnet/proc/purge_logs() + logs = list() + add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-") + +// Updates maximal amount of stored logs. Use this instead of setting the number, it performs required checks. +/datum/ntnet/proc/update_max_log_count(var/lognumber) + if(!lognumber) + return 0 + // Trim the value if necessary + lognumber = between(MIN_NTNET_LOGS, lognumber, MAX_NTNET_LOGS) + setting_maxlogcount = lognumber + add_log("Configuration Updated. Now keeping [setting_maxlogcount] logs in system memory.") + +/datum/ntnet/proc/toggle_function(var/function) + if(!function) + return + function = text2num(function) + switch(function) + if(NTNET_SOFTWAREDOWNLOAD) + setting_softwaredownload = !setting_softwaredownload + add_log("Configuration Updated. Wireless network firewall now [setting_softwaredownload ? "allows" : "disallows"] connection to software repositories.") + if(NTNET_PEERTOPEER) + setting_peertopeer = !setting_peertopeer + add_log("Configuration Updated. Wireless network firewall now [setting_peertopeer ? "allows" : "disallows"] peer to peer network traffic.") + if(NTNET_COMMUNICATION) + setting_communication = !setting_communication + add_log("Configuration Updated. Wireless network firewall now [setting_communication ? "allows" : "disallows"] instant messaging and similar communication services.") + if(NTNET_SYSTEMCONTROL) + setting_systemcontrol = !setting_systemcontrol + add_log("Configuration Updated. Wireless network firewall now [setting_systemcontrol ? "allows" : "disallows"] remote control of station's systems.") + + + + + diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm new file mode 100644 index 00000000000..7808af0cbe6 --- /dev/null +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -0,0 +1,130 @@ +// Relays don't handle any actual communication. Global NTNet datum does that, relays only tell the datum if it should or shouldn't work. +/obj/machinery/ntnet_relay + name = "NTNet Quantum Relay" + desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile." + use_power = 2 + active_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. + idle_power_usage = 100 + icon_state = "bus" + anchored = 1 + density = 1 + var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame. + var/enabled = 1 // Set to 0 if the relay was turned off + var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack + var/list/dos_sources = list() // Backwards reference for qdel() stuff + + // Denial of Service attack variables + var/dos_overload = 0 // Amount of DoS "packets" in this relay's buffer + var/dos_capacity = 500 // Amount of DoS "packets" in buffer required to crash the relay + var/dos_dissipate = 1 // Amount of DoS "packets" dissipated over time. + + +// TODO: Implement more logic here. For now it's only a placeholder. +/obj/machinery/ntnet_relay/proc/is_operational() + if(stat & (BROKEN | NOPOWER | EMPED)) + return 0 + if(dos_failure) + return 0 + if(!enabled) + return 0 + return 1 + +/obj/machinery/ntnet_relay/update_icon() + if(is_operational()) + icon_state = "bus" + else + icon_state = "bus_off" + +/obj/machinery/ntnet_relay/process() + if(is_operational()) + use_power = 2 + else + use_power = 1 + + if(dos_overload) + dos_overload = max(0, dos_overload - dos_dissipate) + + // If DoS traffic exceeded capacity, crash. + if((dos_overload > dos_capacity) && !dos_failure) + dos_failure = 1 + update_icon() + ntnet_global.add_log("Quantum relay switched from normal operation mode to overload recovery mode.") + // If the DoS buffer reaches 0 again, restart. + if((dos_overload == 0) && dos_failure) + dos_failure = 0 + update_icon() + ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.") + ..() + +/obj/machinery/ntnet_relay/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() + data["enabled"] = enabled + data["dos_capacity"] = dos_capacity + data["dos_overload"] = dos_overload + data["dos_crashed"] = dos_failure + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_relay.tmpl", "NTNet Quantum Relay", 500, 300, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/ntnet_relay/attack_hand(var/mob/living/user) + ui_interact(user) + +/obj/machinery/ntnet_relay/Topic(href, href_list) + if(..()) + return 1 + if(href_list["restart"]) + dos_overload = 0 + dos_failure = 0 + update_icon() + ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.") + else if(href_list["toggle"]) + enabled = !enabled + ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].") + update_icon() + +/obj/machinery/ntnet_relay/New() + uid = gl_uid + gl_uid++ + component_parts = list() + component_parts += new /obj/item/stack/cable_coil(src,15) + component_parts += new /obj/item/weapon/circuitboard/ntnet_relay(src) + + if(ntnet_global) + ntnet_global.relays.Add(src) + NTNet = ntnet_global + ntnet_global.add_log("New quantum relay activated. Current amount of linked relays: [NTNet.relays.len]") + ..() + +/obj/machinery/ntnet_relay/Destroy() + if(ntnet_global) + ntnet_global.relays.Remove(src) + ntnet_global.add_log("Quantum relay connection severed. Current amount of linked relays: [NTNet.relays.len]") + NTNet = null + for(var/datum/computer_file/program/ntnet_dos/D in dos_sources) + D.target = null + D.error = "Connection to quantum relay severed" + ..() + +/obj/machinery/ntnet_relay/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + panel_open = !panel_open + user << "You [panel_open ? "open" : "close"] the maintenance hatch" + return + if(istype(W, /obj/item/weapon/crowbar)) + if(!panel_open) + user << "Open the maintenance panel first." + return + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "You disassemble \the [src]!" + + for(var/atom/movable/A in component_parts) + A.forceMove(src.loc) + new/obj/machinery/constructable_frame/machine_frame(src.loc) + qdel(src) + return + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/_description.dm b/code/modules/modular_computers/_description.dm new file mode 100644 index 00000000000..2335ce08e73 --- /dev/null +++ b/code/modules/modular_computers/_description.dm @@ -0,0 +1,121 @@ +/* +Program-based computers, designed to replace computer3 project and eventually most consoles on station + + +1. Basic information +Program based computers will allow you to do multiple things from single computer. Each computer will have programs, with more being downloadable from NTNet (stationwide network with wireless coverage) +if user has apropriate ID card access. It will be possible to hack the computer by using an emag on it - the emag will have to be completely new and will be consumed on use, but it will +lift ALL locks on ALL installed programs, and allow download of programs even if your ID doesn't have access to them. Computers will have hard drives that can store files. +Files can be programs (datum/computer_file/program/ subtype) or data files (datum/computer_file/data/ subtypes). Program for sending files will be available that will allow transfer via NTNet. +NTNet coverage will be limited to station's Z level, but better network card (=more expensive and higher power use) will allow usage everywhere. Hard drives will have limited capacity for files +which will be related to how good hard drive you buy when purchasing the laptop. For storing more files USB-style drives will be buildable with Protolathe in research. + +2. Available devices +CONSOLES +Consoles will come in various pre-fabricated loadouts, each loadout starting with certain set of programs (aka Engineering console, Medical console, etc.), of course, more software may be downloaded. +Consoles won't usually have integrated battery, but the possibility to install one will exist for critical applications. Consoles are considered hardwired into NTNet network which means they +will have working coverage on higher speed (Ethernet is faster than Wi-Fi) and won't require wireless coverage to exist. +LAPTOPS +Laptops are middle ground between actual portable devices and full consoles. They offer certain level of mobility, as they can be closed, moved somewhere else and then opened again. +Laptops will by default have internal battery to power them, and may be recharged with rechargers. However, laptops rely on wireless NTNet coverage. Laptop HDDs are also designed with power efficiency +in mind, which means they sacrifice some storage space for higher battery life. Laptops may be dispensed from computer vendor machine, and may be customised before vending. For people which don't +want to rely on internal battery, tesla link exists that connects to APC, if one exists. +TABLETS +Tablets are smallest available devices, designed with full mobility in mind. Tablets have only weak CPU which means the software they can run is somewhat limited. They are also designed with high +battery life in mind, which means the hardware focuses on power efficiency rather than high performance. This is most visible with hard drives which have quite small storage capacity. +Tablets can't be equipped with tesla link, which means they have to be recharged manually. + + +3. Computer Hardware +Computers will come with basic hardware installed, with upgrades being selectable when purchasing the device. +Hard Drive: Stores data, mandatory for the computer to work +Network Card: Connects to NTNet +Battery: Internal power source that ensures the computer operates when not connected to APC. +Extras (those won't be installed by default, but can be bought) +ID Card Slot: Required for HoP-style programs to work. Access for security record-style programs is read from ID of user [RFID?] without requiring this +APC Tesla Relay: Wirelessly powers the device from APC. Consoles have it by default. Laptops can buy it. +Disk Drive: Allows usage of portable data disks. +Nano Printer: Allows the computer to scan paper contents and save them to file, as well as recycle papers and print stuff on it. + +4. NTNet +NTNet is stationwide network that allows users to download programs needed for their work. It will be possible to send any files to other active computers using relevant program (NTN Transfer). +NTNet is under jurisdiction of both Engineering and Research. Engineering is responsible for any repairs if necessary and research is responsible for monitoring. It is similar to PDA messaging. +Operation requires functional "NTNet Relay" which is by default placed on tcommsat. If the relay is damaged NTNet will be offline until it is replaced. Multiple relays bring extra redundancy, +if one is destroyed the second will take over. If all relays are gone it stops working, simple as that. NTNet may be altered via administration console available to Research Director. It is +possible to enable/disable Software Downloading, P2P file transfers and Communication (IC version of IRC, PDA messages for more than two people) + +5. Software +Software would almost exclusively use NanoUI modules. Few exceptions are text editor (uses similar screen as TCS IDE used for editing and classic HTML for previewing as Nano looks differently) +and similar programs which for some reason require HTML UI. Most software will be highly dependent on NTNet to work as laptops are not physically connected to the station's network. +What i plan to add: + +Note: XXXXDB programs will use ingame_manuals to display basic help for players, similar to how books, etc. do + +Basic - Software in this bundle is automagically preinstalled in every new computer + NTN Transfer - Allows P2P transfer of files to other computers that run this. + Configurator - Allows configuration of computer's hardware, basically status screen. + File Browser - Allows you to browse all files stored on the computer. Allows renaming/deleting of files. + TXT Editor - Allows you editing data files in text editor mode. + NanoPrint - Allows you to operate NanoPrinter hardware to print text files. + NTNRC Chat - NTNet Relay Chat client. Allows PDA-messaging style messaging for more than two users. Person which created the conversation is Host and has administrative privilegies (kicking, etc.) + NTNet News - Allows reading news from newscaster network. + +Engineering - Requires "Engineering" access on ID card (ie. CE, Atmostech, Engineer) + Alarm Monitor - Allows monitoring alarms, same as the stationbound one. + Power Monitor - Power monitoring computer, connects to sensors in same way as regular one does. + Atmospheric Control - Allows access to the Atmospherics Monitor Console that operates air alarms. Requires extra access: "Atmospherics" + RCON Remote Control Console - Allows access to the RCON Remote Control Console. Requires extra access: "Power Equipment" + EngiDB - Allows accessing NTNet information repository for information about engineering-related things. + +Medical - Requires "Medbay" access on ID card (ie. CMO, Doctor,..) + Medical Records Uplink - Allows editing/reading of medical records. Printing requires NanoPrinter hardware. + MediDB - Allows accessing NTNet information repository for information about medical procedures + ChemDB - Requires extra access: "Chemistry" - Downloads basic information about recipes from NTNet + +Research - Requires "Research and Development" access on ID card (ie. RD, Roboticist, etc.) + Research Server Monitor - Allows monitoring of research levels on RnD servers. (read only) + Robotics Monitor Console - Allows monitoring of robots and exosuits. Lockdown/Self-Destruct options are unavailable [balance reasons for malf/traitor AIs]. Requires extra access: "Robotics" + NTNRC Administration Console - Allows administrative access to NTNRC. This includes bypassing any channel passwords and enabling "invisible" mode for spying on conversations. Requires extra access: "Research Director" + NTNet Administration Console - Allows remote configuration of NTNet Relay - CAUTION: If NTNet is turned off it won't be possible to turn it on again from the computer, as operation requires NTNet to work! Requires extra access: "Research Director" + NTNet Monitor - Allows monitoring of NTNet and it's various components, including simplified network logs and system status. + +Security - Requires "Security" access on ID card (ie. HOS, Security officer, Detective) + Security Records Uplink - Allows editing/reading of security records. Printing requires Nanoprinter hardware. + LawDB - Allows accessing NTNet information repository for security information (corporate regulations) + Camera Uplink - Allows viewing cameras around the station. + +Command - Requires "Bridge" access on ID card (all heads) + Alertcon Access - Allows changing of alert levels. Red requires activation from two computers with two IDs similar to how those wall mounted devices do. + Employment Records Access - Allows reading of employment records. Printing requires NanoPrinter hardware. + Communication Console - Allows sending emergency messages to Central. + Emergency Shuttle Control Console - Allows calling/recalling the emergency shuttle. + Shuttle Control Console - Allows control of various shuttles around the station (mining, research, engineering) + +*REDACTED* - Can be downloaded from SyndiCorp servers, only via emagged devices. These files are very large and limited to laptops/consoles only. + SYSCRACK - Allows cracking of secure network terminals, such as, NTNet administration. The sysadmin will probably notice this. + SYSOVERRIDE - Allows hacking into any device connected to NTNet. User will notice this and may stop the hack by disconnecting from NTNet first. After hacking various options exist, such as stealing/deleting files. + SYSKILL - Tricks NTNet to force-disconnect a device. The sysadmin will probably notice this. + SYSDOS - Launches a Denial of Service attack on NTNet relay. Can DoS only one relay at once. Requires NTNet connection. After some time the relay crashes until attack stops. The sysadmin will probably notice this. + AIHACK - Hacks an AI, allowing you to upload/remove/modify a law even without relevant circuit board. The AI is alerted once the hack starts, and it takes a while for it to complete. Does not work on AIs with zeroth law. + COREPURGE - Deletes all files on the hard drive, including the undeletable ones. Something like software self-destruct for computer. + +6. Security +Laptops will be password-lockable. If password is set a MD5 hash of it is stored and password is required every time you turn on the laptop. +Passwords may be decrypted by using special Decrypter (protolathable, RDs office starts with one) device that will slowly decrypt the password. +Decryption time would be length_of_password * 30 seconds, with maximum being 9 minutes (due to battery life limitations, which is 10+ min). +If decrypted the password is cleared, so you can keep using your favorite password without people ever actually revealing it (for meta prevention reasons mostly). +Emagged laptops will have option to enable "Safe Encryption". If safely encrypted laptop is decrypted it loses it's emag status and 50% of files is deleted (randomly selected). + +7. System Administrator +System Administrator will be new job under Research. It's main specifics will be maintaining of computer systems on station, espicially from software side. +From IC perspective they'd probably know how to build a console or something given they work with computers, but they are mostly programmers/network experts. +They will have office in research, which will probably replace (and contain) the server room and part of the toxins storage which is currently oversized. +They will have access to DOWNLOAD (not run) all programs that exist on NTNet. They'll have fairly good amount of available programs, most of them being +administrative consoles and other very useful things. They'll also be able to monitor NTNet. There will probably be one or two job slots. + +8. IDS +With addition of various antag programs, IDS(Intrusion Detection System) will be added to NTNet. This system can be turned on/off via administration console. +If enabled, this system automatically detects any abnormality and triggers a warning that's visible on the NTNet status screen, as well as generating a security log. +IDS can be disabled by simple on/off switch in the configuration. + +*/ \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm new file mode 100644 index 00000000000..2db7a61f154 --- /dev/null +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -0,0 +1,629 @@ +// This is the base type that does all the hardware stuff. +// Other types expand it - tablets use a direct subtypes, and +// consoles and laptops use "procssor" item that is held inside machinery piece +/obj/item/modular_computer + name = "Modular Microcomputer" + desc = "A small portable microcomputer" + + var/enabled = 0 // Whether the computer is turned on. + var/screen_on = 1 // Whether the computer is active/opened/it's screen is on. + var/datum/computer_file/program/active_program = null // A currently active program running on the computer. + var/hardware_flag = 0 // A flag that describes this device type + var/last_power_usage = 0 + var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged + var/last_world_time = "00:00" + var/list/last_header_icons + var/computer_emagged = 0 // Whether the computer is emagged. + + var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too. + var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops) + + // Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..) + // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently + // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example. + + icon = 'icons/obj/computer.dmi' + icon_state = "laptop-open" + var/icon_state_unpowered = null // Icon state when the computer is turned off + var/icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. + var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed. + var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer. + + + // Important hardware (must be installed for computer to work) + var/obj/item/weapon/computer_hardware/processor_unit/processor_unit // CPU. Without it the computer won't run. Better CPUs can run more programs at once. + var/obj/item/weapon/computer_hardware/network_card/network_card // Network Card component of this computer. Allows connection to NTNet + var/obj/item/weapon/computer_hardware/hard_drive/hard_drive // Hard Drive component of this computer. Stores programs and files. + var/obj/item/weapon/computer_hardware/battery_module/battery_module // An internal power source for this computer. Can be recharged. + // Optional hardware (improves functionality, but is not critical for computer to work) + var/obj/item/weapon/computer_hardware/card_slot/card_slot // ID Card slot component of this computer. Mostly for HoP modification console that needs ID slot for modification. + var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs. + var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage + + var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. + + +// Eject ID card from computer, if it has ID slot with card inside. +/obj/item/modular_computer/verb/eject_id() + set name = "Eject ID" + set category = "Object" + set src in view(1) + + if(usr.incapacitated() || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + proc_eject_id(usr) + +/obj/item/modular_computer/proc/proc_eject_id(mob/user) + if(!user) + user = usr + + if(!card_slot) + user << "\The [src] does not have an ID card slot" + return + + if(!card_slot.stored_card) + user << "There is no card in \the [src]" + return + + card_slot.stored_card.forceMove(get_turf(src)) + card_slot.stored_card = null + update_uis() + user << "You remove the card from \the [src]" + +/obj/item/modular_computer/attack_ghost(var/mob/dead/observer/user) + if(enabled) + ui_interact(user) + else if(check_rights(R_ADMIN, 0, user)) + var/response = alert(user, "This computer is turned off. Would you like to turn it on?", "Admin Override", "Yes", "No") + if(response == "Yes") + turn_on(user) + +/obj/item/modular_computer/emag_act(var/remaining_charges, var/mob/user) + if(computer_emagged) + user << "\The [src] was already emagged." + return NO_EMAG_ACT + else + computer_emagged = 1 + user << "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message." + return 1 + +/obj/item/modular_computer/New() + processing_objects.Add(src) + update_icon() + ..() + +/obj/item/modular_computer/Destroy() + kill_program(1) + processing_objects.Remove(src) + for(var/obj/item/weapon/computer_hardware/CH in src.get_all_components()) + qdel(CH) + return ..() + +/obj/item/modular_computer/update_icon() + icon_state = icon_state_unpowered + + overlays.Cut() + if(!enabled) + return + if(active_program) + overlays.Add(active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu) + else + overlays.Add(icon_state_menu) + +// Used by child types if they have other power source than battery +/obj/item/modular_computer/proc/check_power_override() + return 0 + +// Operates NanoUI +/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(!screen_on || !enabled) + if(ui) + ui.close() + return 0 + if((!battery_module || !battery_module.battery.charge) && !check_power_override()) + if(ui) + ui.close() + return 0 + + // If we have an active program switch to it now. + if(active_program) + if(ui) // This is the main laptop screen. Since we are switching to program's UI close it for now. + ui.close() + active_program.ui_interact(user) + return + + // We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it. + // This screen simply lists available programs and user may select them. + if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len) + visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") + return // No HDD, No HDD files list or no stored files. Something is very broken. + + var/list/data = get_header_data() + + var/list/programs = list() + for(var/datum/computer_file/program/P in hard_drive.stored_files) + var/list/program = list() + program["name"] = P.filename + program["desc"] = P.filedesc + programs.Add(list(program)) + + data["programs"] = programs + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "laptop_mainscreen.tmpl", "NTOS Main Menu", 400, 500) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +// On-click handling. Turns on the computer if it's off and opens the GUI. +/obj/item/modular_computer/attack_self(mob/user) + if(enabled) + ui_interact(user) + else + turn_on(user) + +/obj/item/modular_computer/proc/turn_on(var/mob/user) + var/issynth = issilicon(user) // Robots and AIs get different activation messages. + if(processor_unit && ((battery_module && battery_module.battery.charge) || check_power_override())) // Battery-run and charged or non-battery but powered by APC. + if(issynth) + user << "You send an activation signal to \the [src], turning it on" + else + user << "You press the power button and start up \the [src]" + enabled = 1 + update_icon() + ui_interact(user) + else // Unpowered + if(issynth) + user << "You send an activation signal to \the [src] but it does not respond" + else + user << "You press the power button but \the [src] does not respond" + +// Process currently calls handle_power(), may be expanded in future if more things are added. +/obj/item/modular_computer/process() + if(!enabled) // The computer is turned off + last_power_usage = 0 + return 0 + + if(active_program && active_program.requires_ntnet && !get_ntnet_status(active_program.requires_ntnet_feature)) // Active program requires NTNet to run but we've just lost connection. Crash. + kill_program(1) + visible_message("\The [src]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error.") + + for(var/datum/computer_file/program/P in idle_threads) + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) + P.kill_program(1) + idle_threads.Remove(P) + visible_message("\The [src] screen displays an \"Process [P.filename].[P.filetype] (PID [rand(100,999)]) terminated - Network Error\" error") + + if(active_program) + active_program.process_tick() + active_program.ntnet_status = get_ntnet_status() + active_program.computer_emagged = computer_emagged + + for(var/datum/computer_file/program/P in idle_threads) + P.process_tick() + P.ntnet_status = get_ntnet_status() + P.computer_emagged = computer_emagged + + + handle_power() // Handles all computer power interaction + check_update_ui_need() + +// Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" +/obj/item/modular_computer/proc/get_header_data() + var/list/data = list() + + if(battery_module) + switch(battery_module.battery.percent()) + if(80 to 200) // 100 should be maximal but just in case.. + data["PC_batteryicon"] = "batt_100.gif" + if(60 to 80) + data["PC_batteryicon"] = "batt_80.gif" + if(40 to 60) + data["PC_batteryicon"] = "batt_60.gif" + if(20 to 40) + data["PC_batteryicon"] = "batt_40.gif" + if(5 to 20) + data["PC_batteryicon"] = "batt_20.gif" + else + data["PC_batteryicon"] = "batt_5.gif" + data["PC_batterypercent"] = "[round(battery_module.battery.percent())] %" + data["PC_showbatteryicon"] = 1 + else + data["PC_batteryicon"] = "batt_5.gif" + data["PC_batterypercent"] = "N/C" + data["PC_showbatteryicon"] = battery_module ? 1 : 0 + + switch(get_ntnet_status()) + if(0) + data["PC_ntneticon"] = "sig_none.gif" + if(1) + data["PC_ntneticon"] = "sig_low.gif" + if(2) + data["PC_ntneticon"] = "sig_high.gif" + if(3) + data["PC_ntneticon"] = "sig_lan.gif" + + if(idle_threads.len) + var/list/program_headers = list() + for(var/datum/computer_file/program/P in idle_threads) + if(!P.ui_header) + continue + program_headers.Add(list(list( + "icon" = P.ui_header + ))) + + data["PC_programheaders"] = program_headers + + data["PC_stationtime"] = worldtime2text() + data["PC_hasheader"] = 1 + data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen + return data + +// Relays kill program request to currently active program. Use this to quit current program. +/obj/item/modular_computer/proc/kill_program(var/forced = 0) + if(active_program) + active_program.kill_program(forced) + active_program = null + var/mob/user = usr + if(user && istype(user)) + ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + update_icon() + +// Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on) +/obj/item/modular_computer/proc/get_ntnet_status(var/specific_action = 0) + if(network_card) + return network_card.get_signal(specific_action) + else + return 0 + +/obj/item/modular_computer/proc/add_log(var/text) + if(!get_ntnet_status()) + return 0 + return ntnet_global.add_log(text, network_card) + +/obj/item/modular_computer/proc/shutdown_computer(var/loud = 1) + kill_program(1) + for(var/datum/computer_file/program/P in idle_threads) + P.kill_program(1) + idle_threads.Remove(P) + if(loud) + visible_message("\The [src] shuts down.") + enabled = 0 + update_icon() + return + +// Handles user's GUI input +/obj/item/modular_computer/Topic(href, href_list) + if(..()) + return 1 + if( href_list["PC_exit"] ) + kill_program() + return 1 + if( href_list["PC_enable_component"] ) + var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(href_list["PC_enable_component"]) + if(H && istype(H) && !H.enabled) + H.enabled = 1 + . = 1 + if( href_list["PC_disable_component"] ) + var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(href_list["PC_disable_component"]) + if(H && istype(H) && H.enabled) + H.enabled = 0 + . = 1 + if( href_list["PC_shutdown"] ) + shutdown_computer() + return 1 + if( href_list["PC_minimize"] ) + var/mob/user = usr + if(!active_program || !processor_unit) + return + + if(idle_threads.len >= processor_unit.max_idle_programs) + user << "\The [src] displays a \"Maximal CPU load reached. Unable to minimize another program.\" error" + return + + idle_threads.Add(active_program) + active_program.running = 0 // Should close any existing UIs + nanomanager.close_uis(active_program.NM ? active_program.NM : active_program) + active_program = null + update_icon() + if(user && istype(user)) + ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + + if( href_list["PC_runprogram"] ) + var/prog = href_list["PC_runprogram"] + var/datum/computer_file/program/P = null + var/mob/user = usr + if(hard_drive) + P = hard_drive.find_file_by_name(prog) + P.computer = src + + if(!P || !istype(P)) // Program not found or it's not executable program. + user << "\The [src]'s screen shows \"I/O ERROR - Unable to run program\" warning." + return + + if(!P.is_supported_by_hardware(hardware_flag, 1, user)) + return + + // The program is already running. Resume it. + if(P in idle_threads) + P.running = 1 + active_program = P + idle_threads.Remove(P) + update_icon() + return + + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. + user << "\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning." + return + if(P.run_program(user)) + active_program = P + update_icon() + return 1 + if(.) + update_uis() + +// Used in following function to reduce copypaste +/obj/item/modular_computer/proc/power_failure() + if(enabled) // Shut down the computer + visible_message("\The [src]'s screen flickers \"BATTERY CRITICAL\" warning as it shuts down unexpectedly.") + shutdown_computer(0) + +// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged +/obj/item/modular_computer/proc/handle_power() + if(!battery_module || battery_module.battery.charge <= 0) // Battery-run but battery is depleted. + power_failure() + return 0 + + var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage + + for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + if(H.enabled) + power_usage += H.power_usage + + if(battery_module) + battery_module.battery.use(power_usage * CELLRATE) + + last_power_usage = power_usage + +/obj/item/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/weapon/card/id)) // ID Card, try to insert it. + var/obj/item/weapon/card/id/I = W + if(!card_slot) + user << "You try to insert \the [I] into \the [src], but it does not have an ID card slot installed." + return + + if(card_slot.stored_card) + user << "You try to insert \the [I] into \the [src], but it's ID card slot is occupied." + return + user.drop_from_inventory(I) + card_slot.stored_card = I + I.forceMove(src) + update_uis() + user << "You insert \the [I] into \the [src]." + return + if(istype(W, /obj/item/weapon/paper)) + var/obj/item/weapon/paper/P = W + if(!nano_printer) + return + nano_printer.load_paper(P) + if(istype(W, /obj/item/weapon/computer_hardware)) + var/obj/item/weapon/computer_hardware/C = W + if(C.hardware_size <= max_hardware_size) + try_install_component(user, C) + else + user << "This component is too large for \the [src]." + if(istype(W, /obj/item/weapon/wrench)) + var/list/components = get_all_components() + if(components.len) + user << "Remove all components from \the [src] before disassembling it." + return + new /obj/item/stack/material/steel( get_turf(src.loc), steel_sheet_cost ) + src.visible_message("\The [src] has been disassembled by [user].") + relay_qdel() + qdel(src) + return + + if(istype(W, /obj/item/weapon/screwdriver)) + var/list/all_components = get_all_components() + if(!all_components.len) + user << "This device doesn't have any components installed." + return + var/list/component_names = list() + for(var/obj/item/weapon/computer_hardware/H in all_components) + component_names.Add(H.name) + + var/choice = input(usr, "Which component do you want to uninstall?", "Computer maintenance", null) as null|anything in component_names + + if(!choice) + return + + if(!Adjacent(usr)) + return + + var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(choice) + + if(!H) + return + + uninstall_component(user, H) + + return + + ..() + +// Used by processor to relay qdel() to machinery type. +/obj/item/modular_computer/proc/relay_qdel() + return + +// Attempts to install the hardware into apropriate slot. +/obj/item/modular_computer/proc/try_install_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0) + // "USB" flash drive. + if(istype(H, /obj/item/weapon/computer_hardware/hard_drive/portable)) + if(portable_drive) + user << "This computer's portable drive slot is already occupied by \the [portable_drive]." + return + found = 1 + portable_drive = H + else if(istype(H, /obj/item/weapon/computer_hardware/hard_drive)) + if(hard_drive) + user << "This computer's hard drive slot is already occupied by \the [hard_drive]." + return + found = 1 + hard_drive = H + else if(istype(H, /obj/item/weapon/computer_hardware/network_card)) + if(network_card) + user << "This computer's network card slot is already occupied by \the [network_card]." + return + found = 1 + network_card = H + else if(istype(H, /obj/item/weapon/computer_hardware/nano_printer)) + if(nano_printer) + user << "This computer's nano printer slot is already occupied by \the [nano_printer]." + return + found = 1 + nano_printer = H + else if(istype(H, /obj/item/weapon/computer_hardware/card_slot)) + if(card_slot) + user << "This computer's card slot is already occupied by \the [card_slot]." + return + found = 1 + card_slot = H + else if(istype(H, /obj/item/weapon/computer_hardware/battery_module)) + if(battery_module) + user << "This computer's battery slot is already occupied by \the [battery_module]." + return + found = 1 + battery_module = H + else if(istype(H, /obj/item/weapon/computer_hardware/processor_unit)) + if(processor_unit) + user << "This computer's processor slot is already occupied by \the [processor_unit]." + return + found = 1 + processor_unit = H + if(found) + user << "You install \the [H] into \the [src]" + H.holder2 = src + user.drop_from_inventory(H) + H.forceMove(src) + +// Uninstalls component. Found and Critical vars may be passed by parent types, if they have additional hardware. +/obj/item/modular_computer/proc/uninstall_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0, var/critical = 0) + if(portable_drive == H) + portable_drive = null + found = 1 + if(hard_drive == H) + hard_drive = null + found = 1 + critical = 1 + if(network_card == H) + network_card = null + found = 1 + if(nano_printer == H) + nano_printer = null + found = 1 + if(card_slot == H) + card_slot = null + found = 1 + if(battery_module == H) + battery_module = null + found = 1 + if(processor_unit == H) + processor_unit = null + found = 1 + critical = 1 + if(found) + user << "You remove \the [H] from \the [src]." + H.forceMove(get_turf(src)) + H.holder2 = null + if(critical && enabled) + user << "\The [src]'s screen freezes for few seconds and then displays an \"HARDWARE ERROR: Critical component disconnected. Please verify component connection and reboot the device. If the problem persists contact technical support for assistance.\" warning." + kill_program(1) + enabled = 0 + update_icon() + + +// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null +/obj/item/modular_computer/proc/find_hardware_by_name(var/name) + if(portable_drive && (portable_drive.name == name)) + return portable_drive + if(hard_drive && (hard_drive.name == name)) + return hard_drive + if(network_card && (network_card.name == name)) + return network_card + if(nano_printer && (nano_printer.name == name)) + return nano_printer + if(card_slot && (card_slot.name == name)) + return card_slot + if(battery_module && (battery_module.name == name)) + return battery_module + if(processor_unit && (processor_unit.name == name)) + return processor_unit + return null + +// Returns list of all components +/obj/item/modular_computer/proc/get_all_components() + var/list/all_components = list() + if(hard_drive) + all_components.Add(hard_drive) + if(network_card) + all_components.Add(network_card) + if(portable_drive) + all_components.Add(portable_drive) + if(nano_printer) + all_components.Add(nano_printer) + if(card_slot) + all_components.Add(card_slot) + if(battery_module) + all_components.Add(battery_module) + if(processor_unit) + all_components.Add(processor_unit) + return all_components + +/obj/item/modular_computer/proc/update_uis() + if(active_program) //Should we update program ui or computer ui? + nanomanager.update_uis(active_program) + if(active_program.NM) + nanomanager.update_uis(active_program.NM) + else + nanomanager.update_uis(src) + +/obj/item/modular_computer/proc/check_update_ui_need() + var/ui_updated_needed = 0 + if(battery_module) + var/batery_percent = battery_module.battery.percent() + if(last_battery_percent != batery_percent) //Let's update UI on percent chandge + ui_updated_needed = 1 + last_battery_percent = batery_percent + + if(worldtime2text() != last_world_time) + last_world_time = worldtime2text() + ui_updated_needed = 1 + + if(idle_threads.len) + var/list/current_header_icons = list() + for(var/datum/computer_file/program/P in idle_threads) + if(!P.ui_header) + continue + current_header_icons[P.type] = P.ui_header + if(!last_header_icons) + last_header_icons = current_header_icons + + else if(!listequal(last_header_icons, current_header_icons)) + last_header_icons = current_header_icons + ui_updated_needed = 1 + else + for(var/x in last_header_icons|current_header_icons) + if(last_header_icons[x]!=current_header_icons[x]) + last_header_icons = current_header_icons + ui_updated_needed = 1 + break + + if(ui_updated_needed) + update_uis() \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm new file mode 100644 index 00000000000..51a2647ab6c --- /dev/null +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -0,0 +1,121 @@ +// Held by /obj/machinery/modular_computer to reduce amount of copy-pasted code. +/obj/item/modular_computer/processor + name = "processing unit" + desc = "You shouldn't see this. If you do, report it." + icon = null + icon_state = null + icon_state_unpowered = null + icon_state_menu = null + hardware_flag = 0 + + var/obj/machinery/modular_computer/machinery_computer = null + +/obj/item/modular_computer/processor/Destroy() + if(machinery_computer && (machinery_computer.cpu == src)) + machinery_computer.cpu = null + machinery_computer = null + return ..() + +// Due to how processes work, we'd receive two process calls - one from machinery type and one from our own type. +// Since we want this to be in-sync with machinery (as it's hidden type for machinery-based computers) we'll ignore +// non-relayed process calls. +/obj/item/modular_computer/processor/process(var/relayed = 0) + if(relayed) + ..() + else + return + +// Power interaction is handled by our machinery part, due to machinery having APC connection. +/obj/item/modular_computer/processor/handle_power() + if(machinery_computer) + machinery_computer.handle_power() + +/obj/item/modular_computer/processor/New(var/comp) + if(!comp || !istype(comp, /obj/machinery/modular_computer)) + CRASH("Inapropriate type passed to obj/item/modular_computer/processor/New()! Aborting.") + return + // Obtain reference to machinery computer + machinery_computer = comp + machinery_computer.cpu = src + hardware_flag = machinery_computer.hardware_flag + max_hardware_size = machinery_computer.max_hardware_size + steel_sheet_cost = machinery_computer.steel_sheet_cost + +/obj/item/modular_computer/processor/relay_qdel() + qdel(machinery_computer) + +/obj/item/modular_computer/processor/find_hardware_by_name(var/N) + var/obj/item/weapon/computer_hardware/H = machinery_computer.find_hardware_by_name(N) + if(H) + return H + else + return ..() + +/obj/item/modular_computer/processor/update_icon() + if(machinery_computer) + return machinery_computer.update_icon() + +/obj/item/modular_computer/processor/get_header_data() + var/list/L = ..() + if(machinery_computer.tesla_link && machinery_computer.tesla_link.enabled && machinery_computer.powered()) + L["PC_apclinkicon"] = "charging.gif" + return L + +// Checks whether the machinery computer doesn't take power from APC network +/obj/item/modular_computer/processor/check_power_override() + if(!machinery_computer) + return 0 + if(!machinery_computer.tesla_link || !machinery_computer.tesla_link.enabled) + return 0 + return machinery_computer.powered() + +// This thing is not meant to be used on it's own, get topic data from our machinery owner. +/obj/item/modular_computer/processor/CanUseTopic(user, state) + if(!machinery_computer) + return 0 + return machinery_computer.CanUseTopic(user, state) + +/obj/item/modular_computer/processor/shutdown_computer() + if(!machinery_computer) + return + ..() + machinery_computer.update_icon() + machinery_computer.use_power = 0 + return + +// Tesla links only work on machinery types, so we'll override the default try_install_component() proc +/obj/item/modular_computer/processor/try_install_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0) + if(istype(H, /obj/item/weapon/computer_hardware/tesla_link)) + if(machinery_computer.tesla_link) + user << "This computer's tesla link slot is already occupied by \the [machinery_computer.tesla_link]." + return + var/obj/item/weapon/computer_hardware/tesla_link/L = H + L.holder = machinery_computer + machinery_computer.tesla_link = L + // Consoles don't usually have internal power source, so we can't disable tesla link in them. + if(istype(machinery_computer, /obj/machinery/modular_computer/console)) + L.critical = 1 + L.enabled = 1 + found = 1 + ..(user, H, found) + +/obj/item/modular_computer/processor/uninstall_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0, var/critical = 0) + if(machinery_computer.tesla_link == H) + machinery_computer.tesla_link = null + var/obj/item/weapon/computer_hardware/tesla_link/L = H + L.critical = 0 // That way we can install tesla link from console to laptop and it will be possible to turn it off via config. + L.holder = null + found = 1 + ..(user, H, found, critical) + +/obj/item/modular_computer/processor/get_all_components() + var/list/all_components = ..() + if(machinery_computer.tesla_link) + all_components.Add(machinery_computer.tesla_link) + return all_components + +// Perform adjacency checks on our machinery counterpart, rather than on ourselves. +/obj/item/modular_computer/processor/Adjacent(var/atom/neighbor) + if(!machinery_computer) + return 0 + return machinery_computer.Adjacent(neighbor) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm new file mode 100644 index 00000000000..1ca5eed7666 --- /dev/null +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -0,0 +1,9 @@ +/obj/item/modular_computer/tablet + name = "tablet computer" + icon = 'icons/obj/modular_tablet.dmi' + icon_state = "tablet" + icon_state_unpowered = "tablet" + icon_state_menu = "menu" + hardware_flag = PROGRAM_TABLET + max_hardware_size = 1 + w_class = 2 \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm new file mode 100644 index 00000000000..170f68b2ed5 --- /dev/null +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -0,0 +1,19 @@ + +// Available as custom loadout item, this is literally the worst possible cheap tablet +/obj/item/modular_computer/tablet/preset/custom_loadout/cheap/New() + . = ..() + desc = "A low-end tablet often seen among low ranked station personnel" + processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) + battery_module = new/obj/item/weapon/computer_hardware/battery_module/nano(src) + hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(src) + network_card = new/obj/item/weapon/computer_hardware/network_card(src) + +// Alternative version, an average one, for higher ranked positions mostly +/obj/item/modular_computer/tablet/preset/custom_loadout/advanced/New() + . = ..() + processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) + battery_module = new/obj/item/weapon/computer_hardware/battery_module(src) + hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(src) + network_card = new/obj/item/weapon/computer_hardware/network_card(src) + nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(src) + card_slot = new/obj/item/weapon/computer_hardware/card_slot(src) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm new file mode 100644 index 00000000000..9dafd2405c9 --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -0,0 +1,84 @@ +/obj/machinery/modular_computer/console/preset/ + // Can be changed to give devices specific hardware + var/_has_id_slot = 0 + var/_has_printer = 0 + var/_has_battery = 0 + +/obj/machinery/modular_computer/console/preset/New() + . = ..() + if(!cpu) + return + cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(cpu) + if(_has_id_slot) + cpu.card_slot = new/obj/item/weapon/computer_hardware/card_slot(cpu) + if(_has_printer) + cpu.nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(cpu) + if(_has_battery) + cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(cpu) + install_programs() + +// Override in child types to install preset-specific programs. +/obj/machinery/modular_computer/console/preset/proc/install_programs() + return + +// ===== ENGINEERING CONSOLE ===== +/obj/machinery/modular_computer/console/preset/engineering + console_department = "Engineering" + desc = "A stationary computer. This one comes preloaded with engineering programs." + +/obj/machinery/modular_computer/console/preset/engineering/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/power_monitor()) + cpu.hard_drive.store_file(new/datum/computer_file/program/alarm_monitor()) + cpu.hard_drive.store_file(new/datum/computer_file/program/atmos_control()) + cpu.hard_drive.store_file(new/datum/computer_file/program/rcon_console()) + + +// ===== MEDICAL CONSOLE ===== +/obj/machinery/modular_computer/console/preset/medical + console_department = "Medbay" + desc = "A stationary computer. This one comes preloaded with medical programs." + +/obj/machinery/modular_computer/console/preset/medical/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/suit_sensors()) + + +// ===== RESEARCH CONSOLE ===== +/obj/machinery/modular_computer/console/preset/research + console_department = "Medbay" + desc = "A stationary computer. This one comes preloaded with research programs." + +/obj/machinery/modular_computer/console/preset/research/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor()) + cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) + cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) + + +// ===== COMMAND CONSOLE ===== +/obj/machinery/modular_computer/console/preset/command + console_department = "Command" + desc = "A stationary computer. This one comes preloaded with command programs." + _has_id_slot = 1 + +/obj/machinery/modular_computer/console/preset/command/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) + cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod()) + + +// ===== SECURITY CONSOLE ===== +/obj/machinery/modular_computer/console/preset/security + console_department = "Security" + desc = "A stationary computer. This one comes preloaded with security programs." + +/obj/machinery/modular_computer/console/preset/security/install_programs() + return // No security programs exist, yet, but the preset is ready so it may be mapped in. + + +// ===== CIVILIAN CONSOLE ===== +/obj/machinery/modular_computer/console/preset/civilian + console_department = "Civilian" + desc = "A stationary computer. This one comes preloaded with generic programs." + +/obj/machinery/modular_computer/console/preset/civilian/install_programs() + cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) + cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) + diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm new file mode 100644 index 00000000000..213a45d13c6 --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -0,0 +1,143 @@ +// Modular Computer - device that runs various programs and operates with hardware +// DO NOT SPAWN THIS TYPE. Use /laptop/ or /console/ instead. +/obj/machinery/modular_computer/ + name = "modular computer" + desc = "An advanced computer" + + var/battery_powered = 0 // Whether computer should be battery powered. It is set automatically + use_power = 0 + var/hardware_flag = 0 // A flag that describes this device type + var/last_power_usage = 0 // Power usage during last tick + + // Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..) + // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently + // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example. + + icon = null + icon_state = null + var/icon_state_unpowered = null // Icon state when the computer is turned off + var/screen_icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. + var/screen_icon_screensaver = "standby" // Icon state overlay when the computer is powered, but not 'switched on'. + var/max_hardware_size = 0 // Maximal hardware size. Currently, tablets have 1, laptops 2 and consoles 3. Limits what hardware types can be installed. + var/steel_sheet_cost = 10 // Amount of steel sheets refunded when disassembling an empty frame of this computer. + + var/base_active_power_usage = 100 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too. + var/base_idle_power_usage = 10 // Power usage when the computer is idle and screen is off (currently only applies to laptops) + + var/obj/item/weapon/computer_hardware/tesla_link/tesla_link // Tesla Link component of this computer. Allows remote charging from nearest APC. + + var/obj/item/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things. + +/obj/machinery/modular_computer/attack_ghost(var/mob/dead/observer/user) + if(cpu) + cpu.attack_ghost(user) + +/obj/machinery/modular_computer/emag_act(var/remaining_charges, var/mob/user) + return cpu ? cpu.emag_act(remaining_charges, user) : NO_EMAG_ACT + +/obj/machinery/modular_computer/update_icon() + icon_state = icon_state_unpowered + overlays.Cut() + + if(!cpu || !cpu.enabled) + if (!(stat & NOPOWER) || battery_powered) + overlays.Add(screen_icon_screensaver) + return + if(cpu.active_program) + overlays.Add(cpu.active_program.program_icon_state ? cpu.active_program.program_icon_state : screen_icon_state_menu) + else + overlays.Add(screen_icon_state_menu) + +// Eject ID card from computer, if it has ID slot with card inside. +/obj/machinery/modular_computer/verb/eject_id() + set name = "Eject ID" + set category = "Object" + set src in view(1) + + if(cpu) + cpu.eject_id() + +/obj/machinery/modular_computer/New() + ..() + cpu = new(src) + +// On-click handling. Turns on the computer if it's off and opens the GUI. +/obj/machinery/modular_computer/attack_hand(mob/user) + if(cpu) + cpu.attack_self(user) // CPU is an item, that's why we route attack_hand to attack_self + +// Process currently calls handle_power(), may be expanded in future if more things are added. +/obj/machinery/modular_computer/process() + if(cpu) + // Keep names in sync. + cpu.name = src.name + cpu.process(1) + +// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null +/obj/machinery/modular_computer/proc/find_hardware_by_name(var/N) + if(tesla_link && (tesla_link.name == N)) + return tesla_link + return null + +// Used in following function to reduce copypaste +/obj/machinery/modular_computer/proc/power_failure() + if(cpu && cpu.enabled) // Shut down the computer + visible_message("\The [src]'s screen flickers [cpu.battery_module ? "\"BATTERY CRITICAL\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.") + if(cpu) + cpu.shutdown_computer(0) + battery_powered = 0 + update_icon() + stat |= NOPOWER + +// Called by cpu item's process() automatically, handles our power interaction. +/obj/machinery/modular_computer/proc/handle_power() + if(cpu.battery_module && cpu.battery_module.battery.charge <= 0) // Battery-run but battery is depleted. + power_failure() + return 0 + else if(!cpu.battery_module && (!powered() || !tesla_link || !tesla_link.enabled)) // Not battery run, but lacking APC connection. + power_failure() + return 0 + else if(stat & NOPOWER) + stat &= ~NOPOWER + + if(cpu.battery_module && cpu.battery_module.battery.charge) + battery_powered = 1 + else + battery_powered = 0 + + var/power_usage = cpu.screen_on ? base_active_power_usage : base_idle_power_usage + for(var/obj/item/weapon/computer_hardware/CH in src.cpu.get_all_components()) + if(CH.enabled) + power_usage += CH.power_usage + + // Wireless APC connection exists. + if(tesla_link && tesla_link.enabled) + idle_power_usage = power_usage + active_power_usage = idle_power_usage + 100 // APCLink only charges at 100W rate, but covers any power usage. + use_power = 1 + // Battery is not fully charged. Begin slowly recharging. + if(cpu.battery_module && (cpu.battery_module.battery.charge < cpu.battery_module.battery.maxcharge)) + use_power = 2 + + if(cpu.battery_module && powered() && (use_power == 2)) // Battery charging itself + cpu.battery_module.battery.give(100 * CELLRATE) + else if(cpu.battery_module && !powered()) // Unpowered, but battery covers the usage. + cpu.battery_module.battery.use(idle_power_usage * CELLRATE) + + else // No wireless connection run only on battery. + use_power = 0 + if (cpu.battery_module) + cpu.battery_module.battery.use(power_usage * CELLRATE) + cpu.last_power_usage = power_usage + +// Modular computers can have battery in them, we handle power in previous proc, so prevent this from messing it up for us. +/obj/machinery/modular_computer/power_change() + if(battery_powered) + return + else + ..() + +/obj/machinery/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(cpu) + return cpu.attackby(W, user) + return ..() diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm new file mode 100644 index 00000000000..96348865755 --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/modular_console.dm @@ -0,0 +1,45 @@ +/obj/machinery/modular_computer/console/ + name = "console" + desc = "A stationary computer." + + icon = 'icons/obj/modular_console.dmi' + icon_state = "console" + icon_state_unpowered = "console" + screen_icon_state_menu = "menu" + hardware_flag = PROGRAM_CONSOLE + var/console_department = "" // Used in New() to set network tag according to our area. + anchored = 1 + density = 1 + base_idle_power_usage = 100 + base_active_power_usage = 500 + max_hardware_size = 3 + steel_sheet_cost = 20 + +/obj/machinery/modular_computer/console/buildable/New() + ..() + // User-built consoles start as empty frames. + qdel(tesla_link) + qdel(cpu.network_card) + qdel(cpu.hard_drive) + +/obj/machinery/modular_computer/console/New() + ..() + cpu.battery_module = null + cpu.network_card = new/obj/item/weapon/computer_hardware/network_card/wired(src) + tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(src) + tesla_link.enabled = 1 + tesla_link.critical = 1 // Consoles don't usually come with cells, and this prevents people from disabling their only power source, as they wouldn't be able to enable it again. + cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/super(src) // Consoles generally have better HDDs due to lower space limitations + var/area/A = get_area(src) + // Attempts to set this console's tag according to our area. Since some areas have stuff like "XX - YY" in their names we try to remove that too. + if(A && console_department) + cpu.network_card.identification_string = replacetext(replacetext(replacetext("[A.name] [console_department] Console", " ", "_"), "-", ""), "__", "_") // Replace spaces with "_" + else if(A) + cpu.network_card.identification_string = replacetext(replacetext(replacetext("[A.name] Console", " ", "_"), "-", ""), "__", "_") + else if(console_department) + cpu.network_card.identification_string = replacetext(replacetext(replacetext("[console_department] Console", " ", "_"), "-", ""), "__", "_") + else + cpu.network_card.identification_string = "Unknown Console" + if(cpu) + cpu.screen_on = 1 + update_icon() \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/modular_laptop.dm b/code/modules/modular_computers/computers/machinery/modular_laptop.dm new file mode 100644 index 00000000000..ae6f891d9d9 --- /dev/null +++ b/code/modules/modular_computers/computers/machinery/modular_laptop.dm @@ -0,0 +1,107 @@ +// Laptop in it's item state, can be carried around. + +/obj/item/laptop + name = "laptop computer" + desc = "A portable computer. It is closed." + icon = 'icons/obj/modular_laptop.dmi' + icon_state = "laptop-closed" + item_state = "laptop-inhand" + w_class = 3 + var/obj/machinery/modular_computer/laptop/stored_computer = null + +/obj/item/laptop/verb/open_computer() + set name = "Open Laptop" + set category = "Object" + set src in view(1) + + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + if(!istype(loc,/turf)) + usr << "[src] is too bulky! You'll have to set it down." + return + + if(!stored_computer) + if(contents.len) + for(var/obj/O in contents) + O.forceMove(src.loc) + usr << "\The [src] crumbles to pieces." + spawn(5) + qdel(src) + return + + stored_computer.forceMove(src.loc) + stored_computer.stat &= ~MAINT + stored_computer.update_icon() + if(stored_computer.cpu) + stored_computer.cpu.screen_on = 1 + loc = stored_computer + usr << "You open \the [src]." + + +/obj/item/laptop/AltClick() + if(Adjacent(usr)) + open_computer() + +// The actual laptop +/obj/machinery/modular_computer/laptop + name = "laptop computer" + desc = "A portable computer" + var/obj/item/laptop/portable = null // Portable version of this computer, dropped on alt-click to allow transport. Used by laptops. + hardware_flag = PROGRAM_LAPTOP + icon_state_unpowered = "laptop-open" // Icon state when the computer is turned off + icon = 'icons/obj/modular_laptop.dmi' + icon_state = "laptop-open" + base_idle_power_usage = 25 + base_active_power_usage = 200 + max_hardware_size = 2 + +/obj/machinery/modular_computer/laptop/buildable/New() + ..() + // User-built consoles start as empty frames. + qdel(tesla_link) + qdel(cpu.network_card) + qdel(cpu.hard_drive) + +// Close the computer. collapsing it into movable item that can't be used. +/obj/machinery/modular_computer/laptop/verb/close_computer() + set name = "Close Laptop" + set category = "Object" + set src in view(1) + + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) + usr << "You can't do that." + return + + if(!Adjacent(usr)) + usr << "You can't reach it." + return + + close_laptop(usr) + +/obj/machinery/modular_computer/laptop/proc/close_laptop(mob/user = null) + if(istype(loc,/obj/item/laptop)) + return + if(!istype(loc,/turf)) + return + + if(!portable) + portable=new + portable.stored_computer = src + + portable.forceMove(src.loc) + src.forceMove(portable) + stat |= MAINT + if(user) + user << "You close \the [src]." + if(cpu) + cpu.screen_on = 0 + +/obj/machinery/modular_computer/laptop/AltClick() + if(Adjacent(usr)) + close_laptop() \ No newline at end of file diff --git a/code/modules/modular_computers/computers/status_icons.dmi b/code/modules/modular_computers/computers/status_icons.dmi new file mode 100644 index 00000000000..52127ec4842 Binary files /dev/null and b/code/modules/modular_computers/computers/status_icons.dmi differ diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm new file mode 100644 index 00000000000..c5c1d9e86e5 --- /dev/null +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -0,0 +1,39 @@ +var/global/file_uid = 0 + +/datum/computer_file/ + var/filename = "NewFile" // Placeholder. No spacebars + var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case + var/size = 1 // File size in GQ. Integers only! + var/obj/item/weapon/computer_hardware/hard_drive/holder // Holder that contains this file. + var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means. + var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc. + var/uid // UID of this file + +/datum/computer_file/New() + ..() + uid = file_uid + file_uid++ + +/datum/computer_file/Destroy() + if(!holder) + return ..() + + holder.remove_file(src) + // holder.holder is the computer that has drive installed. If we are Destroy()ing program that's currently running kill it. + if(holder.holder2 && holder.holder2.active_program == src) + holder.holder2.kill_program(1) + holder = null + ..() + +// Returns independent copy of this file. +/datum/computer_file/proc/clone(var/rename = 0) + var/datum/computer_file/temp = new type + temp.unsendable = unsendable + temp.undeletable = undeletable + temp.size = size + if(rename) + temp.filename = filename + "(Copy)" + else + temp.filename = filename + temp.filetype = filetype + return temp \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/data.dm b/code/modules/modular_computers/file_system/data.dm new file mode 100644 index 00000000000..4e4b8a1f8db --- /dev/null +++ b/code/modules/modular_computers/file_system/data.dm @@ -0,0 +1,18 @@ +// /data/ files store data in string format. +// They don't contain other logic for now. +/datum/computer_file/data + var/stored_data = "" // Stored data in string format. + filetype = "DAT" + +/datum/computer_file/data/clone() + var/datum/computer_file/data/temp = ..() + temp.stored_data = stored_data + return temp + +// Calculates file size from amount of characters in saved string +/datum/computer_file/data/proc/calculate_size(var/block_size = 250) + size = max(1, round(length(stored_data) / block_size)) + +/datum/computer_file/data/logfile + filetype = "LOG" + diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm new file mode 100644 index 00000000000..2f23f77559f --- /dev/null +++ b/code/modules/modular_computers/file_system/program.dm @@ -0,0 +1,135 @@ +// /program/ files are executable programs that do things. +/datum/computer_file/program + filetype = "PRG" + filename = "UnknownProgram" // File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET! + var/required_access = null // List of required accesses to *run* the program. + var/datum/nano_module/NM = null // If the program uses NanoModule, put it here and it will be automagically opened. Otherwise implement ui_interact. + var/nanomodule_path = null // Path to nanomodule, make sure to set this if implementing new program. + var/running = 0 // Set to 1 when the program is run and back to 0 when it's stopped. + var/obj/item/modular_computer/computer // Device that runs this program. + var/filedesc = "Unknown Program" // User-friendly name of this program. + var/extended_desc = "N/A" // Short description of this program's function. + var/program_icon_state = null // Program-specific screen icon state + var/requires_ntnet = 0 // Set to 1 for program to require nonstop NTNet connection to run. If NTNet connection is lost program crashes. + var/requires_ntnet_feature = 0 // Optional, if above is set to 1 checks for specific function of NTNet (currently NTNET_SOFTWAREDOWNLOAD, NTNET_PEERTOPEER, NTNET_SYSTEMCONTROL and NTNET_COMMUNICATION) + var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc. + var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL + var/network_destination = null // Optional string that describes what NTNet server/system this program connects to. Used in default logging. + var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable. + var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. + var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick + var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images! + + +/datum/computer_file/program/New(var/obj/item/modular_computer/comp = null) + ..() + if(comp && istype(comp)) + computer = comp + +/datum/computer_file/program/clone() + var/datum/computer_file/program/temp = ..() + temp.required_access = required_access + temp.nanomodule_path = nanomodule_path + temp.filedesc = filedesc + temp.program_icon_state = program_icon_state + temp.requires_ntnet = requires_ntnet + temp.requires_ntnet_feature = requires_ntnet_feature + temp.usage_flags = usage_flags + return temp + +// Relays icon update to the computer. +/datum/computer_file/program/proc/update_computer_icon() + if(computer) + computer.update_icon() + +// Attempts to create a log in global ntnet datum. Returns 1 on success, 0 on fail. +/datum/computer_file/program/proc/generate_network_log(var/text) + if(computer) + return computer.add_log(text) + return 0 + +/datum/computer_file/program/proc/is_supported_by_hardware(var/hardware_flag = 0, var/loud = 0, var/mob/user = null) + if(!(hardware_flag & usage_flags)) + if(loud && computer && user) + user << "\The [computer] flashes an \"Hardware Error - Incompatible software\" warning." + return 0 + return 1 + +// Called by Process() on device that runs us, once every tick. +/datum/computer_file/program/proc/process_tick() + return 1 + +// Check if the user can run program. Only humans can operate computer. Automatically called in run_program() +// User has to wear their ID or have it inhand for ID Scan to work. +// Can also be called manually, with optional parameter being access_to_check to scan the user's ID +/datum/computer_file/program/proc/can_run(var/mob/living/user, var/loud = 0, var/access_to_check) + // Defaults to required_access + if(!access_to_check) + access_to_check = required_access + if(!access_to_check) // No required_access, allow it. + return 1 + + var/obj/item/weapon/card/id/I = user.GetIdCard() + if(!I) + if(loud) + user << "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning." + return 0 + + if(access_to_check in I.access) + return 1 + else if(loud) + user << "\The [computer] flashes an \"Access Denied\" warning." + +// This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones +// always include the device here in this proc. This proc basically relays the request to whatever is running the program. +/datum/computer_file/program/proc/get_header_data() + if(computer) + return computer.get_header_data() + return list() + +// This is performed on program startup. May be overriden to add extra logic. Remember to include ..() call. Return 1 on success, 0 on failure. +// When implementing new program based device, use this to run the program. +/datum/computer_file/program/proc/run_program(var/mob/living/user) + if(can_run(user, 1)) + if(nanomodule_path) + NM = new nanomodule_path(computer) // Computer is passed here as it's (probably!) physical object. Some UI's perform get_turf() and passing program datum wouldn't go well with this. + NM.program = src // Set the program reference to separate variable, instead. + if(requires_ntnet && network_destination) + generate_network_log("Connection opened to [network_destination].") + running = 1 + return 1 + return 0 + +// Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. +/datum/computer_file/program/proc/kill_program(var/forced = 0) + running = 0 + if(network_destination) + generate_network_log("Connection to [network_destination] closed.") + if(NM) + qdel(NM) + NM = null + return 1 + +// This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation. +// It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable. +/datum/computer_file/program/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(!running) // Our program was closed. Close the ui if it exists. + if(ui) + ui.close() + return computer.ui_interact(user) + if(istype(NM)) + NM.ui_interact(user, ui_key, null, force_open) + return 0 + return 1 + + +// CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC: +// Topic calls are automagically forwarded from NanoModule this program contains. +// Calls beginning with "PRG_" are reserved for programs handling. +// Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program) +// ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE. +/datum/computer_file/program/Topic(href, href_list) + if(..()) + return 1 + if(computer) + return computer.Topic(href, href_list) diff --git a/code/modules/modular_computers/file_system/programs/_engineering.dm b/code/modules/modular_computers/file_system/programs/_engineering.dm new file mode 100644 index 00000000000..71bc0d475b3 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/_engineering.dm @@ -0,0 +1,85 @@ +// These programs are associated with engineering. + +/datum/computer_file/program/power_monitor + filename = "powermonitor" + filedesc = "Power Monitoring" + nanomodule_path = /datum/nano_module/power_monitor/ + program_icon_state = "power_monitor" + extended_desc = "This program connects to sensors around the station to provide information about electrical systems" + ui_header = "power_norm.gif" + required_access = access_engine + requires_ntnet = 1 + network_destination = "power monitoring system" + size = 9 + var/has_alert = 0 + +/datum/computer_file/program/power_monitor/process_tick() + ..() + var/datum/nano_module/power_monitor/NMA = NM + if(istype(NMA) && NMA.has_alarm()) + if(!has_alert) + program_icon_state = "power_monitor_warn" + ui_header = "power_warn.gif" + update_computer_icon() + has_alert = 1 + else + if(has_alert) + program_icon_state = "power_monitor" + ui_header = "power_norm.gif" + update_computer_icon() + has_alert = 0 + +/datum/computer_file/program/alarm_monitor + filename = "alarmmonitor" + filedesc = "Alarm Monitoring" + nanomodule_path = /datum/nano_module/alarm_monitor/engineering + ui_header = "alarm_green.gif" + program_icon_state = "alert-green" + extended_desc = "This program provides visual interface for station's alarm system." + requires_ntnet = 1 + network_destination = "alarm monitoring network" + size = 5 + var/has_alert = 0 + +/datum/computer_file/program/alarm_monitor/process_tick() + ..() + var/datum/nano_module/alarm_monitor/NMA = NM + if(istype(NMA) && NMA.has_major_alarms()) + if(!has_alert) + program_icon_state = "alert-red" + ui_header = "alarm_red.gif" + update_computer_icon() + has_alert = 1 + else + if(has_alert) + program_icon_state = "alert-green" + ui_header = "alarm_green.gif" + update_computer_icon() + has_alert = 0 + return 1 + +/datum/computer_file/program/atmos_control + filename = "atmoscontrol" + filedesc = "Atmosphere Control" + nanomodule_path = /datum/nano_module/atmos_control + program_icon_state = "atmos_control" + extended_desc = "This program allows remote control of air alarms around the station. This program can not be run on tablet computers." + required_access = access_atmospherics + requires_ntnet = 1 + network_destination = "atmospheric control system" + requires_ntnet_feature = NTNET_SYSTEMCONTROL + usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE + size = 17 + +/datum/computer_file/program/rcon_console + filename = "rconconsole" + filedesc = "RCON Remote Control" + nanomodule_path = /datum/nano_module/rcon + program_icon_state = "generic" + extended_desc = "This program allows remote control of power distribution systems around the station. This program can not be run on tablet computers." + required_access = access_engine + requires_ntnet = 1 + network_destination = "RCON remote control system" + requires_ntnet_feature = NTNET_SYSTEMCONTROL + usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE + size = 19 diff --git a/code/modules/modular_computers/file_system/programs/_medical.dm b/code/modules/modular_computers/file_system/programs/_medical.dm new file mode 100644 index 00000000000..4099d156bbb --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/_medical.dm @@ -0,0 +1,10 @@ +/datum/computer_file/program/suit_sensors + filename = "sensormonitor" + filedesc = "Suit Sensors Monitoring" + nanomodule_path = /datum/nano_module/crew_monitor + program_icon_state = "crew" + extended_desc = "This program connects to life signs monitoring system to provide basic information on crew health." + required_access = access_medical + requires_ntnet = 1 + network_destination = "crew lifesigns monitoring system" + size = 11 diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm new file mode 100644 index 00000000000..a3c2ee8cb61 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -0,0 +1,104 @@ +/datum/computer_file/program/ntnet_dos + filename = "ntn_dos" + filedesc = "DoS Traffic Generator" + program_icon_state = "hostile" + extended_desc = "This advanced script can perform denial of service attacks against NTNet quantum relays. The system administrator will probably notice this. Multiple devices can run this program together against same relay for increased effect" + size = 20 + requires_ntnet = 1 + available_on_ntnet = 0 + available_on_syndinet = 1 + nanomodule_path = /datum/nano_module/computer_dos/ + var/obj/machinery/ntnet_relay/target = null + var/dos_speed = 0 + var/error = "" + var/executed = 0 + +/datum/computer_file/program/ntnet_dos/process_tick() + dos_speed = 0 + switch(ntnet_status) + if(1) + dos_speed = NTNETSPEED_LOWSIGNAL * 10 + if(2) + dos_speed = NTNETSPEED_HIGHSIGNAL * 10 + if(3) + dos_speed = NTNETSPEED_ETHERNET * 10 + if(target && executed) + target.dos_overload += dos_speed + if(target.is_operational()) + target.dos_sources.Remove(src) + target = null + error = "Connection to destination relay lost." + +/datum/computer_file/program/ntnet_dos/kill_program(var/forced) + target.dos_sources.Remove(src) + target = null + executed = 0 + + ..(forced) + +/datum/nano_module/computer_dos + name = "DoS Traffic Generator" + +/datum/nano_module/computer_dos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(!ntnet_global) + return + var/datum/computer_file/program/ntnet_dos/PRG = program + var/list/data = list() + if(!istype(PRG)) + return + data = PRG.get_header_data() + + if(PRG.error) + data["error"] = PRG.error + else if(PRG.target && PRG.executed) + data["target"] = 1 + data["speed"] = PRG.dos_speed + + // This is mostly visual, generate some strings of 1s and 0s + // Probability of 1 is equal of completion percentage of DoS attack on this relay. + // Combined with UI updates this adds quite nice effect to the UI + var/percentage = PRG.target.dos_overload * 100 / PRG.target.dos_capacity + var/list/strings[0] + for(var/j, j<10, j++) + var/string = "" + for(var/i, i<20, i++) + string = "[string][prob(percentage)]" + strings.Add(string) + data["dos_strings"] = strings + else + var/list/relays[0] + for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) + relays.Add(R.uid) + data["relays"] = relays + data["focus"] = PRG.target ? PRG.target.uid : null + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_dos.tmpl", "DoS Traffic Generator", 400, 250, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/computer_file/program/ntnet_dos/Topic(href, href_list) + if(..()) + return 1 + if(href_list["PRG_target_relay"]) + for(var/obj/machinery/ntnet_relay/R in ntnet_global.relays) + if("[R.uid]" == href_list["PRG_target_relay"]) + target = R + return 1 + if(href_list["PRG_reset"]) + target.dos_sources.Remove(src) + target = null + executed = 0 + error = "" + return 1 + if(href_list["PRG_execute"]) + if(target) + executed = 1 + target.dos_sources.Add(src) + if(ntnet_global.intrusion_detection_enabled) + ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [computer.network_card.get_network_tag()]") + ntnet_global.intrusion_detection_alarm = 1 + return 1 diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm new file mode 100644 index 00000000000..6a7d593dace --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -0,0 +1,79 @@ +/datum/computer_file/program/revelation + filename = "revelation" + filedesc = "Revelation" + program_icon_state = "hostile" + extended_desc = "This virus can destroy hard drive of system it is executed on. It may be obfuscated to look like another non-malicious program. Once armed, it will destroy the system upon next execution." + size = 13 + requires_ntnet = 0 + available_on_ntnet = 0 + available_on_syndinet = 1 + nanomodule_path = /datum/nano_module/revelation/ + var/armed = 0 + +/datum/computer_file/program/revelation/run_program(var/mob/living/user) + . = ..(user) + if(armed) + activate() + +/datum/computer_file/program/revelation/proc/activate() + if(computer) + computer.visible_message("\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.") + computer.enabled = 0 + computer.update_icon() + qdel(computer.hard_drive) + if(computer.battery_module && prob(25)) + qdel(computer.battery_module) + computer.visible_message("\The [computer]'s battery explodes in rain of sparks.") + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(10, 1, computer.loc) + s.start() + if(istype(computer, /obj/item/modular_computer/processor)) + var/obj/item/modular_computer/processor/P = computer + if(P.machinery_computer.tesla_link && prob(50)) + qdel(P.machinery_computer.tesla_link) + computer.visible_message("\The [computer]'s tesla link explodes in rain of sparks.") + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(10, 1, computer.loc) + s.start() + +/datum/computer_file/program/revelation/Topic(href, href_list) + if(..()) + return 1 + else if(href_list["PRG_arm"]) + armed = !armed + else if(href_list["PRG_activate"]) + activate() + else if(href_list["PRG_obfuscate"]) + var/mob/living/user = usr + var/newname = sanitize(input(user, "Enter new program name: ")) + if(!newname) + return + filedesc = newname + return 1 + +/datum/computer_file/program/revelation/clone() + var/datum/computer_file/program/revelation/temp = ..() + temp.armed = armed + return temp + +/datum/nano_module/revelation + name = "Revelation Virus" + +/datum/nano_module/revelation/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/datum/computer_file/program/revelation/PRG = program + if(!istype(PRG)) + return + + data = PRG.get_header_data() + + data["armed"] = PRG.armed + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "revelation.tmpl", "Revelation Virus", 400, 250, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm new file mode 100644 index 00000000000..72ebd37f391 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -0,0 +1,231 @@ +/datum/computer_file/program/card_mod + filename = "cardmod" + filedesc = "ID card modification program" + nanomodule_path = /datum/nano_module/card_mod + program_icon_state = "id" + extended_desc = "Program for programming employee ID cards to access parts of the station." + required_access = access_change_ids + requires_ntnet = 0 + size = 8 + +/datum/nano_module/card_mod + name = "ID card modification program" + var/mod_mode = 1 + var/is_centcom = 0 + var/show_assignments = 0 + +/datum/nano_module/card_mod/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() + if(program) + data = program.get_header_data() + + data["src"] = "\ref[src]" + data["station_name"] = station_name() + data["manifest"] = data_core ? data_core.get_manifest(0) : null + data["assignments"] = show_assignments + if(program && program.computer) + data["have_id_slot"] = !!program.computer.card_slot + data["have_printer"] = !!program.computer.nano_printer + data["authenticated"] = program.can_run(user) + if(!program.computer.card_slot) + mod_mode = 0 //We can't modify IDs when there is no card reader + else + data["have_id_slot"] = 0 + data["have_printer"] = 0 + data["authenticated"] = 0 + data["mmode"] = mod_mode + data["centcom_access"] = is_centcom + + if(program && program.computer && program.computer.card_slot) + var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + data["has_id"] = !!id_card + data["id_account_number"] = id_card ? id_card.associated_account_number : null + data["id_rank"] = id_card && id_card.assignment ? id_card.assignment : "Unassigned" + data["id_owner"] = id_card && id_card.registered_name ? id_card.registered_name : "-----" + data["id_name"] = id_card ? id_card.name : "-----" + + + data["engineering_jobs"] = format_jobs(engineering_positions) + data["medical_jobs"] = format_jobs(medical_positions) + data["science_jobs"] = format_jobs(science_positions) + data["security_jobs"] = format_jobs(security_positions) + data["cargo_jobs"] = format_jobs(cargo_positions) + data["civilian_jobs"] = format_jobs(civilian_positions) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + + data["all_centcom_access"] = is_centcom ? get_accesses(1) : null + data["regions"] = get_accesses() + + if(program.computer.card_slot.stored_card) + var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + if(is_centcom) + var/list/all_centcom_access = list() + for(var/access in get_all_centcom_access()) + all_centcom_access.Add(list(list( + "desc" = replacetext(get_centcom_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in id_card.access) ? 1 : 0))) + data["all_centcom_access"] = all_centcom_access + else + var/list/regions = list() + for(var/i = 1; i <= 7; i++) + var/list/accesses = list() + for(var/access in get_region_accesses(i)) + if (get_access_desc(access)) + accesses.Add(list(list( + "desc" = replacetext(get_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in id_card.access) ? 1 : 0))) + + regions.Add(list(list( + "name" = get_region_accesses_name(i), + "accesses" = accesses))) + data["regions"] = regions + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "identification_computer.tmpl", name, 600, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + +/datum/nano_module/card_mod/proc/format_jobs(list/jobs) + var/obj/item/weapon/card/id/id_card = program.computer.card_slot.stored_card + var/list/formatted = list() + for(var/job in jobs) + formatted.Add(list(list( + "display_name" = replacetext(job, " ", " "), + "target_rank" = id_card && id_card.assignment ? id_card.assignment : "Unassigned", + "job" = job))) + + return formatted + +/datum/nano_module/card_mod/proc/get_accesses(var/is_centcom = 0) + + return null + + +/datum/computer_file/program/card_mod/Topic(href, href_list) + if(..()) + return 1 + + var/mob/user = usr + var/obj/item/weapon/card/id/user_id_card = user.GetIdCard() + var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card + var/datum/nano_module/card_mod/module = NM + switch(href_list["action"]) + if("switchm") + if(href_list["target"] == "mod") + module.mod_mode = 1 + else if (href_list["target"] == "manifest") + module.mod_mode = 0 + if("togglea") + if(module.show_assignments) + module.show_assignments = 0 + else + module.show_assignments = 1 + if("print") + if(computer && computer.nano_printer) //This option should never be called if there is no printer + if(module.mod_mode) + if(can_run(user, 1)) + var/contents = {"

      Access Report

      + Prepared By: [user_id_card.registered_name ? user_id_card.registered_name : "Unknown"]
      + For: [id_card.registered_name ? id_card.registered_name : "Unregistered"]
      +
      + Assignment: [id_card.assignment]
      + Account Number: #[id_card.associated_account_number]
      + Blood Type: [id_card.blood_type]

      + Access:
      + "} + + var/known_access_rights = get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM) + for(var/A in id_card.access) + if(A in known_access_rights) + contents += " [get_access_desc(A)]" + + if(!computer.nano_printer.print_text(contents,"access report")) + usr << "Hardware error: Printer was unable to print the file. It may be out of paper." + return + else + computer.visible_message("[computer] prints out paper.") + else + var/contents = {"

      Crew Manifest

      +
      + [data_core ? data_core.get_manifest(0) : ""] + "} + if(!computer.nano_printer.print_text(contents,text("crew manifest ([])", worldtime2text()))) + usr << "Hardware error: Printer was unable to print the file. It may be out of paper." + return + else + computer.visible_message("[computer] prints out paper.") + if("eject") + if(computer && computer.card_slot) + if(id_card) + data_core.manifest_modify(id_card.registered_name, id_card.assignment) + computer.proc_eject_id(user) + if("terminate") + if(computer && can_run(user, 1)) + id_card.assignment = "Terminated" + remove_nt_access(id_card) + callHook("terminate_employee", list(id_card)) + if("edit") + if(computer && can_run(user, 1)) + if(href_list["name"]) + var/temp_name = sanitizeName(input("Enter name.", "Name", id_card.registered_name)) + if(temp_name) + id_card.registered_name = temp_name + else + computer.visible_message("[computer] buzzes rudely.") + else if(href_list["account"]) + var/account_num = text2num(input("Enter account number.", "Account", id_card.associated_account_number)) + id_card.associated_account_number = account_num + if("assign") + if(computer && can_run(user, 1) && id_card) + var/t1 = href_list["assign_target"] + if(t1 == "Custom") + var/temp_t = sanitize(input("Enter a custom job assignment.","Assignment", id_card.assignment), 45) + //let custom jobs function as an impromptu alt title, mainly for sechuds + if(temp_t) + id_card.assignment = temp_t + else + var/list/access = list() + if(module.is_centcom) + access = get_centcom_access(t1) + else + var/datum/job/jobdatum + for(var/jobtype in typesof(/datum/job)) + var/datum/job/J = new jobtype + if(ckey(J.title) == ckey(t1)) + jobdatum = J + break + if(!jobdatum) + usr << "No log exists for this job: [t1]" + return + + access = jobdatum.get_access() + + remove_nt_access(id_card) + apply_access(id_card, access) + id_card.assignment = t1 + id_card.rank = t1 + + callHook("reassign_employee", list(id_card)) + if("access") + if(href_list["allowed"] && computer && can_run(user, 1)) + var/access_type = text2num(href_list["access_target"]) + var/access_allowed = text2num(href_list["allowed"]) + if(access_type in get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM)) + id_card.access -= access_type + if(!access_allowed) + id_card.access += access_type + if(id_card) + id_card.name = text("[id_card.registered_name]'s ID Card ([id_card.assignment])") + + nanomanager.update_uis(NM) + return 1 + +/datum/computer_file/program/card_mod/proc/remove_nt_access(var/obj/item/weapon/card/id/id_card) + id_card.access -= get_access_ids(ACCESS_TYPE_STATION|ACCESS_TYPE_CENTCOM) + +/datum/computer_file/program/card_mod/proc/apply_access(var/obj/item/weapon/card/id/id_card, var/list/accesses) + id_card.access |= accesses diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm new file mode 100644 index 00000000000..05f121b6523 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -0,0 +1,62 @@ +// This is special hardware configuration program. +// It is to be used only with modular computers. +// It allows you to toggle components of your device. + +/datum/computer_file/program/computerconfig + filename = "compconfig" + filedesc = "Computer Configuration Tool" + extended_desc = "This program allows configuration of computer's hardware" + program_icon_state = "generic" + unsendable = 1 + undeletable = 1 + size = 4 + available_on_ntnet = 0 + requires_ntnet = 0 + nanomodule_path = /datum/nano_module/computer_configurator/ + +/datum/nano_module/computer_configurator + name = "NTOS Computer Configuration Tool" + var/obj/item/modular_computer/movable = null + +/datum/nano_module/computer_configurator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(program) + movable = program.computer + if(!istype(movable)) + movable = null + + // No computer connection, we can't get data from that. + if(!movable) + return 0 + + var/list/data = list() + + if(program) + data = program.get_header_data() + + var/list/hardware = movable.get_all_components() + + data["disk_size"] = movable.hard_drive.max_capacity + data["disk_used"] = movable.hard_drive.used_capacity + data["power_usage"] = movable.last_power_usage + data["battery_exists"] = movable.battery_module ? 1 : 0 + if(movable.battery_module) + data["battery_rating"] = movable.battery_module.battery.maxcharge + data["battery_percent"] = round(movable.battery_module.battery.percent()) + + var/list/all_entries[0] + for(var/obj/item/weapon/computer_hardware/H in hardware) + all_entries.Add(list(list( + "name" = H.name, + "desc" = H.desc, + "enabled" = H.enabled, + "critical" = H.critical, + "powerusage" = H.power_usage + ))) + + data["hardware"] = all_entries + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "laptop_configuration.tmpl", "NTOS Configuration Utility", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm new file mode 100644 index 00000000000..89f13eb3ae0 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -0,0 +1,242 @@ +/datum/computer_file/program/filemanager + filename = "filemanager" + filedesc = "NTOS File Manager" + extended_desc = "This program allows management of files." + program_icon_state = "generic" + size = 8 + requires_ntnet = 0 + available_on_ntnet = 0 + undeletable = 1 + nanomodule_path = /datum/nano_module/computer_filemanager/ + var/open_file + var/error + +/datum/computer_file/program/filemanager/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["PRG_openfile"]) + . = 1 + open_file = href_list["PRG_openfile"] + if(href_list["PRG_newtextfile"]) + . = 1 + var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename")) + if(!newname) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = new/datum/computer_file/data() + F.filename = newname + F.filetype = "TXT" + HDD.store_file(F) + if(href_list["PRG_deletefile"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_deletefile"]) + if(!file || file.undeletable) + return 1 + HDD.remove_file(file) + if(href_list["PRG_usbdeletefile"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.portable_drive + if(!RHDD) + return 1 + var/datum/computer_file/file = RHDD.find_file_by_name(href_list["PRG_usbdeletefile"]) + if(!file || file.undeletable) + return 1 + RHDD.remove_file(file) + if(href_list["PRG_closefile"]) + . = 1 + open_file = null + error = null + if(href_list["PRG_clone"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_clone"]) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(1) + HDD.store_file(C) + if(href_list["PRG_rename"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/file = HDD.find_file_by_name(href_list["PRG_rename"]) + if(!file || !istype(file)) + return 1 + var/newname = sanitize(input(usr, "Enter new file name:", "File rename", file.filename)) + if(file && newname) + file.filename = newname + if(href_list["PRG_edit"]) + . = 1 + if(!open_file) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) + if(!F || !istype(F)) + return 1 + // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently. + var/newtext = sanitize(html_decode(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", F.stored_data) as message), 16384) + if(F) + var/datum/computer_file/data/backup = F.clone() + HDD.remove_file(F) + F.stored_data = newtext + F.calculate_size() + // We can't store the updated file, it's probably too large. Print an error and restore backed up version. + // This is mostly intended to prevent people from losing texts they spent lot of time working on due to running out of space. + // They will be able to copy-paste the text from error screen and store it in notepad or something. + if(!HDD.store_file(F)) + error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:

      [F.stored_data]

      " + HDD.store_file(backup) + if(href_list["PRG_printfile"]) + . = 1 + if(!open_file) + return 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + if(!HDD) + return 1 + var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) + if(!F || !istype(F)) + return 1 + if(!computer.nano_printer) + error = "Missing Hardware: Your computer does not have required hardware to complete this operation." + return 1 + if(!computer.nano_printer.print_text(parse_tags(F.stored_data))) + error = "Hardware error: Printer was unable to print the file. It may be out of paper." + return 1 + if(href_list["PRG_copytousb"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive + if(!HDD || !RHDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_copytousb"]) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(0) + RHDD.store_file(C) + if(href_list["PRG_copyfromusb"]) + . = 1 + var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive + if(!HDD || !RHDD) + return 1 + var/datum/computer_file/F = RHDD.find_file_by_name(href_list["PRG_copyfromusb"]) + if(!F || !istype(F)) + return 1 + var/datum/computer_file/C = F.clone(0) + HDD.store_file(C) + if(.) + nanomanager.update_uis(NM) + +/datum/computer_file/program/filemanager/proc/parse_tags(var/t) + t = replacetext(t, "\[center\]", "
      ") + t = replacetext(t, "\[/center\]", "
      ") + t = replacetext(t, "\[br\]", "
      ") + t = replacetext(t, "\[b\]", "") + t = replacetext(t, "\[/b\]", "") + t = replacetext(t, "\[i\]", "") + 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, "\[h1\]", "

      ") + t = replacetext(t, "\[/h1\]", "

      ") + t = replacetext(t, "\[h2\]", "

      ") + t = replacetext(t, "\[/h2\]", "

      ") + t = replacetext(t, "\[h3\]", "

      ") + t = replacetext(t, "\[/h3\]", "

      ") + t = replacetext(t, "\[*\]", "
    12. ") + t = replacetext(t, "\[hr\]", "
      ") + t = replacetext(t, "\[small\]", "") + t = replacetext(t, "\[/small\]", "") + t = replacetext(t, "\[list\]", "
        ") + t = replacetext(t, "\[/list\]", "
      ") + t = replacetext(t, "\[table\]", "") + t = replacetext(t, "\[/table\]", "
      ") + t = replacetext(t, "\[grid\]", "") + t = replacetext(t, "\[/grid\]", "
      ") + t = replacetext(t, "\[row\]", "") + t = replacetext(t, "\[tr\]", "") + t = replacetext(t, "\[td\]", "") + t = replacetext(t, "\[cell\]", "") + t = replacetext(t, "\[logo\]", "") + return t + + +/datum/nano_module/computer_filemanager + name = "NTOS File Manager" + +/datum/nano_module/computer_filemanager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + + var/datum/computer_file/program/filemanager/PRG + var/list/data = list() + if(program) + data = program.get_header_data() + PRG = program + else + return + + var/obj/item/weapon/computer_hardware/hard_drive/HDD + var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD + if(PRG.error) + data["error"] = PRG.error + if(PRG.open_file) + var/datum/computer_file/data/file + + if(!PRG.computer || !PRG.computer.hard_drive) + data["error"] = "I/O ERROR: Unable to access hard drive." + else + HDD = PRG.computer.hard_drive + file = HDD.find_file_by_name(PRG.open_file) + if(!istype(file)) + data["error"] = "I/O ERROR: Unable to open file." + else + data["filedata"] = PRG.parse_tags(file.stored_data) + data["filename"] = "[file.filename].[file.filetype]" + else + if(!PRG.computer || !PRG.computer.hard_drive) + data["error"] = "I/O ERROR: Unable to access hard drive." + else + HDD = PRG.computer.hard_drive + RHDD = PRG.computer.portable_drive + var/list/files[0] + for(var/datum/computer_file/F in HDD.stored_files) + files.Add(list(list( + "name" = F.filename, + "type" = F.filetype, + "size" = F.size, + "undeletable" = F.undeletable + ))) + data["files"] = files + if(RHDD) + data["usbconnected"] = 1 + var/list/usbfiles[0] + for(var/datum/computer_file/F in RHDD.stored_files) + usbfiles.Add(list(list( + "name" = F.filename, + "type" = F.filetype, + "size" = F.size, + "undeletable" = F.undeletable + ))) + data["usbfiles"] = usbfiles + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "file_manager.tmpl", "NTOS File Manager", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + + diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm new file mode 100644 index 00000000000..1703f55ca78 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -0,0 +1,164 @@ +/datum/computer_file/program/ntnetdownload + filename = "ntndownloader" + filedesc = "NTNet Software Download Tool" + program_icon_state = "generic" + extended_desc = "This program allows downloads of software from official NT repositories" + unsendable = 1 + undeletable = 1 + size = 4 + requires_ntnet = 1 + requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD + available_on_ntnet = 0 + nanomodule_path = /datum/nano_module/computer_ntnetdownload/ + ui_header = "downloader_finished.gif" + var/datum/computer_file/program/downloaded_file = null + var/hacked_download = 0 + var/download_completion = 0 //GQ of downloaded data. + var/download_netspeed = 0 + var/downloaderror = "" + +/datum/computer_file/program/ntnetdownload/proc/begin_file_download(var/filename) + if(downloaded_file) + return 0 + + var/datum/computer_file/program/PRG = ntnet_global.find_ntnet_file_by_name(filename) + + if(!PRG || !istype(PRG)) + return 0 + + // Attempting to download antag only program, but without having emagged computer. No. + if(PRG.available_on_syndinet && !computer_emagged) + return 0 + + if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG)) + return 0 + + ui_header = "downloader_running.gif" + + if(PRG in ntnet_global.available_station_software) + generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.") + hacked_download = 0 + else if(PRG in ntnet_global.available_antag_software) + generate_network_log("Began downloading file **ENCRYPTED**.[PRG.filetype] from unspecified server.") + hacked_download = 1 + else + generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from unspecified server.") + hacked_download = 0 + + downloaded_file = PRG.clone() + +/datum/computer_file/program/ntnetdownload/proc/abort_file_download() + if(!downloaded_file) + return + generate_network_log("Aborted download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].") + downloaded_file = null + download_completion = 0 + ui_header = "downloader_finished.gif" + +/datum/computer_file/program/ntnetdownload/proc/complete_file_download() + if(!downloaded_file) + return + generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].") + if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(downloaded_file)) + // The download failed + downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance." + downloaded_file = null + download_completion = 0 + ui_header = "downloader_finished.gif" + +/datum/computer_file/program/ntnetdownload/process_tick() + if(!downloaded_file) + return + if(download_completion >= downloaded_file.size) + complete_file_download() + // Download speed according to connectivity state. NTNet server is assumed to be on unlimited speed so we're limited by our local connectivity + download_netspeed = 0 + // Speed defines are found in misc.dm + switch(ntnet_status) + if(1) + download_netspeed = NTNETSPEED_LOWSIGNAL + if(2) + download_netspeed = NTNETSPEED_HIGHSIGNAL + if(3) + download_netspeed = NTNETSPEED_ETHERNET + download_completion += download_netspeed + +/datum/computer_file/program/ntnetdownload/Topic(href, href_list) + if(..()) + return 1 + if(href_list["PRG_downloadfile"]) + if(!downloaded_file) + begin_file_download(href_list["PRG_downloadfile"]) + return 1 + if(href_list["PRG_reseterror"]) + if(downloaderror) + download_completion = 0 + download_netspeed = 0 + downloaded_file = null + downloaderror = "" + return 1 + return 0 + +/datum/nano_module/computer_ntnetdownload + name = "Network Downloader" + var/obj/item/modular_computer/my_computer = null + +/datum/nano_module/computer_ntnetdownload/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(program) + my_computer = program.computer + + if(!istype(my_computer)) + return + + var/list/data = list() + var/datum/computer_file/program/ntnetdownload/prog = program + // For now limited to execution by the downloader program + if(!prog || !istype(prog)) + return + if(program) + data = program.get_header_data() + + // This IF cuts on data transferred to client, so i guess it's worth it. + if(prog.downloaderror) // Download errored. Wait until user resets the program. + data["error"] = prog.downloaderror + else if(prog.downloaded_file) // Download running. Wait please.. + data["downloadname"] = prog.downloaded_file.filename + data["downloaddesc"] = prog.downloaded_file.filedesc + data["downloadsize"] = prog.downloaded_file.size + data["downloadspeed"] = prog.download_netspeed + data["downloadcompletion"] = round(prog.download_completion, 0.1) + else // No download running, pick file. + data["disk_size"] = my_computer.hard_drive.max_capacity + data["disk_used"] = my_computer.hard_drive.used_capacity + var/list/all_entries[0] + for(var/datum/computer_file/program/P in ntnet_global.available_station_software) + // Only those programs our user can run will show in the list + if(!P.can_run(user)) + continue + all_entries.Add(list(list( + "filename" = P.filename, + "filedesc" = P.filedesc, + "fileinfo" = P.extended_desc, + "size" = P.size + ))) + data["hackedavailable"] = 0 + if(prog.computer_emagged) // If we are running on emagged computer we have access to some "bonus" software + var/list/hacked_programs[0] + for(var/datum/computer_file/program/P in ntnet_global.available_antag_software) + data["hackedavailable"] = 1 + hacked_programs.Add(list(list( + "filename" = P.filename, + "filedesc" = P.filedesc, + "fileinfo" = P.extended_desc, + "size" = P.size + ))) + data["hacked_programs"] = hacked_programs + + data["downloadable_programs"] = all_entries + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_downloader.tmpl", "NTNet Download Program", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm new file mode 100644 index 00000000000..b2acc223cf0 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -0,0 +1,91 @@ +/datum/computer_file/program/ntnetmonitor + filename = "ntmonitor" + filedesc = "NTNet Diagnostics and Monitoring" + program_icon_state = "comm_monitor" + extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes" + size = 12 + requires_ntnet = 1 + required_access = access_network + available_on_ntnet = 1 + nanomodule_path = /datum/nano_module/computer_ntnetmonitor/ + +/datum/nano_module/computer_ntnetmonitor + name = "NTNet Diagnostics and Monitoring" + +/datum/nano_module/computer_ntnetmonitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(!ntnet_global) + return + + var/list/data = list() + if(program) + data = program.get_header_data() + + + data["ntnetstatus"] = ntnet_global.check_function() + data["ntnetrelays"] = ntnet_global.relays.len + data["idsstatus"] = ntnet_global.intrusion_detection_enabled + data["idsalarm"] = ntnet_global.intrusion_detection_alarm + + data["config_softwaredownload"] = ntnet_global.setting_softwaredownload + data["config_peertopeer"] = ntnet_global.setting_peertopeer + data["config_communication"] = ntnet_global.setting_communication + data["config_systemcontrol"] = ntnet_global.setting_systemcontrol + + data["ntnetlogs"] = ntnet_global.logs + data["ntnetmaxlogs"] = ntnet_global.setting_maxlogcount + + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_monitor.tmpl", "NTNet Diagnostics and Monitoring Tool", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/nano_module/computer_ntnetmonitor/Topic(href, href_list) + if(..()) + return 1 + if(href_list["resetIDS"]) + . = 1 + if(ntnet_global) + ntnet_global.resetIDS() + return 1 + if(href_list["toggleIDS"]) + . = 1 + if(ntnet_global) + ntnet_global.toggleIDS() + return 1 + if(href_list["toggleWireless"]) + . = 1 + if(!ntnet_global) + return 1 + + // NTNet is disabled. Enabling can be done without user prompt + if(ntnet_global.setting_disabled) + ntnet_global.setting_disabled = 0 + return 1 + + // NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on) + var/mob/user = usr + if(!user) + return 1 + var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No") + if(response == "Yes") + ntnet_global.setting_disabled = 1 + return 1 + if(href_list["purgelogs"]) + . = 1 + if(ntnet_global) + ntnet_global.purge_logs() + if(href_list["updatemaxlogs"]) + . = 1 + var/mob/user = usr + var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):")) + if(ntnet_global) + ntnet_global.update_max_log_count(logcount) + if(href_list["toggle_function"]) + . = 1 + if(!ntnet_global) + return 1 + ntnet_global.toggle_function(href_list["toggle_function"]) diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm new file mode 100644 index 00000000000..58a1c82c157 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -0,0 +1,230 @@ +/datum/computer_file/program/chatclient + filename = "ntnrc_client" + filedesc = "NTNet Relay Chat Client" + program_icon_state = "command" + extended_desc = "This program allows communication over NTNRC network" + size = 8 + requires_ntnet = 1 + requires_ntnet_feature = NTNET_COMMUNICATION + network_destination = "NTNRC server" + ui_header = "ntnrc_idle.gif" + available_on_ntnet = 1 + nanomodule_path = /datum/nano_module/computer_chatclient/ + var/last_message = null // Used to generate the toolbar icon + var/username + var/datum/ntnet_conversation/channel = null + var/operator_mode = 0 // Channel operator mode + var/netadmin_mode = 0 // Administrator mode (invisible to other users + bypasses passwords) + +/datum/computer_file/program/chatclient/New() + username = "DefaultUser[rand(100, 999)]" + +/datum/computer_file/program/chatclient/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["PRG_speak"]) + . = 1 + if(!channel) + return 1 + var/mob/living/user = usr + var/message = sanitize(input(user, "Enter message or leave blank to cancel: ")) + if(!message || !channel) + return + channel.add_message(message, username) + + if(href_list["PRG_joinchannel"]) + . = 1 + var/datum/ntnet_conversation/C + for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels) + if(chan.id == text2num(href_list["PRG_joinchannel"])) + C = chan + break + + if(!C) + return 1 + + if(netadmin_mode) + channel = C // Bypasses normal leave/join and passwords. Technically makes the user invisible to others. + return 1 + + if(C.password) + var/mob/living/user = usr + var/password = sanitize(input(user,"Access Denied. Enter password:")) + if(C && (password == C.password)) + C.add_client(src) + channel = C + return 1 + C.add_client(src) + channel = C + if(href_list["PRG_leavechannel"]) + . = 1 + if(channel) + channel.remove_client(src) + channel = null + if(href_list["PRG_newchannel"]) + . = 1 + var/mob/living/user = usr + var/channel_title = sanitize(input(user,"Enter channel name or leave blank to cancel:")) + if(!channel_title) + return + var/datum/ntnet_conversation/C = new/datum/ntnet_conversation() + C.add_client(src) + C.operator = src + channel = C + C.title = channel_title + if(href_list["PRG_toggleadmin"]) + . = 1 + if(netadmin_mode) + netadmin_mode = 0 + if(channel) + channel.remove_client(src) // We shouldn't be in channel's user list, but just in case... + channel = null + return 1 + var/mob/living/user = usr + if(can_run(usr, 1, access_network)) + if(channel) + var/response = alert(user, "Really engage admin-mode? You will be disconnected from your current channel!", "NTNRC Admin mode", "Yes", "No") + if(response == "Yes") + if(channel) + channel.remove_client(src) + channel = null + else + return + netadmin_mode = 1 + if(href_list["PRG_changename"]) + . = 1 + var/mob/living/user = usr + var/newname = sanitize(input(user,"Enter new nickname or leave blank to cancel:")) + if(!newname) + return 1 + if(channel) + channel.add_status_message("[username] is now known as [newname].") + username = newname + + if(href_list["PRG_savelog"]) + . = 1 + if(!channel) + return + var/mob/living/user = usr + var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:") + if(!logname || !channel) + return 1 + var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile() + // Now we will generate HTML-compliant file that can actually be viewed/printed. + logfile.filename = logname + logfile.stored_data = "\[b\]Logfile dump from NTNRC channel [channel.title]\[/b\]\[BR\]" + for(var/logstring in channel.messages) + logfile.stored_data += "[logstring]\[BR\]" + logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]" + logfile.calculate_size() + if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(logfile)) + if(!computer) + // This program shouldn't even be runnable without computer. + CRASH("Var computer is null!") + return 1 + if(!computer.hard_drive) + computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.") + else // In 99.9% cases this will mean our HDD is full + computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.") + if(href_list["PRG_renamechannel"]) + . = 1 + if(!operator_mode || !channel) + return 1 + var/mob/living/user = usr + var/newname = sanitize(input(user, "Enter new channel name or leave blank to cancel:")) + if(!newname || !channel) + return + channel.add_status_message("Channel renamed from [channel.title] to [newname] by operator.") + channel.title = newname + if(href_list["PRG_deletechannel"]) + . = 1 + if(channel && ((channel.operator == src) || netadmin_mode)) + qdel(channel) + channel = null + if(href_list["PRG_setpassword"]) + . = 1 + if(!channel || ((channel.operator != src) && !netadmin_mode)) + return 1 + + var/mob/living/user = usr + var/newpassword = sanitize(input(user, "Enter new password for this channel. Leave blank to cancel, enter 'nopassword' to remove password completely:")) + if(!channel || !newpassword || ((channel.operator != src) && !netadmin_mode)) + return 1 + + if(newpassword == "nopassword") + channel.password = "" + else + channel.password = newpassword + +/datum/computer_file/program/chatclient/process_tick() + ..() + if(running) + ui_header = "ntnrc_idle.gif" + if(channel) + // Remember the last message. If there is no message in the channel remember null. + last_message = channel.messages.len ? channel.messages[channel.messages.len - 1] : null + else + last_message = null + return 1 + if(channel && channel.messages && channel.messages.len) + ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif" + else + ui_header = "ntnrc_idle.gif" + +/datum/computer_file/program/chatclient/kill_program(var/forced = 0) + if(channel) + channel.remove_client(src) + channel = null + ..(forced) + +/datum/nano_module/computer_chatclient + name = "NTNet Relay Chat Client" + +/datum/nano_module/computer_chatclient/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(!ntnet_global || !ntnet_global.chat_channels) + return + + var/list/data = list() + if(program) + data = program.get_header_data() + + var/datum/computer_file/program/chatclient/C = program + if(!istype(C)) + return + + data["adminmode"] = C.netadmin_mode + if(C.channel) + data["title"] = C.channel.title + var/list/messages[0] + for(var/M in C.channel.messages) + messages.Add(list(list( + "msg" = M + ))) + data["messages"] = messages + var/list/clients[0] + for(var/datum/computer_file/program/chatclient/cl in C.channel.clients) + clients.Add(list(list( + "name" = cl.username + ))) + data["clients"] = clients + C.operator_mode = (C.channel.operator == C) ? 1 : 0 + data["is_operator"] = C.operator_mode || C.netadmin_mode + + else // Channel selection screen + var/list/all_channels[0] + for(var/datum/ntnet_conversation/conv in ntnet_global.chat_channels) + if(conv && conv.title) + all_channels.Add(list(list( + "chan" = conv.title, + "id" = conv.id + ))) + data["all_channels"] = all_channels + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_chat.tmpl", "NTNet Relay Chat Client", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm new file mode 100644 index 00000000000..75e10a2e26e --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/nttransfer.dm @@ -0,0 +1,197 @@ +var/global/nttransfer_uid = 0 + +/datum/computer_file/program/nttransfer + filename = "nttransfer" + filedesc = "NTNet P2P Transfer Client" + extended_desc = "This program allows for simple file transfer via direct peer to peer connection." + program_icon_state = "comm_logs" + size = 7 + requires_ntnet = 1 + requires_ntnet_feature = NTNET_PEERTOPEER + network_destination = "other device via P2P tunnel" + available_on_ntnet = 1 + nanomodule_path = /datum/nano_module/computer_nttransfer/ + + var/error = "" // Error screen + var/server_password = "" // Optional password to download the file. + var/datum/computer_file/provided_file = null // File which is provided to clients. + var/datum/computer_file/downloaded_file = null // File which is being downloaded + var/list/connected_clients = list() // List of connected clients. + var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from. + var/download_completion = 0 // Download progress in GQ + var/download_netspeed = 0 // Our connectivity speed in GQ/s + var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed. + var/unique_token // UID of this program + var/upload_menu = 0 // Whether we show the program list and upload menu + +/datum/computer_file/program/nttransfer/New() + unique_token = nttransfer_uid + nttransfer_uid++ + ..() + +/datum/computer_file/program/nttransfer/process_tick() + // Server mode + update_netspeed() + if(provided_file) + for(var/datum/computer_file/program/nttransfer/C in connected_clients) + // Transfer speed is limited by device which uses slower connectivity. + // We can have multiple clients downloading at same time, but let's assume we use some sort of multicast transfer + // so they can all run on same speed. + C.actual_netspeed = min(C.download_netspeed, download_netspeed) + C.download_completion += C.actual_netspeed + if(C.download_completion >= provided_file.size) + C.finish_download() + else if(downloaded_file) // Client mode + if(!remote) + crash_download("Connection to remote server lost") + +/datum/computer_file/program/nttransfer/kill_program(var/forced = 0) + if(downloaded_file) // Client mode, clean up variables for next use + finalize_download() + + if(provided_file) // Server mode, disconnect all clients + for(var/datum/computer_file/program/nttransfer/P in connected_clients) + P.crash_download("Connection terminated by remote server") + downloaded_file = null + ..(forced) + + + +/datum/computer_file/program/nttransfer/proc/update_netspeed() + download_netspeed = 0 + switch(ntnet_status) + if(1) + download_netspeed = NTNETSPEED_LOWSIGNAL + if(2) + download_netspeed = NTNETSPEED_HIGHSIGNAL + if(3) + download_netspeed = NTNETSPEED_ETHERNET + +// Finishes download and attempts to store the file on HDD +/datum/computer_file/program/nttransfer/proc/finish_download() + if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(downloaded_file)) + error = "I/O Error: Unable to save file. Check your hard drive and try again." + finalize_download() + +// Crashes the download and displays specific error message +/datum/computer_file/program/nttransfer/proc/crash_download(var/message) + error = message ? message : "An unknown error has occured during download" + finalize_download() + +// Cleans up variables for next use +/datum/computer_file/program/nttransfer/proc/finalize_download() + if(remote) + remote.connected_clients.Remove(src) + downloaded_file = null + remote = null + download_completion = 0 + + + + + +/datum/nano_module/computer_nttransfer + name = "NTNet P2P Transfer Client" + +/datum/nano_module/computer_nttransfer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + if(!program) + return + var/datum/computer_file/program/nttransfer/PRG = program + if(!istype(PRG)) + return + + var/list/data = program.get_header_data() + + if(PRG.error) + data["error"] = PRG.error + else if(PRG.downloaded_file) + data["downloading"] = 1 + data["download_size"] = PRG.downloaded_file.size + data["download_progress"] = PRG.download_completion + data["download_netspeed"] = PRG.actual_netspeed + data["download_name"] = "[PRG.downloaded_file.filename].[PRG.downloaded_file.filetype]" + else if (PRG.provided_file) + data["uploading"] = 1 + data["upload_uid"] = PRG.unique_token + data["upload_clients"] = PRG.connected_clients.len + data["upload_haspassword"] = PRG.server_password ? 1 : 0 + data["upload_filename"] = "[PRG.provided_file.filename].[PRG.provided_file.filetype]" + else if (PRG.upload_menu) + var/list/all_files[0] + for(var/datum/computer_file/F in PRG.computer.hard_drive.stored_files) + all_files.Add(list(list( + "uid" = F.uid, + "filename" = "[F.filename].[F.filetype]", + "size" = F.size + ))) + data["upload_filelist"] = all_files + else + var/list/all_servers[0] + for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers) + all_servers.Add(list(list( + "uid" = P.unique_token, + "filename" = "[P.provided_file.filename].[P.provided_file.filetype]", + "size" = P.provided_file.size, + "haspassword" = P.server_password ? 1 : 0 + ))) + data["servers"] = all_servers + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_transfer.tmpl", "NTNet P2P Transfer Client", 575, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/datum/computer_file/program/nttransfer/Topic(href, href_list) + if(..()) + return 1 + if(href_list["PRG_downloadfile"]) + for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers) + if("[P.unique_token]" == href_list["PRG_downloadfile"]) + remote = P + break + if(!remote || !remote.provided_file) + return + if(remote.server_password) + var/pass = sanitize(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required")) + if(pass != remote.server_password) + error = "Incorrect Password" + return + downloaded_file = remote.provided_file.clone() + remote.connected_clients.Add(src) + return 1 + if(href_list["PRG_reset"]) + error = "" + upload_menu = 0 + finalize_download() + if(src in ntnet_global.fileservers) + ntnet_global.fileservers.Remove(src) + for(var/datum/computer_file/program/nttransfer/T in connected_clients) + T.crash_download("Remote server has forcibly closed the connection") + provided_file = null + return 1 + if(href_list["PRG_setpassword"]) + var/pass = sanitize(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none")) + if(!pass) + return + if(pass == "none") + server_password = "" + return + server_password = pass + return 1 + if(href_list["PRG_uploadfile"]) + for(var/datum/computer_file/F in computer.hard_drive.stored_files) + if("[F.uid]" == href_list["PRG_uploadfile"]) + if(F.unsendable) + error = "I/O Error: File locked." + return + provided_file = F + ntnet_global.fileservers.Add(src) + return + error = "I/O Error: Unable to locate file on hard drive." + return 1 + if(href_list["PRG_uploadmenu"]) + upload_menu = 1 + return 0 diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm new file mode 100644 index 00000000000..3d812b7b5ee --- /dev/null +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -0,0 +1,59 @@ +// This device is wrapper for actual power cell. I have decided to not use power cells directly as even low-end cells available on station +// have tremendeous capacity in comparsion. Higher tier cells would provide your device with nearly infinite battery life, which is something i want to avoid. +/obj/item/weapon/computer_hardware/battery_module + name = "standard battery" + desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops. It's rating is 750." + icon_state = "battery_normal" + critical = 1 + + var/battery_rating = 750 + var/obj/item/weapon/cell/battery = null + +/obj/item/weapon/computer_hardware/battery_module/advanced + name = "advanced battery" + desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices. It's rating is 1100." + icon_state = "battery_advanced" + hardware_size = 2 + battery_rating = 1100 + +/obj/item/weapon/computer_hardware/battery_module/super + name = "super battery" + desc = "A very advanced power cell, often used in high-end devices, or as uninterruptable power supply for important consoles or servers. It's rating is 1500." + icon_state = "battery_super" + hardware_size = 2 + battery_rating = 1500 + +/obj/item/weapon/computer_hardware/battery_module/ultra + name = "ultra battery" + desc = "A very advanced large power cell. It's often used as uninterruptable power supply for critical consoles or servers. It's rating is 2000." + icon_state = "battery_ultra" + hardware_size = 3 + battery_rating = 2000 + +/obj/item/weapon/computer_hardware/battery_module/micro + name = "micro battery" + desc = "A small power cell, commonly seen in most portable microcomputers. It's rating is 500." + icon_state = "battery_micro" + battery_rating = 500 + +/obj/item/weapon/computer_hardware/battery_module/nano + name = "nano battery" + desc = "A tiny power cell, commonly seen in low-end portable microcomputers. It's rating is 300." + icon_state = "battery_nano" + battery_rating = 300 + +// This is not intended to be obtainable in-game. Intended for adminbus and debugging purposes. +/obj/item/weapon/computer_hardware/battery_module/lambda + name = "lambda coil" + desc = "A very complex device that creates it's own bluespace dimension. This dimension may be used to store massive amounts of energy." + icon_state = "battery_lambda" + hardware_size = 1 + battery_rating = 1000000 + + + +/obj/item/weapon/computer_hardware/battery_module/New() + battery = new/obj/item/weapon/cell(src) + battery.maxcharge = battery_rating + battery.charge = battery_rating + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm new file mode 100644 index 00000000000..bfda0005552 --- /dev/null +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -0,0 +1,17 @@ +/obj/item/weapon/computer_hardware/card_slot + name = "RFID card slot" + desc = "Slot that allows this computer to write data on RFID cards. Necessary for some programs to run properly." + power_usage = 10 //W + critical = 0 + icon_state = "cardreader" + hardware_size = 1 + + var/obj/item/weapon/card/id/stored_card = null + +/obj/item/weapon/computer_hardware/card_slot/Destroy() + if(holder2 && (holder2.card_slot == src)) + holder2.card_slot = null + if(stored_card) + stored_card.forceMove(get_turf(holder2)) + holder2 = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm new file mode 100644 index 00000000000..776179e6f21 --- /dev/null +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -0,0 +1,146 @@ +/obj/item/weapon/computer_hardware/hard_drive/ + name = "basic hard drive" + desc = "A small power efficient solid state drive, with 128GQ of storage capacity for use in basic computers where power efficiency is desired." + power_usage = 25 // SSD or something with low power usage + icon_state = "hdd_normal" + hardware_size = 1 + var/max_capacity = 128 + var/used_capacity = 0 + var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY! + +/obj/item/weapon/computer_hardware/hard_drive/advanced + name = "advanced hard drive" + desc = "A small hybrid hard drive with 256GQ of storage capacity for use in higher grade computers where balance between power efficiency and capacity is desired." + max_capacity = 256 + power_usage = 50 // Hybrid, medium capacity and medium power storage + icon_state = "hdd_advanced" + hardware_size = 2 + +/obj/item/weapon/computer_hardware/hard_drive/super + name = "super hard drive" + desc = "A small hard drive with 512GQ of storage capacity for use in cluster storage solutions where capacity is more important than power efficiency." + max_capacity = 512 + power_usage = 100 // High-capacity but uses lots of power, shortening battery life. Best used with APC link. + icon_state = "hdd_super" + hardware_size = 2 + +/obj/item/weapon/computer_hardware/hard_drive/cluster + name = "cluster hard drive" + desc = "A large storage cluster consisting of multiple hard drives for usage in high capacity storage systems. Has capacity of 2048 GQ." + power_usage = 500 + max_capacity = 2048 + icon_state = "hdd_cluster" + hardware_size = 3 + +// For tablets, etc. - highly power efficient. +/obj/item/weapon/computer_hardware/hard_drive/small + name = "small hard drive" + desc = "A small highly efficient solid state drive for portable devices." + power_usage = 10 + max_capacity = 64 + icon_state = "hdd_small" + hardware_size = 1 + +/obj/item/weapon/computer_hardware/hard_drive/micro + name = "micro hard drive" + desc = "A small micro hard drive for portable devices." + power_usage = 2 + max_capacity = 32 + icon_state = "hdd_micro" + hardware_size = 1 + +// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. +/obj/item/weapon/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F) + if(!F || !istype(F)) + return 0 + + if(!can_store_file(F.size)) + return 0 + + if(!stored_files) + return 0 + + // This file is already stored. Don't store it again. + if(F in stored_files) + return 0 + + F.holder = src + stored_files.Add(F) + recalculate_size() + return 1 + +// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. +/obj/item/weapon/computer_hardware/hard_drive/proc/install_default_programs() + store_file(new/datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar + store_file(new/datum/computer_file/program/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository + store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. + + +// Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. +/obj/item/weapon/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F) + if(!F || !istype(F)) + return 0 + + if(!stored_files) + return 0 + + if(F in stored_files) + stored_files -= F + recalculate_size() + return 1 + else + return 0 + +// Loops through all stored files and recalculates used_capacity of this drive +/obj/item/weapon/computer_hardware/hard_drive/proc/recalculate_size() + var/total_size = 0 + for(var/datum/computer_file/F in stored_files) + total_size += F.size + + used_capacity = total_size + +// Checks whether file can be stored on the hard drive. +/obj/item/weapon/computer_hardware/hard_drive/proc/can_store_file(var/size = 1) + // In the unlikely event someone manages to create that many files. + // BYOND is acting weird with numbers above 999 in loops (infinite loop prevention) + if(stored_files.len >= 999) + return 0 + if(used_capacity + size > max_capacity) + return 0 + else + return 1 + +// Checks whether we can store the file. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file. +/obj/item/weapon/computer_hardware/hard_drive/proc/try_store_file(var/datum/computer_file/F) + if(!F || !istype(F)) + return 0 + var/name = F.filename + "." + F.filetype + for(var/datum/computer_file/file in stored_files) + if((file.filename + "." + file.filetype) == name) + return 0 + return can_store_file(F.size) + + + +// Tries to find the file by filename. Returns null on failure +/obj/item/weapon/computer_hardware/hard_drive/proc/find_file_by_name(var/filename) + if(!filename) + return null + + if(!stored_files) + return null + + for(var/datum/computer_file/F in stored_files) + if(F.filename == filename) + return F + return null + +/obj/item/weapon/computer_hardware/hard_drive/Destroy() + if(holder2 && (holder2.hard_drive == src)) + holder2.hard_drive = null + stored_files = null + ..() + +/obj/item/weapon/computer_hardware/hard_drive/New() + install_default_programs() + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/hardware.dm b/code/modules/modular_computers/hardware/hardware.dm new file mode 100644 index 00000000000..6a427e90b45 --- /dev/null +++ b/code/modules/modular_computers/hardware/hardware.dm @@ -0,0 +1,23 @@ +/obj/item/weapon/computer_hardware/ + name = "Hardware" + desc = "Unknown Hardware" + icon = 'icons/obj/modular_components.dmi' + var/obj/item/modular_computer/holder2 = null + var/power_usage = 0 // If the hardware uses extra power, change this. + var/enabled = 1 // If the hardware is turned off set this to 0. + var/critical = 1 // Prevent disabling for important component, like the HDD. + var/hardware_size = 1 // Limits which devices can contain this component. 1: Tablets/Laptops/Consoles, 2: Laptops/Consoles, 3: Consoles only + +/obj/item/weapon/computer_hardware/New(var/obj/L) + if(istype(L, /obj/machinery/modular_computer)) + var/obj/machinery/modular_computer/C = L + if(C.cpu) + holder2 = C.cpu + return + if(istype(L, /obj/item/modular_computer)) + holder2 = L + return + +/obj/item/weapon/computer_hardware/Destroy() + holder2 = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm new file mode 100644 index 00000000000..387350157da --- /dev/null +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -0,0 +1,62 @@ +/obj/item/weapon/computer_hardware/nano_printer + name = "nano printer" + desc = "Small integrated printer with scanner and paper recycling module." + power_usage = 50 + critical = 0 + icon_state = "printer" + hardware_size = 1 + var/stored_paper = 5 + var/max_paper = 10 + var/obj/item/weapon/paper/P = null // Currently stored paper for scanning. + + +/obj/item/weapon/computer_hardware/nano_printer/proc/print_text(var/text_to_print, var/paper_title = null) + if(!stored_paper) + return 0 + + // Recycle stored paper + if(P) + stored_paper++ + qdel(P) + P = null + + P = new/obj/item/weapon/paper(get_turf(holder2)) + P.info = text_to_print + if(paper_title) + P.name = paper_title + P.update_icon() + stored_paper-- + P = null + return 1 + +/obj/item/weapon/computer_hardware/nano_printer/proc/load_paper(var/obj/item/weapon/paper/paper) + if(!paper || !istype(paper)) + return 0 + + // We already have paper loaded, recycle it. + if(P && try_recycle_paper()) + P = paper + P.forceMove(holder2) + +/obj/item/weapon/computer_hardware/nano_printer/proc/try_recycle_paper() + if(!P) + return 0 + + if(stored_paper >= max_paper) + return 0 + + qdel(P) + P = null + return 1 + +/obj/item/weapon/computer_hardware/nano_printer/Destroy() + if(holder2 && (holder2.nano_printer == src)) + holder2.nano_printer = null + if(P) + if(holder2) + P.forceMove(get_turf(holder2)) + else + qdel(P) + P = null + holder2 = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm new file mode 100644 index 00000000000..2502023f542 --- /dev/null +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -0,0 +1,73 @@ +var/global/ntnet_card_uid = 1 + +/obj/item/weapon/computer_hardware/network_card/ + name = "basic NTNet network card" + desc = "A basic network card for usage with standard NTNet frequencies." + power_usage = 50 + critical = 0 + icon_state = "netcard_basic" + hardware_size = 1 + var/identification_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user. + var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user. + var/long_range = 0 + var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks. + +/obj/item/weapon/computer_hardware/network_card/New(var/l) + ..(l) + identification_id = ntnet_card_uid + ntnet_card_uid++ + +/obj/item/weapon/computer_hardware/network_card/advanced + name = "advanced NTNet network card" + desc = "An advanced network card for usage with standard NTNet frequencies. It's transmitter is strong enough to connect even off-station." + long_range = 1 + power_usage = 100 // Better range but higher power usage. + icon_state = "netcard_advanced" + hardware_size = 1 + +/obj/item/weapon/computer_hardware/network_card/wired + name = "wired NTNet network card" + desc = "An advanced network card for usage with NTNet. This one uses wired connection." + ethernet = 1 + power_usage = 100 // Better range but higher power usage. + icon_state = "netcard_ethernet" + hardware_size = 3 + +/obj/item/weapon/computer_hardware/network_card/Destroy() + if(holder2 && (holder2.network_card == src)) + holder2.network_card = null + holder2 = null + ..() + +// Returns a string identifier of this network card +/obj/item/weapon/computer_hardware/network_card/proc/get_network_tag() + return "[identification_string] (NID [identification_id])" + +// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection +/obj/item/weapon/computer_hardware/network_card/proc/get_signal(var/specific_action = 0) + if(!holder2) // Hardware is not installed in anything. No signal. How did this even get called? + return 0 + + if(!enabled) + return 0 + + if(ethernet) // Computer is connected via wired connection. + return 3 + + if(!ntnet_global || !ntnet_global.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal. + return 0 + + if(holder2) + var/turf/T = get_turf(holder2) + if((T && istype(T)) && T.z in config.station_levels) + return 2 + + if(long_range) // Computer is not on station, but it has upgraded network card. Low signal. + return 1 + + return 0 // Computer is not on station and does not have upgraded network card. No signal. + +/obj/item/weapon/computer_hardware/network_card/Destroy() + if(holder2 && (holder2.network_card == src)) + holder2.network_card = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm new file mode 100644 index 00000000000..45cfac6d435 --- /dev/null +++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm @@ -0,0 +1,31 @@ +// These are basically USB data sticks and may be used to transfer files between devices +/obj/item/weapon/computer_hardware/hard_drive/portable/ + name = "basic data crystal" + desc = "Small crystal with imprinted photonic circuits that can be used to store data. It's capacity is 16 GQ" + power_usage = 10 + icon_state = "flashdrive_basic" + hardware_size = 1 + max_capacity = 16 + + +/obj/item/weapon/computer_hardware/hard_drive/portable/advanced + name = "advanced data crystal" + desc = "Small crystal with imprinted high-density photonic circuits that can be used to store data. It's capacity is 64 GQ" + power_usage = 20 + icon_state = "flashdrive_advanced" + hardware_size = 1 + max_capacity = 64 + + +/obj/item/weapon/computer_hardware/hard_drive/portable/super + name = "super data crystal" + desc = "Small crystal with imprinted ultra-density photonic circuits that can be used to store data. It's capacity is 256 GQ" + power_usage = 40 + icon_state = "flashdrive_super" + hardware_size = 1 + max_capacity = 256 + +/obj/item/weapon/computer_hardware/hard_drive/portable/New() + ..() + stored_files = list() + recalculate_size() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm new file mode 100644 index 00000000000..b013a39cd9d --- /dev/null +++ b/code/modules/modular_computers/hardware/processor_unit.dm @@ -0,0 +1,36 @@ +// CPU that allows the computer to run programs. +// Better CPUs are obtainable via research and can run more programs on background. + +/obj/item/weapon/computer_hardware/processor_unit + name = "standard processor" + desc = "A standard CPU used in most computers. It can run up to three programs simultaneously." + icon_state = "cpu_normal" + hardware_size = 2 + power_usage = 50 + critical = 1 + + var/max_idle_programs = 2 // 2 idle, + 1 active = 3 as said in description. + +/obj/item/weapon/computer_hardware/processor_unit/small + name = "standard microprocessor" + desc = "A standard miniaturised CPU used in portable devices. It can run up to two programs simultaneously." + icon_state = "cpu_small" + hardware_size = 1 + power_usage = 25 + max_idle_programs = 1 + +/obj/item/weapon/computer_hardware/processor_unit/photonic + name = "photonic processor" + desc = "An advanced experimental CPU that uses photonic core instead of regular circuitry. It can run up to five programs simultaneously, but uses a lot of power." + icon_state = "cpu_normal_photonic" + hardware_size = 2 + power_usage = 250 + max_idle_programs = 4 + +/obj/item/weapon/computer_hardware/processor_unit/photonic/small + name = "photonic microprocessor" + desc = "An advanced miniaturised CPU for use in portable devices. It uses photonic core instead of regular circuitry. It can run up to three programs simultaneously." + icon_state = "cpu_small_photonic" + hardware_size = 1 + power_usage = 75 + max_idle_programs = 2 \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/tesla_link.dm b/code/modules/modular_computers/hardware/tesla_link.dm new file mode 100644 index 00000000000..395939b8437 --- /dev/null +++ b/code/modules/modular_computers/hardware/tesla_link.dm @@ -0,0 +1,19 @@ +/obj/item/weapon/computer_hardware/tesla_link + name = "tesla link" + desc = "An advanced tesla link that wirelessly recharges connected device from nearby area power controller." + critical = 0 + enabled = 0 // Starts turned off + icon_state = "teslalink" + hardware_size = 2 // Can't be installed into tablets + var/obj/machinery/modular_computer/holder + +/obj/item/weapon/computer_hardware/tesla_link/New(var/obj/L) + if(istype(L, /obj/machinery/modular_computer)) + holder = L + return + ..(L) + +/obj/item/weapon/computer_hardware/tesla_link/Destroy() + if(holder && (holder.tesla_link == src)) + holder.tesla_link = null + ..() \ No newline at end of file diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm new file mode 100644 index 00000000000..31e7fc8381d --- /dev/null +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -0,0 +1,294 @@ +// A vendor machine for modular computer portable devices - Laptops and Tablets + +/obj/machinery/lapvend + name = "computer vendor" + desc = "A vending machine with microfabricator capable of dispensing various NT-branded computers" + icon = 'icons/obj/vending.dmi' + icon_state = "robotics" + layer = 2.9 + anchored = 1 + density = 1 + + // The actual laptop/tablet + var/obj/machinery/modular_computer/laptop/fabricated_laptop = null + var/obj/item/modular_computer/tablet/fabricated_tablet = null + + // Utility vars + var/state = 0 // 0: Select device type, 1: Select loadout, 2: Payment, 3: Thankyou screen + var/devtype = 0 // 0: None(unselected), 1: Laptop, 2: Tablet + var/total_price = 0 // Price of currently vended device. + + // Device loadout + var/dev_cpu = 1 // 1: Default, 2: Upgraded + var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced + var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced + var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range + var/dev_tesla = 0 // 0: None, 1: Standard (LAPTOP ONLY) + var/dev_nanoprint = 0 // 0: None, 1: Standard + var/dev_card = 0 // 0: None, 1: Standard + +// Removes all traces of old order and allows you to begin configuration from scratch. +/obj/machinery/lapvend/proc/reset_order() + state = 0 + devtype = 0 + if(fabricated_laptop) + qdel(fabricated_laptop) + fabricated_laptop = null + if(fabricated_tablet) + qdel(fabricated_tablet) + fabricated_tablet = null + dev_cpu = 1 + dev_battery = 1 + dev_disk = 1 + dev_netcard = 0 + dev_tesla = 0 + dev_nanoprint = 0 + dev_card = 0 + +// Recalculates the price and optionally even fabricates the device. +/obj/machinery/lapvend/proc/fabricate_and_recalc_price(var/fabricate = 0) + total_price = 0 + if(devtype == 1) // Laptop, generally cheaper to make it accessible for most station roles + if(fabricate) + fabricated_laptop = new(src) + total_price = 99 + switch(dev_cpu) + if(1) + if(fabricate) + fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_laptop.cpu) + if(2) + if(fabricate) + fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(fabricated_laptop.cpu) + total_price += 299 + switch(dev_battery) + if(1) // Basic(750C) + if(fabricate) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_laptop.cpu) + if(2) // Upgraded(1100C) + if(fabricate) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/advanced(fabricated_laptop.cpu) + total_price += 199 + if(3) // Advanced(1500C) + if(fabricate) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(fabricated_laptop.cpu) + total_price += 499 + switch(dev_disk) + if(1) // Basic(128GQ) + if(fabricate) + fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive(fabricated_laptop.cpu) + if(2) // Upgraded(256GQ) + if(fabricate) + fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/advanced(fabricated_laptop.cpu) + total_price += 99 + if(3) // Advanced(512GQ) + if(fabricate) + fabricated_laptop.cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/super(fabricated_laptop.cpu) + total_price += 299 + switch(dev_netcard) + if(1) // Basic(Short-Range) + if(fabricate) + fabricated_laptop.cpu.network_card = new/obj/item/weapon/computer_hardware/network_card(fabricated_laptop.cpu) + total_price += 99 + if(2) // Advanced (Long Range) + if(fabricate) + fabricated_laptop.cpu.network_card = new/obj/item/weapon/computer_hardware/network_card/advanced(fabricated_laptop.cpu) + total_price += 299 + if(dev_tesla) + total_price += 399 + if(fabricate) + fabricated_laptop.tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(fabricated_laptop) + if(dev_nanoprint) + total_price += 99 + if(fabricate) + fabricated_laptop.cpu.nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(fabricated_laptop.cpu) + if(dev_card) + total_price += 199 + if(fabricate) + fabricated_laptop.cpu.card_slot = new/obj/item/weapon/computer_hardware/card_slot(fabricated_laptop.cpu) + + return total_price + else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. + if(fabricate) + fabricated_tablet = new(src) + fabricated_tablet.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_tablet) + total_price = 199 + switch(dev_battery) + if(1) // Basic(300C) + if(fabricate) + fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module/nano(fabricated_tablet) + if(2) // Upgraded(500C) + if(fabricate) + fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module/micro(fabricated_tablet) + total_price += 199 + if(3) // Advanced(750C) + if(fabricate) + fabricated_tablet.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_tablet) + total_price += 499 + switch(dev_disk) + if(1) // Basic(32GQ) + if(fabricate) + fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(fabricated_tablet) + if(2) // Upgraded(64GQ) + if(fabricate) + fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(fabricated_tablet) + total_price += 99 + if(3) // Advanced(128GQ) + if(fabricate) + fabricated_tablet.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive(fabricated_tablet) + total_price += 299 + switch(dev_netcard) + if(1) // Basic(Short-Range) + if(fabricate) + fabricated_tablet.network_card = new/obj/item/weapon/computer_hardware/network_card(fabricated_tablet) + total_price += 99 + if(2) // Advanced (Long Range) + if(fabricate) + fabricated_tablet.network_card = new/obj/item/weapon/computer_hardware/network_card/advanced(fabricated_tablet) + total_price += 299 + if(dev_nanoprint) + total_price += 99 + if(fabricate) + fabricated_tablet.nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(fabricated_tablet) + if(dev_card) + total_price += 199 + if(fabricate) + fabricated_tablet.card_slot = new/obj/item/weapon/computer_hardware/card_slot(fabricated_tablet) + return total_price + return 0 + + + + + +/obj/machinery/lapvend/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["pick_device"]) + if(state) // We've already picked a device type + return 0 + devtype = text2num(href_list["pick_device"]) + state = 1 + fabricate_and_recalc_price(0) + return 1 + if(href_list["clean_order"]) + reset_order() + return 1 + if((state != 1) && devtype) // Following IFs should only be usable when in the Select Loadout mode + return 0 + if(href_list["confirm_order"]) + state = 2 // Wait for ID swipe for payment processing + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_cpu"]) + dev_cpu = text2num(href_list["hw_cpu"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_battery"]) + dev_battery = text2num(href_list["hw_battery"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_disk"]) + dev_disk = text2num(href_list["hw_disk"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_netcard"]) + dev_netcard = text2num(href_list["hw_netcard"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_tesla"]) + dev_tesla = text2num(href_list["hw_tesla"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_nanoprint"]) + dev_nanoprint = text2num(href_list["hw_nanoprint"]) + fabricate_and_recalc_price(0) + return 1 + if(href_list["hw_card"]) + dev_card = text2num(href_list["hw_card"]) + fabricate_and_recalc_price(0) + return 1 + return 0 + +/obj/machinery/lapvend/attack_hand(var/mob/user) + ui_interact(user) + +/obj/machinery/lapvend/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + if(stat & (BROKEN | NOPOWER | MAINT)) + if(ui) + ui.close() + return 0 + + var/list/data[0] + data["state"] = state + data["devtype"] = devtype + data["hw_battery"] = dev_battery + data["hw_disk"] = dev_disk + data["hw_netcard"] = dev_netcard + data["hw_tesla"] = dev_tesla + data["hw_nanoprint"] = dev_nanoprint + data["hw_card"] = dev_card + data["hw_cpu"] = dev_cpu + data["totalprice"] = "[total_price]$" + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "computer_fabricator.tmpl", "Personal Computer Vendor", 500, 400) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + + +obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/obj/item/weapon/card/id/I = W.GetID() + // Awaiting payment state + if(state == 2) + if(process_payment(I,W)) + fabricate_and_recalc_price(1) + if((devtype == 1) && fabricated_laptop) + fabricated_laptop.forceMove(src.loc) + fabricated_laptop.close_laptop() + fabricated_laptop = null + else if((devtype == 2) && fabricated_tablet) + fabricated_tablet.forceMove(src.loc) + fabricated_tablet = null + ping("Enjoy your new product!") + state = 3 + return 1 + return 0 + return ..() + + +// Simplified payment processing, returns 1 on success. +/obj/machinery/lapvend/proc/process_payment(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 || customer_account.suspended) + ping("Connection error. Unable to connect to account.") + return 0 + + if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) + var/attempt_pin = input("Enter pin code", "Vendor transaction") as num + customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2) + + if(!customer_account) + ping("Unable to access account: incorrect credentials.") + return 0 + + if(total_price > customer_account.money) + ping("Insufficient funds in account.") + return 0 + else + customer_account.money -= total_price + var/datum/transaction/T = new() + T.target_name = "Computer Manufacturer (via [src.name])" + T.purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"]." + T.amount = total_price + T.source_terminal = src.name + T.date = current_date_string + T.time = worldtime2text() + customer_account.transaction_log.Add(T) + return 1 \ No newline at end of file diff --git a/code/modules/multiz/_stubs.dm b/code/modules/multiz/_stubs.dm new file mode 100644 index 00000000000..4c6e63cb7e6 --- /dev/null +++ b/code/modules/multiz/_stubs.dm @@ -0,0 +1,16 @@ +/obj/effect/landmark/map_data + name = "Unknown" + desc = "An unknown location." + invisibility = 101 + + var/height = 1 ///< The number of Z-Levels in the map. + var/turf/edge_type ///< What the map edge should be formed with. (null = world.turf) + +// FOR THE LOVE OF GOD USE THESE. DO NOT FUCKING SPAGHETTIFY THIS. +// Use the Has*() functions if you ONLY need to check. +// If you need to do something, use Get*(). +HasAbove(var/z) +HasBelow(var/z) +// These give either the turf or null. +GetAbove(var/atom/atom) +GetBelow(var/atom/atom) \ No newline at end of file diff --git a/code/modules/multiz/basic.dm b/code/modules/multiz/basic.dm new file mode 100644 index 00000000000..e76c6516aa7 --- /dev/null +++ b/code/modules/multiz/basic.dm @@ -0,0 +1,35 @@ +// If you add a more comprehensive system, just untick this file. +// WARNING: Only works for up to 17 z-levels! +var/z_levels = 0 // Each bit represents a connection between adjacent levels. So the first bit means levels 1 and 2 are connected. + +// If the height is more than 1, we mark all contained levels as connected. +/obj/effect/landmark/map_data/New() + ASSERT(height <= z) + // Due to the offsets of how connections are stored v.s. how z-levels are indexed, some magic number silliness happened. + for(var/i = (z - height) to (z - 2)) + z_levels |= (1 << i) + qdel(src) + +// The storage of connections between adjacent levels means some bitwise magic is needed. +proc/HasAbove(var/z) + if(z >= world.maxz || z > 16 || z < 1) + return 0 + return z_levels & (1 << (z - 1)) + +proc/HasBelow(var/z) + if(z > world.maxz || z > 17 || z < 2) + return 0 + return z_levels & (1 << (z - 2)) + +// Thankfully, no bitwise magic is needed here. +proc/GetAbove(var/atom/atom) + var/turf/turf = get_turf(atom) + if(!turf) + return null + return HasAbove(turf.z) ? get_step(turf, UP) : null + +proc/GetBelow(var/atom/atom) + var/turf/turf = get_turf(atom) + if(!turf) + return null + return HasBelow(turf.z) ? get_step(turf, DOWN) : null diff --git a/code/modules/multiz/disabled.dm b/code/modules/multiz/disabled.dm new file mode 100644 index 00000000000..b91fb789319 --- /dev/null +++ b/code/modules/multiz/disabled.dm @@ -0,0 +1,10 @@ + +proc/HasAbove(var/z) + return 0 +proc/HasBelow(var/z) + return 0 +// These give either the turf or null. +proc/GetAbove(var/turf/turf) + return null +proc/GetBelow(var/turf/turf) + return null \ No newline at end of file diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm new file mode 100644 index 00000000000..dd0a93fec11 --- /dev/null +++ b/code/modules/multiz/movement.dm @@ -0,0 +1,51 @@ +/obj/item/weapon/tank/jetpack/verb/moveup() + set name = "Move Upwards" + set category = "Object" + + . = 1 + if(!allow_thrust(0.01, usr)) + usr << "\The [src] is disabled." + return + + var/turf/above = GetAbove(src) + if(!istype(above)) + usr << "There is nothing of interest in this direction." + return + + if(!istype(above, /turf/space) && !istype(above, /turf/simulated/open)) + usr << "You bump against \the [above]." + return + + for(var/atom/A in above) + if(A.density) + usr << "\The [A] blocks you." + return + + usr.Move(above) + usr << "You move upwards." + +/obj/item/weapon/tank/jetpack/verb/movedown() + set name = "Move Downwards" + set category = "Object" + + . = 1 + if(!allow_thrust(0.01, usr)) + usr << "\The [src] is disabled." + return + + var/turf/below = GetBelow(src) + if(!istype(below)) + usr << "There is nothing of interest in this direction." + return + + if(below.density) + usr << "You bump against \the [below]." + return + + for(var/atom/A in below) + if(A.density) + usr << "\The [A] blocks you." + return + + usr.Move(below) + usr << "You move downwards." diff --git a/code/TriDimension/Pipes.dm b/code/modules/multiz/pipes.dm similarity index 82% rename from code/TriDimension/Pipes.dm rename to code/modules/multiz/pipes.dm index 7072951dba8..1cb5b9b4da7 100644 --- a/code/TriDimension/Pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -43,8 +43,8 @@ obj/machinery/atmospherics/pipe/zpipe/New() if(SOUTHWEST) initialize_directions = SOUTH -obj/machinery/atmospherics/pipe/zpipe/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) +/obj/machinery/atmospherics/pipe/zpipe/hide(var/i) + if(istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() @@ -70,7 +70,7 @@ obj/machinery/atmospherics/pipe/zpipe/check_pressure(pressure) else return 1 obj/machinery/atmospherics/pipe/zpipe/proc/burst() - src.visible_message("\red \bold [src] bursts!"); + src.visible_message("\The [src] bursts!"); playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) @@ -133,20 +133,17 @@ obj/machinery/atmospherics/pipe/zpipe/up/initialize() node1 = target break - var/turf/controllerlocation = locate(1, 1, src.z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up) - var/turf/above = locate(src.x, src.y, controller.up_target) - if(above) - for(var/obj/machinery/atmospherics/target in above) - if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/zpipe/down)) - if (check_connect_types(target,src)) - node2 = target - break + var/turf/above = GetAbove(src) + if(above) + for(var/obj/machinery/atmospherics/target in above) + if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/zpipe/down)) + if (check_connect_types(target,src)) + node2 = target + break var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + hide(!T.is_plating()) /////////////////////// // and the down pipe // @@ -174,20 +171,17 @@ obj/machinery/atmospherics/pipe/zpipe/down/initialize() node1 = target break - var/turf/controllerlocation = locate(1, 1, src.z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - var/turf/below = locate(src.x, src.y, controller.down_target) - if(below) - for(var/obj/machinery/atmospherics/target in below) - if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/zpipe/up)) - if (check_connect_types(target,src)) - node2 = target - break + var/turf/below = GetBelow(src) + if(below) + for(var/obj/machinery/atmospherics/target in below) + if(target.initialize_directions && istype(target, /obj/machinery/atmospherics/pipe/zpipe/up)) + if (check_connect_types(target,src)) + node2 = target + break var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + hide(!T.is_plating()) /////////////////////// // supply/scrubbers // diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm new file mode 100644 index 00000000000..36a606bfcf9 --- /dev/null +++ b/code/modules/multiz/structures.dm @@ -0,0 +1,106 @@ +////////////////////////////// +//Contents: Ladders, Stairs.// +////////////////////////////// + +/obj/structure/ladder + name = "ladder" + desc = "A ladder. You can climb it up and down." + icon_state = "ladderdown" + icon = 'icons/obj/structures.dmi' + density = 0 + opacity = 0 + anchored = 1 + + var/obj/structure/ladder/target + + initialize() + // the upper will connect to the lower + if(icon_state == "ladderup") + return + + for(var/obj/structure/ladder/L in GetBelow(src)) + if(L.icon_state == "ladderup") + target = L + L.target = src + return + + Destroy() + if(target && icon_state == "ladderdown") + qdel(target) + return ..() + + attackby(obj/item/C as obj, mob/user as mob) + . = ..() + attack_hand(user) + return + + attack_hand(var/mob/M) + if(!target || !istype(target.loc, /turf)) + M << "\The [src] is incomplete and can't be climbed." + return + + var/turf/T = target.loc + for(var/atom/A in T) + if(A.density) + M << "\A [A] is blocking \the [src]." + return + + M.visible_message("\A [M] climbs [icon_state == "ladderup" ? "up" : "down"] \a [src]!", + "You climb [icon_state == "ladderup" ? "up" : "down"] \the [src]!", + "You hear the grunting and clanging of a metal ladder being used.") + M.Move(T) + + CanPass(obj/mover, turf/source, height, airflow) + return airflow || !density + +/obj/structure/stairs + name = "Stairs" + desc = "Stairs leading to another deck. Not too useful if the gravity goes out." + icon = 'icons/obj/stairs.dmi' + density = 0 + opacity = 0 + anchored = 1 + + initialize() + for(var/turf/turf in locs) + var/turf/simulated/open/above = GetAbove(turf) + if(!above) + warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") + return qdel(src) + if(!istype(above)) + above.ChangeTurf(/turf/simulated/open) + + Uncross(atom/movable/A) + if(A.dir == dir) + // This is hackish but whatever. + var/turf/target = get_step(GetAbove(A), dir) + var/turf/source = A.loc + if(target.Enter(A, source)) + A.loc = target + target.Entered(A, source) + return 0 + return 1 + + CanPass(obj/mover, turf/source, height, airflow) + return airflow || !density + + // type paths to make mapping easier. + north + dir = NORTH + bound_height = 64 + bound_y = -32 + pixel_y = -32 + + south + dir = SOUTH + bound_height = 64 + + east + dir = EAST + bound_width = 64 + bound_x = -32 + pixel_x = -32 + + west + dir = WEST + bound_width = 64 \ No newline at end of file diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm new file mode 100644 index 00000000000..b358cd0fbbd --- /dev/null +++ b/code/modules/multiz/turf.dm @@ -0,0 +1,111 @@ +/turf/simulated/open + name = "open space" + icon = 'icons/turf/space.dmi' + icon_state = "black" + alpha = 16 + layer = 0 + density = 0 + pathweight = 100000 //Seriously, don't try and path over this one numbnuts + + var/turf/below + var/list/underlay_references + var/global/overlay_map = list() + +/turf/simulated/open/initialize() + ..() + below = GetBelow(src) + ASSERT(HasBelow(z)) + +/turf/simulated/open/Entered(var/atom/movable/mover) + // only fall down in defined areas (read: areas with artificial gravitiy) + if(!istype(below)) //make sure that there is actually something below + below = GetBelow(src) + if(!below) + return + + // No gravity in space, apparently. + var/area/area = get_area(src) + if(area.name == "Space") + return + + // Prevent pipes from falling into the void... if there is a pipe to support it. + if(mover.anchored || istype(mover, /obj/item/pipe) && \ + (locate(/obj/structure/disposalpipe/up) in below) || \ + locate(/obj/machinery/atmospherics/pipe/zpipe/up in below)) + return + + // See if something prevents us from falling. + var/soft = 0 + for(var/atom/A in below) + if(A.density) + if(!istype(A, /obj/structure/window)) + return + else + var/obj/structure/window/W = A + if(W.is_fulltile()) + return + // Dont break here, since we still need to be sure that it isnt blocked + if(istype(A, /obj/structure/stairs)) + soft = 1 + + // We've made sure we can move, now. + mover.Move(below) + + if(!soft) + if(!istype(mover, /mob)) + if(istype(below, /turf/simulated/open)) + mover.visible_message("\The [mover] falls from the deck above through \the [below]!", "You hear a whoosh of displaced air.") + else + mover.visible_message("\The [mover] falls from the deck above and slams into \the [below]!", "You hear something slam into the deck.") + else + var/mob/M = mover + if(istype(below, /turf/simulated/open)) + below.visible_message("\The [mover] falls from the deck above through \the [below]!", "You hear a soft whoosh.[M.stat ? "" : ".. and some screaming."]") + else + M.visible_message("\The [mover] falls from the deck above and slams into \the [below]!", "You land on \the [below].", "You hear a soft whoosh and a crunch") + + // Handle people getting hurt, it's funny! + if (istype(mover, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mover + var/damage = 5 + H.apply_damage(rand(0, damage), BRUTE, "head") + H.apply_damage(rand(0, damage), BRUTE, "chest") + H.apply_damage(rand(0, damage), BRUTE, "l_leg") + H.apply_damage(rand(0, damage), BRUTE, "r_leg") + H.apply_damage(rand(0, damage), BRUTE, "l_arm") + H.apply_damage(rand(0, damage), BRUTE, "r_arm") + H.weakened = max(H.weakened,2) + H.updatehealth() + +// override to make sure nothing is hidden +/turf/simulated/open/levelupdate() + for(var/obj/O in src) + O.hide(0) + +// Straight copy from space. +/turf/simulated/open/attackby(obj/item/C as obj, mob/user as mob) + if (istype(C, /obj/item/stack/rods)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + return + var/obj/item/stack/rods/R = C + if (R.use(1)) + user << "Constructing support lattice ..." + playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) + ReplaceWithLattice() + return + + if (istype(C, /obj/item/stack/tile/floor)) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + var/obj/item/stack/tile/floor/S = C + if (S.get_amount() < 1) + return + qdel(L) + playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) + S.use(1) + ChangeTurf(/turf/simulated/floor/airless) + return + else + user << "The plating is going to need some support." + return \ No newline at end of file diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm index 7ec40cf7c4c..609d28d6969 100644 --- a/code/modules/nano/interaction/base.dm +++ b/code/modules/nano/interaction/base.dm @@ -1,8 +1,11 @@ -/atom/proc/nano_host() +/datum/proc/nano_host() return src -/atom/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state) - var/src_object = nano_host() +/datum/proc/nano_container() + return src + +/datum/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state) + var/datum/src_object = nano_host() return state.can_use_topic(src_object, user) /datum/topic_state/proc/href_list(var/mob/user) @@ -14,7 +17,7 @@ /mob/proc/shared_nano_interaction() if (src.stat || !client) return STATUS_CLOSE // no updates, close the interface - else if (restrained() || lying || stat || stunned || weakened) // TODO: Change to incapaciated() on merge + else if (incapacitated()) return STATUS_UPDATE // update only (orange visibility) return STATUS_INTERACTIVE diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index 79c08227d5a..e682ea55288 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -9,10 +9,12 @@ /mob/proc/default_can_use_topic(var/src_object) return STATUS_CLOSE // By default no mob can do anything with NanoUI -/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/dead/observer/default_can_use_topic(var/src_object) + if(can_admin_interact()) + return STATUS_INTERACTIVE // Admins are more equal + if(!client || get_dist(src_object, src) > client.view) // Preventing ghosts from having a million windows open by limiting to objects in range + return STATUS_CLOSE + return STATUS_UPDATE // Ghosts can view updates /mob/living/silicon/pai/default_can_use_topic(var/src_object) if((src_object == src || src_object == radio) && !stat) @@ -30,21 +32,6 @@ return STATUS_INTERACTIVE // interactive (green visibility) return STATUS_DISABLED // no updates, completely disabled (red visibility) -/mob/living/silicon/robot/syndicate/default_can_use_topic(var/src_object) - . = ..() - if(. != STATUS_INTERACTIVE) - return - - if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level - return STATUS_INTERACTIVE - if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle - return STATUS_INTERACTIVE - if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery - var/obj/machinery/Machine = src_object - if(Machine.emagged) - return STATUS_INTERACTIVE - return STATUS_UPDATE - /mob/living/silicon/ai/default_can_use_topic(var/src_object) . = shared_nano_interaction() if(. != STATUS_INTERACTIVE) diff --git a/code/modules/nano/interaction/interactive.dm b/code/modules/nano/interaction/interactive.dm new file mode 100644 index 00000000000..ddd8f8f9e11 --- /dev/null +++ b/code/modules/nano/interaction/interactive.dm @@ -0,0 +1,7 @@ +/* + This state always returns STATUS_INTERACTIVE +*/ +/var/global/datum/topic_state/interactive/interactive_state = new() + +/datum/topic_state/interactive/can_use_topic(var/src_object, var/mob/user) + return STATUS_INTERACTIVE diff --git a/code/modules/nano/interaction/outside.dm b/code/modules/nano/interaction/outside.dm new file mode 100644 index 00000000000..9ae0e24fe01 --- /dev/null +++ b/code/modules/nano/interaction/outside.dm @@ -0,0 +1,6 @@ +/var/global/datum/topic_state/default/outside/outside_state = new() + +/datum/topic_state/default/outside/can_use_topic(var/src_object, var/mob/user) + if(user in src_object) + return STATUS_CLOSE + return ..() diff --git a/code/modules/nano/interaction/remote.dm b/code/modules/nano/interaction/remote.dm new file mode 100644 index 00000000000..ef2cb6926df --- /dev/null +++ b/code/modules/nano/interaction/remote.dm @@ -0,0 +1,39 @@ +/* + This state checks that user is capable, within range of the remoter, etc. and that src_object meets the basic requirements for interaction (being powered, non-broken, etc. + Whoever initializes this state is also responsible for deleting it properly. +*/ +/datum/topic_state/remote + var/datum/remoter + var/datum/remote_target + var/datum/topic_state/remoter_state + +/datum/topic_state/remote/New(var/remoter, var/remote_target, var/datum/topic_state/remoter_state = default_state) + src.remoter = remoter + src.remote_target = remote_target + src.remoter_state = remoter_state + ..() + +/datum/topic_state/remote/Destroy() + src.remoter = null + src.remoter_state = null + + // Force an UI update before we go, ensuring that any windows we may have opened for the remote target closes. + nanomanager.update_uis(remote_target.nano_container()) + remote_target = null + return ..() + +/datum/topic_state/remote/can_use_topic(var/datum/src_object, var/mob/user) + if(!(remoter && remoter_state)) // The remoter is gone, let us leave + return STATUS_CLOSE + + if(src_object != remote_target) + error("remote - Unexpected src_object: Expected '[remote_target]'/[remote_target.type], was '[src_object]'/[src_object.type]") + + // This checks if src_object is powered, etc. + // The interactive state is otherwise simplistic and only returns STATUS_INTERACTIVE and never checks distances, etc. + . = src_object.CanUseTopic(user, interactive_state) + if(. == STATUS_CLOSE) + return + + // This is the (generally) heavy checking, making sure the user is capable, within range of the remoter source, etc. + return min(., remoter.CanUseTopic(user, remoter_state)) diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index 7cf71f54219..41435c05342 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -1,50 +1,62 @@ -/obj/nano_module/alarm_monitor +/datum/nano_module/alarm_monitor name = "Alarm monitor" var/list_cameras = 0 // Whether or not to list camera references. A future goal would be to merge this with the enginering/security camera console. Currently really only for AI-use. var/list/datum/alarm_handler/alarm_handlers // The particular list of alarm handlers this alarm monitor should present to the user. -/obj/nano_module/alarm_monitor/all/New() +/datum/nano_module/alarm_monitor/New() + ..() + alarm_handlers = list() + +/datum/nano_module/alarm_monitor/all/New() ..() alarm_handlers = alarm_manager.all_handlers -/obj/nano_module/alarm_monitor/engineering/New() +/datum/nano_module/alarm_monitor/engineering/New() ..() - alarm_handlers = list(atmosphere_alarm, fire_alarm, power_alarm) + alarm_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, power_alarm) -/obj/nano_module/alarm_monitor/security/New() +/datum/nano_module/alarm_monitor/security/New() ..() alarm_handlers = list(camera_alarm, motion_alarm) -/obj/nano_module/alarm_monitor/proc/register(var/object, var/procName) +/datum/nano_module/alarm_monitor/proc/register_alarm(var/object, var/procName) for(var/datum/alarm_handler/AH in alarm_handlers) - AH.register(object, procName) + AH.register_alarm(object, procName) -/obj/nano_module/alarm_monitor/proc/unregister(var/object) +/datum/nano_module/alarm_monitor/proc/unregister_alarm(var/object) for(var/datum/alarm_handler/AH in alarm_handlers) - AH.unregister(object) + AH.unregister_alarm(object) -/obj/nano_module/alarm_monitor/proc/all_alarms() +/datum/nano_module/alarm_monitor/proc/all_alarms() var/list/all_alarms = new() for(var/datum/alarm_handler/AH in alarm_handlers) all_alarms += AH.alarms return all_alarms -/obj/nano_module/alarm_monitor/proc/major_alarms() +/datum/nano_module/alarm_monitor/proc/major_alarms() var/list/all_alarms = new() for(var/datum/alarm_handler/AH in alarm_handlers) all_alarms += AH.major_alarms() return all_alarms -/obj/nano_module/alarm_monitor/proc/minor_alarms() +// Modified version of above proc that uses slightly less resources, returns 1 if there is a major alarm, 0 otherwise. +/datum/nano_module/alarm_monitor/proc/has_major_alarms() + for(var/datum/alarm_handler/AH in alarm_handlers) + if(AH.has_major_alarms()) + return 1 + + return 0 + +/datum/nano_module/alarm_monitor/proc/minor_alarms() var/list/all_alarms = new() for(var/datum/alarm_handler/AH in alarm_handlers) all_alarms += AH.minor_alarms() return all_alarms -/obj/nano_module/alarm_monitor/Topic(ref, href_list) +/datum/nano_module/alarm_monitor/Topic(ref, href_list) if(..()) return 1 if(href_list["switchTo"]) @@ -55,9 +67,12 @@ 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, var/datum/topic_state/state = default_state) +/datum/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] + if(program) + data = program.get_header_data() + var/categories[0] for(var/datum/alarm_handler/AH in alarm_handlers) categories[++categories.len] = list("category" = AH.category, "alarms" = list()) @@ -65,7 +80,7 @@ var/cameras[0] var/lost_sources[0] - if(user.isMobAI()) + if(isAI(user)) for(var/obj/machinery/camera/C in A.cameras()) cameras[++cameras.len] = C.nano_structure() for(var/datum/alarm_source/AS in A.sources) @@ -83,6 +98,8 @@ 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, state = state) + if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI. + ui.auto_update_layout = 1 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 index df008c6416e..6cbd935808f 100644 --- a/code/modules/nano/modules/atmos_control.dm +++ b/code/modules/nano/modules/atmos_control.dm @@ -1,16 +1,14 @@ -/obj/nano_module/atmos_control +/datum/nano_module/atmos_control name = "Atmospherics Control" - var/ui_ref + var/obj/access = new() var/emagged = 0 + var/ui_ref 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) +/datum/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 + access.req_access = req_access + access.req_one_access = req_one_access if(monitored_alarm_ids) for(var/obj/machinery/alarm/alarm in machines) @@ -19,7 +17,7 @@ // machines may not yet be ordered at this point monitored_alarms = dd_sortedObjectList(monitored_alarms) -/obj/nano_module/atmos_control/Topic(href, href_list) +/datum/nano_module/atmos_control/Topic(href, href_list) if(..()) return 1 @@ -31,10 +29,13 @@ 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) +/datum/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] + if(program) + data = program.get_header_data() + // 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)) @@ -43,20 +44,22 @@ 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) + if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI. + ui.auto_update_layout = 1 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) +/datum/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 + var/datum/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)) @@ -71,4 +74,4 @@ return extra_href /datum/topic_state/air_alarm/proc/has_access(var/mob/user) - return user && (user.isMobAI() || 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 user && (isAI(user) || atmos_control.access.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 3d0cdac6575..f89f6010dbc 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -1,34 +1,27 @@ -/obj/nano_module/crew_monitor +/datum/nano_module/crew_monitor name = "Crew monitor" -/obj/nano_module/crew_monitor/Topic(href, href_list) +/datum/nano_module/crew_monitor/Topic(href, href_list) if(..()) return 1 - var/turf/T = get_turf(src) + var/turf/T = get_turf(nano_host()) // TODO: Allow setting any config.contact_levels from the interface. if (!T || !(T.z in config.player_levels)) - usr << "Unable to establish a connection: You're too far away from the station!" + usr << "Unable to establish a connection: You're too far away from the station!" return 0 - if(href_list["close"] ) - var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - usr.unset_machine() - ui.close() - return 0 - if(href_list["update"]) - src.updateDialog() - return 1 if(href_list["track"]) - if(usr.isMobAI()) + if(isAI(usr)) var/mob/living/silicon/ai/AI = usr var/mob/living/carbon/human/H = locate(href_list["track"]) in mob_list if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) 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, var/datum/topic_state/state = default_state) +/datum/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) var/data[0] - var/turf/T = get_turf(src) + if(program) + data = program.get_header_data() + var/turf/T = get_turf(nano_host()) - data["isAI"] = user.isMobAI() + data["isAI"] = isAI(user) data["crewmembers"] = crew_repository.health_data(T) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -45,5 +38,3 @@ // should make the UI auto-update; doesn't seem to? ui.set_auto_update(1) - - return 1 diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 9c533c04384..87bfc761767 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -1,7 +1,6 @@ -/obj/nano_module/appearance_changer +/datum/nano_module/appearance_changer name = "Appearance Editor" - flags = APPEARANCE_ALL_HAIR - invisibility = INVISIBILITY_MAXIMUM + var/flags = APPEARANCE_ALL_HAIR var/mob/living/carbon/human/owner = null var/list/valid_species = list() var/list/valid_hairstyles = list() @@ -11,15 +10,14 @@ var/list/whitelist var/list/blacklist -/obj/nano_module/appearance_changer/New(var/location, var/mob/living/carbon/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list()) +/datum/nano_module/appearance_changer/New(var/location, var/mob/living/carbon/human/H, var/check_species_whitelist = 1, var/list/species_whitelist = list(), var/list/species_blacklist = list()) ..() - loc = location owner = H src.check_whitelist = check_species_whitelist src.whitelist = species_whitelist src.blacklist = species_blacklist -/obj/nano_module/appearance_changer/Topic(ref, href_list, var/nowindow, var/datum/topic_state/state = default_state) +/datum/nano_module/appearance_changer/Topic(ref, href_list, var/datum/topic_state/state = default_state) if(..()) return 1 @@ -35,7 +33,7 @@ return 1 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 + var/new_s_tone = input(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -owner.s_tone + 35) as num|null 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) @@ -92,7 +90,7 @@ return 0 -/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) +/datum/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) if(!owner || !owner.species) return @@ -133,31 +131,33 @@ 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, state = state) + ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) -/obj/nano_module/appearance_changer/proc/update_dna() +/datum/nano_module/appearance_changer/proc/update_dna() if(owner && (flags & APPEARANCE_UPDATE_DNA)) owner.update_dna() -/obj/nano_module/appearance_changer/proc/can_change(var/flag) +/datum/nano_module/appearance_changer/proc/can_change(var/flag) return owner && (flags & flag) -/obj/nano_module/appearance_changer/proc/can_change_skin_tone() - return owner && (flags & APPEARANCE_SKIN) && owner.species.flags & HAS_SKIN_TONE +/datum/nano_module/appearance_changer/proc/can_change_skin_tone() + return owner && (flags & APPEARANCE_SKIN) && owner.species.appearance_flags & HAS_SKIN_TONE -/obj/nano_module/appearance_changer/proc/can_change_skin_color() - return owner && (flags & APPEARANCE_SKIN) && owner.species.flags & HAS_SKIN_COLOR +/datum/nano_module/appearance_changer/proc/can_change_skin_color() + return owner && (flags & APPEARANCE_SKIN) && owner.species.appearance_flags & HAS_SKIN_COLOR -/obj/nano_module/appearance_changer/proc/cut_and_generate_data() +/datum/nano_module/appearance_changer/proc/cut_and_generate_data() // Making the assumption that the available species remain constant valid_facial_hairstyles.Cut() valid_facial_hairstyles.Cut() generate_data() -/obj/nano_module/appearance_changer/proc/generate_data() +/datum/nano_module/appearance_changer/proc/generate_data() + if(!owner) + return if(!valid_species.len) valid_species = owner.generate_valid_species(check_whitelist, whitelist, blacklist) if(!valid_hairstyles.len || !valid_facial_hairstyles.len) diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index 503f914d2ac..2c691349e06 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -1,6 +1,5 @@ -/obj/nano_module/law_manager +/datum/nano_module/law_manager name = "Law manager" - var/ion_law = "IonLaw" var/zeroth_law = "ZerothLaw" var/inherent_law = "InherentLaw" @@ -13,9 +12,8 @@ var/global/list/datum/ai_laws/player_laws var/mob/living/silicon/owner = null -/obj/nano_module/law_manager/New(var/mob/living/silicon/S) +/datum/nano_module/law_manager/New(var/mob/living/silicon/S) ..() - loc = S owner = S if(!admin_laws) @@ -29,7 +27,7 @@ if(laws.selectable) player_laws += laws -/obj/nano_module/law_manager/Topic(href, href_list) +/datum/nano_module/law_manager/Topic(href, href_list) if(..()) return 1 @@ -138,7 +136,7 @@ if(href_list["notify_laws"]) owner << "Law Notice" owner.laws.show_laws(owner) - if(owner.isMobAI()) + if(isAI(owner)) var/mob/living/silicon/ai/AI = owner for(var/mob/living/silicon/robot/R in AI.connected_robots) R << "Law Notice" @@ -149,7 +147,7 @@ return 0 -/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) +/datum/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() @@ -165,7 +163,7 @@ package_laws(data, "inherent_laws", owner.laws.inherent_laws) package_laws(data, "supplied_laws", owner.laws.supplied_laws) - data["isAI"] = owner.isMobAI() + data["isAI"] = isAI(owner) data["isMalf"] = is_malf(user) data["isSlaved"] = owner.is_slaved() data["isAdmin"] = is_admin(user) @@ -185,14 +183,14 @@ ui.open() ui.set_auto_update(1) -/obj/nano_module/law_manager/proc/package_laws(var/list/data, var/field, var/list/datum/ai_law/laws) +/datum/nano_module/law_manager/proc/package_laws(var/list/data, var/field, var/list/datum/ai_law/laws) var/packaged_laws[0] for(var/datum/ai_law/AL in laws) packaged_laws[++packaged_laws.len] = list("law" = AL.law, "index" = AL.get_index(), "state" = owner.laws.get_state_law(AL), "ref" = "\ref[AL]") data[field] = packaged_laws data["has_[field]"] = packaged_laws.len -/obj/nano_module/law_manager/proc/package_multiple_laws(var/list/datum/ai_laws/laws) +/datum/nano_module/law_manager/proc/package_multiple_laws(var/list/datum/ai_laws/laws) var/law_sets[0] for(var/datum/ai_laws/ALs in laws) var/packaged_laws[0] @@ -204,7 +202,7 @@ return law_sets -/obj/nano_module/law_manager/proc/is_malf(var/mob/user) +/datum/nano_module/law_manager/proc/is_malf(var/mob/user) return (is_admin(user) && !owner.is_slaved()) || owner.is_malf_or_traitor() /mob/living/silicon/proc/is_slaved() @@ -213,7 +211,7 @@ /mob/living/silicon/robot/is_slaved() return lawupdate && connected_ai ? sanitize(connected_ai.name) : null -/obj/nano_module/law_manager/proc/sync_laws(var/mob/living/silicon/ai/AI) +/datum/nano_module/law_manager/proc/sync_laws(var/mob/living/silicon/ai/AI) if(!AI) return for(var/mob/living/silicon/robot/R in AI.connected_robots) diff --git a/code/modules/nano/modules/nano_module.dm b/code/modules/nano/modules/nano_module.dm index 3fa82750992..2a53938dddf 100644 --- a/code/modules/nano/modules/nano_module.dm +++ b/code/modules/nano/modules/nano_module.dm @@ -1,5 +1,25 @@ -/obj/nano_module/nano_host() - return loc +/datum/nano_module + var/name + var/host + var/datum/computer_file/program/program = null // Program-Based computer program that runs this nano module. Defaults to null. -/obj/nano_module/proc/can_still_topic(var/datum/topic_state/state = default_state) +/datum/nano_module/New(var/host) + // Machinery-based computers wouldn't work w/o this as nano will assume they're items inside containers. + if(istype(host, /obj/item/modular_computer/processor)) + var/obj/item/modular_computer/processor/H = host + src.host = H.machinery_computer + else + src.host = host + +/datum/nano_module/nano_host() + return host ? host : src + +/datum/nano_module/proc/can_still_topic(var/datum/topic_state/state = default_state) return CanUseTopic(usr, state) == STATUS_INTERACTIVE + +/datum/nano_module/Topic(href, href_list) + // Calls forwarded to PROGRAM itself should begin with "PRG_" + // Calls forwarded to COMPUTER running the program should begin with "PC_" + if(program) + program.Topic(href, href_list) + return ..() \ No newline at end of file diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index b0bf72f39a3..b0eba159e55 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -1,14 +1,26 @@ -/obj/nano_module/power_monitor +/datum/nano_module/power_monitor name = "Power monitor" var/list/grid_sensors var/active_sensor = null //name_tag of the currently selected sensor -/obj/nano_module/power_monitor/New() +/datum/nano_module/power_monitor/New() ..() refresh_sensors() -/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) +// Checks whether there is an active alarm, if yes, returns 1, otherwise returns 0. +/datum/nano_module/power_monitor/proc/has_alarm() + for(var/obj/machinery/power/sensor/S in grid_sensors) + if(S.check_grid_warning()) + return 1 + return 0 + +// If PC is not null header template is loaded. Use PC.get_header_data() to get relevant nanoui data from it. All data entries begin with "PC_...." +// In future it may be expanded to other modular computer devices. +/datum/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() + if(program) + data = program.get_header_data() + 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. var/obj/machinery/power/sensor/focus = null @@ -29,14 +41,18 @@ 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, state = state) + if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI. + ui.auto_update_layout = 1 ui.set_initial_data(data) ui.open() ui.set_auto_update(1) // Refreshes list of active sensors kept on this computer. -/obj/nano_module/power_monitor/proc/refresh_sensors() +/datum/nano_module/power_monitor/proc/refresh_sensors() grid_sensors = list() - var/turf/T = get_turf(src) + var/turf/T = get_turf(nano_host()) + if(!T) // Safety check + return for(var/obj/machinery/power/sensor/S in machines) if((T && S.loc.z == T.z) || (S.long_range)) // Consoles have range on their Z-Level. Sensors with long_range var will work between Z levels. if(S.name_tag == "#UNKN#") // Default name. Shouldn't happen! @@ -45,7 +61,7 @@ grid_sensors += S // Allows us to process UI clicks, which are relayed in form of hrefs. -/obj/nano_module/power_monitor/Topic(href, href_list) +/datum/nano_module/power_monitor/Topic(href, href_list) if(..()) return 1 if( href_list["clear"] ) diff --git a/code/modules/nano/modules/rcon.dm b/code/modules/nano/modules/rcon.dm index 58e55894c1b..bca092b622a 100644 --- a/code/modules/nano/modules/rcon.dm +++ b/code/modules/nano/modules/rcon.dm @@ -1,6 +1,5 @@ -/obj/nano_module/rcon +/datum/nano_module/rcon name = "Power RCON" - var/list/known_SMESs = null var/list/known_breakers = null // Allows you to hide specific parts of the UI @@ -8,9 +7,11 @@ 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, var/datum/topic_state/state = default_state) +/datum/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] + if(program) + data = program.get_header_data() // SMES DATA (simplified view) var/list/smeslist[0] @@ -42,6 +43,8 @@ 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, state = state) + if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI. + ui.auto_update_layout = 1 ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -49,7 +52,7 @@ // 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. -/obj/nano_module/rcon/Topic(href, href_list) +/datum/nano_module/rcon/Topic(href, href_list) if(..()) return @@ -93,7 +96,7 @@ // Proc: GetSMESByTag() // Parameters: 1 (tag - RCON tag of SMES we want to look up) // Description: Looks up and returns SMES which has matching RCON tag -/obj/nano_module/rcon/proc/GetSMESByTag(var/tag) +/datum/nano_module/rcon/proc/GetSMESByTag(var/tag) if(!tag) return @@ -104,7 +107,7 @@ // Proc: FindDevices() // Parameters: None // Description: Refreshes local list of known devices. -/obj/nano_module/rcon/proc/FindDevices() +/datum/nano_module/rcon/proc/FindDevices() known_SMESs = new /list() for(var/obj/machinery/power/smes/buildable/SMES in machines) if(SMES.RCon_tag && (SMES.RCon_tag != "NO_TAG") && SMES.RCon) diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm index bb283accf52..08f9deffa9f 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/state = default_state) +/datum/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/nanomanager.dm b/code/modules/nano/nanomanager.dm index 64c59bcefa4..4ecda08bfab 100644 --- a/code/modules/nano/nanomanager.dm +++ b/code/modules/nano/nanomanager.dm @@ -18,6 +18,7 @@ var/list/nano_asset_dirs = list(\ "nano/css/",\ "nano/images/",\ + "nano/images/status_icons/",\ "nano/js/",\ "nano/templates/"\ ) diff --git a/code/modules/nano/nanomapgen.dm b/code/modules/nano/nanomapgen.dm index dd65b7bbd08..e0e65eba6ce 100644 --- a/code/modules/nano/nanomapgen.dm +++ b/code/modules/nano/nanomapgen.dm @@ -19,42 +19,42 @@ /client/proc/nanomapgen_DumpImage() set name = "Generate NanoUI Map" set category = "Server" - + if(holder) - nanomapgen_DumpTile(1, 1, text2num(input(usr,"Enter the Z level to generate"))) + nanomapgen_DumpTile(1, 1, text2num(input(usr,"Enter the Z level to generate"))) /client/proc/nanomapgen_DumpTile(var/startX = 1, var/startY = 1, var/currentZ = 1, var/endX = -1, var/endY = -1) if (endX < 0 || endX > world.maxx) endX = world.maxx - + if (endY < 0 || endY > world.maxy) endY = world.maxy - + if (currentZ < 0 || currentZ > world.maxz) usr << "NanoMapGen: ERROR: currentZ ([currentZ]) must be between 1 and [world.maxz]" - + sleep(3) return NANOMAP_TERMINALERR - + if (startX > endX) usr << "NanoMapGen: ERROR: startX ([startX]) cannot be greater than endX ([endX])" - + sleep(3) return NANOMAP_TERMINALERR - + if (startY > endX) usr << "NanoMapGen: ERROR: startY ([startY]) cannot be greater than endY ([endY])" sleep(3) return NANOMAP_TERMINALERR - + var/icon/Tile = icon(file("nano/mapbase1024.png")) if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION) world.log << "NanoMapGen: ERROR: BASE IMAGE DIMENSIONS ARE NOT [NANOMAP_MAX_ICON_DIMENSION]x[NANOMAP_MAX_ICON_DIMENSION]" sleep(3) return NANOMAP_TERMINALERR - - world.log << "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])" + + world.log << "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])" usr << "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])" var/count = 0; @@ -62,26 +62,26 @@ for(var/WorldY = startY, WorldY <= endY, WorldY++) var/atom/Turf = locate(WorldX, WorldY, currentZ) - - var/icon/TurfIcon = new(Turf.icon, Turf.icon_state) + + var/icon/TurfIcon = new(Turf.icon, Turf.icon_state, dir = Turf.dir) TurfIcon.Scale(NANOMAP_ICON_SIZE, NANOMAP_ICON_SIZE) - + Tile.Blend(TurfIcon, ICON_OVERLAY, ((WorldX - 1) * NANOMAP_ICON_SIZE), ((WorldY - 1) * NANOMAP_ICON_SIZE)) - + count++ - + if (count % 8000 == 0) world.log << "NanoMapGen: [count] tiles done" sleep(1) - + var/mapFilename = "nanomap_z[currentZ]-new.png" - + world.log << "NanoMapGen: sending [mapFilename] to client" usr << browse(Tile, "window=picture;file=[mapFilename];display=0") - + world.log << "NanoMapGen: Done." - + usr << "NanoMapGen: Done. File [mapFilename] uploaded to your cache." if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index a04b537fc1e..ae16e83877c 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -10,7 +10,7 @@ nanoui is used to open and update nano browser uis // the user who opened this ui var/mob/user // the object this ui "belongs" to - var/atom/movable/src_object + var/datum/src_object // the title of this ui var/title // the key of this ui, this is to allow multiple (different) uis for each src_object @@ -177,7 +177,7 @@ nanoui is used to open and update nano browser uis /datum/nanoui/proc/get_config_data() var/list/config_data = list( "title" = title, - "srcObject" = list("name" = src_object.name), + "srcObject" = list("name" = "[src_object]"), "stateKey" = state_key, "status" = status, "autoUpdateLayout" = auto_update_layout, @@ -393,6 +393,11 @@ nanoui is used to open and update nano browser uis if(!user.client) return + // An attempted fix to UIs sometimes locking up spamming runtime errors due to src_object being null for whatever reason. + // This hard-deletes the UI, preventing the device that uses the UI from being locked up permanently. + if(!src_object) + del(src) + var/window_size = "" if (width && height) window_size = "size=[width]x[height];" @@ -429,6 +434,9 @@ nanoui is used to open and update nano browser uis user << browse(null, "window=[window_id]") for(var/datum/nanoui/child in children) child.close() + children.Cut() + state = null + master_ui = null /** * Set the UI window to call the nanoclose verb when the window is closed @@ -480,7 +488,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, state)) || map_update) + if ((src_object && src_object.Topic(href, href_list, state)) || map_update) nanomanager.update_uis(src_object) // update all UIs attached to src_object /** diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index fa0b87ec212..f64cadc4781 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -35,7 +35,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 B.color = B.data["blood_colour"] // Takes care blood loss and regeneration -/mob/living/carbon/human/proc/handle_blood() +/mob/living/carbon/human/handle_blood() + if(in_stasis) + return if(species && species.flags & NO_BLOOD) return @@ -220,7 +222,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //Transfers blood from reagents to vessel, respecting blood types compatability. /mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount) - if(species && species.flags & NO_BLOOD) + if(!(species.flags & NO_BLOOD)) reagents.add_reagent("blood", amount, injected.data) reagents.update_total() return diff --git a/code/modules/organs/misc.dm b/code/modules/organs/misc.dm new file mode 100644 index 00000000000..a330e307a38 --- /dev/null +++ b/code/modules/organs/misc.dm @@ -0,0 +1,70 @@ +//CORTICAL BORER ORGANS. +/obj/item/organ/borer/process() + + // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss. + for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine")) + if(owner.reagents.get_reagent_amount(chem) < 3) + owner.reagents.add_reagent(chem, 5) + + // They're also super gross and ooze ichor. + if(prob(5)) + var/mob/living/carbon/human/H = owner + if(!istype(H)) + return + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list + blood_splatter(H,B,1) + var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) + if(goo) + goo.name = "husk ichor" + goo.desc = "It's thick and stinks of decay." + goo.basecolor = "#412464" + goo.update_icon() + +/obj/item/organ/borer + name = "cortical borer" + icon = 'icons/obj/objects.dmi' + icon_state = "borer" + organ_tag = "brain" + desc = "A disgusting space slug." + parent_organ = "head" + vital = 1 + +/obj/item/organ/borer/removed(var/mob/living/user) + + ..() + + var/mob/living/simple_animal/borer/B = owner.has_brain_worms() + if(B) + B.leave_host() + B.ckey = owner.ckey + + spawn(0) + qdel(src) + +//VOX ORGANS. +/obj/item/organ/stack + name = "cortical stack" + parent_organ = "head" + robotic = 2 + vital = 1 + var/backup_time = 0 + var/datum/mind/backup + +/obj/item/organ/stack/process() + if(owner && owner.stat != DEAD && !is_broken()) + backup_time = world.time + if(owner.mind) backup = owner.mind + +/obj/item/organ/stack/vox + +/obj/item/organ/stack/vox/stack + +/obj/item/organ/stack + name = "cortical stack" + icon_state = "brain-prosthetic" + organ_tag = "stack" + robotic = 2 + +/obj/item/organ/stack/vox + name = "vox cortical stack" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 888fae6396e..9cd7dff5e15 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -23,6 +23,8 @@ var/list/organ_cache = list() var/list/trace_chemicals = list() // traces of chemicals in the organ, // links chemical IDs to number of ticks for which they'll stay in the blood germ_level = 0 + var/datum/dna/dna + var/datum/species/species /obj/item/organ/Destroy() if(!owner) @@ -53,6 +55,12 @@ var/list/organ_cache = list() max_damage = min_broken_damage * 2 if(istype(holder)) src.owner = holder + species = all_species["Human"] + if(holder.dna) + dna = holder.dna.Clone() + species = all_species[dna.species] + else + log_debug("[src] at [loc] spawned without a proper DNA.") var/mob/living/carbon/human/H = holder if(istype(H)) if(internal) @@ -61,40 +69,48 @@ var/list/organ_cache = list() if(E.internal_organs == null) E.internal_organs = list() E.internal_organs |= src - if(H.dna) + if(dna) if(!blood_DNA) blood_DNA = list() - blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + blood_DNA[dna.unique_enzymes] = dna.b_type if(internal) holder.internal_organs |= src +/obj/item/organ/proc/set_dna(var/datum/dna/new_dna) + if(new_dna) + dna = new_dna.Clone() + blood_DNA.Cut() + blood_DNA[dna.unique_enzymes] = dna.b_type + /obj/item/organ/proc/die() if(status & ORGAN_ROBOT) return damage = max_damage + status |= ORGAN_DEAD processing_objects -= src if(dead_icon) icon_state = dead_icon + if(owner && vital) + owner.death() /obj/item/organ/process() - // Don't process if we're in a freezer, an MMI or a stasis bag. //TODO: ambient temperature? - if(istype(loc,/obj/item/device/mmi) || istype(loc,/obj/item/bodybag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer)) - return - - //Set/remove bad organ status, only every 10 ticks to reduce processing - //Unfortunately internal organs aren't a special subclass so this runs on every organ - if (owner && owner.life_tick % 10 == 0) - internal_set_bad() - - //Process infections - if (robotic >= 2 || (owner && owner.species && (owner.species.flags & IS_PLANT))) - germ_level = 0 - return - if(loc != owner) owner = null + //dead already, no need for more processing + if(status & ORGAN_DEAD) + return + // Don't process if we're in a freezer, an MMI or a stasis bag.or a freezer or something I dunno + if(istype(loc,/obj/item/device/mmi)) + return + if(istype(loc,/obj/structure/closet/body_bag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer) || istype(loc,/obj/item/weapon/storage/box/freezer)) + return + //Process infections + if ((status & ORGAN_ROBOT) || (owner && owner.species && (owner.species.flags & IS_PLANT))) + germ_level = 0 + return + if(!owner) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list if(B && prob(40)) @@ -102,6 +118,11 @@ var/list/organ_cache = list() blood_splatter(src,B,1) if(config.organs_decay) damage += rand(1,3) if(damage >= max_damage) + damage = max_damage + germ_level += rand(2,6) + if(germ_level >= INFECTION_LEVEL_TWO) + germ_level += rand(2,6) + if(germ_level >= INFECTION_LEVEL_THREE) die() @@ -111,13 +132,14 @@ var/list/organ_cache = list() handle_rejection() handle_germ_effects() -/obj/item/organ/proc/internal_set_bad() - if(!istype(src, /obj/item/organ/external))//if the organ is an internal one - if (damage) - if (!(src in owner.bad_internal_organs)) - owner.bad_internal_organs.Add(src) - else - owner.bad_internal_organs.Remove(src) + //check if we've hit max_damage + if(damage >= max_damage) + die() + +/obj/item/organ/examine(mob/user) + ..(user) + if(status & ORGAN_DEAD) + user << "The decay has set in." /obj/item/organ/proc/handle_germ_effects() //** Handle the effects of infections @@ -147,24 +169,23 @@ var/list/organ_cache = list() /obj/item/organ/proc/handle_rejection() // Process unsuitable transplants. TODO: consider some kind of // immunosuppressant that changes transplant data to make it match. - if(transplant_data) - if(!rejecting && prob(20) && owner.dna && blood_incompatible(transplant_data["blood_type"],owner.dna.b_type,owner.species,transplant_data["species"])) - rejecting = 1 + if(dna) + if(!rejecting) + if(blood_incompatible(dna.b_type, owner.dna.b_type, species, owner.species)) + rejecting = 1 else rejecting++ //Rejection severity increases over time. if(rejecting % 10 == 0) //Only fire every ten rejection ticks. switch(rejecting) if(1 to 50) - take_damage(1) + germ_level++ if(51 to 200) - owner.reagents.add_reagent("toxin", 1) - take_damage(1) + germ_level += rand(1,2) if(201 to 500) - take_damage(rand(2,3)) - owner.reagents.add_reagent("toxin", 2) + germ_level += rand(2,3) if(501 to INFINITY) - take_damage(4) - owner.reagents.add_reagent("toxin", rand(3,5)) + germ_level += rand(3,5) + owner.reagents.add_reagent("toxin", rand(1,2)) /obj/item/organ/proc/receive_chem(chemical as obj) return 0 @@ -240,31 +261,17 @@ var/list/organ_cache = list() min_broken_damage = 35 /obj/item/organ/emp_act(severity) - switch(robotic) - if(0) + if(!(status & ORGAN_ROBOT)) + return + switch (severity) + if (1.0) + take_damage(20) return - if(1) - switch (severity) - if (1.0) - take_damage(20,0) - return - if (2.0) - take_damage(7,0) - return - if(3.0) - take_damage(3,0) - return - if(2) - switch (severity) - if (1.0) - take_damage(40,0) - return - if (2.0) - take_damage(15,0) - return - if(3.0) - take_damage(10,0) - return + if (2.0) + take_damage(7) + return + if(3.0) + take_damage(3) /obj/item/organ/proc/removed(var/mob/living/user) diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index a92f4aa66bf..a248455e16f 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -429,40 +429,3 @@ icon_state = "tracheae" /obj/item/organ/vaurca/tracheae/removed() return */ - -// Skeleton limbs. -/obj/item/organ/external/chest/skeleton - name = "rib cage" - -/obj/item/organ/external/groin/skeleton - name = "pelvis" - vital = 0 - -/obj/item/organ/external/arm/skeleton - dislocated = -1 - -/obj/item/organ/external/arm/right/skeleton - dislocated = -1 - -/obj/item/organ/external/leg/skeleton - dislocated = -1 - -/obj/item/organ/external/leg/right/skeleton - dislocated = -1 - -/obj/item/organ/external/foot/skeleton - dislocated = -1 - -/obj/item/organ/external/foot/right/skeleton - dislocated = -1 - -/obj/item/organ/external/hand/skeleton - dislocated = -1 - -/obj/item/organ/external/hand/right/skeleton - dislocated = -1 - -/obj/item/organ/external/head/skeleton - name = "skull" - dislocated = -1 - vital = 0 diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 8f459a9997e..242678f308c 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -14,6 +14,9 @@ dir = SOUTH organ_tag = "limb" + var/brute_mod = 1 + var/burn_mod = 1 + var/icon_name = null var/body_part = null var/icon_position = 0 @@ -32,6 +35,7 @@ var/cannot_break var/s_tone var/list/s_col + var/list/h_col var/list/wounds = list() var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len! var/perma_injury = 0 @@ -52,6 +56,7 @@ var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ. var/can_grasp //It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point var/can_stand + var/body_hair /obj/item/organ/external/Destroy() if(parent && parent.children) @@ -101,12 +106,12 @@ switch(stage) if(0) if(istype(W,/obj/item/weapon/scalpel)) - user.visible_message("[user] cuts [src] open with [W]!") + user.visible_message("[user] cuts [src] open with [W]!") stage++ return if(1) if(istype(W,/obj/item/weapon/retractor)) - user.visible_message("[user] cracks [src] open like an egg with [W]!") + user.visible_message("[user] cracks [src] open like an egg with [W]!") stage++ return if(2) @@ -116,9 +121,9 @@ removing.loc = get_turf(user.loc) if(!(user.l_hand && user.r_hand)) user.put_in_hands(removing) - user.visible_message("[user] extracts [removing] from [src] with [W]!") + user.visible_message("[user] extracts [removing] from [src] with [W]!") else - user.visible_message("[user] fishes around fruitlessly in [src] with [W].") + user.visible_message("[user] fishes around fruitlessly in [src] with [W].") return ..() @@ -172,11 +177,11 @@ /obj/item/organ/external/replaced(var/mob/living/carbon/human/target) owner = target + forceMove(owner) if(istype(owner)) owner.organs_by_name[limb_name] = src owner.organs |= src for(var/obj/item/organ/organ in src) - organ.loc = owner organ.replaced(owner,src) if(parent_organ) @@ -185,6 +190,19 @@ if(!parent.children) parent.children = list() parent.children.Add(src) + //Remove all stump wounds since limb is not missing anymore + for(var/datum/wound/lost_limb/W in parent.wounds) + parent.wounds -= W + qdel(W) + break + parent.update_damages() + + +/obj/item/organ/external/robotize() + ..() + //robit limbs take reduced damage + brute_mod = 0.8 + burn_mod = 0.8 /**************************************************** DAMAGE PROCS @@ -197,19 +215,8 @@ if((brute <= 0) && (burn <= 0)) return 0 - if(status & ORGAN_ROBOT ) - - var/brmod = 0.66 - var/bumod = 0.66 - - if(istype(owner,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = owner - if(H.species && H.species.flags & IS_SYNTHETIC) - brmod = H.species.brute_mod - bumod = H.species.burn_mod - - brute *= brmod //~2/3 damage for ROBOLIMBS - burn *= bumod //~2/3 damage for ROBOLIMBS + brute *= brute_mod + burn *= burn_mod // High brute damage or sharp objects may damage internal organs if(internal_organs && (brute_dam >= max_damage || (((sharp && brute >= 5) || brute >= 10) && prob(5)))) @@ -384,10 +391,14 @@ This function completely restores a damaged organ to perfect condition. var/datum/wound/W = pick(compatible_wounds) W.open_wound(damage) if(prob(25)) - //maybe have a separate message for BRUISE type damage? - owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\ - "\red The wound on your [name] widens with a nasty ripping noise.",\ - "You hear a nasty ripping noise, as if flesh is being torn apart.") + if(status & ORGAN_ROBOT) + owner.visible_message("\red The damage to [owner.name]'s [name] worsens.",\ + "\red The damage to your [name] worsens.",\ + "You hear the screech of abused metal.") + else + owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\ + "\red The wound on your [name] widens with a nasty ripping noise.",\ + "You hear a nasty ripping noise, as if flesh is being torn apart.") return //Creating wound @@ -416,7 +427,7 @@ This function completely restores a damaged organ to perfect condition. //Determines if we even need to process this organ. /obj/item/organ/external/proc/need_process() - if(status && status != ORGAN_ROBOT && status != ORGAN_PLANT) // If it's robotic, that's fine it will have a status. + if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_SPLINTED|ORGAN_DEAD|ORGAN_MUTATED)) return 1 if(brute_dam || burn_dam) return 1 @@ -628,6 +639,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(istype(owner,/mob/living/carbon/human)) H = owner + //update damage counts for(var/datum/wound/W in wounds) if(!W.internal) //so IB doesn't count towards crit/paincrit if(W.damage_type == CUT || W.damage_type == BRUISE) @@ -643,9 +655,13 @@ Note that amputating the affected organ does in fact remove the infection from t number_wounds += W.amount - if (open && !clamped && (H && !(H.species.flags & NO_BLOOD))) //things tend to bleed if they are CUT OPEN + //things tend to bleed if they are CUT OPEN + if (open && !clamped && (H && !(H.species.flags & NO_BLOOD))) status |= ORGAN_BLEEDING + //Bone fractures + if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) + src.fracture() // new damage icon system // adjusted to set damage_state to brute/burn code only (without r_name0 as before) @@ -695,27 +711,30 @@ Note that amputating the affected organ does in fact remove the infection from t switch(disintegrate) if(DROPLIMB_EDGE) if(!clean) + var/gore_sound = "[(status & ORGAN_ROBOT) ? "tortured metal" : "ripping tendons and flesh"]" owner.visible_message( "\The [owner]'s [src.name] flies off in an arc!",\ "Your [src.name] goes flying off!",\ - "You hear a terrible sound of ripping tendons and flesh.") + "You hear a terrible sound of [gore_sound].") if(DROPLIMB_BURN) + var/gore = "[(status & ORGAN_ROBOT) ? "": " of burning flesh"]" owner.visible_message( "\The [owner]'s [src.name] flashes away into ashes!",\ "Your [src.name] flashes away into ashes!",\ - "You hear the crackling sound of burning flesh.") + "You hear a crackling sound[gore].") if(DROPLIMB_BLUNT) + var/gore = "[(status & ORGAN_ROBOT) ? "": " in shower of gore"]" + var/gore_sound = "[(status & ORGAN_ROBOT) ? "rending sound of tortured metal" : "sickening splatter of gore"]" owner.visible_message( - "\The [owner]'s [src.name] explodes in a shower of gore!",\ - "Your [src.name] explodes in a shower of gore!",\ - "You hear the sickening splatter of gore.") + "\The [owner]'s [src.name] explodes[gore]!",\ + "Your [src.name] explodes[gore]!",\ + "You hear the [gore_sound].") var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed(). var/obj/item/organ/external/parent_organ = parent removed(null, ignore_children) victim.traumatic_shock += 60 - wounds.Cut() if(parent_organ) var/datum/wound/lost_limb/W = new (src, disintegrate, clean) if(clean) @@ -723,6 +742,8 @@ Note that amputating the affected organ does in fact remove the infection from t parent_organ.update_damages() else var/obj/item/organ/external/stump/stump = new (victim, 0, src) + if(status & ORGAN_ROBOT) + stump.robotize() stump.wounds |= W victim.organs |= stump stump.update_damages() @@ -797,15 +818,46 @@ Note that amputating the affected organ does in fact remove the infection from t "\The [holder.legcuffed.name] falls off you.") holder.drop_from_inventory(holder.legcuffed) +// checks if all wounds on the organ are bandaged +/obj/item/organ/external/proc/is_bandaged() + for(var/datum/wound/W in wounds) + if(W.internal) continue + if(!W.bandaged) + return 0 + return 1 + +// checks if all wounds on the organ are salved +/obj/item/organ/external/proc/is_salved() + for(var/datum/wound/W in wounds) + if(W.internal) continue + if(!W.salved) + return 0 + return 1 + +// checks if all wounds on the organ are disinfected +/obj/item/organ/external/proc/is_disinfected() + for(var/datum/wound/W in wounds) + if(W.internal) continue + if(!W.disinfected) + return 0 + return 1 + /obj/item/organ/external/proc/bandage() var/rval = 0 - src.status &= ~ORGAN_BLEEDING + status &= ~ORGAN_BLEEDING for(var/datum/wound/W in wounds) if(W.internal) continue rval |= !W.bandaged W.bandaged = 1 return rval +/obj/item/organ/external/proc/salve() + var/rval = 0 + for(var/datum/wound/W in wounds) + rval |= !W.salved + W.salved = 1 + return rval + /obj/item/organ/external/proc/disinfect() var/rval = 0 for(var/datum/wound/W in wounds) @@ -824,25 +876,19 @@ Note that amputating the affected organ does in fact remove the infection from t W.clamped = 1 return rval -/obj/item/organ/external/proc/salve() - var/rval = 0 - for(var/datum/wound/W in wounds) - rval |= !W.salved - W.salved = 1 - return rval - /obj/item/organ/external/proc/fracture() - + if(status & ORGAN_ROBOT) + return //ORGAN_BROKEN doesn't have the same meaning for robot limbs if((status & ORGAN_BROKEN) || cannot_break) return - owner.visible_message(\ - "\red You hear a loud cracking sound coming from \the [owner].",\ - "\red Something feels like it shattered in your [name]!",\ - "You hear a sickening crack.") - - if(owner.species && !(owner.species.flags & NO_PAIN)) - owner.emote("scream") + if(owner) + owner.visible_message(\ + "\red You hear a loud cracking sound coming from \the [owner].",\ + "\red Something feels like it shattered in your [name]!",\ + "You hear a sickening crack.") + if(owner.species && !(owner.species.flags & NO_PAIN)) + owner.emote("scream") status |= ORGAN_BROKEN broken_description = pick("broken","fracture","hairline fracture") @@ -854,8 +900,8 @@ Note that amputating the affected organ does in fact remove the infection from t // This is mostly for the ninja suit to stop ninja being so crippled by breaks. // TODO: consider moving this to a suit proc or process() or something during - // voidsuit rewrite. - if(!(status & ORGAN_SPLINTED) && istype(owner,/mob/living/carbon/human)) + // hardsuit rewrite. + if(owner && !(status & ORGAN_SPLINTED) && istype(owner,/mob/living/carbon/human)) var/mob/living/carbon/human/H = owner @@ -886,6 +932,8 @@ Note that amputating the affected organ does in fact remove the infection from t if(company) model = company var/datum/robolimb/R = all_robolimbs[company] + if(species && (species.name in R.species_cannot_use)) + R = basic_robolimb if(R) force_icon = R.icon name = "[R.company] [initial(name)]" @@ -909,11 +957,11 @@ Note that amputating the affected organ does in fact remove the infection from t if(src.status & ORGAN_ROBOT) return src.status |= ORGAN_MUTATED - owner.update_body() + if(owner) owner.update_body() /obj/item/organ/external/proc/unmutate() src.status &= ~ORGAN_MUTATED - owner.update_body() + if(owner) owner.update_body() /obj/item/organ/external/proc/get_damage() //returns total damage return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use max_damage? @@ -930,11 +978,14 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/proc/is_malfunctioning() return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam)) -/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0) - if(loc != owner) +/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0, var/supplied_message) + if(!owner || loc != owner) return if(!silent) - owner.visible_message("\The [W] sticks in the wound!") + if(supplied_message) + owner.visible_message("[supplied_message]") + else + owner.visible_message("\The [W] sticks in the wound!") implants += W owner.embedded_flag = 1 owner.verbs += /mob/proc/yank_out_object @@ -1017,6 +1068,9 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/proc/get_wounds_desc() . = "" + if(status & ORGAN_DESTROYED && !is_stump()) + . += "tear at [amputation_point] so severe that it hangs by a scrap of flesh" + if(status & ORGAN_ROBOT) if(brute_dam) switch(brute_dam) @@ -1067,6 +1121,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(6 to INFINITY) flavor_text += "a ton of [wound]\s" return english_list(flavor_text) + /**************************************************** ORGAN DEFINES ****************************************************/ diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 8812748b69e..ea92c278f0c 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -15,12 +15,28 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) s_tone = null s_col = null + h_col = null if(status & ORGAN_ROBOT) return - if(!isnull(human.s_tone) && (human.species.flags & HAS_SKIN_TONE)) + if(species && human.species && species.name != human.species.name) + return + if(!isnull(human.s_tone) && (human.species.appearance_flags & HAS_SKIN_TONE)) s_tone = human.s_tone - if(human.species.flags & HAS_SKIN_COLOR) + if(human.species.appearance_flags & HAS_SKIN_COLOR) s_col = list(human.r_skin, human.g_skin, human.b_skin) + h_col = list(human.r_hair, human.g_hair, human.b_hair) + +/obj/item/organ/external/proc/sync_colour_to_dna() + s_tone = null + s_col = null + h_col = null + if(status & ORGAN_ROBOT) + return + if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.appearance_flags & HAS_SKIN_TONE)) + s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) + if(species.appearance_flags & HAS_SKIN_COLOR) + s_col = list(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B)) + h_col = list(dna.GetUIValue(DNA_UI_HAIR_R),dna.GetUIValue(DNA_UI_HAIR_G),dna.GetUIValue(DNA_UI_HAIR_B)) /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) ..() @@ -39,8 +55,8 @@ var/global/list/limb_icon_cache = list() return 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(species.eyes) + var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes) if(eyes) eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) else @@ -48,54 +64,59 @@ var/global/list/limb_icon_cache = list() mob_icon.Blend(eyes_icon, ICON_OVERLAY) overlays |= eyes_icon - if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS))) + if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") overlays |= lip_icon mob_icon.Blend(lip_icon, 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.get_bodytype() in facial_hair_style.species_allowed)) + if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype() 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))) + if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] - if(hair_style && (owner.species.get_bodytype() in hair_style.species_allowed)) + if(hair_style && (species.get_bodytype() 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) + if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) + hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_ADD) overlays |= hair_s return mob_icon /obj/item/organ/external/proc/get_icon(var/skeletal) - var/gender + var/gender = "f" + if(owner && owner.gender == MALE) + gender = "m" + if(force_icon) - mob_icon = new /icon(force_icon, "[icon_name]") + mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]") else - if(!owner) - mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_f" : ""]") + if(!dna) + mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]") else - if(gendered_icon) - if(owner.gender == FEMALE) + if(!gendered_icon) + gender = null + else + if(dna.GetUIState(DNA_UI_GENDER)) gender = "f" else gender = "m" if(skeletal) mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]") - else if ((status & ORGAN_ROBOT) && !(owner.species && owner.species.flags & IS_SYNTHETIC)) + else if (status & ORGAN_ROBOT) mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") else if (status & ORGAN_MUTATED) - mob_icon = new /icon(owner.species.deform, "[icon_name][gender ? "_[gender]" : ""]") + mob_icon = new /icon(species.deform, "[icon_name][gender ? "_[gender]" : ""]") else - mob_icon = new /icon(owner.species.icobase, "[icon_name][gender ? "_[gender]" : ""]") + mob_icon = new /icon(species.icobase, "[icon_name][gender ? "_[gender]" : ""]") if(status & ORGAN_DEAD) mob_icon.ColorTone(rgb(10,50,0)) @@ -109,6 +130,14 @@ var/global/list/limb_icon_cache = list() else if(s_col && s_col.len >= 3) mob_icon.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD) + if(body_hair && islist(h_col) && h_col.len >= 3) + var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]" + if(!limb_icon_cache[cache_key]) + var/icon/I = icon(species.icobase, "[icon_name]_[body_hair]") + I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_ADD) + limb_icon_cache[cache_key] = I + mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY) + dir = EAST icon = mob_icon diff --git a/code/modules/organs/organ_stump.dm b/code/modules/organs/organ_stump.dm index 89f3171aa6e..d59e7470337 100644 --- a/code/modules/organs/organ_stump.dm +++ b/code/modules/organs/organ_stump.dm @@ -14,6 +14,8 @@ ..(holder, internal) if(istype(limb)) max_damage = limb.max_damage + if((limb.status & ORGAN_ROBOT) && (!parent || (parent.status & ORGAN_ROBOT))) + robotize() //if both limb and the parent are robotic, the stump is robotic too /obj/item/organ/external/stump/is_stump() return 1 diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 9feafea0267..e74ceaa40e6 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -15,6 +15,7 @@ var/global/datum/robolimb/basic_robolimb var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb. var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from. var/unavailable_at_chargen // If set, not available at chargen. + var/list/species_cannot_use = list("Resomi") /datum/robolimb/bishop company = "Bishop Cybernetics" @@ -35,3 +36,9 @@ var/global/datum/robolimb/basic_robolimb company = "Xion Manufacturing Group" desc = "This limb has a minimalist black and red casing." icon = 'icons/mob/human_races/cyberlimbs/xion.dmi' + +/datum/robolimb/ipc + company = "Morpheus Cyberkinetics" + desc = "This limb is simple and functional; no effort has been made to make it look human." + icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi' + unavailable_at_chargen = 1 diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm new file mode 100644 index 00000000000..61652aafd44 --- /dev/null +++ b/code/modules/organs/subtypes/diona.dm @@ -0,0 +1,208 @@ +/proc/spawn_diona_nymph(var/turf/target) + if(!istype(target)) + return 0 + + //This is a terrible hack and I should be ashamed. + var/datum/seed/diona = plant_controller.seeds["diona"] + if(!diona) + return 0 + + spawn(1) // So it has time to be thrown about by the gib() proc. + var/mob/living/carbon/alien/diona/D = new(target) + var/datum/ghosttrap/plant/P = get_ghost_trap("living plant") + P.request_player(D, "A diona nymph has split off from its gestalt. ") + spawn(60) + if(D) + if(!D.ckey || !D.client) + D.death() + return 1 + +/obj/item/organ/external/diona + name = "tendril" + cannot_break = 1 + amputation_point = "branch" + joint = "structural ligament" + dislocated = -1 + +/obj/item/organ/external/diona/chest + name = "core trunk" + limb_name = "chest" + icon_name = "torso" + max_damage = 200 + min_broken_damage = 50 + w_class = 5 + body_part = UPPER_TORSO + vital = 1 + cannot_amputate = 1 + parent_organ = null + +/obj/item/organ/external/diona/groin + name = "fork" + limb_name = "groin" + icon_name = "groin" + max_damage = 100 + min_broken_damage = 50 + w_class = 4 + body_part = LOWER_TORSO + parent_organ = "chest" + +/obj/item/organ/external/diona/arm + name = "left upper tendril" + limb_name = "l_arm" + icon_name = "l_arm" + max_damage = 35 + min_broken_damage = 20 + w_class = 3 + body_part = ARM_LEFT + parent_organ = "chest" + can_grasp = 1 + +/obj/item/organ/external/diona/arm/right + name = "right upper tendril" + limb_name = "r_arm" + icon_name = "r_arm" + body_part = ARM_RIGHT + +/obj/item/organ/external/diona/leg + name = "left lower tendril" + limb_name = "l_leg" + icon_name = "l_leg" + max_damage = 35 + min_broken_damage = 20 + w_class = 3 + body_part = LEG_LEFT + icon_position = LEFT + parent_organ = "groin" + can_stand = 1 + +/obj/item/organ/external/diona/leg/right + name = "right lower tendril" + limb_name = "r_leg" + icon_name = "r_leg" + body_part = LEG_RIGHT + icon_position = RIGHT + +/obj/item/organ/external/diona/foot + name = "left foot" + limb_name = "l_foot" + icon_name = "l_foot" + max_damage = 20 + min_broken_damage = 10 + w_class = 2 + body_part = FOOT_LEFT + icon_position = LEFT + parent_organ = "l_leg" + can_stand = 1 + +/obj/item/organ/external/diona/foot/right + name = "right foot" + limb_name = "r_foot" + icon_name = "r_foot" + body_part = FOOT_RIGHT + icon_position = RIGHT + parent_organ = "r_leg" + joint = "right ankle" + amputation_point = "right ankle" + +/obj/item/organ/external/diona/hand + name = "left grasper" + limb_name = "l_hand" + icon_name = "l_hand" + max_damage = 30 + min_broken_damage = 15 + w_class = 2 + body_part = HAND_LEFT + parent_organ = "l_arm" + can_grasp = 1 + +/obj/item/organ/external/diona/hand/right + name = "right grasper" + limb_name = "r_hand" + icon_name = "r_hand" + body_part = HAND_RIGHT + parent_organ = "r_arm" + +/obj/item/organ/external/diona/head + limb_name = "head" + icon_name = "head" + name = "head" + max_damage = 50 + min_broken_damage = 25 + w_class = 3 + body_part = HEAD + parent_organ = "chest" + +/obj/item/organ/external/diona/head/removed() + if(owner) + owner.u_equip(owner.head) + owner.u_equip(owner.l_ear) + ..() + +//DIONA ORGANS. +/obj/item/organ/external/diona/removed() + var/mob/living/carbon/human/H = owner + ..() + if(!istype(H) || !H.organs || !H.organs.len) + H.death() + if(prob(50) && spawn_diona_nymph(get_turf(src))) + qdel(src) + +/obj/item/organ/diona/process() + return + +/obj/item/organ/diona/strata + name = "neural strata" + parent_organ = "chest" + organ_tag = "neural strata" + + +/obj/item/organ/diona/bladder + name = "gas bladder" + parent_organ = "head" + organ_tag = "gas bladder" + +/obj/item/organ/diona/polyp + name = "polyp segment" + parent_organ = "groin" + organ_tag = "polyp segment" + +/obj/item/organ/diona/ligament + name = "anchoring ligament" + parent_organ = "groin" + organ_tag = "anchoring ligament" + +/obj/item/organ/diona + name = "diona nymph" + icon = 'icons/obj/objects.dmi' + icon_state = "nymph" + organ_tag = "special" // Turns into a nymph instantly, no transplanting possible. + +/obj/item/organ/diona/removed(var/mob/living/user) + var/mob/living/carbon/human/H = owner + ..() + if(!istype(H) || !H.organs || !H.organs.len) + H.death() + if(prob(50) && spawn_diona_nymph(get_turf(src))) + qdel(src) + +// These are different to the standard diona organs as they have a purpose in other +// species (absorbing radiation and light respectively) +/obj/item/organ/diona/nutrients + name = "nutrient channel" + parent_organ = "chest" + organ_tag = "nutrient channel" + icon = 'icons/mob/alien.dmi' + icon_state = "claw" + +/obj/item/organ/diona/nutrients/removed() + return + +/obj/item/organ/diona/node + name = "response node" + parent_organ = "head" + organ_tag = "response node" + icon = 'icons/mob/alien.dmi' + icon_state = "claw" + +/obj/item/organ/diona/node/removed() + return diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm new file mode 100644 index 00000000000..bee75956242 --- /dev/null +++ b/code/modules/organs/subtypes/machine.dm @@ -0,0 +1,157 @@ +// IPC limbs. +/obj/item/organ/external/head/ipc + dislocated = -1 + can_intake_reagents = 0 + vital = 0 + max_damage = 50 //made same as arm, since it is not vital + min_broken_damage = 30 + encased = null + +/obj/item/organ/external/head/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/chest/ipc + dislocated = -1 + encased = null +/obj/item/organ/external/chest/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/groin/ipc + dislocated = -1 +/obj/item/organ/external/groin/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/arm/ipc + dislocated = -1 +/obj/item/organ/external/arm/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/arm/right/ipc + dislocated = -1 +/obj/item/organ/external/arm/right/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/leg/ipc + dislocated = -1 +/obj/item/organ/external/leg/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/leg/right/ipc + dislocated = -1 +/obj/item/organ/external/leg/right/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/foot/ipc + dislocated = -1 +/obj/item/organ/external/foot/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/foot/right/ipc + dislocated = -1 +/obj/item/organ/external/foot/right/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/hand/ipc + dislocated = -1 +/obj/item/organ/external/hand/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/external/hand/right/ipc + dislocated = -1 +/obj/item/organ/external/hand/right/ipc/New() + robotize("Morpheus Cyberkinetics") + ..() + +/obj/item/organ/cell + name = "microbattery" + desc = "A small, powerful cell for use in fully prosthetic bodies." + icon = 'icons/obj/power.dmi' + icon_state = "scell" + organ_tag = "cell" + parent_organ = "chest" + vital = 1 + +/obj/item/organ/cell/New() + robotize() + ..() + +/obj/item/organ/cell/replaced() + ..() + // This is very ghetto way of rebooting an IPC. TODO better way. + if(owner && owner.stat == DEAD) + owner.stat = 0 + owner.visible_message("\The [owner] twitches visibly!") + +/obj/item/organ/optical_sensor + name = "optical sensor" + organ_tag = "optics" + parent_organ = "head" + icon = 'icons/obj/robot_component.dmi' + icon_state = "camera" + dead_icon = "camera_broken" + +/obj/item/organ/optical_sensor/New() + robotize() + ..() + +// Used for an MMI or posibrain being installed into a human. +/obj/item/organ/mmi_holder + name = "brain" + organ_tag = "brain" + parent_organ = "chest" + vital = 1 + var/obj/item/device/mmi/stored_mmi + +/obj/item/organ/mmi_holder/proc/update_from_mmi() + if(!stored_mmi) + return + name = stored_mmi.name + desc = stored_mmi.desc + icon = stored_mmi.icon + icon_state = stored_mmi.icon_state + +/obj/item/organ/mmi_holder/removed(var/mob/living/user) + + if(stored_mmi) + stored_mmi.loc = get_turf(src) + if(owner.mind) + owner.mind.transfer_to(stored_mmi.brainmob) + ..() + + var/mob/living/holder_mob = loc + if(istype(holder_mob)) + holder_mob.drop_from_inventory(src) + qdel(src) + +/obj/item/organ/mmi_holder/New() + ..() + // This is very ghetto way of rebooting an IPC. TODO better way. + spawn(1) + if(owner && owner.stat == DEAD) + owner.stat = 0 + owner.visible_message("\The [owner] twitches visibly!") + +/obj/item/organ/mmi_holder/posibrain/New() + robotize() + stored_mmi = new /obj/item/device/mmi/digital/posibrain(src) + ..() + spawn(1) + if(owner) + stored_mmi.name = "positronic brain ([owner.name])" + stored_mmi.brainmob.real_name = owner.name + stored_mmi.brainmob.name = stored_mmi.brainmob.real_name + stored_mmi.icon_state = "posibrain-occupied" + update_from_mmi() + else + stored_mmi.loc = get_turf(src) + qdel(src) \ No newline at end of file diff --git a/code/modules/organs/subtypes/resomi.dm b/code/modules/organs/subtypes/resomi.dm new file mode 100644 index 00000000000..f96cf75f03e --- /dev/null +++ b/code/modules/organs/subtypes/resomi.dm @@ -0,0 +1,8 @@ +/obj/item/organ/external/foot/resomi + body_hair = "feathers" +/obj/item/organ/external/foot/right/resomi + body_hair = "feathers" +/obj/item/organ/external/hand/resomi + body_hair = "feathers" +/obj/item/organ/external/hand/right/resomi + body_hair = "feathers" diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm new file mode 100644 index 00000000000..54ec34ae70c --- /dev/null +++ b/code/modules/organs/subtypes/standard.dm @@ -0,0 +1,170 @@ +/**************************************************** + ORGAN DEFINES +****************************************************/ + +/obj/item/organ/external/chest + name = "upper body" + limb_name = "chest" + icon_name = "torso" + max_damage = 100 + min_broken_damage = 35 + w_class = 5 + body_part = UPPER_TORSO + vital = 1 + amputation_point = "spine" + joint = "neck" + dislocated = -1 + gendered_icon = 1 + cannot_amputate = 1 + parent_organ = null + encased = "ribcage" + +/obj/item/organ/external/groin + name = "lower body" + limb_name = "groin" + icon_name = "groin" + max_damage = 100 + min_broken_damage = 35 + w_class = 4 + body_part = LOWER_TORSO + vital = 1 + parent_organ = "chest" + amputation_point = "lumbar" + joint = "hip" + dislocated = -1 + gendered_icon = 1 + +/obj/item/organ/external/arm + limb_name = "l_arm" + name = "left arm" + icon_name = "l_arm" + max_damage = 50 + min_broken_damage = 30 + w_class = 3 + body_part = ARM_LEFT + parent_organ = "chest" + joint = "left elbow" + amputation_point = "left shoulder" + can_grasp = 1 + +/obj/item/organ/external/arm/right + limb_name = "r_arm" + name = "right arm" + icon_name = "r_arm" + body_part = ARM_RIGHT + joint = "right elbow" + amputation_point = "right shoulder" + +/obj/item/organ/external/leg + limb_name = "l_leg" + name = "left leg" + icon_name = "l_leg" + max_damage = 50 + min_broken_damage = 30 + w_class = 3 + body_part = LEG_LEFT + icon_position = LEFT + parent_organ = "groin" + joint = "left knee" + amputation_point = "left hip" + can_stand = 1 + +/obj/item/organ/external/leg/right + limb_name = "r_leg" + name = "right leg" + icon_name = "r_leg" + body_part = LEG_RIGHT + icon_position = RIGHT + joint = "right knee" + amputation_point = "right hip" + +/obj/item/organ/external/foot + limb_name = "l_foot" + name = "left foot" + icon_name = "l_foot" + max_damage = 30 + min_broken_damage = 15 + w_class = 2 + body_part = FOOT_LEFT + icon_position = LEFT + parent_organ = "l_leg" + joint = "left ankle" + amputation_point = "left ankle" + can_stand = 1 + +/obj/item/organ/external/foot/removed() + if(owner) owner.u_equip(owner.shoes) + ..() + +/obj/item/organ/external/foot/right + limb_name = "r_foot" + name = "right foot" + icon_name = "r_foot" + body_part = FOOT_RIGHT + icon_position = RIGHT + parent_organ = "r_leg" + joint = "right ankle" + amputation_point = "right ankle" + +/obj/item/organ/external/hand + limb_name = "l_hand" + name = "left hand" + icon_name = "l_hand" + max_damage = 30 + min_broken_damage = 15 + w_class = 2 + body_part = HAND_LEFT + parent_organ = "l_arm" + joint = "left wrist" + amputation_point = "left wrist" + can_grasp = 1 + +/obj/item/organ/external/hand/removed() + owner.u_equip(owner.gloves) + ..() + +/obj/item/organ/external/hand/right + limb_name = "r_hand" + name = "right hand" + icon_name = "r_hand" + body_part = HAND_RIGHT + parent_organ = "r_arm" + joint = "right wrist" + amputation_point = "right wrist" + +/obj/item/organ/external/head + limb_name = "head" + icon_name = "head" + name = "head" + max_damage = 75 + min_broken_damage = 35 + w_class = 3 + body_part = HEAD + vital = 1 + parent_organ = "chest" + joint = "jaw" + amputation_point = "neck" + gendered_icon = 1 + encased = "skull" + var/can_intake_reagents = 1 + +/obj/item/organ/external/head/removed() + if(owner) + name = "[owner.real_name]'s head" + owner.u_equip(owner.glasses) + owner.u_equip(owner.head) + owner.u_equip(owner.l_ear) + owner.u_equip(owner.r_ear) + owner.u_equip(owner.wear_mask) + spawn(1) + owner.update_hair() + ..() + +/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) + ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) + if (!disfigured) + if (brute_dam > 40) + if (prob(50)) + disfigure("brute") + if (burn_dam > 40) + disfigure("burn") diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/organs/subtypes/unbreakable.dm new file mode 100644 index 00000000000..137249e7473 --- /dev/null +++ b/code/modules/organs/subtypes/unbreakable.dm @@ -0,0 +1,44 @@ +// Slime limbs. +/obj/item/organ/external/chest/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/groin/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/arm/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/arm/right/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/leg/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/leg/right/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/foot/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/foot/right/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/hand/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/hand/right/unbreakable + cannot_break = 1 + dislocated = -1 + +/obj/item/organ/external/head/unbreakable + cannot_break = 1 + dislocated = -1 diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm new file mode 100644 index 00000000000..c4c9bf35625 --- /dev/null +++ b/code/modules/organs/subtypes/xenos.dm @@ -0,0 +1,106 @@ +//XENOMORPH ORGANS +/obj/item/organ/xenos + name = "xeno organ" + icon = 'icons/effects/blood.dmi' + desc = "It smells like an accident in a chemical factory." + +/obj/item/organ/xenos/eggsac + name = "egg sac" + parent_organ = "groin" + icon_state = "xgibmid1" + organ_tag = "egg sac" + +/obj/item/organ/xenos/plasmavessel + name = "plasma vessel" + parent_organ = "chest" + icon_state = "xgibdown1" + organ_tag = "plasma vessel" + var/stored_plasma = 0 + var/max_plasma = 500 + +/obj/item/organ/xenos/plasmavessel/queen + name = "bloated plasma vessel" + stored_plasma = 200 + max_plasma = 500 + +/obj/item/organ/xenos/plasmavessel/sentinel + stored_plasma = 100 + max_plasma = 250 + +/obj/item/organ/xenos/plasmavessel/hunter + name = "tiny plasma vessel" + stored_plasma = 100 + max_plasma = 150 + +/obj/item/organ/xenos/acidgland + name = "acid gland" + parent_organ = "head" + icon_state = "xgibtorso" + organ_tag = "acid gland" + +/obj/item/organ/xenos/resinspinner + name = "resin spinner" + parent_organ = "head" + icon_state = "xgibmid2" + organ_tag = "resin spinner" + +/obj/item/organ/xenos/hivenode + name = "hive node" + parent_organ = "chest" + icon_state = "xgibmid2" + organ_tag = "hive node" + +/obj/item/organ/xenos/hivenode/removed(var/mob/living/user) + if(owner && ishuman(owner)) + var/mob/living/carbon/human/H = owner + H << "You feel your connection to the hivemind fray and fade away..." + H.remove_language("Hivemind") + if(H.mind && H.species.get_bodytype() != "Xenomorph") + xenomorphs.remove_antagonist(H.mind) + ..(user) + +/obj/item/organ/xenos/hivenode/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected) + ..(target, affected) + if(owner && ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.add_language("Hivemind") + if(H.mind && H.species.get_bodytype() != "Xenomorph") + H << "You feel a sense of pressure as a vast intelligence meshes with your thoughts..." + xenomorphs.add_antagonist_mind(H.mind,1, xenomorphs.faction_role_text, xenomorphs.faction_welcome) + +// Skeleton limbs. +/obj/item/organ/external/chest/skeleton + name = "rib cage" + +/obj/item/organ/external/groin/skeleton + name = "pelvis" + vital = 0 + +/obj/item/organ/external/arm/skeleton + dislocated = -1 + +/obj/item/organ/external/arm/right/skeleton + dislocated = -1 + +/obj/item/organ/external/leg/skeleton + dislocated = -1 + +/obj/item/organ/external/leg/right/skeleton + dislocated = -1 + +/obj/item/organ/external/foot/skeleton + dislocated = -1 + +/obj/item/organ/external/foot/right/skeleton + dislocated = -1 + +/obj/item/organ/external/hand/skeleton + dislocated = -1 + +/obj/item/organ/external/hand/right/skeleton + dislocated = -1 + +/obj/item/organ/external/head/skeleton + name = "skull" + dislocated = -1 + vital = 0 diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index 850f5114c03..7d89a07d67c 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -140,6 +140,15 @@ return 0 + proc/bandage() + bandaged = 1 + + proc/salve() + salved = 1 + + proc/disinfect() + disinfected = 1 + // heal the given amount of damage, and if the given amount of damage was more // than what needed to be healed, return how much heal was left // set @heals_internal to also heal internal organ damage @@ -318,15 +327,15 @@ datum/wound/cut/massive /datum/wound/lost_limb/New(var/obj/item/organ/external/lost_limb, var/losstype, var/clean) var/damage_amt = lost_limb.max_damage if(clean) damage_amt /= 2 - + switch(losstype) if(DROPLIMB_EDGE, DROPLIMB_BLUNT) damage_type = CUT max_bleeding_stage = 3 //clotted stump and above can bleed. stages = list( "ripped stump" = damage_amt*1.3, - "bloody stump" = damage_amt, - "clotted stump" = damage_amt*0.5, + "bloody stump" = damage_amt, + "clotted stump" = damage_amt*0.5, "scarred stump" = 0 ) if(DROPLIMB_BURN) @@ -337,7 +346,7 @@ datum/wound/cut/massive "scarred stump" = damage_amt*0.5, "scarred stump" = 0 ) - + ..(damage_amt) /datum/wound/lost_limb/can_merge(var/datum/wound/other) diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index 933969a91b7..49b0f190b66 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -2,7 +2,8 @@ /obj/machinery/computer/engines name = "engine control console" - icon_state = "id" + icon_keyboard = "tech_key" + icon_screen = "id" var/state = "status" var/list/engines = list() var/obj/effect/map/ship/linked diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index e15de319698..b92eebbc7ea 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -1,6 +1,7 @@ /obj/machinery/computer/helm name = "helm control console" - icon_state = "id" + icon_keyboard = "med_key" + icon_screen = "id" var/state = "status" var/obj/effect/map/ship/linked //connected overmap object var/autopilot = 0 diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index ae8357a5582..32242e96694 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -1,50 +1,51 @@ -/obj/item/weapon/paper/carbon - name = "paper" - icon_state = "paper_stack" - item_state = "paper" - var copied = 0 - var iscopy = 0 - - -/obj/item/weapon/paper/carbon/update_icon() - if(iscopy) - if(info) - icon_state = "cpaper_words" - return - icon_state = "cpaper" - else if (copied) - if(info) - icon_state = "paper_words" - return - icon_state = "paper" - else - if(info) - icon_state = "paper_stack_words" - return - icon_state = "paper_stack" - - - -/obj/item/weapon/paper/carbon/verb/removecopy() - set name = "Remove carbon-copy" - set category = "Object" - set src in usr - - if (copied == 0) - var/obj/item/weapon/paper/carbon/c = src - var/copycontents = html_decode(c.info) - var/obj/item/weapon/paper/carbon/copy = new /obj/item/weapon/paper/carbon (usr.loc) - copycontents = replacetext(copycontents, "" - copy.name = "Copy - " + c.name - copy.fields = c.fields - copy.updateinfolinks() - usr << "You tear off the carbon-copy!" - c.copied = 1 - copy.iscopy = 1 - copy.update_icon() - c.update_icon() - else +/obj/item/weapon/paper/carbon + name = "paper" + icon_state = "paper_stack" + item_state = "paper" + var copied = 0 + var iscopy = 0 + + +/obj/item/weapon/paper/carbon/update_icon() + if(iscopy) + if(info) + icon_state = "cpaper_words" + return + icon_state = "cpaper" + else if (copied) + if(info) + icon_state = "paper_words" + return + icon_state = "paper" + else + if(info) + icon_state = "paper_stack_words" + return + icon_state = "paper_stack" + + + +/obj/item/weapon/paper/carbon/verb/removecopy() + set name = "Remove carbon-copy" + set category = "Object" + set src in usr + + if (copied == 0) + var/obj/item/weapon/paper/carbon/c = src + var/copycontents = html_decode(c.info) + var/obj/item/weapon/paper/carbon/copy = new /obj/item/weapon/paper/carbon (usr.loc) + // + copycontents = replacetext(copycontents, "" + copy.name = "Copy - " + c.name + copy.fields = c.fields + copy.updateinfolinks() + usr << "You tear off the carbon-copy!" + c.copied = 1 + copy.iscopy = 1 + copy.update_icon() + c.update_icon() + else usr << "There are no more carbon copies attached to this paper!" \ No newline at end of file diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 80c86329c33..7429ebd93f4 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -2,6 +2,7 @@ var/list/obj/machinery/photocopier/faxmachine/allfaxes = list() var/list/arrived_faxes = list() //cache for faxes that have been sent to the admins var/list/sent_faxes = list() //cache for faxes that have been sent by the admins var/list/alldepartments = list() +var/list/admin_departments = list("[boss_name]", "Sol Government", "Supply") /obj/machinery/photocopier/faxmachine name = "fax machine" @@ -27,15 +28,14 @@ var/list/alldepartments = list() var/sendcooldown = 0 // Delay, before another fax can be sent (in 1/10 second). Used by set_cooldown() and get_remaining_cooldown() var/department = "Unknown" // our department - - var/destination = "Central Command" // the department we're sending to + var/destination = null // the department we're sending to var/list/obj/item/device/pda/alert_pdas = list() //A list of PDAs to alert upon arrival of the fax. /obj/machinery/photocopier/faxmachine/New() ..() allfaxes += src - + if(!destination) destination = "[boss_name]" if( !(("[department]" in alldepartments) || ("[department]" in admin_departments)) ) alldepartments |= department @@ -60,7 +60,7 @@ var/list/alldepartments = list() dat += "
      " if(authenticated) - dat += "Logged in to: Central Command Quantum Entanglement Network

      " + dat += "Logged in to: [boss_name] Quantum Entanglement Network

      " if(copyitem) dat += "Remove Item

      " @@ -145,8 +145,7 @@ var/list/alldepartments = list() scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src scan = I authenticated = 0 @@ -305,8 +304,8 @@ var/list/alldepartments = list() //message badmins that a fax has arrived switch(destination) - if ("Central Command") - message_admins(sender, "CENTCOMM FAX", rcvdcopy, "CentcommFaxReply", "#006100") + if (boss_name) + message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentcommFaxReply", "#006100") if ("Sol Government") message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0") //message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "SolGovFaxReply", "#1F66A0") diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index c10b940c1e7..a14ef11720d 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "folder" w_class = 2 - pressure_resistance = 2 /obj/item/weapon/folder/blue desc = "A blue folder." diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 3f8616efe17..db9cba835e4 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -15,7 +15,6 @@ throw_range = 1 throw_speed = 1 layer = 4 - pressure_resistance = 1 slot_flags = SLOT_HEAD body_parts_covered = HEAD attack_verb = list("bapped") @@ -108,6 +107,15 @@ return /obj/item/weapon/paper/attack_self(mob/living/user as mob) + if(user.a_intent == I_HURT) + if(icon_state == "scrap") + user.show_message("\The [src] is already crumpled.") + return + //crumple dat paper + info = stars(info,85) + user.visible_message("\The [user] crumples \the [src] into a ball!") + icon_state = "scrap" + return user.examinate(src) if(rigged && (Holiday == "April Fool's Day")) if(spam_flag == 0) @@ -269,12 +277,13 @@ t = "[t]" + // t = replacetext(t, "#", "") // Junk converted to nothing! //Count the fields var/laststart = 1 while(1) - var/i = findtext(t, "", laststart) + var/i = findtext(t, "", laststart) // if(i==0) break laststart = i+1 @@ -282,8 +291,8 @@ return t -/obj/item/weapon/paper/proc/burnpaper(obj/item/weapon/P, mob/user) - var/class = "" +/obj/item/weapon/paper/proc/burnpaper(obj/item/weapon/flame/P, mob/user) + var/class = "warning" if (!user.restrained()) if (istype(P, /obj/item/weapon/flame)) @@ -301,16 +310,16 @@ return if(istype(P, /obj/item/weapon/flame/lighter/zippo)) - class = "" + class = "rose" - user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \ - "[class]You hold \the [P] up to \the [src], burning it slowly.") + user.visible_message("[user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \ + "You hold \the [P] up to \the [src], burning it slowly.") //I was going to add do_after in here, but keeping the current method allows people to burn papers they're holding, while they move. That seems fine to keep -Nanako spawn(20) if(get_dist(src, user) < 2 && user.get_active_hand() == P) - user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ - "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + user.visible_message("[user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") if(user.get_inactive_hand() == src) user.drop_from_inventory(src) @@ -343,7 +352,16 @@ 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)) - return + if(usr.back && istype(usr.back,/obj/item/weapon/rig)) + var/obj/item/weapon/rig/r = usr.back + var/obj/item/rig_module/device/pen/m = locate(/obj/item/rig_module/device/pen) in r.installed_modules + if(!r.offline && m) + i = m.device + else + return + else + return + if(istype(i, /obj/item/weapon/pen/crayon)) iscrayon = 1 @@ -449,6 +467,10 @@ B.update_icon() else if(istype(P, /obj/item/weapon/pen)) + if(icon_state == "scrap") + usr << "\The [src] is too crumpled to write on." + return + var/obj/item/weapon/pen/robopen/RP = P if ( istype(RP) && RP.mode == 2 ) RP.RenamePaper(user,src) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 461f4a2fdac..8b36739b1cb 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -9,7 +9,6 @@ throw_range = 2 throw_speed = 1 layer = 4 - pressure_resistance = 1 attack_verb = list("bapped") 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. @@ -67,23 +66,24 @@ 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 = "" + var/class = "warning" if(P.lit && !user.restrained()) if(istype(P, /obj/item/weapon/flame/lighter/zippo)) - class = "" + class = "rose>" - user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \ - "[class]You hold \the [P] up to \the [src], burning it slowly.") + user.visible_message("[user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \ + "You hold \the [P] up to \the [src], burning it slowly.") spawn(20) if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit) - user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ - "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + user.visible_message("[user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") if(user.get_inactive_hand() == src) user.drop_from_inventory(src) @@ -241,4 +241,4 @@ if(photo) desc += "\nThere is a photo attached to it." overlays += image('icons/obj/bureaucracy.dmi', "clip") - return \ No newline at end of file + return diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 5dbead26083..0b7448e1dde 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -7,7 +7,6 @@ w_class = 3 throw_speed = 3 throw_range = 7 - pressure_resistance = 10 layer = OBJ_LAYER - 0.1 var/amount = 30 //How much paper is in the bin. var/list/papers = new/list() //List of papers put in the bin for reference. @@ -17,13 +16,29 @@ if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) if(!istype(usr, /mob/living/carbon/slime) && !istype(usr, /mob/living/simple_animal)) if( !usr.get_active_hand() ) //if active hand is empty - attack_hand(usr, 1, 1) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + + if (H.hand) + temp = H.organs_by_name["l_hand"] + if(temp && !temp.is_usable()) + user << "You try to move your [temp.name], but cannot!" + return + + user << "You pick up the [src]." + user.put_in_hands(src) return /obj/item/weapon/paper_bin/attack_hand(mob/user as mob) - if(!user.can_use_hand()) - return + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + if (H.hand) + temp = H.organs_by_name["l_hand"] + if(temp && !temp.is_usable()) + user << "You try to move your [temp.name], but cannot!" + return var/response = "" if(!papers.len > 0) response = alert(user, "Do you take regular paper, or Carbon copy paper?", "Paper type request", "Regular", "Carbon-Copy", "Cancel") diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm new file mode 100644 index 00000000000..37cfdaa86b1 --- /dev/null +++ b/code/modules/paperwork/papershredder.dm @@ -0,0 +1,139 @@ +/obj/machinery/papershredder + name = "paper shredder" + desc = "For those documents you don't want seen." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "papershredder0" + density = 1 + anchored = 1 + var/max_paper = 10 + var/paperamount = 0 + var/list/shred_amounts = list( + /obj/item/weapon/photo = 1, + /obj/item/weapon/shreddedp = 1, + /obj/item/weapon/paper = 1, + /obj/item/weapon/newspaper = 3, + /obj/item/weapon/card/id = 3, + /obj/item/weapon/paper_bundle = 3, + ) + +/obj/machinery/papershredder/attackby(var/obj/item/W, var/mob/user) + + if(istype(W, /obj/item/weapon/storage)) + empty_bin(user, W) + return + else + var/paper_result + for(var/shred_type in shred_amounts) + if(istype(W, shred_type)) + paper_result = shred_amounts[shred_type] + if(paper_result) + if(paperamount == max_paper) + user << "\The [src] is full; please empty it before you continue." + return + paperamount += paper_result + user.drop_from_inventory(W) + qdel(W) + playsound(src.loc, 'sound/items/pshred.ogg', 75, 1) + if(paperamount > max_paper) + user <<"\The [src] was too full, and shredded paper goes everywhere!" + for(var/i=(paperamount-max_paper);i>0;i--) + var/obj/item/weapon/shreddedp/SP = get_shredded_paper() + SP.loc = get_turf(src) + SP.throw_at(get_edge_target_turf(src,pick(alldirs)),1,5) + paperamount = max_paper + update_icon() + return + return ..() + +/obj/machinery/papershredder/verb/empty_contents() + set name = "Empty bin" + set category = "Object" + set src in range(1) + + if(usr.stat || usr.restrained() || usr.weakened || usr.paralysis || usr.lying || usr.stunned) + return + + if(!paperamount) + usr << "\The [src] is empty." + return + + empty_bin(usr) + +/obj/machinery/papershredder/proc/empty_bin(var/mob/living/user, var/obj/item/weapon/storage/empty_into) + + // Sanity. + if(empty_into && !istype(empty_into)) + empty_into = null + + if(empty_into && empty_into.contents.len >= empty_into.storage_slots) + user << "\The [empty_into] is full." + return + + while(paperamount) + var/obj/item/weapon/shreddedp/SP = get_shredded_paper() + if(!SP) break + if(empty_into) + empty_into.handle_item_insertion(SP) + if(empty_into.contents.len >= empty_into.storage_slots) + break + if(empty_into) + if(paperamount) + user << "You fill \the [empty_into] with as much shredded paper as it will carry." + else + user << "You empty \the [src] into \the [empty_into]." + + else + user << "You empty \the [src]." + update_icon() + +/obj/machinery/papershredder/proc/get_shredded_paper() + if(!paperamount) + return + paperamount-- + return PoolOrNew(/obj/item/weapon/shreddedp, get_turf(src)) + +/obj/machinery/papershredder/update_icon() + icon_state = "papershredder[max(0,min(5,Floor(paperamount/2)))]" + +/obj/item/weapon/shreddedp/attackby(var/obj/item/W as obj, var/mob/user) + if(istype(W, /obj/item/weapon/flame/lighter)) + burnpaper(W, user) + else + ..() + +/obj/item/weapon/shreddedp/proc/burnpaper(var/obj/item/weapon/flame/lighter/P, var/mob/user) + if(user.restrained()) + return + if(!P.lit) + user << "\The [P] is not lit." + return + user.visible_message("\The [user] holds \the [P] up to \the [src]. It looks like \he's trying to burn it!", \ + "You hold \the [P] up to \the [src], burning it slowly.") + if(!do_after(user,20)) + user << "You must hold \the [P] steady to burn \the [src]." + return + user.visible_message("\The [user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + FireBurn() + +/obj/item/weapon/shreddedp/proc/FireBurn() + var/mob/living/M = loc + if(istype(M)) + M.drop_from_inventory(src) + PoolOrNew(/obj/effect/decal/cleanable/ash,get_turf(src)) + qdel(src) + +/obj/item/weapon/shreddedp + name = "shredded paper" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "shredp" + throwforce = 0 + w_class = 1 + throw_range = 3 + throw_speed = 1 + +/obj/item/weapon/shreddedp/New() + ..() + pixel_x = rand(-5,5) + pixel_y = rand(-5,5) + if(prob(65)) color = pick("#BABABA","#7F7F7F") diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 5f0918238b7..a3508a48ce0 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -22,7 +22,6 @@ throw_range = 15 matter = list(DEFAULT_WALL_MATERIAL = 10) var/colour = "black" //what colour the ink is! - pressure_resistance = 2 /obj/item/weapon/pen/blue @@ -35,6 +34,24 @@ icon_state = "pen_red" colour = "red" +/obj/item/weapon/pen/multi + desc = "It's a pen with multiple colors of ink!" + var/selectedColor = 1 + var/colors = list("black","blue","red") + +/obj/item/weapon/pen/multi/attack_self(mob/user) + if(++selectedColor > 3) + selectedColor = 1 + + colour = colors[selectedColor] + + if(colour == "black") + icon_state = "pen" + else + icon_state = "pen_[colour]" + + user << "Changed color to '[colour].'" + /obj/item/weapon/pen/invisible desc = "It's an invisble pen marker." icon_state = "pen" @@ -58,6 +75,7 @@ /obj/item/weapon/pen/reagent flags = OPENCONTAINER slot_flags = SLOT_BELT + origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) /obj/item/weapon/pen/reagent/New() ..() @@ -82,7 +100,7 @@ */ /obj/item/weapon/pen/reagent/sleepy desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\"" - origin_tech = "materials=2;syndicate=5" + origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) /obj/item/weapon/pen/reagent/sleepy/New() ..() @@ -92,7 +110,7 @@ /* * Parapens */ - /obj/item/weapon/pen/reagent/paralysis +/obj/item/weapon/pen/reagent/paralysis origin_tech = "materials=2;syndicate=5" /obj/item/weapon/pen/reagent/paralysis/New() @@ -138,7 +156,7 @@ if("Yellow") colour = COLOR_YELLOW if("Green") - colour = COLOR_GREEN + colour = COLOR_LIME if("Pink") colour = COLOR_PINK if("Blue") @@ -173,10 +191,6 @@ var/instant = 0 var/colourName = "red" //for updateIcon purposes - suicide_act(mob/user) - viewers(user) << "\red [user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide." - return (BRUTELOSS|OXYLOSS) - New() name = "[colourName] crayon" ..() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 2ae10e1c351..6d24a8f238d 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -146,15 +146,6 @@ toner = 0 return -/obj/machinery/photocopier/blob_act() - if(prob(50)) - qdel(src) - else - if(toner > 0) - new /obj/effect/decal/cleanable/blood/oil(get_turf(src)) - toner = 0 - return - /obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy) var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc) if(toner > 10) //lots of toner, make it dark @@ -165,7 +156,7 @@ copied = replacetext(copied, "" + c.info += ""//
      c.name = copy.name // -- Doohl c.fields = copy.fields c.stamps = copy.stamps @@ -228,7 +219,7 @@ W = photocopy(W) W.loc = p 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 90ed7ccf59e..62f85d8f3b1 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -165,55 +165,6 @@ var/global/photo_count = 0 ..() -/obj/item/device/camera/proc/get_icon(list/turfs, turf/center) - - //Bigger icon base to capture those icons that were shifted to the next tile - //i.e. pretty much all wall-mounted machinery - var/icon/res = icon('icons/effects/96x96.dmi', "") - res.Scale(size*32, size*32) - // Initialize the photograph to black. - res.Blend("#000", ICON_OVERLAY) - - var/atoms[] = list() - for(var/turf/the_turf in turfs) - // Add outselves to the list of stuff to draw - atoms.Add(the_turf); - // As well as anything that isn't invisible. - for(var/atom/A in the_turf) - if(A.invisibility) continue - atoms.Add(A) - - // Sort the atoms into their layers - var/list/sorted = sort_atoms_by_layer(atoms) - var/center_offset = (size-1)/2 * 32 + 1 - for(var/i; i <= sorted.len; i++) - var/atom/A = sorted[i] - if(A) - var/icon/img = getFlatIcon(A)//build_composite_icon(A) - - // If what we got back is actually a picture, draw it. - if(istype(img, /icon)) - // Check if we're looking at a mob that's lying down - if(istype(A, /mob/living) && A:lying) - // If they are, apply that effect to their picture. - img.BecomeLying() - // Calculate where we are relative to the center of the photo - var/xoff = (A.x - center.x) * 32 + center_offset - var/yoff = (A.y - center.y) * 32 + center_offset - if (istype(A,/atom/movable)) - xoff+=A:step_x - yoff+=A:step_y - res.Blend(img, blendMode2iconMode(A.blend_mode), A.pixel_x + xoff, A.pixel_y + yoff) - - // Lastly, render any contained effects on top. - for(var/turf/the_turf in turfs) - // Calculate where we are relative to the center of the photo - var/xoff = (the_turf.x - center.x) * 32 + center_offset - var/yoff = (the_turf.y - center.y) * 32 + center_offset - res.Blend(getFlatIcon(the_turf.loc), blendMode2iconMode(the_turf.blend_mode),xoff,yoff) - return res - - /obj/item/device/camera/proc/get_mobs(turf/the_turf as turf) var/mob_detail for(var/mob/living/carbon/A in the_turf) @@ -248,37 +199,39 @@ var/global/photo_count = 0 icon_state = icon_on on = 1 -/obj/item/device/camera/proc/can_capture_turf(turf/T, mob/user) +//Proc for capturing check +/mob/living/proc/can_capture_turf(turf/T) var/mob/dummy = new(T) //Go go visibility check dummy - var/viewer = user - if(user.client) //To make shooting through security cameras possible - viewer = user.client.eye + var/viewer = src + if(src.client) //To make shooting through security cameras possible + viewer = src.client.eye var/can_see = (dummy in viewers(world.view, viewer)) qdel(dummy) return can_see -/obj/item/device/camera/proc/captureimage(atom/target, mob/user, flag) +/obj/item/device/camera/proc/captureimage(atom/target, mob/living/user, flag) var/x_c = target.x - (size-1)/2 var/y_c = target.y + (size-1)/2 var/z_c = target.z - var/list/turfs = list() var/mobs = "" for(var/i = 1; i <= size; i++) for(var/j = 1; j <= size; j++) var/turf/T = locate(x_c, y_c, z_c) - if(can_capture_turf(T, user)) - turfs.Add(T) + if(user.can_capture_turf(T)) mobs += get_mobs(T) x_c++ y_c-- x_c = x_c - size - var/obj/item/weapon/photo/p = createpicture(target, user, turfs, mobs, flag) + var/obj/item/weapon/photo/p = createpicture(target, user, mobs, flag) printpicture(user, p) -/obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag) - var/icon/photoimage = get_icon(turfs, target) +/obj/item/device/camera/proc/createpicture(atom/target, mob/user, mobs, flag) + var/x_c = target.x - (size-1)/2 + var/y_c = target.y - (size-1)/2 + var/z_c = target.z + var/icon/photoimage = generate_image(x_c, y_c, z_c, size, CAPTURE_MODE_REGULAR, user) var/icon/small_img = icon(photoimage) var/icon/tiny_img = icon(photoimage) diff --git a/code/modules/paperwork/silicon_photography.dm b/code/modules/paperwork/silicon_photography.dm index c754909c4ca..dc22014ae8a 100644 --- a/code/modules/paperwork/silicon_photography.dm +++ b/code/modules/paperwork/silicon_photography.dm @@ -69,8 +69,9 @@ aipictures -= selection usr << "Local image deleted" -/obj/item/device/camera/siliconcam/ai_camera/can_capture_turf(turf/T, mob/user) - var/mob/living/silicon/ai = user +//Capture Proc for AI / Robot +/mob/living/silicon/ai/can_capture_turf(turf/T) + var/mob/living/silicon/ai = src return ai.TurfAdjacent(T) /obj/item/device/camera/siliconcam/proc/toggle_camera_mode() diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index a6954e9e2f0..dd4c2fd2b9f 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -9,7 +9,6 @@ throw_speed = 7 throw_range = 15 matter = list(DEFAULT_WALL_MATERIAL = 60) - pressure_resistance = 2 attack_verb = list("stamped") /obj/item/weapon/stamp/captain @@ -73,4 +72,4 @@ if(chosen_stamp) name = chosen_stamp.name - icon_state = chosen_stamp.icon_state \ No newline at end of file + icon_state = chosen_stamp.icon_state diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 9fd35c2c265..8c7af58346e 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -101,19 +101,6 @@ return 0 -/obj/machinery/power/am_control_unit/blob_act() - stability -= 20 - if(prob(100-stability))//Might infect the rest of the machine - for(var/obj/machinery/am_shielding/AMS in linked_shielding) - AMS.blob_act() - spawn(0) - //Likely explode - qdel(src) - return - check_stability() - return - - /obj/machinery/power/am_control_unit/ex_act(severity) switch(severity) if(1.0) diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 700fad25ad0..4f89687fb4e 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -90,20 +90,6 @@ proc/cardinalrange(var/center) return 0 -/obj/machinery/am_shielding/blob_act() - stability -= 20 - if(prob(100-stability)) - if(prob(10))//Might create a node - new /obj/effect/blob/node(src.loc,150) - else - new /obj/effect/blob(src.loc,60) - spawn(0) - qdel(src) - return - check_stability() - return - - /obj/machinery/am_shielding/ex_act(severity) switch(severity) if(1.0) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 6233984e78b..87b6265203a 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1,12 +1,12 @@ //update_state -#define UPSTATE_CELL_IN 1 -#define UPSTATE_OPENED1 2 -#define UPSTATE_OPENED2 4 -#define UPSTATE_MAINT 8 -#define UPSTATE_BROKE 16 -#define UPSTATE_BLUESCREEN 32 -#define UPSTATE_WIREEXP 64 -#define UPSTATE_ALLGOOD 128 +#define UPDATE_CELL_IN 1 +#define UPDATE_OPENED1 2 +#define UPDATE_OPENED2 4 +#define UPDATE_MAINT 8 +#define UPDATE_BROKE 16 +#define UPDATE_BLUESCREEN 32 +#define UPDATE_WIREEXP 64 +#define UPDATE_ALLGOOD 128 //update_overlay #define APC_UPOVERLAY_CHARGEING0 1 @@ -43,6 +43,16 @@ /obj/machinery/power/apc/high cell_type = /obj/item/weapon/cell/high +// Construction site APC, starts turned off +/obj/machinery/power/apc/high/inactive + cell_type = /obj/item/weapon/cell/high + lighting = 0 + equipment = 0 + environ = 0 + locked = 0 + coverlocked = 0 + start_charge = 100 + /obj/machinery/power/apc/super cell_type = /obj/item/weapon/cell/super @@ -63,6 +73,7 @@ var/area/area var/areastring = null var/obj/item/weapon/cell/cell + var/chargelevel = 0.0005 // Cap for how fast APC cells charge, as a percentage-per-tick (0.01 means cellcharge is capped to 1% per second) var/start_charge = 90 // initial cell charge % var/cell_type = /obj/item/weapon/cell/apc var/opened = 0 //0=closed, 1=opened, 2=cover removed @@ -100,6 +111,8 @@ var/is_critical = 0 var/global/status_overlays = 0 var/updating_icon = 0 + var/failure_timer = 0 + var/force_update = 0 var/global/list/status_overlays_lock var/global/list/status_overlays_charging var/global/list/status_overlays_equipment @@ -170,21 +183,22 @@ area.power_equip = 0 area.power_environ = 0 area.power_change() - if(wires) - qdel(wires) - wires = null + qdel(wires) + wires = null + qdel(terminal) + terminal = null if(cell) - cell.loc = loc + cell.forceMove(loc) cell = null - if(terminal) - qdel(terminal) - terminal = null // Malf AI, removes the APC from AI's hacked APCs list. if((hacker) && (hacker.hacked_apcs) && (src in hacker.hacked_apcs)) hacker.hacked_apcs -= src - ..() + return ..() + +/obj/machinery/power/apc/proc/energy_fail(var/duration) + failure_timer = max(failure_timer, duration) /obj/machinery/power/apc/proc/make_terminal() // create a terminal object at the same position as original turf loc @@ -287,25 +301,25 @@ return if(update & 1) // Updating the icon state - if(update_state & UPSTATE_ALLGOOD) + if(update_state & UPDATE_ALLGOOD) icon_state = "apc0" - else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) + else if(update_state & (UPDATE_OPENED1|UPDATE_OPENED2)) var/basestate = "apc[ cell ? "2" : "1" ]" - if(update_state & UPSTATE_OPENED1) - if(update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) + if(update_state & UPDATE_OPENED1) + if(update_state & (UPDATE_MAINT|UPDATE_BROKE)) icon_state = "apcmaint" //disabled APC cannot hold cell else icon_state = basestate - else if(update_state & UPSTATE_OPENED2) + else if(update_state & UPDATE_OPENED2) icon_state = "[basestate]-nocover" - else if(update_state & UPSTATE_BROKE) + else if(update_state & UPDATE_BROKE) icon_state = "apc-b" - else if(update_state & UPSTATE_BLUESCREEN) + else if(update_state & UPDATE_BLUESCREEN) icon_state = "apcemag" - else if(update_state & UPSTATE_WIREEXP) + else if(update_state & UPDATE_WIREEXP) icon_state = "apcewires" - if(!(update_state & UPSTATE_ALLGOOD)) + if(!(update_state & UPDATE_ALLGOOD)) if(overlays.len) overlays = 0 return @@ -313,7 +327,7 @@ if(update & 2) if(overlays.len) overlays.len = 0 - if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) + if(!(stat & (BROKEN|MAINT)) && update_state & UPDATE_ALLGOOD) overlays += status_overlays_lock[locked+1] overlays += status_overlays_charging[charging+1] if(operating) @@ -321,6 +335,21 @@ overlays += status_overlays_lighting[lighting+1] overlays += status_overlays_environ[environ+1] + if(update & 3) + if(update_state & UPDATE_BLUESCREEN) + set_light(l_range = 2, l_power = 0.5, l_color = "#0000FF") + else if(!(stat & (BROKEN|MAINT)) && update_state & UPDATE_ALLGOOD) + var/color + switch(charging) + if(0) + color = "#F86060" + if(1) + color = "#A8B0F8" + if(2) + color = "#82FF4C" + set_light(l_range = 2, l_power = 0.5, l_color = color) + else + set_light(0) /obj/machinery/power/apc/proc/check_updates() @@ -330,27 +359,27 @@ update_overlay = 0 if(cell) - update_state |= UPSTATE_CELL_IN + update_state |= UPDATE_CELL_IN if(stat & BROKEN) - update_state |= UPSTATE_BROKE + update_state |= UPDATE_BROKE if(stat & MAINT) - update_state |= UPSTATE_MAINT + update_state |= UPDATE_MAINT if(opened) if(opened==1) - update_state |= UPSTATE_OPENED1 + update_state |= UPDATE_OPENED1 if(opened==2) - update_state |= UPSTATE_OPENED2 - else if(emagged || hacker) - update_state |= UPSTATE_BLUESCREEN + update_state |= UPDATE_OPENED2 + else if(emagged || hacker || failure_timer) + update_state |= UPDATE_BLUESCREEN else if(wiresexposed) - update_state |= UPSTATE_WIREEXP + update_state |= UPDATE_WIREEXP if(update_state <= 1) - update_state |= UPSTATE_ALLGOOD + update_state |= UPDATE_ALLGOOD if(operating) update_overlay |= APC_UPOVERLAY_OPERATING - if(update_state & UPSTATE_ALLGOOD) + if(update_state & UPDATE_ALLGOOD) if(locked) update_overlay |= APC_UPOVERLAY_LOCKED @@ -452,7 +481,7 @@ return user.drop_item() - W.loc = src + W.forceMove(src) cell = W user.visible_message(\ "[user.name] has inserted the power cell to [src.name]!",\ @@ -502,25 +531,9 @@ update_icon() else user << "Access denied." - else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || hacker)) // trying to unlock with an emag card - if(opened) - user << "You must close the cover to swipe an ID card." - else if(wiresexposed) - user << "You must close the panel first" - else if(stat & (BROKEN|MAINT)) - user << "Nothing happens." - else - flick("apc-spark", src) - if (do_after(user,6)) - if(prob(50)) - emagged = 1 - locked = 0 - user << "You emag the APC interface." - update_icon() - else - user << "You fail to [ locked ? "unlock" : "lock"] the APC interface." else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2) - if (src.loc:intact) + var/turf/T = loc + if(istype(T) && !T.is_plating()) user << "You must remove the floor plating in front of the APC first." return var/obj/item/stack/cable_coil/C = W @@ -532,7 +545,6 @@ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20)) if (C.amount >= 10 && !terminal && opened && has_electronics != 2) - var/turf/T = get_turf(src) var/obj/structure/cable/N = T.get_cable_node() if (prob(50) && electrocute_mob(usr, N, N)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread @@ -547,7 +559,8 @@ make_terminal() terminal.connect_to_network() else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2) - if (src.loc:intact) + var/turf/T = loc + if(istype(T) && !T.is_plating()) user << "You must remove the floor plating in front of the APC first." return user.visible_message("[user.name] dismantles the power terminal from [src].", \ @@ -672,6 +685,26 @@ // attack with hand - remove cell (if cover open) or interact with the APC +/obj/machinery/power/apc/emag_act(var/remaining_charges, var/mob/user) + if (!(emagged || hacker)) // trying to unlock with an emag card + if(opened) + user << "You must close the cover to swipe an ID card." + else if(wiresexposed) + user << "You must close the panel first" + else if(stat & (BROKEN|MAINT)) + user << "Nothing happens." + else + flick("apc-spark", src) + if (do_after(user,6)) + if(prob(50)) + emagged = 1 + locked = 0 + user << "You emag the APC interface." + update_icon() + else + user << "You fail to [ locked ? "unlock" : "lock"] the APC interface." + return 1 + /obj/machinery/power/apc/attack_hand(mob/user) // if (!can_use(user)) This already gets called in interact() and in topic() // return @@ -683,34 +716,7 @@ if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(H.species.flags & IS_SYNTHETIC && H.a_intent == I_GRAB) - if(emagged || stat & BROKEN) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - H << "\red The APC power currents surge eratically, damaging your chassis!" - H.adjustFireLoss(10,0) - else if(src.cell && src.cell.charge > 0) - if(H.nutrition < 450) - - if(src.cell.charge >= 500) - H.nutrition += 50 - src.cell.charge -= 500 - else - H.nutrition += src.cell.charge/10 - src.cell.charge = 0 - - user << "\blue You slot your fingers into the APC interface and siphon off some of the stored charge for your own use." - if(src.cell.charge < 0) src.cell.charge = 0 - if(H.nutrition > 500) H.nutrition = 500 - src.charging = 1 - - else - user << "\blue You are already fully charged." - else - user << "There is no charge to draw from that APC." - return - else if(H.species.can_shred(H)) + if(H.species.can_shred(H)) user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) @@ -747,11 +753,6 @@ // do APC interaction src.interact(user) -/obj/machinery/power/apc/attack_ghost(user as mob) - if(stat & (BROKEN|MAINT)) - return - return ui_interact(user) - /obj/machinery/power/apc/interact(mob/user) if(!user) return @@ -777,6 +778,7 @@ "totalLoad" = round(lastused_total), "totalCharging" = round(lastused_charging), "coverLocked" = coverlocked, + "failTime" = failure_timer * 2, "siliconUser" = istype(user, /mob/living/silicon), "powerChannels" = list( @@ -830,7 +832,7 @@ return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])" /obj/machinery/power/apc/proc/update() - if(operating && !shorted) + if(operating && !shorted && !failure_timer) area.power_light = (lighting > 1) area.power_equip = (equipment > 1) area.power_environ = (environ > 1) @@ -893,7 +895,7 @@ return 0 return 1 -/obj/machinery/power/apc/Topic(href, href_list, var/nowindow = 0) +/obj/machinery/power/apc/Topic(href, href_list) if(..()) return 1 @@ -915,6 +917,11 @@ else if (href_list["breaker"]) toggle_breaker() + else if( href_list["reboot"] ) + failure_timer = 0 + update_icon() + update() + else if (href_list["cmode"]) chargemode = !chargemode if(!chargemode) @@ -1010,6 +1017,12 @@ return if(!area.requires_power) return + if(failure_timer) + update() + queue_icon_update() + failure_timer-- + force_update = 1 + return lastused_light = area.usage(LIGHT) lastused_equip = area.usage(EQUIP) @@ -1068,7 +1081,7 @@ if(src.attempt_charging()) if(excess > 0) // check to make sure we have enough to charge // Max charge is capped to % per second constant - var/ch = min(excess*CELLRATE, cell.maxcharge*CHARGELEVEL) + var/ch = min(excess*CELLRATE, cell.maxcharge*chargelevel) ch = draw_power(ch/CELLRATE) // Removes the power we're taking from the grid cell.give(ch*CELLRATE) // actually recharge the cell @@ -1085,7 +1098,7 @@ if(chargemode) if(!charging) - if(excess > cell.maxcharge*CHARGELEVEL) + if(excess > cell.maxcharge*chargelevel) chargecount++ else chargecount = 0 @@ -1109,7 +1122,8 @@ autoflag = 0 // update icon & area power if anything changed - if(last_lt != lighting || last_eq != equipment || last_en != environ) + if(last_lt != lighting || last_eq != equipment || last_en != environ || force_update) + force_update = 0 queue_icon_update() update() else if (last_ch != charging) @@ -1210,12 +1224,6 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on) cell.ex_act(3.0) return -/obj/machinery/power/apc/blob_act() - if (prob(75)) - set_broken() - if (cell && prob(5)) - cell.blob_act() - /obj/machinery/power/apc/disconnect_terminal() if(terminal) terminal.master = null @@ -1231,17 +1239,18 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on) update_icon() update() -// overload all the lights in this APC area +// overload the lights in this APC area -/obj/machinery/power/apc/proc/overload_lighting() +/obj/machinery/power/apc/proc/overload_lighting(var/chance = 100) if(/* !get_connection() || */ !operating || shorted) return if( cell && cell.charge>=20) cell.use(20); spawn(0) for(var/obj/machinery/light/L in area) - L.on = 1 - L.broken() + if(prob(chance)) + L.on = 1 + L.broken() sleep(1) /obj/machinery/power/apc/proc/toggle_nightlight(var/force = null) diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm index ee6a0dfd9c6..a70b19421ec 100644 --- a/code/modules/power/batteryrack.dm +++ b/code/modules/power/batteryrack.dm @@ -87,8 +87,6 @@ M.state = 2 M.icon_state = "box_1" for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 I.loc = src.loc qdel(src) return 1 diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 5930dd53e7c..e133f82e6e2 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -21,7 +21,7 @@ /obj/machinery/power/breakerbox/Destroy() ..() - for(var/obj/nano_module/rcon/R in world) + for(var/datum/nano_module/rcon/R in world) R.FindDevices() /obj/machinery/power/breakerbox/activated diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 02e2147f287..02bb73d7e99 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -10,11 +10,11 @@ /* Cable directions (d1 and d2) - 9 1 5 - \ | / - 8 - 0 - 4 - / | \ - 10 2 6 +> 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) @@ -22,6 +22,16 @@ 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 */ +var/list/possible_cable_coil_colours = list( + "Yellow" = COLOR_YELLOW, + "Green" = COLOR_LIME, + "Pink" = COLOR_PINK, + "Blue" = COLOR_BLUE, + "Orange" = COLOR_ORANGE, + "Cyan" = COLOR_CYAN, + "Red" = COLOR_RED + ) + /obj/structure/cable level = 1 anchored =1 @@ -50,7 +60,7 @@ By design, d1 is the smallest direction and d2 is the highest color = COLOR_YELLOW /obj/structure/cable/green - color = COLOR_GREEN + color = COLOR_LIME /obj/structure/cable/blue color = COLOR_BLUE @@ -70,7 +80,6 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/New() ..() - // ensure d1 & d2 reflect the icon_state for entering and exiting cable var/dash = findtext(icon_state, "-") @@ -80,8 +89,7 @@ By design, d1 is the smallest direction and d2 is the highest d2 = text2num( copytext( icon_state, dash+1 ) ) var/turf/T = src.loc // hide if turf is not intact - - if(level==1) hide(T.intact) + if(level==1) hide(!T.is_plating()) cable_list += src //add it to the global cable list @@ -97,11 +105,13 @@ By design, d1 is the smallest direction and d2 is the highest //If underfloor, hide the cable /obj/structure/cable/hide(var/i) - - if(level == 1 && istype(loc, /turf)) + if(istype(loc, /turf)) invisibility = i ? 101 : 0 updateicon() +/obj/structure/cable/hides_under_flooring() + return 1 + /obj/structure/cable/proc/updateicon() icon_state = "[d1]-[d2]" alpha = invisibility ? 127 : 255 @@ -122,15 +132,14 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/attackby(obj/item/W, mob/user) var/turf/T = src.loc - if(T.intact) + if(!T.is_plating()) return if(istype(W, /obj/item/weapon/wirecutters)) -///// Z-Level Stuff - if(src.d1 == 12 || src.d2 == 12) + if(d1 == 12 || 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 @@ -146,16 +155,13 @@ By design, d1 is the smallest direction and d2 is the highest 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) - qdel(c) -///// Z-Level Stuff + if(d1 == 11 || d2 == 11) + var/turf/turf = GetBelow(src) + if(turf) + for(var/obj/structure/cable/c in turf) + if(c.d1 == 12 || c.d2 == 12) + qdel(c) + investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires") qdel(src) @@ -348,17 +354,15 @@ obj/structure/cable/proc/cableColor(var/colorC) var/turf/T // Handle up/down cables - if(d1 == 11 || d1 == 12 || d2 == 11 || d2 == 12) - var/turf/controllerlocation = locate(1, 1, z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up && (d1 == 12 || d2 == 12)) - T = locate(src.x, src.y, controller.up_target) - if(T) - . += power_list(T, src, 11, 1) - if(controller.down && (d1 == 11 || d2 == 11)) - T = locate(src.x, src.y, controller.down_target) - if(T) - . += power_list(T, src, 12, 1) + if(d1 == 11 || d2 == 11) + T = GetBelow(src) + if(T) + . += power_list(T, src, 12, 1) + + if(d1 == 12 || d2 == 12) + T = GetAbove(src) + if(T) + . += power_list(T, src, 11, 1) // Handle standard cables in adjacent turfs for(var/cable_dir in list(d1, d2)) @@ -479,14 +483,6 @@ obj/structure/cable/proc/cableColor(var/colorC) 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) ..() @@ -503,24 +499,26 @@ obj/structure/cable/proc/cableColor(var/colorC) /////////////////////////////////// //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)) +/obj/item/stack/cable_coil/afterattack(var/mob/M, var/mob/user) + + if(ishuman(M)) var/mob/living/carbon/human/H = M - var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting) - if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help") + var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting] + + if (!S) return + if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP) 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!" + if(S.burn_dam) + if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP) + S.heal_damage(0,15,0,1) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.visible_message("\The [user] patches some damaged wiring on \the [M]'s [S.name] with \the [src].") + else if(S.open != 2) + user << "The damage is far too severe to patch over externally." + return 1 + else if(S.open != 2) + user << "Nothing to fix!" else return ..() @@ -528,7 +526,7 @@ obj/structure/cable/proc/cableColor(var/colorC) /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) + color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) if(amount == 1) icon_state = "coil1" name = "cable piece" @@ -539,6 +537,17 @@ obj/structure/cable/proc/cableColor(var/colorC) icon_state = "coil" name = "cable coil" +/obj/item/stack/cable_coil/proc/set_cable_color(var/selected_color, var/user) + if(!selected_color) + return + + var/final_color = possible_cable_coil_colours[selected_color] + if(!final_color) + final_color = possible_cable_coil_colours["Red"] + selected_color = "red" + color = final_color + user << "You change \the [src]'s color to [lowertext(selected_color)]." + /obj/item/stack/cable_coil/proc/update_wclass() if(amount == 1) w_class = 1.0 @@ -579,26 +588,8 @@ obj/structure/cable/proc/cableColor(var/colorC) 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]" + var/selected_type = input("Pick new colour.", "Cable Colour", null, null) as null|anything in possible_cable_coil_colours + set_cable_color(selected_type, usr) // Items usable on a cable coil : // - Wirecutters : cut them duh ! @@ -644,7 +635,7 @@ obj/structure/cable/proc/cableColor(var/colorC) user << "You can't lay cable at a place that far away." return - if(F.intact) // Ff floor is intact, complain + if(!F.is_plating()) // Ff floor is intact, complain user << "You can't lay cable there unless the floor tiles are removed." return @@ -662,15 +653,14 @@ obj/structure/cable/proc/cableColor(var/colorC) return ///// Z-Level Stuff // check if the target is open space - if(istype(F, /turf/simulated/floor/open)) + if(istype(F, /turf/simulated/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) + var/obj/structure/cable/D = new(GetBelow(F)) C.cableColor(color) @@ -739,7 +729,7 @@ obj/structure/cable/proc/cableColor(var/colorC) var/turf/T = C.loc - if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable + if(!isturf(T) || !T.is_plating()) // sanity checks, also stop use interacting with T-scanner revealed cable return if(get_dist(C, user) > 1) // make sure it's close enough @@ -755,7 +745,7 @@ obj/structure/cable/proc/cableColor(var/colorC) // 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 + if(!U.is_plating()) // 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 @@ -868,7 +858,7 @@ obj/structure/cable/proc/cableColor(var/colorC) color = COLOR_BLUE /obj/item/stack/cable_coil/green - color = COLOR_GREEN + color = COLOR_LIME /obj/item/stack/cable_coil/pink color = COLOR_PINK @@ -883,5 +873,5 @@ obj/structure/cable/proc/cableColor(var/colorC) 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) + color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) ..() diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm index 36bd4f93eb7..67eb09bb1a7 100644 --- a/code/modules/power/cable_heavyduty.dm +++ b/code/modules/power/cable_heavyduty.dm @@ -12,7 +12,7 @@ /obj/structure/cable/heavyduty/attackby(obj/item/W, mob/user) var/turf/T = src.loc - if(T.intact) + if(!T.is_plating()) return if(istype(W, /obj/item/weapon/wirecutters)) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 5eb5709f75d..25e4a575854 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -73,12 +73,6 @@ if(maxcharge < amount) return 0 var/amount_used = min(maxcharge-charge,amount) - if(crit_fail) return 0 - if(!prob(reliability)) - minor_fault++ - if(prob(minor_fault)) - crit_fail = 1 - return 0 charge += amount_used return amount_used @@ -91,8 +85,6 @@ user << "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%." else user << "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%." - if(crit_fail) - user << "\red This power cell seems to be faulty." /obj/item/weapon/cell/attackby(obj/item/W, mob/user) ..() @@ -161,8 +153,6 @@ charge -= maxcharge / severity if (charge < 0) charge = 0 - if(reliability != 100 && prob(50/severity)) - reliability -= 10 / severity ..() /obj/item/weapon/cell/ex_act(severity) @@ -185,10 +175,6 @@ corrupt() return -/obj/item/weapon/cell/blob_act() - if(prob(75)) - explode() - /obj/item/weapon/cell/proc/get_electrocute_damage() switch (charge) /* if (9000 to INFINITY) diff --git a/code/modules/power/engine.dm b/code/modules/power/engine.dm deleted file mode 100644 index a9095b3a783..00000000000 --- a/code/modules/power/engine.dm +++ /dev/null @@ -1,37 +0,0 @@ -/turf/simulated/floor/engine/attack_hand(var/mob/user as mob) - if ((!( user.canmove ) || user.restrained() || !( user.pulling ))) - return - if (user.pulling.anchored) - return - if ((user.pulling.loc != user.loc && get_dist(user, user.pulling) > 1)) - return - if (ismob(user.pulling)) - var/mob/M = user.pulling - var/atom/movable/t = M.pulling - M.stop_pulling() - step(user.pulling, get_dir(user.pulling.loc, src)) - M.start_pulling(t) - else - step(user.pulling, get_dir(user.pulling.loc, src)) - return - -/turf/simulated/floor/engine/ex_act(severity) - switch(severity) - if(1.0) - ChangeTurf(/turf/space) - qdel(src) - return - if(2.0) - if (prob(50)) - ChangeTurf(/turf/space) - qdel(src) - return - else - return - -/turf/simulated/floor/engine/blob_act() - if (prob(25)) - ChangeTurf(/turf/space) - 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 a59a30e7e67..b3ab2264be8 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -171,6 +171,11 @@ brightness_power = 2 brightness_color = "#da0205" +/obj/machinery/light/small/red + brightness_range = 5 + brightness_power = 1 + brightness_color = "#da0205" + /obj/machinery/light/spot name = "spotlight" fitting = "large tube" @@ -548,10 +553,6 @@ //blob effect -/obj/machinery/light/blob_act() - if(prob(75)) - broken() - // timed process // use power @@ -612,7 +613,7 @@ icon = 'icons/obj/lighting.dmi' force = 2 throwforce = 5 - w_class = 2 + w_class = 1 var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN var/base_state var/switchcount = 0 // number of times switched diff --git a/code/modules/power/pacman2.dm b/code/modules/power/pacman2.dm index 0664c529d25..592fc97f2d2 100644 --- a/code/modules/power/pacman2.dm +++ b/code/modules/power/pacman2.dm @@ -43,21 +43,16 @@ RefreshParts() var/temp_rating = 0 - var/temp_reliability = 0 for(var/obj/item/weapon/stock_parts/SP in component_parts) if(istype(SP, /obj/item/weapon/stock_parts/matter_bin)) //max_coins = SP.rating * SP.rating * 1000 else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor)) temp_rating += SP.rating - for(var/obj/item/weapon/CP in component_parts) - temp_reliability += CP.reliability - reliability = min(round(temp_reliability / 4), 100) power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2)) examine(mob/user) ..(user) user << "\blue The generator has [P.air_contents.phoron] units of fuel left, producing [power_gen] per cycle." - if(crit_fail) user << "\red The generator seems to have broken down." handleInactive() heat -= 2 @@ -81,14 +76,6 @@ user.drop_item() O.loc = src user << "\blue You add the phoron tank to the generator." - else if (istype(O, /obj/item/weapon/card/emag)) - var/obj/item/weapon/card/emag/E = O - if(E.uses) - E.uses-- - else - return - emagged = 1 - emp_act(1) else if(!active) if(istype(O, /obj/item/weapon/wrench)) anchored = !anchored @@ -108,8 +95,6 @@ else if(istype(O, /obj/item/weapon/crowbar) && !open) var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc) for(var/obj/item/I in component_parts) - if(I.reliability < 100) - I.crit_fail = 1 I.loc = src.loc new_frame.state = 2 new_frame.icon_state = "box_1" @@ -159,7 +144,7 @@ src.add_fingerprint(usr) if(href_list["action"]) if(href_list["action"] == "enable") - if(!active && HasFuel() && !crit_fail) + if(!active && HasFuel()) active = 1 icon_state = "portgen1" src.updateUsrDialog() @@ -179,3 +164,8 @@ if (href_list["action"] == "close") usr << browse(null, "window=port_gen") usr.machine = null + +/obj/machinery/power/port_gen/pacman2/emag_act(var/remaining_uses, var/mob/user) + emagged = 1 + emp_act(1) + return 1 diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index e821e5528d7..400e7281b6f 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -15,7 +15,7 @@ var/power_output = 1 /obj/machinery/power/port_gen/proc/IsBroken() - return (crit_fail || (stat & (BROKEN|EMPED))) + return (stat & (BROKEN|EMPED)) /obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check. return 1 @@ -127,7 +127,7 @@ /obj/machinery/power/port_gen/pacman/Destroy() DropFuel() - ..() + return ..() /obj/machinery/power/port_gen/pacman/RefreshParts() var/temp_rating = 0 @@ -137,13 +137,6 @@ else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor)) temp_rating += SP.rating - var/temp_reliability = 0 - var/part_count = 0 - for(var/obj/item/weapon/CP in component_parts) - temp_reliability += CP.reliability - part_count++ - - reliability = min(round(temp_reliability / part_count), 100) power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2)) /obj/machinery/power/port_gen/pacman/examine(mob/user) @@ -168,13 +161,6 @@ sheets -= amount /obj/machinery/power/port_gen/pacman/UseFuel() - //break down sometimes - if (reliability < 100) - if (prob(1) && prob(1) && prob(100 - reliability)) - stat |= BROKEN - crit_fail = 1 - if (prob(100 - reliability)) - explode() //how much material are we using this iteration? var/needed_sheets = power_output / time_per_sheet @@ -260,6 +246,14 @@ sheet_left = 0 ..() +/obj/machinery/power/port_gen/pacman/emag_act(var/remaining_charges, var/mob/user) + if (active && prob(25)) + explode() //if they're foolish enough to emag while it's running + + if (!emagged) + emagged = 1 + return 1 + /obj/machinery/power/port_gen/pacman/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O, sheet_path)) var/obj/item/stack/addstack = O @@ -272,10 +266,6 @@ addstack.use(amount) updateUsrDialog() return - else if (istype(O, /obj/item/weapon/card/emag)) - emagged = 1 - if (active && prob(25)) - explode() //if they're foolish enough to emag while it's running else if(!active) if(istype(O, /obj/item/weapon/wrench)) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 33bfd8b8751..73daf815c69 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -37,6 +37,8 @@ /obj/machinery/power/proc/add_avail(var/amount) if(powernet) powernet.newavail += amount + return 1 + return 0 /obj/machinery/power/proc/draw_power(var/amount) if(powernet) @@ -126,7 +128,7 @@ var/turf/T = user.loc - if(T.intact || !istype(T, /turf/simulated/floor)) + if(!T.is_plating() || !istype(T, /turf/simulated/floor)) return if(get_dist(src, user) > 1) diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 1d5711b4b32..cd06803c694 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -8,6 +8,12 @@ var/viewload = 0 // the load as it appears on the power console (gradually updated) var/number = 0 // Unused //TODEL + var/smes_demand = 0 // Amount of power demanded by all SMESs from this network. Needed for load balancing. + var/list/inputting = list() // List of SMESs that are demanding power from this network. Needed for load balancing. + + var/smes_avail = 0 // Amount of power (avail) from SMESes. Used by SMES load balancing + var/smes_newavail = 0 // As above, just for newavail + var/perapc = 0 // per-apc avilability var/perapc_excess = 0 var/netexcess = 0 // excess power on the powernet (typically avail-load) @@ -19,8 +25,14 @@ ..() /datum/powernet/Destroy() + for(var/obj/structure/cable/C in cables) + cables -= C + C.powernet = null + for(var/obj/machinery/power/M in nodes) + nodes -= M + M.powernet = null powernets -= src - ..() + return ..() //Returns the amount of excess power (before refunding to SMESs) from last tick. //This is for machines that might adjust their power consumption using this data. @@ -107,9 +119,18 @@ perapc = avail/numapc + perapc_excess - if(netexcess > 100 && nodes && nodes.len) // if there was excess power last cycle - for(var/obj/machinery/power/smes/S in nodes) // find the SMESes in the network - S.restore() // and restore some of the power that was used + // At this point, all other machines have finished using power. Anything left over may be used up to charge SMESs. + if(inputting.len && smes_demand) + var/smes_input_percentage = between(0, (netexcess / smes_demand) * 100, 100) + for(var/obj/machinery/power/smes/S in inputting) + S.input_power(smes_input_percentage) + + netexcess = avail - load + + if(netexcess) + var/perc = get_percent_load(1) + for(var/obj/machinery/power/smes/S in nodes) + S.restore(perc) //updates the viewed load (as seen on power computers) viewload = round(load) @@ -117,7 +138,22 @@ //reset the powernet load = 0 avail = newavail + smes_avail = smes_newavail + inputting.Cut() + smes_demand = 0 newavail = 0 + smes_newavail = 0 + +/datum/powernet/proc/get_percent_load(var/smes_only = 0) + if(smes_only) + var/smes_used = load - (avail - smes_avail) // SMESs are always last to provide power + if(!smes_used || smes_used < 0 || !smes_avail) // SMES power isn't available or being used at all, SMES load is therefore 0% + return 0 + return between(0, (smes_used / smes_avail) * 100, 100) // Otherwise return percentage load of SMESs. + else + if(!load) + return 0 + return between(0, (avail / load) * 100, 100) /datum/powernet/proc/get_electrocute_damage() switch(avail) @@ -142,7 +178,7 @@ // return a knot cable (O-X) if one is present in the turf // null if there's none /turf/proc/get_cable_node() - if(!istype(src, /turf/simulated/floor)) + if(!istype(src, /turf/simulated)) return null for(var/obj/structure/cable/C in src) if(C.d1 == 0) diff --git a/code/modules/power/sensors/powernet_sensor.dm b/code/modules/power/sensors/powernet_sensor.dm index 27e434b562f..7dcc3a02433 100644 --- a/code/modules/power/sensors/powernet_sensor.dm +++ b/code/modules/power/sensors/powernet_sensor.dm @@ -12,7 +12,7 @@ desc = "Small machine which transmits data about specific powernet" anchored = 1 density = 0 - layer = 2.46 // Above cables, but should be below floors. + level = 1 icon = 'icons/obj/objects.dmi' icon_state = "floor_beacon" // If anyone wants to make better sprite, feel free to do so without asking me. diff --git a/code/modules/power/sensors/sensor_monitoring.dm b/code/modules/power/sensors/sensor_monitoring.dm index c4e9a191e93..c75b6285289 100644 --- a/code/modules/power/sensors/sensor_monitoring.dm +++ b/code/modules/power/sensors/sensor_monitoring.dm @@ -7,7 +7,8 @@ name = "Power Monitoring Console" desc = "Computer designed to remotely monitor power levels around the station" icon = 'icons/obj/computer.dmi' - icon_state = "power" + icon_keyboard = "power_key" + icon_screen = "power" light_color = "#ffcc33" //computer stuff @@ -18,7 +19,7 @@ use_power = 1 idle_power_usage = 300 active_power_usage = 300 - var/obj/nano_module/power_monitor/power_monitor + var/datum/nano_module/power_monitor/power_monitor // Checks the sensors for alerts. If change (alerts cleared or detected) occurs, calls for icon update. /obj/machinery/computer/power_monitor/process() diff --git a/code/modules/power/singularity/act.dm b/code/modules/power/singularity/act.dm index 3804c1f1587..23774d526ed 100644 --- a/code/modules/power/singularity/act.dm +++ b/code/modules/power/singularity/act.dm @@ -34,7 +34,7 @@ src << "The [S] pulls \the [hand] from your grip!" apply_effect(current_size * 3, IRRADIATE) if(shoes) - if(shoes.flags & NOSLIP) return 0 + if(shoes.item_flags & NOSLIP) return 0 ..() /obj/singularity_act() @@ -101,13 +101,13 @@ return 1000 /turf/singularity_act(S, current_size) - if(intact) + if(!is_plating()) for(var/obj/O in contents) if(O.level != 1) continue if(O.invisibility == 101) O.singularity_act(src, current_size) - ChangeTurf(/turf/space) + ChangeTurf(get_base_turf_by_area(src)) return 2 /turf/simulated/wall/singularity_pull(S, current_size) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 8b512644606..751e2cf1578 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -10,6 +10,7 @@ unacidable = 1 use_power = 0 light_range = 4 + flags = PROXMOVE var/obj/machinery/field_generator/FG1 = null 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. @@ -29,16 +30,9 @@ return 1 -/obj/machinery/containment_field/blob_act() - return 0 - - /obj/machinery/containment_field/ex_act(severity) return 0 -/obj/machinery/containment_field/meteorhit() - return 0 - /obj/machinery/containment_field/HasProximity(atom/movable/AM as mob|obj) if(istype(AM,/mob/living/silicon) && prob(40)) shock(AM) @@ -65,7 +59,7 @@ user.throw_at(target, 200, 4) sleep(20) - + hasShocked = 0 return diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a5b73bb4b0e..53668d80de7 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -24,6 +24,8 @@ var/state = 0 var/locked = 0 + var/_wifi_id + var/datum/wifi/receiver/button/emitter/wifi_receiver /obj/machinery/power/emitter/verb/rotate() set name = "Rotate" @@ -40,12 +42,16 @@ ..() if(state == 2 && anchored) connect_to_network() + if(_wifi_id) + wifi_receiver = new(_wifi_id, src) /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") - ..() + qdel(wifi_receiver) + wifi_receiver = null + return ..() /obj/machinery/power/emitter/update_icon() if (active && powernet && avail(active_power_usage)) @@ -93,9 +99,6 @@ src.use_power = 1 */ return 1 -/obj/machinery/containment_field/meteorhit() - return 0 - /obj/machinery/power/emitter/process() if(stat & (BROKEN)) return @@ -130,15 +133,15 @@ var/burst_time = (min_burst_delay + max_burst_delay)/2 + 2*(burst_shots-1) var/power_per_shot = active_power_usage * (burst_time/10) / burst_shots + playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1) if(prob(35)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) - playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1) A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER) - A.launch(get_step(src.loc, src.dir)) + A.launch( get_step(src.loc, src.dir) ) /obj/machinery/power/emitter/attackby(obj/item/W, mob/user) @@ -215,13 +218,12 @@ else user << "Access denied." return + ..() + return - - if(istype(W, /obj/item/weapon/card/emag) && !emagged) +/obj/machinery/power/emitter/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) locked = 0 emagged = 1 user.visible_message("[user.name] emags [src].","You short out the lock.") - return - - ..() - return + return 1 diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 2f388006371..6368e7348d6 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -159,16 +159,6 @@ field_generator power level display /obj/machinery/field_generator/emp_act() return 0 - -/obj/machinery/field_generator/blob_act() - if(active) - return 0 - else - ..() - -/obj/machinery/containment_field/meteorhit() - return 0 - /obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj, /obj/item/projectile/beam)) power += Proj.damage * EMITTER_DAMAGE_POWER_TRANSFER diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 6ae932dee1d..f6770d48c07 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -157,18 +157,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin else return - -/obj/structure/particle_accelerator/blob_act() - if(prob(50)) - qdel(src) - return - - -/obj/structure/particle_accelerator/meteorhit() - if(prob(50)) - qdel(src) - return - /obj/structure/particle_accelerator/update_icon() switch(construction_state) if(0,1) @@ -345,18 +333,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return -/obj/machinery/particle_accelerator/blob_act() - if(prob(50)) - qdel(src) - return - - -/obj/machinery/particle_accelerator/meteorhit() - if(prob(50)) - qdel(src) - return - - /obj/machinery/particle_accelerator/proc/update_state() return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 985bd74e62a..39f08f509b8 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -30,7 +30,9 @@ /obj/machinery/particle_accelerator/control_box/Destroy() if(active) toggle_power() - ..() + qdel(wires) + wires = null + return ..() /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 55b4fad1a47..7b70b10b5b5 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -53,9 +53,6 @@ consume(user) return 1 -/obj/singularity/blob_act(severity) - return - /obj/singularity/ex_act(severity) if(current_size == STAGE_SUPER)//IT'S UNSTOPPABLE return @@ -266,12 +263,10 @@ allowed_size = STAGE_SUPER if (current_size != allowed_size && current_size != STAGE_SUPER) - expand(null, current_size > allowed_size) + expand(null, current_size < allowed_size) return 1 /obj/singularity/proc/eat() - set background = BACKGROUND_ENABLED - for(var/atom/X in orange(grav_pull, src)) var/dist = get_dist(X, src) var/obj/singularity/S = src diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 5fcffca1207..0a5ccbc720d 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -22,22 +22,28 @@ var/input_level_max = 200000 // cap on input_level var/input_available = 0 // amount of charge available from input last tick - var/output_attempt = 1 // 1 = attempting to output, 0 = not attempting to output - var/outputting = 1 // 1 = actually outputting, 0 = not outputting + var/output_attempt = 0 // 1 = attempting to output, 0 = not attempting to output + var/outputting = 0 // 1 = actually outputting, 0 = not outputting var/output_level = 50000 // amount of power the SMES attempts to output var/output_level_max = 200000 // cap on output_level var/output_used = 0 // amount of power actually outputted. may be less than output_level if the powernet returns excess power //Holders for powerout event. - var/last_output_attempt = 0 - var/last_input_attempt = 0 - var/last_charge = 0 + //var/last_output_attempt = 0 + //var/last_input_attempt = 0 + //var/last_charge = 0 + + //For icon overlay updates + var/last_disp + var/last_chrg + var/last_onln var/input_cut = 0 var/input_pulsed = 0 var/output_cut = 0 var/output_pulsed = 0 - + var/failure_timer = 0 // Set by gridcheck event, temporarily disables the SMES. + var/target_load = 0 var/open_hatch = 0 var/name_tag = null var/building_terminal = 0 //Suggestions about how to avoid clickspam building several terminals accepted! @@ -83,6 +89,12 @@ return +/obj/machinery/power/smes/add_avail(var/amount) + if(..(amount)) + powernet.smes_newavail += amount + return 1 + return 0 + /obj/machinery/power/smes/disconnect_terminal() if(terminal) @@ -101,65 +113,74 @@ overlays += image('icons/obj/power.dmi', "smes-oc2") else if (inputting == 1) overlays += image('icons/obj/power.dmi', "smes-oc1") - else - if(input_attempt) - overlays += image('icons/obj/power.dmi', "smes-oc0") + else if (input_attempt) + overlays += image('icons/obj/power.dmi', "smes-oc0") var/clevel = chargedisplay() - if(clevel>0) + if(clevel) overlays += image('icons/obj/power.dmi', "smes-og[clevel]") - return + if(outputting == 2) + overlays += image('icons/obj/power.dmi', "smes-op2") + else if (outputting == 1) + overlays += image('icons/obj/power.dmi', "smes-op1") + else + overlays += image('icons/obj/power.dmi', "smes-op0") /obj/machinery/power/smes/proc/chargedisplay() return round(5.5*charge/(capacity ? capacity : 5e6)) +/obj/machinery/power/smes/proc/input_power(var/percentage) + var/inputted_power = target_load * (percentage/100) + inputted_power = between(0, inputted_power, target_load) + if(terminal && terminal.powernet) + inputted_power = terminal.powernet.draw_power(inputted_power) + charge += inputted_power * SMESRATE + if(percentage == 100) + inputting = 2 + else if(percentage) + inputting = 1 + // else inputting = 0, as set in process() + /obj/machinery/power/smes/process() if(stat & BROKEN) return - - //store machine state to see if we need to update the icon overlays - var/last_disp = chargedisplay() - var/last_chrg = inputting - var/last_onln = outputting - - //inputting - if(input_attempt && (!input_pulsed && !input_cut)) - var/target_load = min((capacity-charge)/SMESRATE, input_level) // charge at set rate, limited to spare capacity - var/actual_load = draw_power(target_load) // add the load to the terminal side network - charge += actual_load * SMESRATE // increase the charge - - if (actual_load >= target_load) // Did we charge at full rate? - inputting = 2 - else if (actual_load) // If not, did we charge at least partially? - inputting = 1 - else // Or not at all? - inputting = 0 - - //outputting - if(outputting && (!output_pulsed && !output_cut)) - output_used = min( charge/SMESRATE, output_level) //limit output to that stored - - charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) - - add_avail(output_used) // add output to powernet (smes side) - - if(output_used < 0.0001) // either from no charge or set to 0 - outputting(0) - investigate_log("lost power and turned off","singulo") - else if(output_attempt && output_level > 0) - outputting = 1 - else - output_used = 0 + if(failure_timer) // Disabled by gridcheck. + failure_timer-- + return // only update icon if state changed if(last_disp != chargedisplay() || last_chrg != inputting || last_onln != outputting) update_icon() + //store machine state to see if we need to update the icon overlays + last_disp = chargedisplay() + last_chrg = inputting + last_onln = outputting + //inputting + if(input_attempt && (!input_pulsed && !input_cut)) + target_load = min((capacity-charge)/SMESRATE, input_level) // Amount we will request from the powernet. + if(terminal && terminal.powernet) + terminal.powernet.smes_demand += target_load + terminal.powernet.inputting.Add(src) + else + target_load = 0 // We won't input any power without powernet connection. + inputting = 0 + + //outputting + if(output_attempt && (!output_pulsed && !output_cut) && powernet && charge) + output_used = min( charge/SMESRATE, output_level) //limit output to that stored + charge -= output_used*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) + add_avail(output_used) // add output to powernet (smes side) + outputting = 2 + else if(!powernet || !charge) + outputting = 1 + else + outputting = 0 // called after all power processes are finished // restores charge level to smes if there was excess this ptick -/obj/machinery/power/smes/proc/restore() +/obj/machinery/power/smes/proc/restore(var/percent_load) if(stat & BROKEN) return @@ -167,20 +188,18 @@ output_used = 0 return - var/excess = powernet.netexcess // this was how much wasn't used on the network last ptick, minus any removed by other SMESes - - excess = min(output_used, excess) // clamp it to how much was actually output by this SMES last ptick - - excess = min((capacity-charge)/SMESRATE, excess) // for safety, also limit recharge by space capacity of SMES (shouldn't happen) + var/total_restore = output_used * (percent_load / 100) // First calculate amount of power used from our output + total_restore = between(0, total_restore, output_used) // Now clamp the value between 0 and actual output, just for clarity. + total_restore = output_used - total_restore // And, at last, subtract used power from outputted power, to get amount of power we will give back to the SMES. // now recharge this amount var/clev = chargedisplay() - charge += excess * SMESRATE // restore unused power - powernet.netexcess -= excess // remove the excess from the powernet, so later SMESes don't try to use it + charge += total_restore * SMESRATE // restore unused power + powernet.netexcess -= total_restore // remove the excess from the powernet, so later SMESes don't try to use it - output_used -= excess + output_used -= total_restore if(clev != chargedisplay() ) //if needed updates the icons overlay update_icon() @@ -204,7 +223,7 @@ user << "You can't build a terminal on space." return 1 else if (istype(tempLoc)) - if(tempLoc.intact) + if(!tempLoc.is_plating()) user << "You must remove the floor plating first." return 1 user << "You start adding cable to the [src]." @@ -223,10 +242,7 @@ /obj/machinery/power/smes/attack_ai(mob/user) - add_fingerprint(user) - ui_interact(user) - -/obj/machinery/power/smes/attack_ghost(mob/user) + add_hiddenprint(user) ui_interact(user) /obj/machinery/power/smes/attack_hand(mob/user) @@ -246,7 +262,7 @@ return 0 if (!open_hatch) - user << "You need to open access hatch on [src] first!" + user << "You need to open access hatch on [src] first!" return 0 if(istype(W, /obj/item/stack/cable_coil) && !terminal && !building_terminal) @@ -272,7 +288,7 @@ building_terminal = 1 var/turf/tempTDir = terminal.loc if (istype(tempTDir)) - if(tempTDir.intact) + if(!tempTDir.is_plating()) user << "You must remove the floor plating first." else user << "You begin to cut the cables..." @@ -311,13 +327,9 @@ data["outputLevel"] = output_level data["outputMax"] = output_level_max data["outputLoad"] = round(output_used) + data["failTime"] = failure_timer * 2 + data["outputting"] = outputting - if(outputting) - data["outputting"] = 2 // smes is outputting - else if(!outputting && output_attempt) - data["outputting"] = 1 // smes is online but not outputting because it's charge level is too low - else - data["outputting"] = 0 // smes is not outputting // update the ui if it exists, returns null if no ui is passed/found ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -346,6 +358,9 @@ else if( href_list["online"] ) outputting(!output_attempt) update_icon() + else if( href_list["reboot"] ) + failure_timer = 0 + update_icon() else if( href_list["input"] ) switch( href_list["input"] ) if("min") @@ -366,10 +381,12 @@ output_level = input(usr, "Enter new output level (0-[output_level_max])", "SMES Output Power Control", output_level) as num output_level = max(0, min(output_level_max, output_level)) // clamp to range - investigate_log("input/output; [input_level>output_level?"":""][input_level]/[output_level] | Output-mode: [output_attempt?"on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [usr.key]","singulo") + investigate_log("input/output; on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [usr.key]","singulo") return 1 +/obj/machinery/power/smes/proc/energy_fail(var/duration) + failure_timer = max(failure_timer, duration) /obj/machinery/power/smes/proc/ion_act() if(src.z in config.station_levels) @@ -384,7 +401,7 @@ explosion(src.loc, -1, 0, 1, 3, 1, 0) qdel(src) return - if(prob(15)) //Power drain + else if(prob(15)) //Power drain var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() @@ -392,11 +409,13 @@ emp_act(1) else emp_act(2) - if(prob(5)) //smoke only + else if(prob(5)) //smoke only var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() smoke.set_up(3, 0, src.loc) smoke.attach(src) smoke.start() + else + energy_fail(rand(0, 30)) /obj/machinery/power/smes/proc/inputting(var/do_input) input_attempt = do_input @@ -409,21 +428,26 @@ outputting = 0 /obj/machinery/power/smes/emp_act(severity) - inputting(rand(0,1)) - outputting(rand(0,1)) - output_level = rand(0, output_level_max) - input_level = rand(0, input_level_max) - charge -= 1e6/severity - if (charge < 0) - charge = 0 + if(prob(50)) + inputting(rand(0,1)) + outputting(rand(0,1)) + if(prob(50)) + output_level = rand(0, output_level_max) + input_level = rand(0, input_level_max) + if(prob(50)) + charge -= 1e6/severity + if (charge < 0) + charge = 0 + if(prob(50)) + energy_fail(rand(0 + (severity * 30),30 + (severity * 30))) update_icon() ..() /obj/machinery/power/smes/magical - name = "magical power storage unit" - desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. Magically produces power." - capacity = 9000000 + name = "quantum power storage unit" + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. Gains energy from quantum entanglement link." + capacity = 5000000 output_level = 250000 should_be_mapped = 1 diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 095c172aac5..5f4a71b1339 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -76,11 +76,11 @@ should_be_mapped = 1 /obj/machinery/power/smes/buildable/Destroy() - ..() qdel(wires) - for(var/obj/nano_module/rcon/R in world) + wires = null + for(var/datum/nano_module/rcon/R in world) R.FindDevices() - + return ..() // Proc: process() // Parameters: None @@ -93,7 +93,7 @@ s.start() charge -= (output_level_max * SMESRATE) if(prob(1)) // Small chance of overload occuring since grounding is disabled. - apcs_overload(5,10) + apcs_overload(5,10,20) ..() @@ -214,6 +214,7 @@ h_user.Paralyse(5) spawn(0) empulse(src.loc, 2, 4) + apcs_overload(0, 5, 10) charge = 0 if (36 to 60) @@ -232,7 +233,8 @@ spawn(0) empulse(src.loc, 8, 16) charge = 0 - apcs_overload(1, 10) + apcs_overload(1, 10, 20) + energy_fail(10) src.ping("Caution. Output regulators malfunction. Uncontrolled discharge detected.") if (61 to INFINITY) @@ -247,7 +249,8 @@ spawn(0) empulse(src.loc, 32, 64) charge = 0 - apcs_overload(5, 25) + apcs_overload(5, 25, 100) + energy_fail(30) src.ping("Caution. Output regulators malfunction. Significant uncontrolled discharge detected.") if (prob(50)) @@ -270,9 +273,9 @@ // Proc: apcs_overload() -// Parameters: 2 (failure_chance - chance to actually break the APC, overload_chance - Chance of breaking lights) +// Parameters: 3 (failure_chance - chance to actually break the APC, overload_chance - Chance of breaking lights, reboot_chance - Chance of temporarily disabling the APC) // Description: Damages output powernet by power surge. Destroys few APCs and lights, depending on parameters. -/obj/machinery/power/smes/buildable/proc/apcs_overload(var/failure_chance, var/overload_chance) +/obj/machinery/power/smes/buildable/proc/apcs_overload(var/failure_chance, var/overload_chance, var/reboot_chance) if (!src.powernet) return @@ -283,6 +286,8 @@ A.overload_lighting() if (prob(failure_chance)) A.set_broken() + if(prob(reboot_chance)) + A.energy_fail(rand(30,60)) // Proc: update_icon() // Parameters: None @@ -349,8 +354,6 @@ M.state = 2 M.icon_state = "box_1" for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 I.loc = src.loc component_parts -= I qdel(src) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index a6184a1a932..3a661d6f917 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -80,12 +80,6 @@ var/list/solars_list = list() ..() -/obj/machinery/power/solar/blob_act() - src.health-- - src.healthcheck() - return - - /obj/machinery/power/solar/proc/healthcheck() if (src.health <= 0) if(!(stat & BROKEN)) @@ -172,12 +166,6 @@ var/list/solars_list = list() return -/obj/machinery/power/solar/blob_act() - if(prob(75)) - broken() - src.density = 0 - - /obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S) ..(loc, S, 0) @@ -387,7 +375,7 @@ var/list/solars_list = list() var/t = "Generated power : [round(lastgen)] W
      " t += "Star Orientation: [sun.angle]° ([angle2text(sun.angle)])
      " t += "Array Orientation: [rate_control(src,"cdir","[cdir]°",1,15)] ([angle2text(cdir)])
      " - t += "Tracking:
      " + t += "Tracking:
      " switch(track) if(0) t += "Off Timed Auto
      " @@ -538,12 +526,17 @@ var/list/solars_list = list() broken() return +// Used for mapping in solar array which automatically starts itself (telecomms, for example) +/obj/machinery/power/solar_control/autostart + track = 2 // Auto tracking mode -/obj/machinery/power/solar_control/blob_act() - if (prob(75)) - broken() - src.density = 0 - +/obj/machinery/power/solar_control/autostart/New() + ..() + spawn(150) // Wait 15 seconds to ensure everything was set up properly (such as, powernets, solar panels, etc. + src.search_for_connected() + if(connected_tracker && track == 2) + connected_tracker.set_angle(sun.angle) + src.set_panels(cdir) // // MISC diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index cec6bd57f60..7cbe2c828b3 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -17,7 +17,7 @@ /obj/machinery/power/terminal/New() ..() var/turf/T = src.loc - if(level==1) hide(T.intact) + if(level==1) hide(!T.is_plating()) return /obj/machinery/power/terminal/Destroy() @@ -27,12 +27,8 @@ return ..() /obj/machinery/power/terminal/hide(var/i) - if(i) - invisibility = 101 - icon_state = "term-f" - else - invisibility = 0 - icon_state = "term" + invisibility = i ? 101 : initial(invisibility) + icon_state = i ? "term-f" : "term" // Needed so terminals are not removed from machines list. // Powernet rebuilds need this to work properly. diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 0119de83088..8786930e2f8 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -29,7 +29,8 @@ name = "Gas turbine control computer" desc = "A computer to remotely control a gas turbine" icon = 'icons/obj/computer.dmi' - icon_state = "turbinecomp" + icon_keyboard = "tech_key" + icon_screen = "turbinecomp" circuit = /obj/item/weapon/circuitboard/turbine_control anchored = 1 density = 1 @@ -277,7 +278,7 @@ \n
      \n"} else - dat += "\redNo compatible attached compressor found." + dat += "No compatible attached compressor found." user << browse(dat, "window=computer;size=400x500") onclose(user, "computer") diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 08b3b574740..90bbe1cc277 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -90,6 +90,7 @@ var/list/ammo_states = list() //values /obj/item/ammo_magazine/New() + ..() if(multiple_sprites) initialize_magazine_icondata(src) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index d3f97953e68..4a7c58c90a0 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -68,7 +68,7 @@ /obj/item/ammo_magazine/mc9mm name = "magazine (9mm)" icon_state = "9x19p" - origin_tech = "combat=2" + origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE matter = list(DEFAULT_WALL_MATERIAL = 600) caliber = "9mm" @@ -85,7 +85,7 @@ /obj/item/ammo_magazine/c9mm name = "ammunition Box (9mm)" icon_state = "9mm" - origin_tech = "combat=2" + origin_tech = list(TECH_COMBAT = 2) matter = list(DEFAULT_WALL_MATERIAL = 1800) caliber = "9mm" ammo_type = /obj/item/ammo_casing/c9mm @@ -118,7 +118,7 @@ /obj/item/ammo_magazine/c45 name = "ammunition Box (.45)" icon_state = "9mm" - origin_tech = "combat=2" + origin_tech = list(TECH_COMBAT = 2) caliber = ".45" matter = list(DEFAULT_WALL_MATERIAL = 2250) ammo_type = /obj/item/ammo_casing/c45 @@ -127,24 +127,24 @@ /obj/item/ammo_magazine/c9mm/empty initial_ammo = 0 -/obj/item/ammo_magazine/a12mm - name = "magazine (12mm)" +/obj/item/ammo_magazine/a10mm + name = "magazine (10mm)" icon_state = "12mm" - origin_tech = "combat=2" + origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE - caliber = "12mm" + caliber = "10mm" matter = list(DEFAULT_WALL_MATERIAL = 1500) - ammo_type = "/obj/item/ammo_casing/a12mm" + ammo_type = /obj/item/ammo_casing/t40 max_ammo = 20 multiple_sprites = 1 -/obj/item/ammo_magazine/a12mm/empty +/obj/item/ammo_magazine/a10mm/empty initial_ammo = 0 /obj/item/ammo_magazine/a556 name = "magazine (5.56mm)" icon_state = "5.56" - origin_tech = "combat=2" + origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE caliber = "a556" matter = list(DEFAULT_WALL_MATERIAL = 1800) @@ -162,7 +162,7 @@ /obj/item/ammo_magazine/a50 name = "magazine (.50)" icon_state = "50ae" - origin_tech = "combat=2" + origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE caliber = ".50" matter = list(DEFAULT_WALL_MATERIAL = 1260) @@ -213,7 +213,7 @@ /obj/item/ammo_magazine/a762 name = "magazine box (7.62mm)" icon_state = "a762" - origin_tech = "combat=2" + origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE caliber = "a762" matter = list(DEFAULT_WALL_MATERIAL = 4500) @@ -234,19 +234,6 @@ max_ammo = 20 multiple_sprites = 1 -/obj/item/ammo_magazine/chameleon - name = "magazine (.45)" - icon_state = "45" - mag_type = MAGAZINE - caliber = ".45" - ammo_type = /obj/item/ammo_casing/chameleon - max_ammo = 7 - multiple_sprites = 1 - matter = list() - -/obj/item/ammo_magazine/chameleon/empty - initial_ammo = 0 - /obj/item/ammo_magazine/boltaction name = "ammo clip (7.62mm)" icon_state = "762" @@ -329,6 +316,16 @@ max_ammo = 8 matter = list(DEFAULT_WALL_MATERIAL = 3600) +/obj/item/ammo_magazine/caps + name = "speed loader (caps)" + icon_state = "T38" + caliber = "caps" + color = "#FF0000" + ammo_type = /obj/item/ammo_casing/cap + matter = list(DEFAULT_WALL_MATERIAL = 600) + max_ammo = 7 + multiple_sprites = 1 + //dragunov magazine /obj/item/ammo_magazine/d762 diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index f207ae769eb..bfc944193f0 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -213,3 +213,11 @@ caliber = "357" projectile_type = /obj/item/projectile/bullet/cyanideround */ + +/obj/item/ammo_casing/cap + name = "cap" + desc = "A cap for children toys." + caliber = "caps" + color = "#FF0000" + projectile_type = /obj/item/projectile/bullet/pistol/cap + diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 834f136369e..276b9346314 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,32 +1,31 @@ /* 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. + A firemode is created from a list of fire mode settings. Each setting modifies the value of the gun var with the same name. + If the fire mode value for a setting is null, it will be replaced with the initial value of that gun's variable when the firemode is created. + Obviously not compatible with variables that take a null value. If a setting is not present, then the corresponding var will not be modified. */ /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) + var/list/settings = list() -//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) +/datum/firemode/New(obj/item/weapon/gun/gun, list/properties = null) ..() if(!properties) return - for(var/propname in vars) - if(!isnull(properties[propname])) - src.vars[propname] = properties[propname] + for(var/propname in properties) + var/propvalue = properties[propname] + + if(propname == "mode_name") + name = propvalue + else if(isnull(propvalue)) + settings[propname] = gun.vars[propname] //better than initial() as it handles list vars like burst_accuracy + else + settings[propname] = propvalue + +/datum/firemode/proc/apply_to(obj/item/weapon/gun/gun) + for(var/propname in settings) + gun.vars[propname] = settings[propname] //Parent gun type. Guns are weapons that can be aimed at mobs and act over a distance /obj/item/weapon/gun @@ -47,12 +46,14 @@ throw_speed = 4 throw_range = 5 force = 5 - origin_tech = "combat=1" + origin_tech = list(TECH_COMBAT = 1) attack_verb = list("struck", "hit", "bashed") zoomdevicename = "scope" + var/burst = 1 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/move_delay = 1 var/fire_sound = 'sound/weapons/Gunshot.ogg' var/fire_sound_text = "gunshot" var/recoil = 0 //screen shake @@ -60,12 +61,13 @@ var/muzzle_flash = 3 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/list/burst_accuracy = list(0) //allows for different accuracies for each shot in a burst. Applied on top of accuracy + var/list/dispersion = list(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 //wielding information var/fire_delay_wielded = 0 @@ -85,11 +87,8 @@ /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]) + for(var/i in 1 to firemodes.len) + firemodes[i] = new /datum/firemode(src, firemodes[i]) if(isnull(scoped_accuracy)) scoped_accuracy = accuracy @@ -114,7 +113,7 @@ 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]!", + "\The [user] shoots \himself in the foot with \the [src]!", "You shoot yourself in the foot with \the [src]!" ) M.drop_item() @@ -130,14 +129,17 @@ /obj/item/weapon/gun/afterattack(atom/A, mob/living/user, adjacent, params) if(adjacent) return //A is adjacent, is the user, or is on the user's person - //decide whether to aim or shoot normally - var/aiming = 0 - if(user && user.client && !(A in aim_targets)) - if(user.client.gun_mode) - aiming = PreFire(A,user,params) //They're using the new gun system, locate what they're aiming at. + if(!user.aiming) + user.aiming = new(user) - if (!aiming) - Fire(A,user,params) //Fire normally and always. + if(user && user.client && user.aiming && user.aiming.active && user.aiming.aiming_at != A) + PreFire(A,user,params) //They're using the new gun system, locate what they're aiming at. + return + + if(user && user.a_intent == I_HELP) //regardless of what happens, refuse to shoot if help intent is on + user << "You refrain from firing your [src] as your intent is set to help." + else + Fire(A,user,params) //Otherwise, fire normally. /obj/item/weapon/gun/attack(atom/A, mob/living/user, def_zone) if (A == user && user.zone_sel.selecting == "mouth" && !mouthshoot) @@ -160,41 +162,32 @@ user << "[src] is not ready to fire again!" 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 - if(can_wield() && !wielded && firemode.fire_delay) - _fire_delay += initial(fire_delay) / 2 - 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 + var/shoot_time = (burst - 1)* burst_delay + user.setClickCooldown(shoot_time) //no clicking on things while shooting + user.setMoveCooldown(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) + 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)] + var/acc = burst_accuracy[min(i, burst_accuracy.len)] + var/disp = dispersion[min(i, 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, i == _burst) + handle_post_fire(user, target, pointblank, reflex) update_icon() - if(i < _burst) - sleep(_burst_delay) + if(i < burst) + sleep(burst_delay) if(!(target && target.loc)) target = targloc @@ -203,9 +196,9 @@ update_held_icon() //update timing - user.next_move = world.time + 4 - if(user.client) user.client.move_delay = world.time + _move_delay - next_fire_time = world.time + _fire_delay + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.setMoveCooldown(move_delay) + next_fire_time = world.time + fire_delay if(muzzle_flash) set_light(0) @@ -345,20 +338,19 @@ playsound(user, fire_sound, 10, 1) else playsound(user, fire_sound, 50, 1) - - in_chamber.on_hit(M) - - if (in_chamber.damage == 0) + if(istype(in_chamber, /obj/item/projectile/beam/lastertag)) user.show_message("You feel rather silly, trying to commit suicide with a toy.") mouthshoot = 0 return - else if (in_chamber.damage_type == HALLOSS) - user << "Ow..." - user.apply_effect(110,AGONY,0) - else + + in_chamber.on_hit(M) + if (in_chamber.damage_type != HALLOSS) log_and_message_admins("[key_name(user)] commited suicide using \a [src]") user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() + else + user << "Ow..." + user.apply_effect(110,AGONY,0) qdel(in_chamber) mouthshoot = 0 return @@ -403,16 +395,22 @@ 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) +/obj/item/weapon/gun/proc/switch_firemodes() + if(firemodes.len <= 1) + return 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]." + new_mode.apply_to(src) + + return new_mode /obj/item/weapon/gun/attack_self(mob/user) - if(firemodes.len > 1) - switch_firemodes(user) + var/datum/firemode/new_mode = switch_firemodes(user) + if(new_mode) + user << "\The [src] is now set to [new_mode.name]." //Handling of rifles and two-handed weapons. /obj/item/weapon/gun/proc/can_wield() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 2a7fdad6475..53986e151ca 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -1,16 +1,9 @@ -/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 = 200 //How much energy is needed to fire. @@ -26,17 +19,10 @@ 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 - +/obj/item/weapon/gun/energy/switch_firemodes() + . = ..() + if(.) update_icon() - update_held_icon() /obj/item/weapon/gun/energy/emp_act(severity) ..() @@ -115,4 +101,4 @@ icon_state = "[modifystate][ratio]" else icon_state = "[initial(icon_state)][ratio]" - + update_held_icon() diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 5c371c988fe..e180548afcf 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -1,31 +1,30 @@ /obj/item/weapon/gun/energy/laser name = "laser carbine" - desc = "A common laser weapon, designed to kill with concentrated energy blasts." + desc = "An Hesphaistos Industries G40E carbine, designed to kill with concentrated energy blasts." icon_state = "laser" item_state = "laser" fire_sound = 'sound/weapons/Laser.ogg' slot_flags = SLOT_BELT|SLOT_BACK w_class = 3 force = 10 + origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) matter = list(DEFAULT_WALL_MATERIAL = 2000) - origin_tech = "combat=3;magnets=2" - projectile_type = /obj/item/projectile/beam - fire_delay = 1 //rapid fire + projectile_type = /obj/item/projectile/beam/midlaser /obj/item/weapon/gun/energy/laser/mounted self_recharge = 1 use_external_power = 1 /obj/item/weapon/gun/energy/laser/practice - name = "practice laser gun" - desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." + name = "practice laser carbine" + desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice." projectile_type = /obj/item/projectile/beam/practice obj/item/weapon/gun/energy/retro name = "retro laser" icon_state = "retro" item_state = "retro" - desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." + desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." fire_sound = 'sound/weapons/Laser.ogg' slot_flags = SLOT_BELT w_class = 3 @@ -36,7 +35,7 @@ obj/item/weapon/gun/energy/retro name = "antique laser gun" icon_state = "caplaser" item_state = "caplaser" - desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." + desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well." force = 5 fire_sound = 'sound/weapons/Laser.ogg' slot_flags = SLOT_BELT @@ -52,7 +51,7 @@ obj/item/weapon/gun/energy/retro icon_state = "lasercannon" item_state = null fire_sound = 'sound/weapons/lasercannonfire.ogg' - origin_tech = "combat=4;materials=3;powerstorage=3" + origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) slot_flags = SLOT_BELT|SLOT_BACK projectile_type = /obj/item/projectile/beam/heavylaser charge_cost = 400 @@ -71,19 +70,19 @@ obj/item/weapon/gun/energy/retro icon_state = "xray" item_state = "xray" fire_sound = 'sound/weapons/laser3.ogg' - origin_tech = "combat=5;materials=3;magnets=2;syndicate=2" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2) projectile_type = /obj/item/projectile/beam/xray charge_cost = 100 max_shots = 20 fire_delay = 1 /obj/item/weapon/gun/energy/sniperrifle - name = "\improper L.W.A.P. sniper rifle" - desc = "A high-power laser rifle fitted with a SMART aiming-system scope." + name = "marksman energy rifle" + desc = "The HI DMR 9E is an older design of Hesphaistos Industries. A designated marksman rifle capable of shooting powerful ionized beams, this is a weapon to kill from a distance." icon_state = "sniper" item_state = "sniper" fire_sound = 'sound/weapons/marauder.ogg' - origin_tech = "combat=6;materials=5;powerstorage=4" + origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4) projectile_type = /obj/item/projectile/beam/sniper slot_flags = SLOT_BACK charge_cost = 400 @@ -98,7 +97,6 @@ obj/item/weapon/gun/energy/retro accuracy_wielded = -3 //action button for wielding - icon_action_button = "action_blank" action_button_name = "Wield rifle" /obj/item/weapon/gun/energy/sniperrifle/can_wield() @@ -142,7 +140,7 @@ obj/item/weapon/gun/energy/retro name = "laser tag gun" item_state = "laser" desc = "Standard issue weapon of the Imperial Guard" - origin_tech = "combat=1;magnets=2" + origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2) self_recharge = 1 matter = list(DEFAULT_WALL_MATERIAL = 2000) fire_sound = 'sound/weapons/Laser.ogg' diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 28b8a0e1fd2..7339a1d549c 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -8,14 +8,16 @@ max_shots = 10 projectile_type = /obj/item/projectile/beam/stun - origin_tech = "combat=3;magnets=2" + origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) modifystate = "energystun" 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'), + list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="energystun", fire_sound='sound/weapons/Taser.ogg'), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", fire_sound='sound/weapons/Laser.ogg'), ) + var/crit_fail = 0 //Added crit_fail as a local variable + /obj/item/weapon/gun/energy/gun/mounted name = "mounted energy gun" self_recharge = 1 @@ -25,15 +27,16 @@ name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized reactor." icon_state = "nucgun" - origin_tech = "combat=3;materials=5;powerstorage=3" + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) slot_flags = SLOT_BELT force = 8 //looks heavier than a pistol self_recharge = 1 modifystate = null + var/reliability = 95 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(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg'), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg'), ) var/lightfail = 0 @@ -45,7 +48,6 @@ charge_tick = 0 if(!power_supply) return 0 if((power_supply.charge / power_supply.maxcharge) != 1) - if(!failcheck()) return 0 power_supply.give(charge_cost) update_icon() return 1 @@ -97,11 +99,11 @@ switch(current_mode.name) if("stun") overlays += "nucgun-stun" if("lethal") overlays += "nucgun-kill" - +/* /obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity) ..() reliability -= round(15/severity) - +*/ /obj/item/weapon/gun/energy/gun/nuclear/update_icon() overlays.Cut() update_charge() diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 507bc22735b..98817fede33 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -11,9 +11,9 @@ max_shots = 10 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=400), + list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', fire_delay=null, charge_cost=null), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', fire_delay=null, charge_cost=null), + list(mode_name="DESTROY", projectile_type=/obj/item/projectile/beam/pulse, fire_sound='sound/weapons/pulse.ogg', fire_delay=25, charge_cost=400), ) /obj/item/weapon/gun/energy/pulse_rifle/mounted diff --git a/code/modules/projectiles/guns/energy/rifle.dm b/code/modules/projectiles/guns/energy/rifle.dm index 218701797fe..01ef39c96cd 100644 --- a/code/modules/projectiles/guns/energy/rifle.dm +++ b/code/modules/projectiles/guns/energy/rifle.dm @@ -25,7 +25,6 @@ ) //action button for wielding - icon_action_button = "action_blank" action_button_name = "Wield rifle" /obj/item/weapon/gun/energy/rifle/can_wield() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d500cd6e320..9b50b158686 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -1,10 +1,10 @@ /obj/item/weapon/gun/energy/ionrifle name = "ion rifle" - desc = "A man portable anti-armor weapon designed to disable mechanical threats" + desc = "The NT Mk60 EW Halicon is a man portable anti-armor weapon designed to disable mechanical threats, produced by NT. Not the best of its type." icon_state = "ionrifle" item_state = "ionrifle" fire_sound = 'sound/weapons/Laser.ogg' - origin_tech = "combat=2;magnets=4" + origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 4) w_class = 4 force = 10 flags = CONDUCT @@ -29,7 +29,7 @@ icon_state = "decloner" item_state = "decloner" fire_sound = 'sound/weapons/pulse3.ogg' - origin_tech = "combat=5;materials=4;powerstorage=3" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3) max_shots = 10 projectile_type = /obj/item/projectile/energy/declone @@ -42,13 +42,13 @@ charge_cost = 100 max_shots = 10 projectile_type = /obj/item/projectile/energy/floramut - origin_tech = "materials=2;biotech=3;powerstorage=3" + origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) modifystate = "floramut" self_recharge = 1 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"), + list(mode_name="induce mutations", projectile_type=/obj/item/projectile/energy/floramut, modifystate="floramut"), + list(mode_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) @@ -95,8 +95,7 @@ icon_state = "toxgun" fire_sound = 'sound/effects/stealthoff.ogg' w_class = 3.0 - origin_tech = "combat=5;phorontech=4" - slot_flags = SLOT_HOLSTER | SLOT_BELT + origin_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) projectile_type = /obj/item/projectile/energy/phoron /obj/item/weapon/gun/energy/beegun @@ -151,7 +150,7 @@ M << "[src]'s reactor overloads!" M << "You feel a wave of heat wash over you." M.apply_effect(300, IRRADIATE) - crit_fail = 1 //break the gun so it stops recharging + //crit_fail = 1 //break the gun so it stops recharging processing_objects.Remove(src) update_icon() return 0 @@ -198,7 +197,6 @@ list(name="spray", burst=20, burst_delay = 1, move_delay = 5, fire_delay = 30, dispersion = list(0.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 3.0, 3.25)), ) - icon_action_button = "action_blank" action_button_name = "Wield gatling laser" /obj/item/weapon/gun/energy/vaurca/gatlinglaser/can_wield() @@ -399,4 +397,3 @@ obj/item/weapon/gun/energy/staff/focus/attack_self(mob/living/user as mob) charge_cost = 200 user << "The [src.name] will now strike only a single person." projectile_type = /obj/item/projectile/forcebolt - diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 56a52b7ca1c..495518aa6b4 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -1,6 +1,6 @@ /obj/item/weapon/gun/energy/taser name = "taser gun" - desc = "A small, low capacity gun used for non-lethal takedowns." + desc = "The NT Mk30 NL is a small, low capacity gun used for non-lethal takedowns. Produced by NT, it's actually a licensed version of a W-T design." icon_state = "taser" item_state = null //so the human update icon uses the icon_state instead. fire_sound = 'sound/weapons/Taser.ogg' @@ -20,11 +20,11 @@ /obj/item/weapon/gun/energy/stunrevolver name = "stun revolver" - desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger." + desc = "A LAEP20 Zeus. Designed by Lawson Arms and produced under the wing of the FTU, several TSCs have been trying to get a hold of the blueprints for half a decade." icon_state = "stunrevolver" item_state = "stunrevolver" fire_sound = 'sound/weapons/Gunshot.ogg' - origin_tech = "combat=3;materials=3;powerstorage=2" + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) projectile_type = /obj/item/projectile/energy/electrode max_shots = 8 @@ -35,8 +35,8 @@ icon_state = "crossbow" w_class = 2.0 item_state = "crossbow" + origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2, TECH_ILLEGAL = 5) matter = list(DEFAULT_WALL_MATERIAL = 2000) - origin_tech = "combat=2;magnets=2;syndicate=5" slot_flags = SLOT_BELT silenced = 1 fire_sound = 'sound/weapons/Genhit.ogg' diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index 34801b4574b..62315caf416 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -2,11 +2,11 @@ name = "freeze ray" icon_state = "freezegun" fire_sound = 'sound/weapons/pulse3.ogg' - desc = "For when somebody won't let it go." - //var/temperature = T20C - //var/current_temperature = T20C - charge_cost = 25 //20 shots, exact replica of old code (WAS 100) - origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" + desc = "A gun that changes temperatures. It has a small label on the side, 'More extreme temperatures will cost more charge!'" + var/temperature = T20C + var/current_temperature = T20C + charge_cost = 100 + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) slot_flags = SLOT_BELT|SLOT_BACK projectile_type = /obj/item/projectile/temp diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index fd86302fb8d..12338ee5c34 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -7,9 +7,9 @@ throw_speed = 2 throw_range = 10 force = 5.0 - flags = CONDUCT | USEDELAY + flags = CONDUCT slot_flags = 0 - origin_tech = "combat=8;materials=5" + origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 5) fire_sound = 'sound/effects/bang.ogg' release_force = 15 diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index bae5ed54555..d89381a2d59 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -6,7 +6,7 @@ name = "gun" desc = "A gun that fires bullets." icon_state = "revolver" - origin_tech = "combat=2;materials=2" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) w_class = 3 matter = list(DEFAULT_WALL_MATERIAL = 1000) recoil = 1 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 64cc0d25d8c..da0184e662b 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -1,27 +1,28 @@ /obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude - name = "submachine gun" - desc = "A lightweight, fast firing gun. Uses 9mm rounds." + name = "prototype SMG" + desc = "A protoype lightweight, fast firing gun. Uses 9mm rounds." icon_state = "saber" //ugly w_class = 3 load_method = SPEEDLOADER //yup. until someone sprites a magazine for it. max_shells = 22 caliber = "9mm" - origin_tech = "combat=4;materials=2" + origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2) slot_flags = SLOT_BELT ammo_type = /obj/item/ammo_casing/c9mm multi_aim = 1 + burst_delay = 2 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)), + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)), + list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1,-2,-2), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)), ) //Submachine guns and personal defence weapons, go. /obj/item/weapon/gun/projectile/automatic/mini_uzi name = "\improper Uzi" - desc = "A lightweight, fast firing gun, for when you want someone dead. Uses .45 rounds." + desc = "The UZI is a lightweight, fast firing gun. For when you want someone dead. Uses .45 rounds." icon_state = "mini-uzi" w_class = 3 load_method = MAGAZINE @@ -29,23 +30,23 @@ allowed_magazines = list(/obj/item/ammo_magazine/c45uzi) max_shells = 16 caliber = ".45" - origin_tech = "combat=5;materials=2;syndicate=8" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) ammo_type = /obj/item/ammo_casing/c45 /obj/item/weapon/gun/projectile/automatic/c20r - name = "\improper C-20r SMG" - desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses 12mm pistol rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp" + name = "submachine gun" + desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. Uses 10mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp." icon_state = "c20r" item_state = "c20r" w_class = 3 force = 10 - caliber = "12mm" - origin_tech = "combat=5;materials=2;syndicate=8" + caliber = "10mm" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) slot_flags = SLOT_BELT|SLOT_BACK fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a12mm - allowed_magazines = list(/obj/item/ammo_magazine/a12mm) + magazine_type = /obj/item/ammo_magazine/a10mm + allowed_magazines = list(/obj/item/ammo_magazine/a10mm) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -58,13 +59,13 @@ return /obj/item/weapon/gun/projectile/automatic/wt550 - name = "\improper W-T 550 Saber" - desc = "A cheap, mass produced Ward-Takahashi PDW. Uses 9mm rounds." + name = "machine pistol" + desc = "The W-T 550 Saber is a cheap self-defense weapon, mass-produced by Ward-Takahashi for paramilitary and private use. Uses 9mm rounds." icon_state = "wt550" item_state = "wt550" w_class = 3 caliber = "9mm" - origin_tech = "combat=5;materials=2" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) slot_flags = SLOT_BELT ammo_type = "/obj/item/ammo_casing/c9mmr" fire_sound = 'sound/weapons/Gunshot_light.ogg' @@ -111,7 +112,6 @@ accuracy_wielded = 0 //action button for wielding - icon_action_button = "action_blank" action_button_name = "Wield rifle" /obj/item/weapon/gun/projectile/automatic/rifle/can_wield() @@ -148,7 +148,7 @@ w_class = 4 force = 10 caliber = "a556" - origin_tech = "combat=8;materials=3" + origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 3) ammo_type = "/obj/item/ammo_casing/a556" fire_sound = 'sound/weapons/Gunshot.ogg' slot_flags = SLOT_BACK @@ -159,13 +159,13 @@ auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' 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) + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, use_launcher=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, use_launcher=null, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 0.6)), + list(mode_name="fire grenades", burst=null, fire_delay=null, move_delay=null, use_launcher=1, burst_accuracy=null, dispersion=null) ) + var/use_launcher = 0 var/obj/item/weapon/gun/launcher/grenade/underslung/launcher /obj/item/weapon/gun/projectile/automatic/rifle/z8/New() @@ -179,15 +179,13 @@ ..() /obj/item/weapon/gun/projectile/automatic/rifle/z8/attack_hand(mob/user) - var/datum/firemode/z8/current_mode = firemodes[sel_mode] - if(user.get_inactive_hand() == src && current_mode.use_launcher) + if(user.get_inactive_hand() == src && use_launcher) launcher.unload(user) else ..() /obj/item/weapon/gun/projectile/automatic/rifle/z8/Fire(atom/target, mob/living/user, params, pointblank=0, reflex=0) - var/datum/firemode/z8/current_mode = firemodes[sel_mode] - if(current_mode.use_launcher) + if(use_launcher) launcher.Fire(target, user, params, pointblank, reflex) if(!launcher.chambered) switch_firemodes() //switch back automatically @@ -219,7 +217,7 @@ slot_flags = 0 max_shells = 50 caliber = "a762" - origin_tech = "combat=6;materials=1;syndicate=2" + origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 2) slot_flags = SLOT_BACK ammo_type = "/obj/item/ammo_casing/a762" allowed_magazines = list(/obj/item/ammo_magazine/a762) @@ -228,8 +226,8 @@ 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)), + list(mode_name="short bursts", burst=5, move_delay=6, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)), + list(mode_name="long bursts", burst=8, move_delay=8, burst_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 diff --git a/code/modules/projectiles/guns/projectile/boltaction.dm b/code/modules/projectiles/guns/projectile/boltaction.dm index 7c8b498429e..a6bc8fa1de4 100644 --- a/code/modules/projectiles/guns/projectile/boltaction.dm +++ b/code/modules/projectiles/guns/projectile/boltaction.dm @@ -15,7 +15,6 @@ force = 10 var/recentpump = 0 - icon_action_button = "action_blank" action_button_name = "Wield rifle" /obj/item/weapon/gun/projectile/boltaction/can_wield() diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index db193a0f75f..4f72eff5009 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -34,7 +34,7 @@ desc = "A rack of hollow darts." icon_state = "darts" item_state = "rcdammo" - origin_tech = "materials=2" + origin_tech = list(TECH_MATERIAL = 2) mag_type = MAGAZINE caliber = "dart" ammo_type = /obj/item/ammo_casing/chemdart @@ -43,7 +43,7 @@ /obj/item/weapon/gun/projectile/dartgun name = "dart gun" - desc = "A small gas-powered dartgun, capable of delivering chemical cocktails swiftly across short distances." + desc = "Zeng-Hu Pharmaceutical's entry into the arms market, the Z-H P Artemis is a gas-powered dart gun capable of delivering chemical cocktails swiftly across short distances." icon_state = "dartgun-empty" item_state = null @@ -203,4 +203,4 @@ starting_chems = list("kelotane","bicaridine","anti_toxin") /obj/item/weapon/gun/projectile/dartgun/vox/raider - starting_chems = list("space_drugs","stoxin","impedrezene") \ No newline at end of file + starting_chems = list("space_drugs","stoxin","impedrezene") diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 0b3c6deaec8..0e33e5465a7 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -1,17 +1,16 @@ /obj/item/weapon/gun/projectile/colt - name = "\improper Colt M1911" - desc = "A cheap Martian knock-off of a Colt M1911." + name = "vintage .45 pistol" + desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds." magazine_type = /obj/item/ammo_magazine/c45m allowed_magazines = list(/obj/item/ammo_magazine/c45m) icon_state = "colt" caliber = ".45" - origin_tech = "combat=2;materials=2" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE /obj/item/weapon/gun/projectile/colt/detective - desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds." - magazine_type = /obj/item/ammo_magazine/c45m/rubber + magazine_type = /obj/item/ammo_magazine/c45m/flash /obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun() set name = "Name Gun" @@ -32,23 +31,22 @@ return 1 /obj/item/weapon/gun/projectile/sec - desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 rounds." - name = "\improper NT Mk58" + name = ".45 pistol" + desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. Found pretty much everywhere humans are. Uses .45 rounds." icon_state = "secguncomp" magazine_type = /obj/item/ammo_magazine/c45m/rubber allowed_magazines = list(/obj/item/ammo_magazine/c45m) caliber = ".45" - origin_tech = "combat=2;materials=2" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE /obj/item/weapon/gun/projectile/sec/flash - name = "\improper NT Mk58 signal pistol" - magazine_type = /obj/item/ammo_magazine/c45m/flash + name = ".45 signal pistol" /obj/item/weapon/gun/projectile/sec/wood - desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses .45 rounds." - name = "\improper Custom NT Mk58" + desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. This one has a sweet wooden grip. Uses .45 rounds." + name = "custom .45 Pistol" icon_state = "secgundark" /obj/item/weapon/gun/projectile/tanto @@ -81,7 +79,7 @@ w_class = 3 caliber = ".45" silenced = 1 - origin_tech = "combat=2;materials=2;syndicate=8" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/c45m allowed_magazines = list(/obj/item/ammo_magazine/c45m) @@ -116,7 +114,7 @@ max_shells = 8 caliber = "75" fire_sound = 'sound/effects/Explosion1.ogg' - origin_tech = "combat=3" + origin_tech = list(TECH_COMBAT = 3) ammo_type = "/obj/item/ammo_casing/a75" load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/a75 @@ -132,22 +130,21 @@ icon_state = "gyropistol" /obj/item/weapon/gun/projectile/pistol - name = "\improper Stechtkin pistol" - desc = "A small, easily concealable gun. Uses 9mm rounds." + name = "holdout pistol" + desc = "The Lumoco Arms P3 Whisper. A small, easily concealable gun. Uses 9mm rounds." icon_state = "pistol" item_state = null w_class = 2 caliber = "9mm" silenced = 0 - origin_tech = "combat=2;materials=2;syndicate=2" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE magazine_type = /obj/item/ammo_magazine/mc9mm allowed_magazines = list(/obj/item/ammo_magazine/mc9mm) /obj/item/weapon/gun/projectile/pistol/flash - name = "\improper Stechtkin signal pistol" - desc = "A small, easily concealable gun. Uses 9mm rounds." + name = "holdout signal pistol" magazine_type = /obj/item/ammo_magazine/mc9mm/flash /obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob) @@ -193,7 +190,7 @@ w_class = 2 /obj/item/weapon/gun/projectile/pirate - name = "zipgun" + name = "zip gun" desc = "Little more than a barrel, handle, and firing mechanism, cheap makeshift firearms like this one are not uncommon in frontier systems." icon_state = "sawnshotgun" item_state = "sawnshotgun" @@ -203,7 +200,6 @@ var/global/list/ammo_types = list( /obj/item/ammo_casing/a357 = ".357", - /obj/item/ammo_casing/a12mm = "12mm", /obj/item/ammo_casing/shotgun = "12 gauge", /obj/item/ammo_casing/shotgun = "12 gauge", /obj/item/ammo_casing/shotgun/pellet = "12 gauge", diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 85f4a4a4501..f977324b97c 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -1,10 +1,10 @@ /obj/item/weapon/gun/projectile/revolver name = "revolver" - desc = "A classic revolver. Uses .357 ammo" + desc = "The Lumoco Arms HE Colt is a choice revolver for when you absolutely, positively need to put a hole in the other guy. Uses .357 ammo." icon_state = "revolver" item_state = "revolver" caliber = "357" - origin_tech = "combat=2;materials=2" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) handle_casings = CYCLE_CASINGS max_shells = 7 ammo_type = /obj/item/ammo_casing/a357 @@ -34,9 +34,8 @@ /obj/item/weapon/gun/projectile/revolver/mateba name = "mateba" - desc = "When you absolutely, positively need a 10mm hole in the other guy. Uses .357 ammo." //>10mm hole >.357 icon_state = "mateba" - origin_tech = "combat=2;materials=2" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) /obj/item/weapon/gun/projectile/revolver/detective name = "revolver" @@ -44,7 +43,7 @@ icon_state = "detective" max_shells = 6 caliber = "38" - origin_tech = "combat=2;materials=2" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' ammo_type = /obj/item/ammo_casing/c38 @@ -98,3 +97,14 @@ load_method = SINGLE_CASING max_shells = 2 ammo_type = /obj/item/ammo_casing/a357 + +/obj/item/weapon/gun/projectile/revolver/capgun + name = "cap gun" + desc = "Looks almost like the real thing! Ages 8 and up." + icon_state = "revolver" + item_state = "revolver" + caliber = "caps" + origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1) + handle_casings = CYCLE_CASINGS + max_shells = 7 + ammo_type = /obj/item/ammo_casing/cap diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 64958f9c14e..84f679b7c2b 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -1,6 +1,6 @@ /obj/item/weapon/gun/projectile/shotgun/pump name = "shotgun" - desc = "Useful for sweeping alleys." + desc = "The mass-produced W-T Remmington 29x shotgun is a favourite of police and security forces on many worlds. Useful for sweeping alleys." icon_state = "shotgun" item_state = "shotgun" max_shells = 4 @@ -9,13 +9,12 @@ flags = CONDUCT slot_flags = SLOT_BACK caliber = "shotgun" - origin_tech = "combat=4;materials=2" + origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2) load_method = SINGLE_CASING|SPEEDLOADER ammo_type = /obj/item/ammo_casing/shotgun/beanbag handle_casings = HOLD_CASINGS var/recentpump = 0 // to prevent spammage - icon_action_button = "action_blank" action_button_name = "Wield rifle" /obj/item/weapon/gun/projectile/shotgun/pump/can_wield() @@ -62,9 +61,10 @@ /obj/item/weapon/gun/projectile/shotgun/pump/combat name = "combat shotgun" + desc = "Built for close quarters combat, the Hesphaistos Industries KS-40 is widely regarded as a weapon of choice for repelling boarders." icon_state = "cshotgun" item_state = "cshotgun" - origin_tech = "combat=5;materials=2" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) max_shells = 7 //match the ammo box capacity, also it can hold a round in the chamber anyways, for a total of 8. ammo_type = /obj/item/ammo_casing/shotgun @@ -83,13 +83,13 @@ flags = CONDUCT slot_flags = SLOT_BACK caliber = "shotgun" - origin_tech = "combat=3;materials=1" + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 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), + list(mode_name="fire one barrel at a time", burst=1), + list(mode_name="fire both barrels at once", burst=2), ) /obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet @@ -136,3 +136,46 @@ w_class = 3 force = 5 +/obj/item/weapon/gun/projectile/shotgun/pump/boltaction + name = "\improper bolt action rifle" + desc = "A cheap ballistic rifle often found in the hands of crooks and frontiersmen." + icon_state = "moistnugget" + item_state = "moistnugget" + origin_tech = "combat=4;materials=2" + slot_flags = SLOT_BACK + load_method = SINGLE_CASING|SPEEDLOADER + caliber = "a762" + ammo_type = /obj/item/ammo_casing/a762 + max_shells = 5 + +/obj/item/weapon/gun/projectile/shotgun/pump/boltaction/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) && w_class != 3) + user << "You begin to shorten the barrel and stock of \the [src]." + if(loaded.len) + afterattack(user, user) + playsound(user, fire_sound, 50, 1) + user.visible_message("[src] goes off!", "The rifle goes off in your face!") + return + if(do_after(user, 30)) + icon_state = "obrez" + w_class = 3 + recoil = 2 + accuracy = -2 + item_state = "gun" + slot_flags &= ~SLOT_BACK + slot_flags |= (SLOT_BELT|SLOT_HOLSTER) + name = "\improper obrez" + desc = "A shortened bolt action rifle, not really acurate. Uses 7.62mm rounds." + user << "You shorten the barrel and stock of the rifle!" + else + ..() + +/obj/item/weapon/gun/projectile/shotgun/pump/boltaction/obrez + name = "obrez" + desc = "A shortened bolt action rifle, not really accurate. Uses 7.62mm rounds." + icon_state = "obrez" + item_state = "gun" + w_class = 3 + recoil = 2 + accuracy = -2 + slot_flags = SLOT_BELT|SLOT_HOLSTER diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index f35e7e348cd..7fc620c401d 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -1,12 +1,12 @@ /obj/item/weapon/gun/projectile/heavysniper - name = "\improper PTR-7 rifle" - desc = "A portable anti-armour rifle fitted with a scope. Originally designed to used against armoured exosuits, it is capable of punching through windows and non-reinforced walls with ease. Fires armor piercing 14.5mm shells." + name = "anti-materiel rifle" + desc = "A portable anti-armour rifle fitted with a scope, the HI PTR-7 Rifle was originally designed to used against armoured exosuits. It is capable of punching through windows and non-reinforced walls with ease. Fires armor piercing 14.5mm shells." icon_state = "heavysniper" item_state = "heavysniper" w_class = 4 force = 10 slot_flags = SLOT_BACK - origin_tech = "combat=8;materials=2;syndicate=8" + origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) caliber = "14.5mm" recoil = 4 //extra kickback handle_casings = HOLD_CASINGS @@ -22,7 +22,6 @@ accuracy_wielded = -1 //action button for wielding - icon_action_button = "action_blank" action_button_name = "Wield rifle" /obj/item/weapon/gun/projectile/heavysniper/can_wield() diff --git a/code/modules/projectiles/guns/projectile/svd.dm b/code/modules/projectiles/guns/projectile/svd.dm index 2930acd2a1f..8cbfc3d719f 100644 --- a/code/modules/projectiles/guns/projectile/svd.dm +++ b/code/modules/projectiles/guns/projectile/svd.dm @@ -23,7 +23,6 @@ accuracy_wielded = 0 //action button for wielding - icon_action_button = "action_blank" action_button_name = "Wield rifle" /obj/item/weapon/gun/projectile/dragunov/update_icon() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index a05844e950d..f4abb8de975 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -25,8 +25,8 @@ var/yo = null var/xo = null var/current = null - var/obj/shot_from = null // the object which shot us - var/atom/original = null // the original target clicked + var/shot_from = "" // name of the object which shot us + var/atom/original = null // the target clicked (not necessarily where the projectile is headed). Should probably be renamed to 'target' or something. var/turf/starting = null // the projectile's starting turf var/list/permutated = list() // we've passed through these atoms, don't try to hit them again @@ -98,6 +98,11 @@ return 0 return 1 +/obj/item/projectile/proc/get_structure_damage() + if(damage_type == BRUTE || damage_type == BURN) + return damage + return 0 + //return 1 if the projectile should be allowed to pass through after all, 0 if not. /obj/item/projectile/proc/check_penetrate(var/atom/A) return 1 @@ -180,16 +185,16 @@ def_zone = hit_zone //set def_zone, so if the projectile ends up hitting someone else later (to be implemented), it is more likely to hit the same part result = target_mob.bullet_act(src, def_zone) - if(result == PROJECTILE_FORCE_MISS && (can_miss == 0)) //if you're shooting at point blank you can't miss. + if(result == PROJECTILE_FORCE_MISS) if(!silenced) - target_mob.visible_message("\The [src] misses [target_mob] narrowly!") + visible_message("\The [src] misses [target_mob] narrowly!") return 0 //hit messages if(silenced) target_mob << "You've been hit in the [parse_zone(def_zone)] by \the [src]!" else - target_mob.visible_message("\The [target_mob] is hit by \the [src] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter + visible_message("\The [target_mob] is hit by \the [src] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter //admin logs if(!no_attack_log) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index b1c12a25976..50f9615a30c 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -24,10 +24,15 @@ check_armour = "laser" eyeblur = 2 +/obj/item/projectile/beam/midlaser + damage = 40 + armor_penetration = 10 + /obj/item/projectile/beam/heavylaser name = "heavy laser" icon_state = "heavylaser" damage = 60 + armor_penetration = 30 muzzle_type = /obj/effect/projectile/laser_heavy/muzzle tracer_type = /obj/effect/projectile/laser_heavy/tracer @@ -36,7 +41,8 @@ /obj/item/projectile/beam/xray name = "xray beam" icon_state = "xray" - damage = 30 + damage = 25 + armor_penetration = 50 muzzle_type = /obj/effect/projectile/xray/muzzle tracer_type = /obj/effect/projectile/xray/tracer @@ -46,6 +52,7 @@ name = "pulse" icon_state = "u_laser" damage = 50 + armor_penetration = 30 muzzle_type = /obj/effect/projectile/laser_pulse/muzzle tracer_type = /obj/effect/projectile/laser_pulse/tracer @@ -123,7 +130,8 @@ /obj/item/projectile/beam/sniper name = "sniper beam" icon_state = "xray" - damage = 60 + damage = 50 + armor_penetration = 10 stun = 3 weaken = 3 stutter = 3 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 8ae0b7c969f..1b8e604b77c 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -58,7 +58,7 @@ if(prob(chance)) if(A.opacity) //display a message so that people on the other side aren't so confused - A.visible_message("\The [src] pierces through \the [A]!") + A.visible_message("\The [src] pierces through \the [A]!") return 1 return 0 @@ -69,22 +69,34 @@ damage = 20 //icon_state = "bullet" //TODO: would be nice to have it's own icon state var/pellets = 4 //number of pellets - var/range_step = 2 //effective pellet count decreases every few tiles - var/base_spread = 90 //lower means the pellets spread more across body parts + var/range_step = 2 //projectile will lose a fragment each time it travels this distance. Can be a non-integer. + var/base_spread = 90 //lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone var/spread_step = 10 //higher means the pellets spread more across body parts with distance /obj/item/projectile/bullet/pellet/Bumped() . = ..() bumped = 0 //can hit all mobs in a tile. pellets is decremented inside attack_mob so this should be fine. -/obj/item/projectile/bullet/pellet/attack_mob(var/mob/living/target_mob, var/distance) +/obj/item/projectile/bullet/pellet/proc/get_pellets(var/distance) + var/pellet_loss = round((distance - 1)/range_step) //pellets lost due to distance + return max(pellets - pellet_loss, 1) + +/obj/item/projectile/bullet/pellet/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier) if (pellets < 0) return 1 - var/pellet_loss = round((distance - 1)/range_step) //pellets lost due to distance - var/total_pellets = max(pellets - pellet_loss, 1) + var/total_pellets = get_pellets(distance) var/spread = max(base_spread - (spread_step*distance), 0) + + //shrapnel explosions miss prone mobs with a chance that increases with distance + var/prone_chance = 0 + if(!base_spread) + prone_chance = max(spread_step*(distance - 2), 0) + var/hits = 0 for (var/i in 1 to total_pellets) + if(target_mob.lying && target_mob != original && prob(prone_chance)) + continue + //pellet hits spread out across different zones, but 'aim at' the targeted zone with higher probability //whether the pellet actually hits the def_zone or a different zone should still be determined by the parent using get_zone_with_miss_chance(). var/old_zone = def_zone @@ -97,6 +109,20 @@ return 1 return 0 +/obj/item/projectile/bullet/pellet/get_structure_damage() + var/distance = get_dist(loc, starting) + return ..() * get_pellets(distance) + +/obj/item/projectile/bullet/pellet/Move() + . = ..() + + //If this is a shrapnel explosion, allow mobs that are prone to get hit, too + if(. && !base_spread && isturf(loc)) + for(var/mob/living/M in loc) + if(M.lying || !M.CanPass(src, loc)) //Bump if lying or if we would normally Bump. + if(Bump(M)) //Bump will make sure we don't hit a mob multiple times + return + /* short-casing projectiles, like the kind used in pistols or SMGs */ /obj/item/projectile/bullet/pistol @@ -120,7 +146,8 @@ /obj/item/projectile/bullet/shotgun name = "slug" - damage = 60 + damage = 50 + armor_penetration = 15 /obj/item/projectile/bullet/shotgun/beanbag //because beanbags are not bullets name = "beanbag" @@ -150,15 +177,22 @@ /* "Rifle" rounds */ -/obj/item/projectile/bullet/rifle/a762 - damage = 30 +/obj/item/projectile/bullet/rifle + armor_penetration = 20 penetrating = 1 +/obj/item/projectile/bullet/rifle/a762 + damage = 25 + +/obj/item/projectile/bullet/rifle/a556 + damage = 35 + /obj/item/projectile/bullet/rifle/a145 damage = 80 stun = 3 weaken = 3 penetrating = 5 + armor_penetration = 80 hitscan = 1 //so the PTR isn't useless as a sniper weapon /obj/item/projectile/bullet/rifle/tranq @@ -204,10 +238,6 @@ M.Sleeping(1200)*/ //commented out until simple_mob paralysis actually works. ..() -/obj/item/projectile/bullet/rifle/a556 - damage = 40 - penetrating = 1 - /* Miscellaneous */ /obj/item/projectile/bullet/suffocationbullet//How does this even work? @@ -250,3 +280,15 @@ /obj/item/projectile/bullet/shotgun/practice name = "practice" damage = 5 + +/obj/item/projectile/bullet/pistol/cap + name = "cap" + damage_type = HALLOSS + damage = 0 + nodamage = 1 + embed = 0 + sharp = 0 + +/obj/item/projectile/bullet/pistol/cap/process() + loc = null + qdel(src) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 4a9fdb9c4f6..c643e94dcc4 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -11,7 +11,7 @@ /obj/item/projectile/change/proc/wabbajack(var/mob/M) if(istype(M, /mob/living) && M.stat != DEAD) - if(M.monkeyizing) + if(M.transforming) return if(M.has_brain_worms()) return //Borer stuff - RR diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 8a624469cad..0aab2136460 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -11,6 +11,7 @@ name = "chemical shell" icon_state = "bullet" damage = 5 + agony = 10 kill_count = 15 //if the shell hasn't hit anything after travelling this far it just explodes. var/flash_range = 0 var/brightness = 7 @@ -22,7 +23,7 @@ //blind adjacent people for (var/mob/living/carbon/M in viewers(T, flash_range)) - if(M.eyecheck() < 1) + if(M.eyecheck() < FLASH_PROTECTION_MODERATE) flick("e_flash", M.flash) //snap pop @@ -30,7 +31,7 @@ src.visible_message("\The [src] explodes in a bright flash!") new /obj/effect/decal/cleanable/ash(src.loc) //always use src.loc so that ash doesn't end up inside windows - new /obj/effect/effect/sparks(T) + new /obj/effect/sparks(T) new /obj/effect/effect/smoke/illumination(T, brightness=max(flash_range*2, brightness), lifetime=light_duration) //blinds people like the flash round, but can also be used for temporary illumination diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index c6150adf8a6..2342059f1f8 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -72,7 +72,7 @@ if(src)//Do not add to this if() statement, otherwise the meteor won't delete them if(A) - A.meteorhit(src) + A.ex_act(2) playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) for(var/mob/M in range(10, src)) @@ -162,3 +162,12 @@ on_impact(var/atom/A) explosion(A, 0, 0, 4) ..() + +/obj/item/projectile/chameleon + name = "bullet" + icon_state = "bullet" + damage = 1 // stop trying to murderbone with a fake gun dumbass!!! + embed = 0 // nope + nodamage = 1 + damage_type = HALLOSS + muzzle_type = /obj/effect/projectile/bullet/muzzle diff --git a/code/modules/projectiles/targeting.dm b/code/modules/projectiles/targeting.dm deleted file mode 100644 index cc91ae04241..00000000000 --- a/code/modules/projectiles/targeting.dm +++ /dev/null @@ -1,406 +0,0 @@ -/obj/item/weapon/gun/verb/toggle_firerate() - set name = "Toggle Continue Aiming" - set category = "Object" - - keep_aim = !keep_aim - - if (keep_aim) - loc << "You will now continue firing when your target moves." - else - loc << "You will now only fire once, then lower your aim, when your target moves." - -/obj/item/weapon/gun/verb/lower_aim() - set name = "Lower Aim" - set category = "Object" - if(aim_targets) - stop_aim() - usr.visible_message(" \The [usr] lowers \the [src]...") - -//Removing the lock and the buttons. -/obj/item/weapon/gun/dropped(mob/user as mob) - stop_aim() - if(user && user.client) - user.client.remove_gun_icons() - return ..() - -/obj/item/weapon/gun/equipped(var/mob/user, var/slot) - if (slot != slot_l_hand && slot != slot_r_hand) - stop_aim() - if (user.client) - user.client.remove_gun_icons() - return ..() - -//Removes lock from all targets -/obj/item/weapon/gun/proc/stop_aim() - if(aim_targets) - for(var/mob/living/M in aim_targets) - if(M) - M.NotTargeted(src) //Untargeting people. - qdel(aim_targets) - -//Compute how to fire..... -//Return 1 if a target was found, 0 otherwise. -/obj/item/weapon/gun/proc/PreFire(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, params) - //Lets not spam it. - if(lock_time > world.time - 2) return - - user.set_dir(get_cardinal_dir(src, A)) - if(isliving(A) && !(A in aim_targets)) - Aim(A) //Clicked a mob, aim at them - return 1 - - //Didn't click someone, check if there is anyone along that guntrace - var/mob/living/M = GunTrace(usr.x,usr.y,A.x,A.y,usr.z,usr) //Find dat mob. - if(isliving(M) && (M in view(user)) && !(M in aim_targets)) - Aim(M) //Aha! Aim at them! - return 1 - - return 0 - -//Aiming at the target mob. -/obj/item/weapon/gun/proc/Aim(var/mob/living/M) - if(!aim_targets || !(M in aim_targets)) - lock_time = world.time - if(aim_targets && !multi_aim) //If they're targeting someone and they have a non multi_aim weapon. - for(var/mob/living/L in aim_targets) - if(L) - L.NotTargeted(src) - qdel(aim_targets) - usr.visible_message("[usr] turns \the [src] on [M]!") - else - usr.visible_message("[usr] aims \a [src] at [M]!") - M.Targeted(src) - -//HE MOVED, SHOOT HIM! -/obj/item/weapon/gun/proc/TargetActed(var/mob/living/T) - var/mob/living/M = loc - if(M == T) return - if(!istype(M)) return - if(src != M.get_active_hand()) - stop_aim() - return - - //reflex firing is disabled when help intent is set - if (M.a_intent == I_HELP) - M << "You refrain from firing your [src] as your intent is set to help." - return - - M.last_move_intent = world.time - var/firing_check = can_hit(T,usr) //0 if it cannot hit them, 1 if it is capable of hitting, and 2 if a special check is preventing it from firing. - if(firing_check > 0) - if(firing_check == 1) - Fire(T,usr, reflex = 1) - else if(!told_cant_shoot) - M << "They can't be hit from here!" - told_cant_shoot = 1 - spawn(30) - told_cant_shoot = 0 - - usr.set_dir(get_cardinal_dir(src, T)) - - if (!keep_aim) // If keep_aim is set to lower aim after one shot, untarget the target - T.NotTargeted(src) - -//Yay, math! - -#define SIGN(X) ((X<0)?-1:1) - -/proc/GunTrace(X1,Y1,X2,Y2,Z=1,exc_obj,PX1=16,PY1=16,PX2=16,PY2=16) - //bluh << "Tracin' [X1],[Y1] to [X2],[Y2] on floor [Z]." - var/turf/T - var/mob/living/M - if(X1==X2) - if(Y1==Y2) return 0 //Light cannot be blocked on same tile - else - var/s = SIGN(Y2-Y1) - Y1+=s - while(1) - T = locate(X1,Y1,Z) - if(!T) return 0 - M = locate() in T - if(M) return M - M = locate() in orange(1,T)-exc_obj - if(M) return M - Y1+=s - else - var - m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) - b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles - signX = SIGN(X2-X1) - signY = SIGN(Y2-Y1) - if(X1= 5) - if(ismob(I.loc)) - I.loc << "You can only target 5 people at once!" - return - else - return - for(var/mob/living/K in viewers(usr)) - K << 'sound/weapons/TargetOn.ogg' - - 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 << "((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), 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) - target_locked = image("icon" = 'icons/effects/Targeted.dmi', "icon_state" = "locking") - overlays += target_locked - spawn(0) - sleep(20) - if(target_locked) - target_locked = image("icon" = 'icons/effects/Targeted.dmi', "icon_state" = "locked") - update_targeted() - - //Adding the buttons to the controller person - var/mob/living/T = I.loc - if(T) - if(T.client) - T.client.add_gun_icons() - else - I.lower_aim() - return - 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. - while(targeted_by && T.client) - if(last_move_intent > I.lock_time + 10 && !T.client.target_can_move) //If target moved when not allowed to - 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 - else if(last_move_intent > I.lock_time + 10 && !T.client.target_can_run && m_intent == "run") //If the target ran while targeted - 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 - if(last_target_click > I.lock_time + 10 && !T.client.target_can_click) //If the target clicked the map to pick something up/shoot/etc - 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 - 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) - if(!I.silenced) - for(var/mob/living/M in viewers(src)) - M << 'sound/weapons/TargetOff.ogg' - targeted_by -= I - I.aim_targets.Remove(src) //De-target them - if(!I.aim_targets.len) - qdel(I.aim_targets) - var/mob/living/T = I.loc //Remove the targeting icons - if(T && ismob(T) && !I.aim_targets && T.client) - T.client.remove_gun_icons() - if(!targeted_by.len) - qdel(target_locked) //Remove the overlay - qdel(targeted_by) - spawn(1) update_targeted() - -/mob/living/Move() - . = ..() - for(var/obj/item/weapon/gun/G in targeted_by) //Handle moving out of the gunner's view. - var/mob/living/M = G.loc - if(!(M in view(src))) - NotTargeted(G) - for(var/obj/item/weapon/gun/G in src) //Handle the gunner loosing sight of their target/s - if(G.aim_targets) - for(var/mob/living/M in G.aim_targets) - if(M && !(M in view(src))) - M.NotTargeted(G) - -//If you move out of range, it isn't going to still stay locked on you any more. -/client/var - 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() - if(!usr) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. - screen += usr.item_use_icon - screen += usr.gun_move_icon - screen += usr.radio_use_icon - if (target_can_move) - screen += usr.gun_run_icon - - - -/client/proc/remove_gun_icons() - 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 - -/client/verb/ToggleGunMode() - set name = "Toggle Gun Mode" - set hidden = 1 - gun_mode = !gun_mode - if(gun_mode) - usr << "You will now take people captive." - else - usr << "You will now shoot where you target." - for(var/obj/item/weapon/gun/G in usr) - G.stop_aim() - remove_gun_icons() - if(usr.gun_setting_icon) - usr.gun_setting_icon.icon_state = "gun[gun_mode]" - - -/client/verb/AllowTargetMove() - set hidden=1 - - //Changing client's permissions - target_can_move = !target_can_move - if(target_can_move) - usr << "Target may now walk." - //usr.gun_run_icon = new /obj/screen/gun/run(null) //adding icon for running permission - screen += usr.gun_run_icon - else - usr << "Target may no longer move." - target_can_run = 0 - qdel(usr.gun_run_icon) //no need for icon for running permission - - //Updating walking permission button - if(usr.gun_move_icon) - usr.gun_move_icon.icon_state = "no_walk[target_can_move]" - usr.gun_move_icon.name = "[target_can_move ? "Disallow" : "Allow"] Walking" - - //Handling change for all the guns on client - for(var/obj/item/weapon/gun/G in usr) - G.lock_time = world.time + 5 - if(G.aim_targets) - for(var/mob/living/M in G.aim_targets) - if(target_can_move) - M << "Your character may now walk at the discretion of their targeter." - if(!target_can_run) - M << "Your move intent is now set to walk, as your targeter permits it." - M.set_m_intent("walk") - else - M << "Your character will now be shot if they move." - -/mob/living/proc/set_m_intent(var/intent) - if (intent != "walk" && intent != "run") - return 0 - m_intent = intent - if(hud_used) - if (hud_used.move_intent) - hud_used.move_intent.icon_state = intent == "walk" ? "walking" : "running" - -client/verb/AllowTargetRun() - set hidden=1 - - //Changing client's permissions - target_can_run = !target_can_run - if(target_can_run) - usr << "Target may now run." - else - usr << "Target may no longer run." - - //Updating running permission button - if(usr.gun_run_icon) - usr.gun_run_icon.icon_state = "no_run[target_can_run]" - usr.gun_run_icon.name = "[target_can_run ? "Disallow" : "Allow"] Running" - - //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_run) - M << "Your character may now run at the discretion of their targeter." - else - M << "Your character will now be shot if they run." - -/client/verb/AllowTargetClick() - set hidden=1 - - //Changing client's permissions - target_can_click = !target_can_click - if(target_can_click) - usr << "Target may now use items." - else - usr << "Target may no longer use items." - - if(usr.item_use_icon) - usr.item_use_icon.icon_state = "no_item[target_can_click]" - usr.item_use_icon.name = "[target_can_click ? "Disallow" : "Allow"] Item 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_click) - M << "Your character may now use items at the discretion of their targeter." - else - 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/projectiles/targeting/targeting_client.dm b/code/modules/projectiles/targeting/targeting_client.dm new file mode 100644 index 00000000000..42a0e3e6a1c --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_client.dm @@ -0,0 +1,12 @@ +//These are called by the on-screen buttons, adjusting what the victim can and cannot do. +/client/proc/add_gun_icons() + if(!usr) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. + screen |= usr.item_use_icon + screen |= usr.gun_move_icon + screen |= usr.radio_use_icon + +/client/proc/remove_gun_icons() + 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 diff --git a/code/modules/projectiles/targeting/targeting_gun.dm b/code/modules/projectiles/targeting/targeting_gun.dm new file mode 100644 index 00000000000..e2ef466255e --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_gun.dm @@ -0,0 +1,21 @@ +//Removing the lock and the buttons. +/obj/item/weapon/gun/dropped(var/mob/living/user) + if(istype(user)) + user.stop_aiming(src) + return ..() + +/obj/item/weapon/gun/equipped(var/mob/living/user, var/slot) + if(istype(user) && (slot != slot_l_hand && slot != slot_r_hand)) + user.stop_aiming(src) + return ..() + +//Compute how to fire..... +//Return 1 if a target was found, 0 otherwise. +/obj/item/weapon/gun/proc/PreFire(var/atom/A, var/mob/living/user, var/params) + if(!user.aiming) + user.aiming = new(user) + user.face_atom(A) + if(ismob(A) && user.aiming) + user.aiming.aim_at(A, src) + return 1 + return 0 \ No newline at end of file diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm new file mode 100644 index 00000000000..0994769363c --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_mob.dm @@ -0,0 +1,44 @@ +/mob/living/var/obj/aiming_overlay/aiming +/mob/living/var/list/aimed = list() + +/mob/verb/toggle_gun_mode() + set name = "Toggle Gun Mode" + set desc = "Begin or stop aiming." + set category = "IC" + + if(isliving(src)) + var/mob/living/M = src + if(!M.aiming) + M.aiming = new(src) + M.aiming.toggle_active() + else + src << "This verb may only be used by living mobs, sorry." + return + +/mob/living/proc/stop_aiming(var/obj/item/thing, var/no_message = 0) + if(!aiming) + aiming = new(src) + if(thing && aiming.aiming_with != thing) + return + aiming.cancel_aiming(no_message) + +/mob/living/death(gibbed,deathmessage="seizes up and falls limp...") + if(..()) + stop_aiming(no_message=1) + +/mob/living/update_canmove() + ..() + if(lying) + stop_aiming(no_message=1) + +/mob/living/Weaken(amount) + stop_aiming(no_message=1) + ..() + +/mob/living/Destroy() + if(aiming) + qdel(aiming) + aiming = null + aimed.Cut() + return ..() + diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm new file mode 100644 index 00000000000..40b1234805e --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -0,0 +1,224 @@ +/obj/aiming_overlay + name = "" + desc = "Stick 'em up!" + icon = 'icons/effects/Targeted.dmi' + icon_state = "locking" + anchored = 1 + density = 0 + opacity = 0 + layer = FLY_LAYER + simulated = 0 + mouse_opacity = 0 + + var/mob/living/aiming_at // Who are we currently targeting, if anyone? + var/obj/item/aiming_with // What are we targeting with? + var/mob/living/owner // Who do we belong to? + var/locked = 0 // Have we locked on? + var/lock_time = 0 // When -will- we lock on? + var/active = 0 // Is our owner intending to take hostages? + var/target_permissions = 0 // Permission bitflags. + +/obj/aiming_overlay/New(var/newowner) + ..() + owner = newowner + loc = null + verbs.Cut() + +/obj/aiming_overlay/proc/toggle_permission(var/perm) + + if(target_permissions & perm) + target_permissions &= ~perm + else + target_permissions |= perm + + // Update HUD icons. + if(owner.gun_move_icon) + if(!(target_permissions & TARGET_CAN_MOVE)) + owner.gun_move_icon.icon_state = "no_walk0" + owner.gun_move_icon.name = "Allow Movement" + else + owner.gun_move_icon.icon_state = "no_walk1" + owner.gun_move_icon.name = "Disallow Movement" + + if(owner.item_use_icon) + if(!(target_permissions & TARGET_CAN_CLICK)) + owner.item_use_icon.icon_state = "no_item0" + owner.item_use_icon.name = "Allow Item Use" + else + owner.item_use_icon.icon_state = "no_item1" + owner.item_use_icon.name = "Disallow Item Use" + + if(owner.radio_use_icon) + if(!(target_permissions & TARGET_CAN_RADIO)) + owner.radio_use_icon.icon_state = "no_radio0" + owner.radio_use_icon.name = "Allow Radio Use" + else + owner.radio_use_icon.icon_state = "no_radio1" + owner.radio_use_icon.name = "Disallow Radio Use" + + var/message = "no longer permitted to " + var/use_span = "warning" + if(target_permissions & perm) + message = "now permitted to " + use_span = "notice" + + switch(perm) + if(TARGET_CAN_MOVE) + message += "move" + if(TARGET_CAN_CLICK) + message += "use items" + if(TARGET_CAN_RADIO) + message += "use a radio" + else + return + + owner << "[aiming_at ? "\The [aiming_at] is" : "Your targets are"] [message]." + if(aiming_at) + aiming_at << "You are [message]." + +/obj/aiming_overlay/process() + if(!owner) + qdel(src) + return + ..() + update_aiming() + +/obj/aiming_overlay/Destroy() + cancel_aiming(1) + owner = null + return ..() + +obj/aiming_overlay/proc/update_aiming_deferred() + set waitfor = 0 + sleep(0) + update_aiming() + +/obj/aiming_overlay/proc/update_aiming() + + if(!owner) + qdel(src) + return + + if(!aiming_at) + cancel_aiming() + return + + if(!locked && lock_time >= world.time) + locked = 1 + update_icon() + + var/cancel_aim = 1 + + if(!(aiming_with in owner) || (istype(owner, /mob/living/carbon/human) && (owner.l_hand != aiming_with && owner.r_hand != aiming_with))) + owner << "You must keep hold of your weapon!" + else if(!aiming_at || !istype(aiming_at.loc, /turf)) + owner << "You have lost sight of your target!" + else if(owner.incapacitated() || owner.lying || owner.restrained()) + owner << "You must be conscious and standing to keep track of your target!" + else if(aiming_at.alpha == 0 || (aiming_at.invisibility > owner.see_invisible)) + owner << "Your target has become invisible!" + else if(!(aiming_at in view(owner))) + owner << "Your target is too far away to track!" + else + cancel_aim = 0 + + forceMove(get_turf(aiming_at)) + + if(cancel_aim) + cancel_aiming() + return + + if(!owner.incapacitated() && owner.client) + spawn(0) + owner.set_dir(get_dir(get_turf(owner), get_turf(src))) + +/obj/aiming_overlay/proc/aim_at(var/mob/target, var/obj/thing) + + if(!owner) + return + + if(owner.incapacitated()) + owner << "You cannot aim a gun in your current state." + return + if(owner.lying) + owner << "You cannot aim a gun while prone." + return + if(owner.restrained()) + owner << "You cannot aim a gun while handcuffed." + return + + if(aiming_at) + if(aiming_at == target) + return + cancel_aiming(1) + owner.visible_message("\The [owner] turns \the [thing] on \the [target]!") + else + owner.visible_message("\The [owner] aims \the [thing] at \the [target]!") + + if(owner.client) + owner.client.add_gun_icons() + target << "You now have a gun pointed at you. No sudden moves!" + aiming_with = thing + aiming_at = target + if(istype(aiming_with, /obj/item/weapon/gun)) + playsound(get_turf(owner), 'sound/weapons/TargetOn.ogg', 50,1) + + forceMove(get_turf(target)) + processing_objects |= src + + aiming_at.aimed |= src + toggle_active(1) + locked = 0 + update_icon() + lock_time = world.time + 35 + moved_event.register(owner, src, /obj/aiming_overlay/proc/update_aiming) + moved_event.register(aiming_at, src, /obj/aiming_overlay/proc/target_moved) + destroyed_event.register(aiming_at, src, /obj/aiming_overlay/proc/cancel_aiming) + +/obj/aiming_overlay/update_icon() + if(locked) + icon_state = "locked" + else + icon_state = "locking" + +/obj/aiming_overlay/proc/toggle_active(var/force_state = null) + if(!isnull(force_state)) + if(active == force_state) + return + active = force_state + else + active = !active + + if(!active) + cancel_aiming() + + if(owner.client) + if(active) + owner << "You will now aim rather than fire." + owner.client.add_gun_icons() + else + owner << "You will no longer aim rather than fire." + owner.client.remove_gun_icons() + +/obj/aiming_overlay/proc/cancel_aiming(var/no_message = 0) + if(!aiming_with || !aiming_at) + return + if(istype(aiming_with, /obj/item/weapon/gun)) + playsound(get_turf(owner), 'sound/weapons/TargetOff.ogg', 50,1) + if(!no_message) + owner.visible_message("\The [owner] lowers \the [aiming_with].") + + moved_event.unregister(owner, src) + if(aiming_at) + moved_event.unregister(aiming_at, src) + destroyed_event.unregister(aiming_at, src) + aiming_at.aimed -= src + aiming_at = null + + aiming_with = null + loc = null + processing_objects -= src + +/obj/aiming_overlay/proc/target_moved() + update_aiming() + trigger(TARGET_CAN_MOVE) diff --git a/code/modules/projectiles/targeting/targeting_triggers.dm b/code/modules/projectiles/targeting/targeting_triggers.dm new file mode 100644 index 00000000000..ea18fc3a708 --- /dev/null +++ b/code/modules/projectiles/targeting/targeting_triggers.dm @@ -0,0 +1,29 @@ +/mob/living/proc/trigger_aiming(var/trigger_type) + if(!aimed.len) + return + for(var/obj/aiming_overlay/AO in aimed) + if(AO.aiming_at == src) + AO.update_aiming() + if(AO.aiming_at == src) + AO.trigger(trigger_type) + AO.update_aiming_deferred() + +/obj/aiming_overlay/proc/trigger(var/perm) + if(!owner || !aiming_with || !aiming_at || !locked) + return + if(perm && (target_permissions & perm)) + return + if(!owner.canClick()) + return + owner.setClickCooldown(5) // Spam prevention, essentially. + if(owner.a_intent == I_HELP) + owner << "You refrain from firing \the [aiming_with] as your intent is set to help." + return + owner.visible_message("\The [owner] pulls the trigger reflexively!") + var/obj/item/weapon/gun/G = aiming_with + if(istype(G)) + G.Fire(aiming_at, owner) + +/mob/living/ClickOn(var/atom/A, var/params) + . = ..() + trigger_aiming(TARGET_CAN_CLICK) diff --git a/code/modules/random_map/_random_map_setup.dm b/code/modules/random_map/_random_map_setup.dm new file mode 100644 index 00000000000..01c57f2f76b --- /dev/null +++ b/code/modules/random_map/_random_map_setup.dm @@ -0,0 +1,22 @@ +/* + This module is used to generate the debris fields/distribution maps/procedural stations. +*/ + +#define MIN_SURFACE_COUNT 500 +#define MIN_RARE_COUNT 200 +#define MIN_DEEP_COUNT 100 +#define RESOURCE_HIGH_MAX 4 +#define RESOURCE_HIGH_MIN 2 +#define RESOURCE_MID_MAX 3 +#define RESOURCE_MID_MIN 1 +#define RESOURCE_LOW_MAX 1 +#define RESOURCE_LOW_MIN 0 + +#define FLOOR_CHAR 0 +#define WALL_CHAR 1 +#define DOOR_CHAR 2 +#define EMPTY_CHAR 3 +#define ROOM_TEMP_CHAR 4 +#define MONSTER_CHAR 5 +#define ARTIFACT_TURF_CHAR 6 +#define ARTIFACT_CHAR 7 \ No newline at end of file diff --git a/code/modules/random_map/automata/automata.dm b/code/modules/random_map/automata/automata.dm new file mode 100644 index 00000000000..f3867d78bdc --- /dev/null +++ b/code/modules/random_map/automata/automata.dm @@ -0,0 +1,65 @@ +/datum/random_map/automata + descriptor = "generic caves" + initial_wall_cell = 55 + var/iterations = 0 // Number of times to apply the automata rule. + var/cell_live_value = WALL_CHAR // Cell is alive if it has this value. + var/cell_dead_value = FLOOR_CHAR // As above for death. + var/cell_threshold = 5 // Cell becomes alive with this many live neighbors. + +// Automata-specific procs and processing. +/datum/random_map/automata/generate_map() + for(var/i=1;i<=iterations;i++) + iterate(i) + +/datum/random_map/automata/get_additional_spawns(var/value, var/turf/T) + return + +/datum/random_map/automata/proc/iterate(var/iteration) + var/list/next_map[limit_x*limit_y] + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + next_map[current_cell] = map[current_cell] + var/count = 0 + + // Every attempt to place this in a proc or a list has resulted in + // the generator being totally bricked and useless. Fuck it. We're + // hardcoding this shit. Feel free to rewrite and PR a fix. ~ Z + var/tmp_cell = get_map_cell(x,y) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + tmp_cell = get_map_cell(x+1,y+1) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + tmp_cell = get_map_cell(x-1,y-1) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + tmp_cell = get_map_cell(x+1,y-1) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + tmp_cell = get_map_cell(x-1,y+1) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + tmp_cell = get_map_cell(x-1,y) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + tmp_cell = get_map_cell(x,y-1) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + tmp_cell = get_map_cell(x+1,y) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + tmp_cell = get_map_cell(x,y+1) + if(tmp_cell && cell_is_alive(map[tmp_cell])) count++ + + if(count >= cell_threshold) + revive_cell(current_cell, next_map, (iteration == iterations)) + else + kill_cell(current_cell, next_map, (iteration == iterations)) + map = next_map + +// Check if a given tile counts as alive for the automata generations. +/datum/random_map/automata/proc/cell_is_alive(var/value) + return (value == cell_live_value) && (value != cell_dead_value) + +/datum/random_map/automata/proc/revive_cell(var/target_cell, var/list/use_next_map, var/final_iter) + if(!use_next_map) + use_next_map = map + use_next_map[target_cell] = cell_live_value + +/datum/random_map/automata/proc/kill_cell(var/target_cell, var/list/use_next_map, var/final_iter) + if(!use_next_map) + use_next_map = map + use_next_map[target_cell] = cell_dead_value \ No newline at end of file diff --git a/code/modules/random_map/automata/caves.dm b/code/modules/random_map/automata/caves.dm new file mode 100644 index 00000000000..fe959c72b52 --- /dev/null +++ b/code/modules/random_map/automata/caves.dm @@ -0,0 +1,52 @@ +/datum/random_map/automata/cave_system + iterations = 5 + descriptor = "moon caves" + wall_type = /turf/simulated/mineral + floor_type = /turf/simulated/floor/asteroid + target_turf_type = /turf/unsimulated/mask + var/mineral_sparse = /turf/simulated/mineral/random + var/mineral_rich = /turf/simulated/mineral/random/high_chance + var/list/ore_turfs = list() + +/datum/random_map/automata/cave_system/get_appropriate_path(var/value) + switch(value) + if(DOOR_CHAR) + return mineral_sparse + if(EMPTY_CHAR) + return mineral_rich + if(FLOOR_CHAR) + return floor_type + if(WALL_CHAR) + return wall_type + +/datum/random_map/automata/cave_system/get_map_char(var/value) + switch(value) + if(DOOR_CHAR) + return "x" + if(EMPTY_CHAR) + return "X" + return ..(value) + +/datum/random_map/automata/cave_system/revive_cell(var/target_cell, var/list/use_next_map, var/final_iter) + ..() + if(final_iter) + ore_turfs |= target_cell + +/datum/random_map/automata/cave_system/kill_cell(var/target_cell, var/list/use_next_map, var/final_iter) + ..() + if(final_iter) + ore_turfs -= target_cell + +// Create ore turfs. +/datum/random_map/automata/cave_system/cleanup() + var/ore_count = round(map.len/20) + while((ore_count>0) && (ore_turfs.len>0)) + if(!priority_process) sleep(-1) + var/check_cell = pick(ore_turfs) + ore_turfs -= check_cell + if(prob(75)) + map[check_cell] = DOOR_CHAR // Mineral block + else + map[check_cell] = EMPTY_CHAR // Rare mineral block. + ore_count-- + return 1 diff --git a/code/modules/random_map/automata/diona.dm b/code/modules/random_map/automata/diona.dm new file mode 100644 index 00000000000..523f6880385 --- /dev/null +++ b/code/modules/random_map/automata/diona.dm @@ -0,0 +1,172 @@ +/turf/simulated/wall/diona/New(var/newloc) + ..(newloc,"biomass") + +/turf/simulated/wall/diona/attack_generic(var/mob/user, var/damage, var/attack_message) + if(istype(user, /mob/living/carbon/alien/diona)) + if(can_open == WALL_OPENING) + return + can_open = WALL_CAN_OPEN + user.visible_message("\The [user] strokes its feelers against \the [src] and the biomass [density ? "moves aside" : "closes up"].") + toggle_open(user) + sleep(15) + if(can_open == WALL_CAN_OPEN) can_open = 0 + else + return ..(user, damage, attack_message) + +/obj/structure/diona + icon = 'icons/obj/diona.dmi' + anchored = 1 + density = 1 + opacity = 0 + layer = TURF_LAYER + 0.01 + +/obj/structure/diona/vines + name = "alien vines" + desc = "Thick, heavy vines of some sort." + icon_state = "vines3" + var/growth = 0 + +/obj/structure/diona/vines/proc/spread() + var/turf/origin = get_turf(src) + for(var/turf/T in range(src,2)) + if(T.density || T == origin || istype(T, /turf/space)) + continue + var/new_growth = 1 + switch(get_dist(origin,T)) + if(0) + new_growth = 3 + if(1) + new_growth = 2 + var/obj/structure/diona/vines/existing = locate() in T + if(!istype(existing)) existing = PoolOrNew(/obj/structure/diona/vines, T) + if(existing.growth < new_growth) + existing.growth = new_growth + existing.update_icon() + +/obj/structure/diona/vines/update_icon() + icon_state = "vines[growth]" + +/obj/structure/diona/bulb + name = "glow bulb" + desc = "A glowing bulb of some sort." + icon_state = "glowbulb" + +/obj/structure/diona/bulb/New(var/newloc) + ..() + set_light(3,3,"#557733") + +/datum/random_map/automata/diona + iterations = 3 + descriptor = "diona gestalt" + limit_x = 32 + limit_y = 32 + + wall_type = /turf/simulated/wall/diona + floor_type = /turf/simulated/floor/diona + +// This is disgusting. +/datum/random_map/automata/diona/proc/search_neighbors_for(var/search_val, var/x, var/y) + var/current_cell = get_map_cell(x-1,y-1) + if(current_cell && map[current_cell] == search_val) return 1 + current_cell = get_map_cell(x-1,y) + if(current_cell && map[current_cell] == search_val) return 1 + current_cell = get_map_cell(x-1,y+1) + if(current_cell && map[current_cell] == search_val) return 1 + current_cell = get_map_cell(x,y-1) + if(current_cell && map[current_cell] == search_val) return 1 + current_cell = get_map_cell(x,y+1) + if(current_cell && map[current_cell] == search_val) return 1 + current_cell = get_map_cell(x+1,y-1) + if(current_cell && map[current_cell] == search_val) return 1 + current_cell = get_map_cell(x+1,y) + if(current_cell && map[current_cell] == search_val) return 1 + current_cell = get_map_cell(x+1,y+1) + if(current_cell && map[current_cell] == search_val) return 1 + return 0 + +/datum/random_map/automata/diona/cleanup() + + // Hollow out the interior spaces. + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + if(!current_cell) continue + if(map[current_cell] == WALL_CHAR) + if(!search_neighbors_for(FLOOR_CHAR,x,y) && !search_neighbors_for(DOOR_CHAR,x,y) && !(x == 1 || y == 1 || x == limit_x || y == limit_y)) + map[current_cell] = EMPTY_CHAR + + // Prune exposed floor turfs away from the edges. + var/changed = 1 + while(changed) + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + changed = 0 + var/current_cell = get_map_cell(x,y) + if(!current_cell) continue + if(map[current_cell] == EMPTY_CHAR) + if((search_neighbors_for(FLOOR_CHAR,x,y)) || (x == 1 || y == 1 || x == limit_x || y == limit_y)) + map[current_cell] = FLOOR_CHAR + changed = 1 + + // Count and track the floors. + var/list/floor_turfs = list() + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + if(!current_cell) continue + if(map[current_cell] == EMPTY_CHAR) + floor_turfs |= current_cell + + // Add vine decals. + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + if(!current_cell || map[current_cell] != EMPTY_CHAR) continue + if(search_neighbors_for(WALL_CHAR,x,y)) + map[current_cell] = DOOR_CHAR + + // Add bulbs and doona nymphs. + if(floor_turfs.len) + var/bulb_count = rand(round(floor_turfs.len/10),round(floor_turfs.len/8)) + while(floor_turfs.len && bulb_count) + var/cell = pick(floor_turfs) + floor_turfs -= cell + map[cell] = ARTIFACT_CHAR + bulb_count-- + if(floor_turfs.len) + var/nymph_count = rand(round(floor_turfs.len/10),round(floor_turfs.len/8)) + while(floor_turfs.len && nymph_count) + var/cell = pick(floor_turfs) + floor_turfs -= cell + map[cell] = MONSTER_CHAR + nymph_count-- + return + +/datum/random_map/automata/diona/get_appropriate_path(var/value) + switch(value) + if(EMPTY_CHAR, DOOR_CHAR, MONSTER_CHAR, ARTIFACT_CHAR) + return floor_type + if(WALL_CHAR) + return wall_type + +/datum/random_map/automata/diona/get_additional_spawns(var/value, var/turf/T) + + if(value != FLOOR_CHAR) + for(var/thing in T) + if(istype(thing, /atom)) + var/atom/A = thing + if(A.simulated) + continue + qdel(thing) + + switch(value) + if(ARTIFACT_CHAR) + PoolOrNew(/obj/structure/diona/bulb,T) + if(MONSTER_CHAR) + spawn_diona_nymph(T) + if(DOOR_CHAR) + var/obj/structure/diona/vines/V = PoolOrNew(/obj/structure/diona/vines,T) + V.growth = 3 + V.update_icon() + spawn(1) + V.spread() \ No newline at end of file diff --git a/code/modules/random_map/building/building.dm b/code/modules/random_map/building/building.dm new file mode 100644 index 00000000000..98a157c4599 --- /dev/null +++ b/code/modules/random_map/building/building.dm @@ -0,0 +1,55 @@ +/datum/random_map/building + descriptor = "generic room" + limit_x = 7 + limit_y = 7 + +/datum/random_map/building/generate_map() + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + if(!current_cell) + continue + if(x == 1 || y == 1 || x == limit_x || y == limit_y) + map[current_cell] = WALL_CHAR + else + map[current_cell] = FLOOR_CHAR + +/datum/random_map/building/handle_post_overlay_on(var/datum/random_map/target_map, var/tx, var/ty) + var/list/possible_doors + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + if(!current_cell) + continue + if(!(x == 1 || y == 1 || x == limit_x || y == limit_y)) + continue + if(tx+x > target_map.limit_x) + continue + if(ty+y > target_map.limit_y) + continue + + var/place_door + // #.# ... .## ##. + // #X# #X# .X. .X. == place a door + // ... # # .## ##. + + // (tx+x)-1,(ty+y-1) (tx+x),(ty+y)-1 (tx+x)+1,(ty+y)-1 + // (tx+x)-1,(ty+y) (tx+x),(ty+y) (tx+x)+1,(ty+y) + // (tx+x)-1,(ty+y+1) (tx+x),(ty+y)+1 (tx+x)+1,(ty+y)+1 + + + if(place_door) + possible_doors |= target_map.get_map_cell(tx+x,ty+y) + + if(possible_doors.len) + // Place at least one door. + var/placing_door = pick(possible_doors) + possible_doors -= placing_door + target_map.map[placing_door] = DOOR_CHAR + // Keep placing doors until we get bored or lose interest. + while(possible_doors && !prob(30)) + placing_door = pick(possible_doors) + possible_doors -= placing_door + target_map.map[placing_door] = DOOR_CHAR + + return \ No newline at end of file diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm new file mode 100644 index 00000000000..9bdc2c8eb95 --- /dev/null +++ b/code/modules/random_map/drop/drop_types.dm @@ -0,0 +1,195 @@ +var/global/list/datum/supply_drop_loot/supply_drop + +/proc/supply_drop_random_loot_types() + if(!supply_drop) + supply_drop = init_subtypes(/datum/supply_drop_loot) + supply_drop = dd_sortedObjectList(supply_drop) + return supply_drop + +/datum/supply_drop_loot + var/name = "" + var/container = null + var/list/contents = null + +/datum/supply_drop_loot/proc/contents() + return contents + +/datum/supply_drop_loot/proc/drop(turf/T) + var/C = container ? new container(T) : T + for(var/content in contents()) + new content(C) + +/datum/supply_drop_loot/dd_SortValue() + return name + +/datum/supply_drop_loot/supermatter + name = "Supermatter" +/datum/supply_drop_loot/supermatter/New() + ..() + contents = list(/obj/machinery/power/supermatter) + +/datum/supply_drop_loot/lasers + name = "Lasers" + container = /obj/structure/largecrate +/datum/supply_drop_loot/lasers/New() + ..() + contents = list( + /obj/item/weapon/gun/energy/laser, + /obj/item/weapon/gun/energy/laser, + /obj/item/weapon/gun/energy/sniperrifle, + /obj/item/weapon/gun/energy/ionrifle) + +/datum/supply_drop_loot/ballistics + name = "Ballistics" + container = /obj/structure/largecrate +/datum/supply_drop_loot/ballistics/New() + ..() + contents = list( + /obj/item/weapon/gun/projectile/sec, + /obj/item/weapon/gun/projectile/shotgun/doublebarrel, + /obj/item/weapon/gun/projectile/shotgun/pump/combat, + /obj/item/weapon/gun/projectile/automatic/wt550, + /obj/item/weapon/gun/projectile/automatic/rifle/z8) + +/datum/supply_drop_loot/ballistics + name = "Ballistics" + container = /obj/structure/largecrate +/datum/supply_drop_loot/ballistics/New() + ..() + contents = list( + /obj/item/weapon/gun/projectile/sec, + /obj/item/weapon/gun/projectile/shotgun/doublebarrel, + /obj/item/weapon/gun/projectile/shotgun/pump/combat, + /obj/item/weapon/gun/projectile/automatic/wt550, + /obj/item/weapon/gun/projectile/automatic/rifle/z8) + +/datum/supply_drop_loot/seeds + name = "Seeds" + container = /obj/structure/closet/crate +/datum/supply_drop_loot/seeds/New() + ..() + contents = list( + /obj/item/seeds/chiliseed, + /obj/item/seeds/berryseed, + /obj/item/seeds/cornseed, + /obj/item/seeds/eggplantseed, + /obj/item/seeds/tomatoseed, + /obj/item/seeds/appleseed, + /obj/item/seeds/soyaseed, + /obj/item/seeds/wheatseed, + /obj/item/seeds/carrotseed, + /obj/item/seeds/lemonseed, + /obj/item/seeds/orangeseed, + /obj/item/seeds/grassseed, + /obj/item/seeds/sunflowerseed, + /obj/item/seeds/chantermycelium, + /obj/item/seeds/potatoseed, + /obj/item/seeds/sugarcaneseed) + +/datum/supply_drop_loot/food + name = "Food" + container = /obj/structure/largecrate +/datum/supply_drop_loot/food/New() + ..() + contents = 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/drinks/milk, + /obj/item/weapon/reagent_containers/food/drinks/milk, + /obj/item/weapon/storage/fancy/egg_box, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat) + +/datum/supply_drop_loot/armour + name = "Armour" + container = /obj/structure/largecrate +/datum/supply_drop_loot/armour/New() + ..() + contents = list( + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/storage/vest, + /obj/item/clothing/suit/storage/vest, + /obj/item/clothing/suit/armor/laserproof, + /obj/item/clothing/suit/armor/bulletproof) + +/datum/supply_drop_loot/materials + name = "Materials" + container = /obj/structure/largecrate +/datum/supply_drop_loot/materials/New() + ..() + contents = list( + /obj/item/stack/material/steel, + /obj/item/stack/material/steel, + /obj/item/stack/material/steel, + /obj/item/stack/material/glass, + /obj/item/stack/material/glass, + /obj/item/stack/material/wood, + /obj/item/stack/material/plastic, + /obj/item/stack/material/glass/reinforced, + /obj/item/stack/material/plasteel) + +/datum/supply_drop_loot/medical + name = "Medical" + container = /obj/structure/closet/crate/medical +/datum/supply_drop_loot/medical/New() + ..() + contents = list( + /obj/item/weapon/storage/firstaid/regular, + /obj/item/weapon/storage/firstaid/fire, + /obj/item/weapon/storage/firstaid/toxin, + /obj/item/weapon/storage/firstaid/o2, + /obj/item/weapon/storage/firstaid/adv, + /obj/item/weapon/reagent_containers/glass/bottle/antitoxin, + /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline, + /obj/item/weapon/reagent_containers/glass/bottle/stoxin, + /obj/item/weapon/storage/box/syringes, + /obj/item/weapon/storage/box/autoinjectors) + +/datum/supply_drop_loot/power + name = "Power" + container = /obj/structure/largecrate +/datum/supply_drop_loot/power/New() + ..() + contents = list( + /obj/item/stack/material/steel, + /obj/item/stack/material/steel, + /obj/item/stack/material/steel, + /obj/item/stack/material/glass, + /obj/item/stack/material/glass, + /obj/item/stack/material/wood, + /obj/item/stack/material/plastic, + /obj/item/stack/material/glass/reinforced, + /obj/item/stack/material/plasteel) + +/datum/supply_drop_loot/hydroponics + name = "Hydroponics" + container = /obj/structure/largecrate +/datum/supply_drop_loot/hydroponics/New() + ..() + contents = list( + /obj/machinery/portable_atmospherics/hydroponics, + /obj/machinery/portable_atmospherics/hydroponics, + /obj/machinery/portable_atmospherics/hydroponics) + +/datum/supply_drop_loot/power + name = "Power" + container = /obj/structure/largecrate +/datum/supply_drop_loot/power/New() + ..() + contents = list( + /obj/machinery/power/port_gen/pacman, + /obj/machinery/power/port_gen/pacman/super, + /obj/machinery/power/port_gen/pacman/mrs) + +/datum/supply_drop_loot/power/contents() + return list(pick(contents)) diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm new file mode 100644 index 00000000000..625568bbf14 --- /dev/null +++ b/code/modules/random_map/drop/droppod.dm @@ -0,0 +1,227 @@ +#define SD_FLOOR_TILE 0 +#define SD_WALL_TILE 1 +#define SD_DOOR_TILE 2 +#define SD_EMPTY_TILE 3 +#define SD_SUPPLY_TILE 7 + +/datum/random_map/droppod + descriptor = "drop pod" + initial_wall_cell = 0 + limit_x = 3 + limit_y = 3 + preserve_map = 0 + + wall_type = /turf/simulated/wall/titanium + floor_type = /turf/simulated/floor/reinforced + var/list/supplied_drop_types = list() + var/door_type = /obj/structure/droppod_door + var/drop_type = /mob/living/simple_animal/parrot + var/auto_open_doors + + var/placement_explosion_dev = 1 + var/placement_explosion_heavy = 2 + var/placement_explosion_light = 6 + var/placement_explosion_flash = 4 + +/datum/random_map/droppod/New(var/seed, var/tx, var/ty, var/tz, var/tlx, var/tly, var/do_not_apply, var/do_not_announce, var/supplied_drop, var/list/supplied_drops, var/automated) + + if(supplied_drop) + drop_type = supplied_drop + else if(islist(supplied_drops) && supplied_drops.len) + supplied_drop_types = supplied_drops + drop_type = "custom" + if(automated) + auto_open_doors = 1 + + //Make sure there is a clear midpoint. + if(limit_x % 2 == 0) limit_x++ + if(limit_y % 2 == 0) limit_y++ + ..() + +/datum/random_map/droppod/generate_map() + + // No point calculating these 200 times. + var/x_midpoint = n_ceil(limit_x / 2) + var/y_midpoint = n_ceil(limit_y / 2) + + // Draw walls/floors/doors. + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + if(!current_cell) + continue + + var/on_x_bound = (x == 1 || x == limit_x) + var/on_y_bound = (y == 1 || y == limit_x) + var/draw_corners = (limit_x < 5 && limit_y < 5) + if(on_x_bound || on_y_bound) + // Draw access points in midpoint of each wall. + if(x == x_midpoint || y == y_midpoint) + map[current_cell] = SD_DOOR_TILE + // Draw the actual walls. + else if(draw_corners || (!on_x_bound || !on_y_bound)) + map[current_cell] = SD_WALL_TILE + //Don't draw the far corners on large pods. + else + map[current_cell] = SD_EMPTY_TILE + else + // Fill in the corners. + if((x == 2 || x == (limit_x-1)) && (y == 2 || y == (limit_y-1))) + map[current_cell] = SD_WALL_TILE + // Fill in EVERYTHING ELSE. + else + map[current_cell] = SD_FLOOR_TILE + + // Draw the drop contents. + var/current_cell = get_map_cell(x_midpoint,y_midpoint) + if(current_cell) + map[current_cell] = SD_SUPPLY_TILE + return 1 + +/datum/random_map/droppod/apply_to_map() + if(placement_explosion_dev || placement_explosion_heavy || placement_explosion_light || placement_explosion_flash) + var/turf/T = locate((origin_x + n_ceil(limit_x / 2)-1), (origin_y + n_ceil(limit_y / 2)-1), origin_z) + if(istype(T)) + explosion(T, placement_explosion_dev, placement_explosion_heavy, placement_explosion_light, placement_explosion_flash) + sleep(15) // Let the explosion finish proccing before we ChangeTurf(), otherwise it might destroy our spawned objects. + return ..() + +/datum/random_map/droppod/get_appropriate_path(var/value) + if(value == SD_FLOOR_TILE || value == SD_SUPPLY_TILE) + return floor_type + else if(value == SD_WALL_TILE) + return wall_type + else if(value == SD_DOOR_TILE ) + return wall_type + return null + +// Pods are circular. Get the direction this object is facing from the center of the pod. +/datum/random_map/droppod/get_spawn_dir(var/x, var/y) + var/x_midpoint = n_ceil(limit_x / 2) + var/y_midpoint = n_ceil(limit_y / 2) + if(x == x_midpoint && y == y_midpoint) + return null + var/turf/target = locate(origin_x+x-1, origin_y+y-1, origin_z) + var/turf/middle = locate(origin_x+x_midpoint-1, origin_y+y_midpoint-1, origin_z) + if(!istype(target) || !istype(middle)) + return null + return get_dir(middle, target) + +/datum/random_map/droppod/get_additional_spawns(var/value, var/turf/T, var/spawn_dir) + + // Splatter anything under us that survived the explosion. + if(value != SD_EMPTY_TILE && T.contents.len) + for(var/atom/movable/AM in T) + if(AM.simulated && !istype(AM, /mob/dead)) + qdel(AM) + + // Also spawn doors and loot. + if(value == SD_DOOR_TILE) + var/obj/structure/S = new door_type(T, auto_open_doors) + S.set_dir(spawn_dir) + + else if(value == SD_SUPPLY_TILE) + get_spawned_drop(T) + +/datum/random_map/droppod/proc/get_spawned_drop(var/turf/T) + var/obj/structure/bed/chair/C = new(T) + C.set_light(3, l_color = "#CC0000") + var/mob/living/drop + // This proc expects a list of mobs to be passed to the spawner. + // Use the supply pod if you don't want to drop mobs. + // Mobs will not double up; if you want multiple mobs, you + // will need multiple drop tiles. + if(islist(supplied_drop_types) && supplied_drop_types.len) + while(supplied_drop_types.len) + drop = pick(supplied_drop_types) + supplied_drop_types -= drop + if(istype(drop)) + drop.tag = null + if(drop.buckled) + drop.buckled = null + drop.forceMove(T) + else if(ispath(drop_type)) + drop = new drop_type(T) + if(istype(drop)) + if(drop.buckled) + drop.buckled = null + drop.forceMove(T) + +/datum/admins/proc/call_drop_pod() + set category = "Fun" + set desc = "Call an immediate drop pod on your location." + set name = "Call Drop Pod" + + if(!check_rights(R_FUN)) return + + var/client/selected_player + var/mob/living/spawned_mob + var/list/spawned_mobs = list() + + var/spawn_path = input("Select a mob type.", "Drop Pod Selection", null) as null|anything in typesof(/mob/living)-/mob/living + if(!spawn_path) + return + + if(alert("Do you wish the mob to have a player?",,"No","Yes") == "No") + var/spawn_count = input("How many mobs do you wish the pod to contain?", "Drop Pod Selection", null) as num + if(spawn_count <= 0) + return + for(var/i=0;iYou prime the explosive bolts. Better get clear!" + sleep(30) + deploy() + +/obj/structure/droppod_door/proc/deploy() + if(deployed) + return + + deployed = 1 + visible_message("The explosive bolts on \the [src] detonate, throwing it open!") + playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) + + // This is shit but it will do for the sake of testing. + for(var/obj/structure/droppod_door/D in orange(1,src)) + if(D.deployed) + continue + D.deploy() + + // Overwrite turfs. + var/turf/origin = get_turf(src) + origin.ChangeTurf(/turf/simulated/floor/reinforced) + origin.set_light(0) // Forcing updates + var/turf/T = get_step(origin, src.dir) + T.ChangeTurf(/turf/simulated/floor/reinforced) + T.set_light(0) // Forcing updates + + // Destroy turf contents. + for(var/obj/O in origin) + if(!O.simulated) + continue + qdel(O) //crunch + for(var/obj/O in T) + if(!O.simulated) + continue + qdel(O) //crunch + + // Hurl the mobs away. + for(var/mob/living/M in T) + M.throw_at(get_edge_target_turf(T,src.dir),rand(0,3),50) + for(var/mob/living/M in origin) + M.throw_at(get_edge_target_turf(origin,src.dir),rand(0,3),50) + + // Create a decorative ramp bottom and flatten out our current ramp. + density = 0 + opacity = 0 + icon_state = "ramptop" + var/obj/structure/droppod_door/door_bottom = new(T) + door_bottom.deployed = 1 + door_bottom.density = 0 + door_bottom.opacity = 0 + door_bottom.dir = src.dir + door_bottom.icon_state = "rampbottom" \ No newline at end of file diff --git a/code/modules/random_map/drop/supply.dm b/code/modules/random_map/drop/supply.dm new file mode 100644 index 00000000000..18cc90d08e7 --- /dev/null +++ b/code/modules/random_map/drop/supply.dm @@ -0,0 +1,93 @@ +/datum/random_map/droppod/supply + descriptor = "supply drop" + limit_x = 5 + limit_y = 5 + + placement_explosion_light = 7 + placement_explosion_flash = 5 + +// UNLIKE THE DROP POD, this map deals ENTIRELY with strings and types. +// Drop type is a string representing a mode rather than an atom or path. +// supplied_drop_types is a list of types to spawn in the pod. +/datum/random_map/droppod/supply/get_spawned_drop(var/turf/T) + + if(!drop_type) drop_type = pick(supply_drop_random_loot_types()) + + if(drop_type == "custom") + if(supplied_drop_types.len) + var/obj/structure/largecrate/C = locate() in T + for(var/drop_type in supplied_drop_types) + var/atom/movable/A = new drop_type(T) + if(!istype(A, /mob)) + if(!C) C = new(T) + C.contents |= A + return + else + drop_type = pick(supply_drop_random_loot_types()) + + if(istype(drop_type, /datum/supply_drop_loot)) + var/datum/supply_drop_loot/SDL = drop_type + SDL.drop(T) + else + error("Unhandled drop type: [drop_type]") + + +/datum/admins/proc/call_supply_drop() + set category = "Fun" + set desc = "Call an immediate supply drop on your location." + set name = "Call Supply Drop" + + if(!check_rights(R_FUN)) return + + var/chosen_loot_type + var/list/chosen_loot_types + var/choice = alert("Do you wish to supply a custom loot list?",,"No","Yes") + if(choice == "Yes") + chosen_loot_types = list() + + choice = alert("Do you wish to add mobs?",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/mob/living) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + choice = alert("Do you wish to add structures or machines?",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj) - typesof(/obj/item) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + choice = alert("Do you wish to add any non-weapon items?",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item) - typesof(/obj/item/weapon) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + + choice = alert("Do you wish to add weapons?",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item/weapon) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + choice = alert("Do you wish to add ABSOLUTELY ANYTHING ELSE? (you really shouldn't need to)",,"No","Yes") + if(choice == "Yes") + while(1) + var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/atom/movable) + if(!adding_loot_type) + break + chosen_loot_types |= adding_loot_type + else + choice = alert("Do you wish to specify a loot type?",,"No","Yes") + if(choice == "Yes") + chosen_loot_type = input("Select a loot type.", "Loot Selection", null) as null|anything in supply_drop_random_loot_types() + + choice = alert("Are you SURE you wish to deploy this supply drop? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes") + if(choice == "No") + return + log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])") + new /datum/random_map/droppod/supply(null, usr.x-2, usr.y-2, usr.z, supplied_drops = chosen_loot_types, supplied_drop = chosen_loot_type) \ No newline at end of file diff --git a/code/modules/random_map/mazes/maze.dm b/code/modules/random_map/mazes/maze.dm new file mode 100644 index 00000000000..557adbd6e8e --- /dev/null +++ b/code/modules/random_map/mazes/maze.dm @@ -0,0 +1,65 @@ +/datum/random_map/maze + descriptor = "maze" + initial_wall_cell = 100 + var/list/checked_coord_cache = list() + var/list/openlist = list() + var/list/closedlist = list() + +/datum/random_map/maze/set_map_size() + // Map has to be odd so that there are walls on all sides. + if(limit_x%2==0) limit_x++ + if(limit_y%2==0) limit_y++ + ..() + +/datum/random_map/maze/generate_map() + + // Grab a random point on the map to begin the maze cutting at. + var/start_x = rand(1,limit_x-2) + var/start_y = rand(1,limit_y-2) + if(start_x%2!=0) start_x++ + if(start_y%2!=0) start_y++ + + // Create the origin cell to start us off. + openlist += new /datum/maze_cell(start_x,start_y) + + while(openlist.len) + // Grab a maze point to use and remove it from the open list. + var/datum/maze_cell/next = pick(openlist) + openlist -= next + if(!isnull(closedlist[next.name])) + continue + + // Preliminary marking-off... + closedlist[next.name] = next + map[get_map_cell(next.x,next.y)] = FLOOR_CHAR + + // Apply the values required and fill gap between this cell and origin point. + if(next.ox && next.oy) + if(next.ox < next.x) + map[get_map_cell(next.x-1,next.y)] = FLOOR_CHAR + else if(next.ox == next.x) + if(next.oy < next.y) + map[get_map_cell(next.x,next.y-1)] = FLOOR_CHAR + else + map[get_map_cell(next.x,next.y+1)] = FLOOR_CHAR + else + map[get_map_cell(next.x+1,next.y)] = FLOOR_CHAR + + // Grab valid neighbors for use in the open list! + add_to_openlist(next.x,next.y+2,next.x,next.y) + add_to_openlist(next.x-2,next.y,next.x,next.y) + add_to_openlist(next.x+2,next.y,next.x,next.y) + add_to_openlist(next.x,next.y-2,next.x,next.y) + + // Cleanup. Map stays in memory for display proc. + checked_coord_cache.Cut() + openlist.Cut() + closedlist.Cut() + +/datum/random_map/maze/proc/add_to_openlist(var/tx, var/ty, var/nx, var/ny) + if(tx < 1 || ty < 1 || tx > limit_x || ty > limit_y || !isnull(checked_coord_cache["[tx]-[ty]"])) + return 0 + checked_coord_cache["[tx]-[ty]"] = 1 + map[get_map_cell(tx,ty)] = DOOR_CHAR + var/datum/maze_cell/new_cell = new(tx,ty,nx,ny) + openlist |= new_cell diff --git a/code/modules/random_map/mazes/maze_cell.dm b/code/modules/random_map/mazes/maze_cell.dm new file mode 100644 index 00000000000..0b4fa1ac869 --- /dev/null +++ b/code/modules/random_map/mazes/maze_cell.dm @@ -0,0 +1,18 @@ +var/maze_cell_count = 0 + +/datum/maze_cell + var/name + var/uid + var/x + var/y + var/ox + var/oy + +/datum/maze_cell/New(var/nx,var/ny,var/nox,var/noy) + maze_cell_count++ + uid = maze_cell_count + name = "cell #[uid]" + x = nx + y = ny + ox = nox + oy = noy \ No newline at end of file diff --git a/code/modules/random_map/mining_distribution.dm b/code/modules/random_map/mining_distribution.dm deleted file mode 100644 index 7973ff14ab9..00000000000 --- a/code/modules/random_map/mining_distribution.dm +++ /dev/null @@ -1,242 +0,0 @@ -#define MIN_SURFACE_COUNT 500 -#define MIN_RARE_COUNT 200 -#define MIN_DEEP_COUNT 100 -#define RESOURCE_HIGH_MAX 4 -#define RESOURCE_HIGH_MIN 2 -#define RESOURCE_MID_MAX 3 -#define RESOURCE_MID_MIN 1 -#define RESOURCE_LOW_MAX 1 -#define RESOURCE_LOW_MIN 0 - -/* -Surface minerals: - silicates - iron - gold - silver -Rare minerals: - uranium - diamond -Deep minerals: - phoron - osmium (platinum) - tritium (hydrogen) -*/ - -/datum/random_map/ore - - descriptor = "resource distribution map" - real_size = 65 // Must be (power of 2)+1 for diamond-square. - cell_range = 255 // These values are used to seed ore values rather than to determine a turf type. - iterations = 0 // We'll handle iterating on our end (recursive, with args). - - var/chunk_size = 4 // Size each cell represents on map - var/random_variance_chance = 25 // % chance of applying random_element. - var/random_element = 0.5 // Determines the variance when smoothing out cell values. - var/deep_val = 0.8 // Threshold for deep metals, set in new as percentage of cell_range. - var/rare_val = 0.7 // Threshold for rare metal, set in new as percentage of cell_range. - var/cell_base // Set in New() - var/initial_cell_range // Set in New() - -/datum/random_map/ore/New() - rare_val = cell_range * rare_val - deep_val = cell_range * deep_val - - initial_cell_range = cell_range/5 - cell_base = cell_range/2 - ..() - -/datum/random_map/ore/check_map_sanity() - - var/rare_count = 0 - var/surface_count = 0 - var/deep_count = 0 - - // Increment map sanity counters. - for(var/value in map) - if(value < rare_val) - surface_count++ - else if(value < deep_val) - rare_count++ - else - deep_count++ - // Sanity check. - if(surface_count < MIN_SURFACE_COUNT) - admin_notice("Insufficient surface minerals. Rerolling...", R_DEBUG) - return 0 - else if(rare_count < MIN_RARE_COUNT) - admin_notice("Insufficient rare minerals. Rerolling...", R_DEBUG) - return 0 - else if(deep_count < MIN_DEEP_COUNT) - admin_notice("Insufficient deep minerals. Rerolling...", R_DEBUG) - return 0 - else - return 1 - -//Halfassed diamond-square algorithm with some fuckery since it's a single dimension array. -/datum/random_map/ore/seed_map() - - // Instantiate the grid. - for(var/x = 1, x <= real_size, x++) - for(var/y = 1, y <= real_size, y++) - map[get_map_cell(x,y)] = 0 - - // Now dump in the actual random data. - map[get_map_cell(1,1)] = cell_base+rand(initial_cell_range) - map[get_map_cell(1,real_size)] = cell_base+rand(initial_cell_range) - map[get_map_cell(real_size,real_size)] = cell_base+rand(initial_cell_range) - map[get_map_cell(real_size,1)] = cell_base+rand(initial_cell_range) - iterate(1,1,1,(real_size-1)) // Start the recursion here. - -/datum/random_map/ore/display_map(atom/user) - - if(!user) - user = world - - for(var/x = 1, x <= real_size, x++) - var/line = "" - for(var/y = 1, y <= real_size, y++) - var/current_cell = get_map_cell(x,y) - if(within_bounds(current_cell) && map[current_cell]) - if(map[current_cell] < rare_val) - line += "S" - else if(map[current_cell] < deep_val) - line += "R" - else - line += "D" - else - line += "X" - user << line - -/datum/random_map/ore/iterate(var/iteration,var/x,var/y,var/input_size) - - // Infinite loop check! - if(iteration>=iterate_before_fail) - admin_notice("Iteration count exceeded, aborting.", R_DEBUG) - return - - var/isize = input_size - var/hsize = round(input_size/2) - - /* - (x,y+isize)----(x+hsize,y+isize)----(x+size,y+isize) - | | | - | | | - | | | - (x,y+hsize)----(x+hsize,y+hsize)----(x+isize,y) - | | | - | | | - | | | - (x,y)----------(x+hsize,y)----------(x+isize,y) - */ - // Central edge values become average of corners. - map[get_map_cell(x+hsize,y+isize)] = round((\ - map[get_map_cell(x,y+isize)] + \ - map[get_map_cell(x+isize,y+isize)] \ - )/2) - - map[get_map_cell(x+hsize,y)] = round(( \ - map[get_map_cell(x,y)] + \ - map[get_map_cell(x+isize,y)] \ - )/2) - - map[get_map_cell(x,y+hsize)] = round(( \ - map[get_map_cell(x,y+isize)] + \ - map[get_map_cell(x,y)] \ - )/2) - - map[get_map_cell(x+isize,y+hsize)] = round(( \ - map[get_map_cell(x+isize,y+isize)] + \ - map[get_map_cell(x+isize,y)] \ - )/2) - - // Centre value becomes the average of all other values + possible random variance. - var/current_cell = get_map_cell(x+hsize,y+hsize) - map[current_cell] = round((map[get_map_cell(x+hsize,y+isize)]+map[get_map_cell(x+hsize,y)]+map[get_map_cell(x,y+hsize)]+map[get_map_cell(x+isize,y)])/4) - - if(prob(random_variance_chance)) - map[current_cell] *= (rand(1,2)==1 ? (1.0-random_element) : (1.0+random_element)) - map[current_cell] = max(0,min(cell_range,map[current_cell])) - - // Recurse until size is too small to subdivide. - if(isize>3) - sleep(-1) - iteration++ - iterate(iteration, x, y, hsize) - iterate(iteration, x+hsize, y, hsize) - iterate(iteration, x, y+hsize, hsize) - iterate(iteration, x+hsize, y+hsize, hsize) - -/datum/random_map/ore/apply_to_map() - for(var/x = 0, x < real_size, x++) - if((origin_x + x) > limit_x) continue - for(var/y = 0, y < real_size, y++) - if((origin_y + y) > limit_y) continue - sleep(-1) - apply_to_turf(x,y) - -/datum/random_map/ore/apply_to_turf(var/x,var/y) - - var/tx = origin_x+((x-1)*chunk_size) - var/ty = origin_y+((y-1)*chunk_size) - - for(var/i=0,ilimit_y) - continue - for(var/j=0,jlimit_x) - continue - - var/turf/T = locate(tx+j, ty+i, origin_z) - if(!T || !T.has_resources) - continue - - sleep(-1) - - T.resources = list() - T.resources["silicates"] = rand(3,5) - T.resources["carbonaceous rock"] = rand(3,5) - - var/current_cell = map[get_map_cell(x,y)] - if(current_cell < rare_val) // Surface metals. - T.resources["iron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) - T.resources["gold"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) - T.resources["silver"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) - T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) - T.resources["diamond"] = 0 - T.resources["phoron"] = 0 - T.resources["osmium"] = 0 - T.resources["hydrogen"] = 0 - else if(current_cell < deep_val) // Rare metals. - T.resources["gold"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["uranium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["phoron"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["osmium"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["hydrogen"] = 0 - T.resources["diamond"] = 0 - T.resources["iron"] = 0 - else // Deep metals. - T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) - T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) - T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) - T.resources["osmium"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) - T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["iron"] = 0 - T.resources["gold"] = 0 - T.resources["silver"] = 0 - - return - -/datum/random_map/ore/cleanup() - return 1 - -#undef MIN_SURFACE_COUNT -#undef MIN_RARE_COUNT -#undef MIN_DEEP_COUNT -#undef RESOURCE_HIGH_MAX -#undef RESOURCE_HIGH_MIN -#undef RESOURCE_MID_MAX -#undef RESOURCE_MID_MIN -#undef RESOURCE_LOW_MAX -#undef RESOURCE_LOW_MIN \ No newline at end of file diff --git a/code/modules/random_map/noise/desert.dm b/code/modules/random_map/noise/desert.dm new file mode 100644 index 00000000000..1c7ca229a41 --- /dev/null +++ b/code/modules/random_map/noise/desert.dm @@ -0,0 +1,40 @@ +/datum/random_map/noise/desert + descriptor = "desert" + smoothing_iterations = 3 + +/datum/random_map/noise/desert/replace_space + descriptor = "desert (replacement)" + target_turf_type = /turf/space + +/datum/random_map/noise/desert/get_map_char(var/value) + return "[pick(list(",",".","'","`"))]" + +/datum/random_map/noise/desert/get_appropriate_path(var/value) + var/val = min(9,max(0,round((value/cell_range)*10))) + if(isnull(val)) val = 0 + switch(val) + if(0 to 1) + return /turf/simulated/floor/beach/water + else + return /turf/simulated/floor/beach/sand/desert + +/datum/random_map/noise/desert/get_additional_spawns(var/value, var/turf/T) + var/val = min(9,max(0,round((value/cell_range)*10))) + if(isnull(val)) val = 0 + switch(val) + if(2 to 3) + if(prob(60)) + var/grass_path = pick(typesof(/obj/structure/flora/grass)-/obj/structure/flora/grass) + new grass_path(T) + if(prob(5)) + var/mob_type = pick(list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/mouse)) + new mob_type(T) + if(5 to 6) + if(prob(20)) + var/grass_path = pick(typesof(/obj/structure/flora/grass)-/obj/structure/flora/grass) + new grass_path(T) + if(7 to 9) + if(prob(60)) + new /obj/structure/flora/bush(T) + else if(prob(20)) + new /obj/structure/flora/tree/dead(T) diff --git a/code/modules/random_map/noise/magma.dm b/code/modules/random_map/noise/magma.dm new file mode 100644 index 00000000000..8c8bd6a9f4e --- /dev/null +++ b/code/modules/random_map/noise/magma.dm @@ -0,0 +1,44 @@ +// This is basically filler at this point. Subsidence and all kinds of fun +// hazards will be included when it is done. +/datum/random_map/noise/volcanism + descriptor = "volcanism" + smoothing_iterations = 6 + target_turf_type = /turf/simulated + +// Get rid of those dumb little single-tile volcanic areas. +/datum/random_map/noise/volcanism/cleanup() + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + if(map[current_cell] < 178) + continue + var/count + var/tmp_cell = get_map_cell(x+1,y+1) + if(tmp_cell && map[tmp_cell] >= 178) count++ + tmp_cell = get_map_cell(x-1,y-1) + if(tmp_cell && map[tmp_cell] >= 178) count++ + tmp_cell = get_map_cell(x+1,y-1) + if(tmp_cell && map[tmp_cell] >= 178) count++ + tmp_cell = get_map_cell(x-1,y+1) + if(tmp_cell && map[tmp_cell] >= 178) count++ + tmp_cell = get_map_cell(x-1,y) + if(tmp_cell && map[tmp_cell] >= 178) count++ + tmp_cell = get_map_cell(x,y-1) + if(tmp_cell && map[tmp_cell] >= 178) count++ + tmp_cell = get_map_cell(x+1,y) + if(tmp_cell && map[tmp_cell] >= 178) count++ + tmp_cell = get_map_cell(x,y+1) + if(tmp_cell && map[tmp_cell] >= 178) count++ + if(!count) + map[current_cell] = 177 + +/datum/random_map/noise/volcanism/get_appropriate_path(var/value) + return + +/datum/random_map/noise/volcanism/get_additional_spawns(var/value, var/turf/T) + if(value>=178) + if(istype(T,/turf/simulated/floor/asteroid)) + T.ChangeTurf(/turf/simulated/floor/airless/lava) + else if(istype(T,/turf/simulated/mineral)) + var/turf/simulated/mineral/M = T + M.mined_turf = /turf/simulated/floor/airless/lava \ No newline at end of file diff --git a/code/modules/random_map/noise/noise.dm b/code/modules/random_map/noise/noise.dm new file mode 100644 index 00000000000..7e4323158e4 --- /dev/null +++ b/code/modules/random_map/noise/noise.dm @@ -0,0 +1,168 @@ +// NOTE: Maps generated with this datum as the base are not DIRECTLY compatible with maps generated from +// the automata, building or maze datums, as the noise generator uses 0-255 instead of WALL_CHAR/FLOOR_CHAR. +// TODO: Consider writing a conversion proc for noise-to-regular maps. +/datum/random_map/noise + descriptor = "distribution map" + var/cell_range = 255 // These values are used to seed ore values rather than to determine a turf type. + var/cell_smooth_amt = 5 + var/random_variance_chance = 25 // % chance of applying random_element. + var/random_element = 0.5 // Determines the variance when smoothing out cell values. + var/cell_base // Set in New() + var/initial_cell_range // Set in New() + var/smoothing_iterations = 0 + +/datum/random_map/noise/New() + initial_cell_range = cell_range/5 + cell_base = cell_range/2 + ..() + +/datum/random_map/noise/set_map_size() + // Make sure the grid is a square with limits that are + // (n^2)+1, otherwise diamond-square won't work. + if(!IsPowerOfTwo((limit_x-1))) + limit_x = RoundUpToPowerOfTwo(limit_x) + 1 + if(!IsPowerOfTwo((limit_y-1))) + limit_y = RoundUpToPowerOfTwo(limit_y) + 1 + // Sides must be identical lengths. + if(limit_x > limit_y) + limit_y = limit_x + else if(limit_y > limit_x) + limit_x = limit_y + ..() + +// Diamond-square algorithm. +/datum/random_map/noise/seed_map() + // Instantiate the grid. + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + map[get_map_cell(x,y)] = 0 + + // Now dump in the actual random data. + map[get_map_cell(1,1)] = cell_base+rand(initial_cell_range) + map[get_map_cell(1,limit_y)] = cell_base+rand(initial_cell_range) + map[get_map_cell(limit_x,limit_y)] = cell_base+rand(initial_cell_range) + map[get_map_cell(limit_x,1)] = cell_base+rand(initial_cell_range) + +/datum/random_map/noise/generate_map() + // Begin recursion. + subdivide(1,1,1,(limit_y-1)) + +/datum/random_map/noise/get_map_char(var/value) + var/val = min(9,max(0,round((value/cell_range)*10))) + if(isnull(val)) val = 0 + return "[val]" + +/datum/random_map/noise/proc/subdivide(var/iteration,var/x,var/y,var/input_size) + + var/isize = input_size + var/hsize = round(input_size/2) + + /* + (x,y+isize)----(x+hsize,y+isize)----(x+size,y+isize) + | | | + | | | + | | | + (x,y+hsize)----(x+hsize,y+hsize)----(x+isize,y) + | | | + | | | + | | | + (x,y)----------(x+hsize,y)----------(x+isize,y) + */ + // Central edge values become average of corners. + map[get_map_cell(x+hsize,y+isize)] = round((\ + map[get_map_cell(x,y+isize)] + \ + map[get_map_cell(x+isize,y+isize)] \ + )/2) + + map[get_map_cell(x+hsize,y)] = round(( \ + map[get_map_cell(x,y)] + \ + map[get_map_cell(x+isize,y)] \ + )/2) + + map[get_map_cell(x,y+hsize)] = round(( \ + map[get_map_cell(x,y+isize)] + \ + map[get_map_cell(x,y)] \ + )/2) + + map[get_map_cell(x+isize,y+hsize)] = round(( \ + map[get_map_cell(x+isize,y+isize)] + \ + map[get_map_cell(x+isize,y)] \ + )/2) + + // Centre value becomes the average of all other values + possible random variance. + var/current_cell = get_map_cell(x+hsize,y+hsize) + map[current_cell] = round(( \ + map[get_map_cell(x+hsize,y+isize)] + \ + map[get_map_cell(x+hsize,y)] + \ + map[get_map_cell(x,y+hsize)] + \ + map[get_map_cell(x+isize,y)] \ + )/4) + + if(prob(random_variance_chance)) + map[current_cell] *= (rand(1,2)==1 ? (1.0-random_element) : (1.0+random_element)) + map[current_cell] = max(0,min(cell_range,map[current_cell])) + + // Recurse until size is too small to subdivide. + if(isize>3) + if(!priority_process) sleep(-1) + iteration++ + subdivide(iteration, x, y, hsize) + subdivide(iteration, x+hsize, y, hsize) + subdivide(iteration, x, y+hsize, hsize) + subdivide(iteration, x+hsize, y+hsize, hsize) + +/datum/random_map/noise/cleanup() + + for(var/i = 1;i<=smoothing_iterations;i++) + var/list/next_map[limit_x*limit_y] + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + + var/current_cell = get_map_cell(x,y) + next_map[current_cell] = map[current_cell] + var/val_count = 0 + var/total = 0 + + // Get the average neighboring value. + var/tmp_cell = get_map_cell(x+1,y+1) + if(tmp_cell) + total += map[tmp_cell] + val_count++ + tmp_cell = get_map_cell(x-1,y-1) + if(tmp_cell) + total += map[tmp_cell] + val_count++ + tmp_cell = get_map_cell(x+1,y-1) + if(tmp_cell) + total += map[tmp_cell] + val_count++ + tmp_cell = get_map_cell(x-1,y+1) + if(tmp_cell) + total += map[tmp_cell] + val_count++ + tmp_cell = get_map_cell(x-1,y) + if(tmp_cell) + total += map[tmp_cell] + val_count++ + tmp_cell = get_map_cell(x,y-1) + if(tmp_cell) + total += map[tmp_cell] + val_count++ + tmp_cell = get_map_cell(x+1,y) + if(tmp_cell) + total += map[tmp_cell] + val_count++ + tmp_cell = get_map_cell(x,y+1) + if(tmp_cell) + total += map[tmp_cell] + val_count++ + total = round(total/val_count) + + if(abs(map[current_cell]-total) <= cell_smooth_amt) + map[current_cell] = total + else if(map[current_cell] < total) + map[current_cell]+=cell_smooth_amt + else if(map[current_cell] < total) + map[current_cell]-=cell_smooth_amt + map[current_cell] = max(0,min(cell_range,map[current_cell])) + map = next_map \ No newline at end of file diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm new file mode 100644 index 00000000000..4caacb70995 --- /dev/null +++ b/code/modules/random_map/noise/ore.dm @@ -0,0 +1,90 @@ +/datum/random_map/noise/ore + descriptor = "ore distribution map" + var/deep_val = 0.8 // Threshold for deep metals, set in new as percentage of cell_range. + var/rare_val = 0.7 // Threshold for rare metal, set in new as percentage of cell_range. + var/chunk_size = 4 // Size each cell represents on map + +/datum/random_map/noise/ore/New() + rare_val = cell_range * rare_val + deep_val = cell_range * deep_val + ..() + +/datum/random_map/noise/ore/check_map_sanity() + + var/rare_count = 0 + var/surface_count = 0 + var/deep_count = 0 + + // Increment map sanity counters. + for(var/value in map) + if(value < rare_val) + surface_count++ + else if(value < deep_val) + rare_count++ + else + deep_count++ + // Sanity check. + if(surface_count < MIN_SURFACE_COUNT) + admin_notice("Insufficient surface minerals. Rerolling...", R_DEBUG) + return 0 + else if(rare_count < MIN_RARE_COUNT) + admin_notice("Insufficient rare minerals. Rerolling...", R_DEBUG) + return 0 + else if(deep_count < MIN_DEEP_COUNT) + admin_notice("Insufficient deep minerals. Rerolling...", R_DEBUG) + return 0 + else + return 1 + +/datum/random_map/noise/ore/apply_to_turf(var/x,var/y) + + var/tx = ((origin_x-1)+x)*chunk_size + var/ty = ((origin_y-1)+y)*chunk_size + + for(var/i=0,i~
      " + if(1) + return "~" + if(2) + return "~" + if(3) + return "[pick(list(".",","))]" + if(4) + return "[pick(list(".",","))]" + if(5) + return "[pick(list(".",","))]" + if(6) + return "[pick(list(".",","))]" + if(7) + return "[pick(list("T","t"))]" + if(8) + return "[pick(list("T","t"))]" + if(9) + return "[pick(list("T","t"))]" + +/datum/random_map/noise/tundra/get_appropriate_path(var/value) + var/val = min(9,max(0,round((value/cell_range)*10))) + if(isnull(val)) val = 0 + switch(val) + if(0 to 4) + return /turf/simulated/floor/beach/water/ocean + else + return /turf/simulated/floor/snow + +/datum/random_map/noise/tundra/get_additional_spawns(var/value, var/turf/T) + var/val = min(9,max(0,round((value/cell_range)*10))) + if(isnull(val)) val = 0 + switch(val) + if(2) + if(prob(5)) + new /mob/living/simple_animal/crab(T) + if(6) + if(prob(60)) + var/grass_path = pick(typesof(/obj/structure/flora/grass)-/obj/structure/flora/grass) + new grass_path(T) + if(prob(5)) + var/mob_type = pick(list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/mouse)) + new mob_type(T) + if(7) + if(prob(60)) + new /obj/structure/flora/bush(T) + else if(prob(30)) + new /obj/structure/flora/tree/pine(T) + else if(prob(20)) + new /obj/structure/flora/tree/dead(T) + if(8) + if(prob(70)) + new /obj/structure/flora/tree/pine(T) + else if(prob(30)) + new /obj/structure/flora/tree/dead(T) + else + new /obj/structure/flora/bush(T) + if(9) + new /obj/structure/flora/tree/pine(T) diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index 9de319a838e..f1d7d02637a 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -1,165 +1,211 @@ -#define ORE_COUNT 1000 -/* - This module is used to generate the debris fields/distribution maps/procedural stations. -*/ - +// Generates cave systems for the asteroid, and places ore tiles. var/global/list/random_maps = list() +var/global/list/map_count = list() /datum/random_map - var/descriptor = "asteroid" // Display name. - var/real_size = 246 // Size of each edge (must be square :(). - var/cell_range = 2 // Random range for initial cells. - var/iterations = 5 // Number of times to apply the automata rule. + + // Strings. + var/name // Set in New() + var/descriptor = "random map" // Display name. + + // Locator/value vars. + var/initial_wall_cell = 100 // % Chance that a cell will be seeded as a wall. var/max_attempts = 5 // Fail if a sane map isn't generated by this point. - var/raw_map_size // Used for creating new maps each iteration. Value must be real_size^2 - var/list/map = list() // Actual map. var/origin_x = 1 // Origin point, left. var/origin_y = 1 // Origin point, bottom. var/origin_z = 1 // Target Z-level. - var/limit_x = 256 // Maximum x bound. - var/limit_y = 256 // Maximum y bound. - var/iterate_before_fail = 120 // Infinite loop safeguard. + var/limit_x = 128 // Default x size. + var/limit_y = 128 // Default y size. + var/auto_apply = 1 + var/preserve_map = 1 + + // Turf paths. + var/wall_type = /turf/simulated/wall + var/floor_type = /turf/simulated/floor + var/target_turf_type + + // Storage for the final iteration of the map. + var/list/map = list() // Actual map. + + // If set, all sleep(-1) calls will be skipped. + // Test to see if rand_seed() can be used reliably. + var/priority_process + +/datum/random_map/New(var/seed, var/tx, var/ty, var/tz, var/tlx, var/tly, var/do_not_apply, var/do_not_announce) + + // Store this for debugging. + if(!map_count[descriptor]) + map_count[descriptor] = 1 + else + map_count[descriptor]++ + name = "[descriptor] #[map_count[descriptor]]" + if(preserve_map) random_maps[name] = src + + // Get origins for applying the map later. + set_origins(tx, ty, tz) + if(tlx) limit_x = tlx + if(tly) limit_y = tly + + if(do_not_apply) + auto_apply = null + + // Initialize map. + set_map_size() + + var/start_time = world.timeofday + if(!do_not_announce) admin_notice("Generating [name].", R_DEBUG) + sleep(-1) + + // Testing needed to see how reliable this is (asynchronous calls, called during worldgen), DM ref is not optimistic + if(seed) + rand_seed(seed) + priority_process = 1 + + for(var/i = 0;i[capitalize(name)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG) + return + if(!do_not_announce) admin_notice("[capitalize(name)] failed to generate ([round(0.1*(world.timeofday-start_time),0.1)] seconds): could not produce sane map.", R_DEBUG) /datum/random_map/proc/get_map_cell(var/x,var/y) - return ((y-1)*real_size)+x + if(!islist(map)) + set_map_size() + var/cell = ((y-1)*limit_x)+x + if((cell < 1) || (cell > map.len)) + return null + else + return cell + +/datum/random_map/proc/get_map_char(var/value) + switch(value) + if(WALL_CHAR) + return "#" + if(FLOOR_CHAR) + return "." + if(DOOR_CHAR) + return "D" + if(ROOM_TEMP_CHAR) + return "+" + if(MONSTER_CHAR) + return "M" + if(ARTIFACT_TURF_CHAR) + return "_" + if(ARTIFACT_CHAR) + return "A" + else + return " " /datum/random_map/proc/display_map(atom/user) if(!user) user = world - for(var/x = 1, x <= real_size, x++) - var/line = "" - for(var/y = 1, y <= real_size, y++) + var/dat = "+------+
      " + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) var/current_cell = get_map_cell(x,y) - if(within_bounds(current_cell)) - if(map[current_cell] == 2) - line += "#" - else - line += "." - user << line + if(current_cell) + dat += get_map_char(map[current_cell]) + dat += "
      " + user << "[dat]+------+
      " -/datum/random_map/New(var/seed, var/tx, var/ty, var/tz, var/tlx, var/tly) - - // Store this for debugging. - random_maps |= src - - // Initialize map. - set_map_size() - - // Get origins for applying the map later. - if(tx) origin_x = tx - if(ty) origin_y = ty - if(tz) origin_z = tz - if(tlx) limit_x = tlx - if(tly) limit_y = tly - - // testing needed to see how reliable this is (asynchronous calls, called during worldgen), DM ref is not optimistic - if(seed) rand_seed(seed) - - var/start_time = world.timeofday - 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.", R_DEBUG) - return - 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) - -/datum/random_map/proc/set_map_size(var/raw_size) - if(!raw_size) - raw_size = real_size * real_size - raw_map_size = raw_size - map.len = raw_map_size +/datum/random_map/proc/set_map_size() + map = list() + map.len = limit_x * limit_y /datum/random_map/proc/seed_map() - for(var/x = 1, x <= real_size, x++) - for(var/y = 1, y <= real_size, y++) + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) var/current_cell = get_map_cell(x,y) - if(prob(55)) - map[current_cell] = 2 + if(prob(initial_wall_cell)) + map[current_cell] = WALL_CHAR else - map[current_cell] = 1 + map[current_cell] = FLOOR_CHAR /datum/random_map/proc/clear_map() - for(var/x = 1, x <= real_size, x++) - for(var/y = 1, y <= real_size, y++) + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) map[get_map_cell(x,y)] = 0 /datum/random_map/proc/generate() seed_map() - for(var/i=1;i<=iterations;i++) - iterate(i) + generate_map() if(check_map_sanity()) cleanup() - apply_to_map() + if(auto_apply) + apply_to_map() return 1 return 0 -/datum/random_map/proc/iterate(var/iteration) - var/list/next_map[raw_map_size] - for(var/x = 1, x <= real_size, x++) - for(var/y = 1, y <= real_size, y++) - var/current_cell = get_map_cell(x,y) - // Sanity check. - if(!within_bounds(current_cell)) - continue - // Copy over original value. - next_map[current_cell] = map[current_cell] - // Check all neighbors. - var/count = 0 - for(var/cell in list(current_cell,get_map_cell(x+1,y+1),get_map_cell(x-1,y-1),get_map_cell(x+1,y-1),get_map_cell(x-1,y+1),get_map_cell(x-1,y),get_map_cell(x,y-1),get_map_cell(x+1,y),get_map_cell(x,y+1))) - if(within_bounds(cell) && map[cell] == 2) - count++ - if(count>=5) - next_map[current_cell] = 2 // becomes a wall - else - next_map[current_cell] = 1 // becomes a floor - map = next_map +// Unused for basic map. +/datum/random_map/proc/generate_map() + return 1 /datum/random_map/proc/check_map_sanity() return 1 +/datum/random_map/proc/set_origins(var/tx, var/ty, var/tz) + origin_x = tx ? tx : 1 + origin_y = ty ? ty : 1 + origin_z = tz ? tz : 1 + /datum/random_map/proc/apply_to_map() - for(var/x = 0, x < real_size, x++) - if((origin_x + x) > limit_x) continue - for(var/y = 0, y < real_size, y++) - if((origin_y + y) > limit_y) continue - sleep(-1) - apply_to_turf(origin_x+x,origin_y+y) + if(!origin_x) origin_x = 1 + if(!origin_y) origin_y = 1 + if(!origin_z) origin_z = 1 + + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + if(!priority_process) sleep(-1) + apply_to_turf(x,y) /datum/random_map/proc/apply_to_turf(var/x,var/y) var/current_cell = get_map_cell(x,y) - if(!within_bounds(current_cell)) - return - var/turf/T = locate(x,y,origin_z) - if(!T || !istype(T,/turf/unsimulated/mask)) - return - switch(map[current_cell]) - if(1) - T.ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) - if(2) - T.ChangeTurf(/turf/simulated/mineral) - if(3) - T.ChangeTurf(/turf/simulated/mineral/random) - if(4) - T.ChangeTurf(/turf/simulated/mineral/random/high_chance) + if(!current_cell) + return 0 + var/turf/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z) + if(!T || (target_turf_type && !istype(T,target_turf_type))) + return 0 + var/newpath = get_appropriate_path(map[current_cell]) + if(newpath) + T.ChangeTurf(newpath) + get_additional_spawns(map[current_cell],T,get_spawn_dir(x, y)) + return T + +/datum/random_map/proc/get_spawn_dir() + return 0 + +/datum/random_map/proc/get_appropriate_path(var/value) + switch(value) + if(FLOOR_CHAR) + return floor_type + if(WALL_CHAR) + return wall_type + +/datum/random_map/proc/get_additional_spawns(var/value, var/turf/T) + if(value == DOOR_CHAR) + new /obj/machinery/door/airlock(T) /datum/random_map/proc/cleanup() + return - sleep(-1) - // Create ore. - var/ore_count = ORE_COUNT - while(ore_count) - var/check_cell = get_map_cell(rand(1,real_size),rand(1,real_size)) - if(!(within_bounds(check_cell)) || map[check_cell] != 2) - continue - if(prob(25)) - map[check_cell] = 4 - else - map[check_cell] = 3 - ore_count-- +/datum/random_map/proc/overlay_with(var/datum/random_map/target_map, var/tx, var/ty) + if(!map.len || !istype(target_map)) + return + tx-- // Update origin so that x/y index + ty-- // doesn't push it off-kilter by one. + for(var/x = 1, x <= limit_x, x++) + for(var/y = 1, y <= limit_y, y++) + var/current_cell = get_map_cell(x,y) + if(!current_cell) + continue + if(tx+x > target_map.limit_x) + continue + if(ty+y > target_map.limit_y) + continue + target_map.map[target_map.get_map_cell(tx+x,ty+y)] = map[current_cell] + handle_post_overlay_on(target_map,tx,ty) - return 1 \ No newline at end of file + +/datum/random_map/proc/handle_post_overlay_on(var/datum/random_map/target_map, var/tx, var/ty) + return diff --git a/code/modules/random_map/random_map_verbs.dm b/code/modules/random_map/random_map_verbs.dm new file mode 100644 index 00000000000..f94bcd45894 --- /dev/null +++ b/code/modules/random_map/random_map_verbs.dm @@ -0,0 +1,108 @@ +/client/proc/print_random_map() + set category = "Debug" + set name = "Display Random Map" + set desc = "Show the contents of a random map." + + if(!holder) return + + var/choice = input("Choose a map to display.") as null|anything in random_maps + if(!choice) + return + var/datum/random_map/M = random_maps[choice] + if(istype(M)) + M.display_map(usr) + +/client/proc/delete_random_map() + set category = "Debug" + set name = "Delete Random Map" + set desc = "Delete a random map." + + if(!holder) return + + var/choice = input("Choose a map to delete.") as null|anything in random_maps + if(!choice) + return + var/datum/random_map/M = random_maps[choice] + random_maps[choice] = null + if(istype(M)) + message_admins("[key_name_admin(usr)] has deleted [M.name].") + log_admin("[key_name(usr)] has deleted [M.name].") + qdel(M) + +/client/proc/create_random_map() + set category = "Debug" + set name = "Create Random Map" + set desc = "Create a random map." + + if(!holder) return + + var/map_datum = input("Choose a map to create.") as null|anything in typesof(/datum/random_map)-/datum/random_map + if(!map_datum) + return + + var/datum/random_map/M + if(alert("Do you wish to customise the map?",,"Yes","No") == "Yes") + var/seed = input("Seed? (blank for none)") as text|null + var/lx = input("X-size? (blank for default)") as num|null + var/ly = input("Y-size? (blank for default)") as num|null + M = new map_datum(seed,null,null,null,lx,ly,1) + else + M = new map_datum(null,null,null,null,null,null,1) + + if(M) + message_admins("[key_name_admin(usr)] has created [M.name].") + log_admin("[key_name(usr)] has created [M.name].") + +/client/proc/apply_random_map() + set category = "Debug" + set name = "Apply Random Map" + set desc = "Apply a map to the game world." + + if(!holder) return + + var/choice = input("Choose a map to apply.") as null|anything in random_maps + if(!choice) + return + var/datum/random_map/M = random_maps[choice] + if(istype(M)) + var/tx = input("X? (default to current turf)") as num|null + var/ty = input("Y? (default to current turf)") as num|null + var/tz = input("Z? (default to current turf)") as num|null + if(isnull(tx) || isnull(ty) || isnull(tz)) + var/turf/T = get_turf(usr) + tx = !isnull(tx) ? tx : T.x + ty = !isnull(ty) ? ty : T.y + tz = !isnull(tz) ? tz : T.z + message_admins("[key_name_admin(usr)] has applied [M.name] at x[tx],y[ty],z[tz].") + log_admin("[key_name(usr)] has applied [M.name] at x[tx],y[ty],z[tz].") + M.set_origins(tx,ty,tz) + M.apply_to_map() + +/client/proc/overlay_random_map() + set category = "Debug" + set name = "Overlay Random Map" + set desc = "Apply a map to another map." + + if(!holder) return + + var/choice = input("Choose a map as base.") as null|anything in random_maps + if(!choice) + return + var/datum/random_map/base_map = random_maps[choice] + + choice = null + choice = input("Choose a map to overlay.") as null|anything in random_maps + if(!choice) + return + + var/datum/random_map/overlay_map = random_maps[choice] + + if(istype(base_map) && istype(overlay_map)) + var/tx = input("X? (default to 1)") as num|null + var/ty = input("Y? (default to 1)") as num|null + if(!tx) tx = 1 + if(!ty) ty = 1 + message_admins("[key_name_admin(usr)] has applied [overlay_map.name] to [base_map.name] at x[tx],y[ty].") + log_admin("[key_name(usr)] has applied [overlay_map.name] to [base_map.name] at x[tx],y[ty].") + overlay_map.overlay_with(base_map,tx,ty) + base_map.display_map(usr) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index f8aa92964f4..b06d776c250 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -1,3 +1,5 @@ +#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times + /datum/reagents var/list/datum/reagent/reagent_list = list() var/total_volume = 0 @@ -5,6 +7,7 @@ var/atom/my_atom = null /datum/reagents/New(var/max = 100, atom/A = null) + ..() maximum_volume = max my_atom = A @@ -19,33 +22,11 @@ continue 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() - - for(var/path in paths) - - 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 - - // 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. - /datum/reagents/Destroy() ..() + if(chemistryProcess) + chemistryProcess.active_holders -= src + for(var/datum/reagent/R in reagent_list) qdel(R) reagent_list.Cut() @@ -105,55 +86,43 @@ my_atom.reagents = null /datum/reagents/proc/handle_reactions() + if(chemistryProcess) + chemistryProcess.mark_for_update(src) + +//returns 1 if the holder should continue reactiong, 0 otherwise. +/datum/reagents/proc/process_reactions() if(!my_atom) // No reactions in temporary holders - return + return 0 + if(!my_atom.loc) //No reactions inside GC'd containers + return 0 if(my_atom.flags & NOREACT) // No reactions here - return - - var/reaction_occured = 0 - do + return 0 + + var/reaction_occured + var/list/effect_reactions = list() + var/list/eligible_reactions = list() + for(var/i in 1 to PROCESS_REACTION_ITER) reaction_occured = 0 + + //need to rebuild this to account for chain reactions for(var/datum/reagent/R in reagent_list) - for(var/datum/chemical_reaction/C in chemical_reactions_list[R.id]) - var/reagents_suitable = 1 - for(var/B in C.required_reagents) - if(!has_reagent(B, C.required_reagents[B])) - reagents_suitable = 0 - for(var/B in C.catalysts) - if(!has_reagent(B, C.catalysts[B])) - reagents_suitable = 0 - for(var/B in C.inhibitors) - if(has_reagent(B, C.inhibitors[B])) - reagents_suitable = 0 - - if(!reagents_suitable || !C.can_happen(src)) - continue - - var/use = -1 - for(var/B in C.required_reagents) - if(use == -1) - use = get_reagent_amount(B) / C.required_reagents[B] - else - use = min(use, get_reagent_amount(B) / C.required_reagents[B]) - - var/newdata = C.send_data(src) // We need to get it before reagents are removed. See blood paint. - for(var/B in C.required_reagents) - remove_reagent(B, use * C.required_reagents[B], safety = 1) - - if(C.result) - add_reagent(C.result, C.result_amount * use, newdata) - - if(!ismob(my_atom) && C.mix_message) - var/list/seen = viewers(4, get_turf(my_atom)) - for(var/mob/M in seen) - M << "\icon[my_atom] [C.mix_message]" - playsound(get_turf(my_atom), 'sound/effects/bubbles.ogg', 80, 1) - - C.on_reaction(src, C.result_amount * use) + eligible_reactions |= chemical_reactions_list[R.id] + + for(var/datum/chemical_reaction/C in eligible_reactions) + if(C.can_happen(src) && C.process(src)) + effect_reactions |= C reaction_occured = 1 - while(reaction_occured) + + eligible_reactions.Cut() + + if(!reaction_occured) + break + + for(var/datum/chemical_reaction/C in effect_reactions) + C.post_reaction(src) + update_total() - return + return reaction_occured /* Holder-to-chemical */ @@ -225,6 +194,24 @@ return 0 return 0 +/datum/reagents/proc/has_any_reagent(var/list/check_reagents) + for(var/datum/reagent/current in reagent_list) + if(current.id in check_reagents) + if(current.volume >= check_reagents[current.id]) + return 1 + else + return 0 + return 0 + +/datum/reagents/proc/has_all_reagents(var/list/check_reagents) + //this only works if check_reagents has no duplicate entries... hopefully okay since it expects an associative list + var/missing = check_reagents.len + for(var/datum/reagent/current in reagent_list) + if(current.id in check_reagents) + if(current.volume >= check_reagents[current.id]) + missing-- + return !missing + /datum/reagents/proc/clear_reagents() for(var/datum/reagent/current in reagent_list) del_reagent(current.id) @@ -305,9 +292,15 @@ return trans_to_obj(target, amount, multiplier, copy) return 0 -//Using this in case we want to differentiate splashing an atom from transferring reagents to it later down the road. -//For now it just calls trans_to. -/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) +//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well. +/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60) + var/spill = 0 + if(!isturf(target) && target.loc) + spill = amount*(rand(min_spill, max_spill)/100) + amount -= spill + if(spill) + splash(target.loc, spill, multiplier, copy, min_spill, max_spill) + trans_to(target, amount, multiplier, copy) /datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) @@ -423,4 +416,4 @@ /* Atom reagent creation - use it all the time */ /atom/proc/create_reagents(var/max_vol) - reagents = new/datum/reagents(max_vol, src) + reagents = new/datum/reagents(max_vol, src) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index db9b74314ee..b1d6b7eb87b 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -45,14 +45,6 @@ qdel(src) return -/obj/machinery/chem_master/blob_act() - if (prob(50)) - qdel(src) - -/obj/machinery/chem_master/meteorhit() - qdel(src) - return - /obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) if(istype(B, /obj/item/weapon/reagent_containers/glass)) @@ -119,21 +111,21 @@ if(href_list["amount"]) var/id = href_list["add"] - var/amount = isgoodnumber(text2num(href_list["amount"])) + var/amount = Clamp((text2num(href_list["amount"])), 0, 200) R.trans_id_to(src, id, amount) else if (href_list["addcustom"]) var/id = href_list["addcustom"] useramount = input("Select the amount to transfer.", 30, useramount) as num - useramount = isgoodnumber(useramount) + useramount = Clamp(useramount, 0, 200) src.Topic(null, list("amount" = "[useramount]", "add" = "[id]")) else if (href_list["remove"]) if(href_list["amount"]) var/id = href_list["remove"] - var/amount = isgoodnumber(text2num(href_list["amount"])) + var/amount = Clamp((text2num(href_list["amount"])), 0, 200) if(mode) reagents.trans_id_to(beaker, id, amount) else @@ -144,7 +136,7 @@ var/id = href_list["removecustom"] useramount = input("Select the amount to transfer.", 30, useramount) as num - useramount = isgoodnumber(useramount) + useramount = Clamp(useramount, 0, 200) src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]")) else if (href_list["toggle"]) @@ -166,11 +158,8 @@ return if (href_list["createpill_multiple"]) - count = isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num) - //used to be clamp, but seemed to be forcing the call of create_pill 3 times - - if(count > max_pill_count) //instead we'll just manually check it the pill count - Ryan784 - count = max_pill_count + count = input("Select the number of pills to make.", "Max [max_pill_count]", pillamount) as num + count = Clamp(count, 1, max_pill_count) if(reagents.total_volume/count < 1) //Sanity checking. return @@ -299,12 +288,6 @@ onclose(user, "chem_master") return -/obj/machinery/chem_master/proc/isgoodnumber(var/num) - if(isnum(num)) - return Clamp(round(num), 0, 200) - else - return 0 - /obj/machinery/chem_master/condimaster name = "CondiMaster 3000" condi = 1 diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index 9a49d409e08..b05fbe03b72 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -127,7 +127,7 @@ About the Holder: trans_to_obj(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0) If target has reagents, transfers [amount] to it. Otherwise, same as trans_to_turf(). - /atom/proc/create_reagents(var/max_vol) + atom/proc/create_reagents(var/max_vol) Creates a new reagent datum. About Reagents: @@ -285,7 +285,7 @@ About the Tools: By default, all atom have a reagents var - but its empty. if you want to use an object for the chem. system you'll need to add something like this in its new proc: - /atom/proc/create_reagents(var/max_volume) + atom/proc/create_reagents(var/max_volume) Other important stuff: @@ -302,4 +302,4 @@ About the Tools: transfer code since you will not be able to use the standard tools to manipulate it. -*/ \ No newline at end of file +*/ diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index c57f416101f..0a73f5c0bf7 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1,3 +1,15 @@ + +//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id +/proc/initialize_chemical_reagents() + var/paths = typesof(/datum/reagent) - /datum/reagent + chemical_reagents_list = list() + for(var/path in paths) + var/datum/reagent/D = new path() + if(!D.name) + continue + chemical_reagents_list[D.id] = D + + /datum/reagent var/name = "Reagent" var/id = "reagent" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 32224d0ad38..6f8c8c88089 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -70,6 +70,8 @@ infect_virus2(M, V.getcopy()) /datum/reagent/blood/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_MACHINE) + return if(data && data["viruses"]) for(var/datum/disease/D in data["viruses"]) if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS) @@ -194,6 +196,7 @@ description = "Required for welders. Flamable." reagent_state = LIQUID color = "#660000" + touch_met = 5 glass_icon_state = "dr_gibb_glass" glass_name = "glass of welder fuel" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 18099b62e3e..c94406acba1 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -1,3 +1,31 @@ +/datum/reagent/acetone + name = "Acetone" + id = "acetone" + description = "A colorless liquid solvent used in chemical synthesis." + reagent_state = LIQUID + color = "#808080" + metabolism = REM * 0.2 + +/datum/reagent/acetone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.adjustToxLoss(removed * 3) + +/datum/reagent/acetone/touch_obj(var/obj/O) //I copied this wholesale from ethanol and could likely be converted into a shared proc. ~Techhead + 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." + return + if(istype(O, /obj/item/weapon/book)) + if(volume < 5) + return + if(istype(O, /obj/item/weapon/book/tome)) + usr << "The solution does nothing. Whatever this is, it isn't normal ink." + return + var/obj/item/weapon/book/affectedbook = O + affectedbook.dat = null + usr << "The solution dissolves the ink on the book." + return + /datum/reagent/aluminum name = "Aluminum" id = "aluminum" @@ -5,6 +33,20 @@ reagent_state = SOLID color = "#A8A8A8" +/datum/reagent/ammonia + name = "Ammonia" + id = "ammonia" + description = "A caustic substance commonly used in fertilizer or household cleaners." + reagent_state = LIQUID + color = "#404030" + metabolism = REM * 0.5 + +/datum/reagent/ammonia/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_VOX) + M.adjustOxyLoss(-removed * 10) + else if(alien != IS_DIONA) + M.adjustToxLoss(removed * 1.5) + /datum/reagent/carbon name = "Carbon" id = "carbon" @@ -32,19 +74,6 @@ 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" - -/datum/reagent/chlorine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.take_organ_damage(1*REM, 0) - -/datum/reagent/chlorine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) - M.take_organ_damage(1*REM, 0) - /datum/reagent/copper name = "Copper" id = "copper" @@ -127,25 +156,26 @@ usr << "The solution dissolves the ink on the book." return -/datum/reagent/fluorine - name = "Fluorine" - id = "fluorine" - description = "A highly-reactive chemical element." - reagent_state = GAS +/datum/reagent/hydrazine + name = "Hydrazine" + id = "hydrazine" + description = "A toxic, colorless, flammable liquid with a strong ammonia-like odor, in hydrate form." + reagent_state = LIQUID color = "#808080" + metabolism = REM * 0.2 + touch_met = 5 -/datum/reagent/fluorine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.adjustToxLoss(removed) +/datum/reagent/hydrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.adjustToxLoss(4 * removed) -/datum/reagent/fluorine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) - M.adjustToxLoss(removed) +/datum/reagent/hydrazine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) // Hydrazine is both toxic and flammable. + M.adjust_fire_stacks(removed / 12) + M.adjustToxLoss(0.2 * removed) -/datum/reagent/hydrogen - name = "Hydrogen" - id = "hydrogen" - description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." - reagent_state = GAS - color = "#808080" +/datum/reagent/hydrazine/touch_turf(var/turf/T) + new /obj/effect/decal/cleanable/liquid_fuel(T, volume) + remove_self(volume) + return /datum/reagent/iron name = "Iron" @@ -187,28 +217,6 @@ M.emote(pick("twitch", "drool", "moan")) M.adjustBrainLoss(2) -/datum/reagent/nitrogen - name = "Nitrogen" - id = "nitrogen" - description = "A colorless, odorless, tasteless gas." - reagent_state = GAS - color = "#808080" - -/datum/reagent/nitrogen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(alien == IS_VOX ) - M.adjustOxyLoss(-removed * 3) - -/datum/reagent/oxygen - name = "Oxygen" - id = "oxygen" - description = "A colorless, odorless gas." - reagent_state = GAS - color = "#808080" - -/datum/reagent/oxygen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(alien == IS_VOX|| M.get_species() == "Vaurca") - M.adjustToxLoss(removed * 3) - /datum/reagent/phosphorus name = "Phosphorus" id = "phosphorus" @@ -238,7 +246,7 @@ if(prob(5)) M.antibodies |= V.antigen if(prob(50)) - M.radiation += 50 // curing it that way may kill you instead + M.apply_effect(50, IRRADIATE, check_protection = 0) // curing it that way may kill you instead var/absorbed = 0 var/obj/item/organ/diona/nutrients/rad_organ = locate() in M.internal_organs if(rad_organ && !rad_organ.is_broken()) @@ -339,6 +347,15 @@ qdel(O) remove_self(meltdose) // 10 units of acid will not melt EVERYTHING on the tile +/datum/reagent/acid/hydrochloric //Like sulfuric, but less toxic and more acidic. + name = "Hydrochloric Acid" + id = "hclacid" + description = "A very corrosive mineral acid with the molecular formula HCl." + reagent_state = LIQUID + color = "#808080" + power = 3 + meltdose = 8 + /datum/reagent/silicon name = "Silicon" id = "silicon" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 6d29808ad7b..9be138c2715 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -77,7 +77,13 @@ return ..() -/datum/reagent/nutriment/egg // Also bad for skrell. Not a child of protein because it might mess up, not sure. +/datum/reagent/nutriment/protein/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien && alien == IS_SKRELL) + M.adjustToxLoss(2 * removed) + return + ..() + +/datum/reagent/nutriment/protein/egg // Also bad for skrell. name = "egg yolk" id = "egg" color = "#FFFFAA" @@ -91,6 +97,13 @@ return ..() +/datum/reagent/nutriment/honey + name = "Honey" + id = "honey" + description = "A golden yellow syrup, loaded with sugary sweetness." + nutriment_factor = 10 + color = "#FFFF00" + /datum/reagent/nutriment/flour name = "flour" id = "flour" @@ -261,11 +274,11 @@ M.adjustToxLoss(0.5 * removed) /datum/reagent/capsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) - if(alien == IS_DIONA) + if(alien == IS_DIONA || alien == IS_MACHINE) return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species && (H.species.flags & (NO_PAIN | IS_SYNTHETIC))) + if(H.species && (H.species.flags & (NO_PAIN))) return if(dose < agony_dose) if(prob(5) || dose == metabolism) //dose == metabolism is a very hacky way of forcing the message the first time this procs @@ -309,10 +322,10 @@ for(var/obj/item/I in protection) if(I) - if(I.flags & MASKCOVERSEYES) + if(I.body_parts_covered & EYES) eyes_covered = 1 eye_protection = I.name - if(I.flags & MASKCOVERSMOUTH) + if((I.body_parts_covered & FACE) && !(I.item_flags & FLEXIBLEMATERIAL)) mouth_covered = 1 face_protection = I.name @@ -339,7 +352,20 @@ M.Stun(5) M.Weaken(5) - M << message +/datum/reagent/condensedcapsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && (H.species.flags & NO_PAIN)) + return + if(dose == metabolism) + M << "You feel like your insides are burning!" + else + M.apply_effect(4, AGONY, 0) + if(prob(5)) + M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]", "You feel like your insides are burning!") + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature += rand(15, 30) + holder.remove_reagent("frostoil", 5) /* Drinks */ @@ -598,9 +624,12 @@ glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." /datum/reagent/drink/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) - ..() if(alien == IS_DIONA) return + ..() + if(alien == IS_TAJARA) + M.adjustToxLoss(0.5 * removed) + M.make_jittery(4) //extra sensitive to caffine if(adj_temp > 0) holder.remove_reagent("frostoil", 10 * removed) @@ -611,11 +640,20 @@ if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) +/datum/reagent/nutriment/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_TAJARA) + M.adjustToxLoss(2 * removed) + M.make_jittery(4) + return /datum/reagent/drink/coffee/overdose(var/mob/living/carbon/M, var/alien) if(alien == IS_DIONA) return + if(alien == IS_TAJARA) + M.adjustToxLoss(4 * REM) + M.apply_effect(3, STUTTER) M.make_jittery(5) /datum/reagent/drink/coffee/icecoffee @@ -1047,7 +1085,39 @@ glass_desc = "A crystal clear glass of Griffeater gin." glass_center_of_mass = list("x"=16, "y"=12) -/datum/reagent/ethanol/kahlua +//Base type for alchoholic drinks containing coffee +/datum/reagent/ethanol/coffee + overdose = 45 + +/datum/reagent/ethanol/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + ..() + M.dizziness = max(0, M.dizziness - 5) + M.drowsyness = max(0, M.drowsyness - 3) + M.sleeping = max(0, M.sleeping - 2) + if(M.bodytemperature > 310) + M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) + if(alien == IS_TAJARA) + M.adjustToxLoss(0.5 * removed) + M.make_jittery(4) //extra sensitive to caffine + +/datum/reagent/ethanol/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_TAJARA) + M.adjustToxLoss(2 * removed) + M.make_jittery(4) + return + ..() + +/datum/reagent/ethanol/coffee/overdose(var/mob/living/carbon/M, var/alien) + if(alien == IS_DIONA) + return + if(alien == IS_TAJARA) + M.adjustToxLoss(4 * REM) + M.apply_effect(3, STUTTER) + M.make_jittery(5) + +/datum/reagent/ethanol/coffee/kahlua name = "Kahlua" id = "kahlua" description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" @@ -1060,17 +1130,6 @@ glass_desc = "DAMN, THIS THING LOOKS ROBUST" glass_center_of_mass = list("x"=15, "y"=7) -/datum/reagent/ethanol/kahlua/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) - ..() - if(alien == IS_DIONA) - return - M.dizziness = max(0, M.dizziness - 5) - M.drowsyness = max(0, M.drowsyness - 3) - M.sleeping = max(0, M.sleeping - 2) - if(M.bodytemperature > 310) - M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) - M.make_jittery(5) - /datum/reagent/ethanol/melonliquor name = "Melon Liquor" id = "melonliquor" @@ -1167,7 +1226,7 @@ /datum/reagent/ethanol/vodka/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() - M.radiation = max(M.radiation - 1 * removed, 0) + M.apply_effect(max(M.radiation - 1 * removed, 0), IRRADIATE, check_protection = 0) /datum/reagent/ethanol/whiskey name = "Whiskey" @@ -1205,7 +1264,7 @@ glass_icon_state = "acidspitglass" glass_name = "glass of Acid Spit" - glass_desc = "A drink from Nanotrasen. Made from live aliens." + glass_desc = "A drink from the company archives. Made from live aliens." glass_center_of_mass = list("x"=16, "y"=7) /datum/reagent/ethanol/alliescocktail @@ -1235,7 +1294,7 @@ /datum/reagent/ethanol/amasec name = "Amasec" id = "amasec" - description = "Official drink of the NanoTrasen Gun-Club!" + description = "Official drink of the Gun Club!" reagent_state = LIQUID color = "#664300" strength = 25 @@ -1282,10 +1341,10 @@ glass_icon_state = "atomicbombglass" glass_name = "glass of Atomic Bomb" - glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + glass_desc = "We cannot take legal responsibility for your actions after imbibing." glass_center_of_mass = list("x"=15, "y"=7) -/datum/reagent/ethanol/b52 +/datum/reagent/ethanol/coffee/b52 name = "B-52" id = "b52" description = "Coffee, Irish Cream, and cognac. You will get bombed." @@ -1396,7 +1455,7 @@ glass_name = "glass of Booger" glass_desc = "Ewww..." -/datum/reagent/ethanol/brave_bull +/datum/reagent/ethanol/coffee/brave_bull name = "Brave Bull" id = "bravebull" description = "It's just as effective as Dutch-Courage!" @@ -1496,7 +1555,7 @@ /datum/reagent/ethanol/grog name = "Grog" id = "grog" - description = "Watered down rum, NanoTrasen approves!" + description = "Watered-down rum, pirate approved!" reagent_state = LIQUID color = "#664300" strength = 10 @@ -1605,7 +1664,7 @@ glass_desc = "An irish car bomb." glass_center_of_mass = list("x"=16, "y"=8) -/datum/reagent/ethanol/irishcoffee +/datum/reagent/ethanol/coffee/irishcoffee name = "Irish Coffee" id = "irishcoffee" description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index cc12f1f00e1..152d2f2a984 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -208,23 +208,18 @@ /datum/reagent/water/holywater/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() - - if (M.mind && M.mind.vampire) - var/datum/vampire/vampire = M.mind.vampire - vampire.frenzy += removed * 5 + if(ishuman(M)) + if (M.mind && M.mind.vampire) + var/datum/vampire/vampire = M.mind.vampire + vampire.frenzy += removed * 5 + else if(M.mind && cult.is_antagonist(M.mind) && prob(10)) + cult.remove_antagonist(M.mind) /datum/reagent/water/holywater/touch_turf(var/turf/T) 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" - /datum/reagent/diethylamine name = "Diethylamine" id = "diethylamine" @@ -232,10 +227,10 @@ reagent_state = LIQUID color = "#604030" -/datum/reagent/fluorosurfactant // Foam precursor - name = "Fluorosurfactant" - id = "fluorosurfactant" - description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." +/datum/reagent/surfactant // Foam precursor + name = "Azosurfactant" + id = "surfactant" + description = "A isocyanate liquid that forms a foam when mixed with water." reagent_state = LIQUID color = "#9E6B38" @@ -330,7 +325,7 @@ return if(volume >= 1) T.wet_floor(2) - + /datum/reagent/silicate name = "Silicate" id = "silicate" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 4367b66c1ac..66ff4769883 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -48,7 +48,8 @@ description = "Phoron in its liquid form." reagent_state = LIQUID color = "#9D14DB" - strength = 4 + strength = 30 + touch_met = 5 /datum/reagent/toxin/phoron/touch_mob(var/mob/living/L, var/amount) if(istype(L)) @@ -56,11 +57,13 @@ /datum/reagent/toxin/phoron/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) M.take_organ_damage(0, removed * 0.1) //being splashed directly with phoron causes minor chemical burns + if(prob(50)) + M.pl_effects() /datum/reagent/toxin/phoron/touch_turf(var/turf/simulated/T) if(!istype(T)) return - T.assume_gas("volatile_fuel", volume, T20C) + T.assume_gas("phoron", volume, T20C) remove_self(volume) /datum/reagent/toxin/cyanide //Fast and Lethal @@ -175,14 +178,10 @@ if(locate(/obj/effect/overlay/wallrot) in W) for(var/obj/effect/overlay/wallrot/E in W) qdel(E) - W.visible_message("The fungi are completely dissolved by the solution!") + W.visible_message("The fungi are completely dissolved by the solution!") /datum/reagent/toxin/plantbgone/touch_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) - alien_weeds.healthcheck() - else if(istype(O, /obj/effect/plant)) + if(istype(O, /obj/effect/plant)) qdel(O) /datum/reagent/toxin/plantbgone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) @@ -235,6 +234,9 @@ affect_blood(M, alien, removed) /datum/reagent/mutagen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/mob/living/carbon/human/H = M + if(istype(H) && (H.species.flags & NO_SCAN)) + return if(M.dna) if(prob(removed * 10)) // Approx. one mutation per 10 injected/20 ingested/30 touching units M << "Something feels different about you..." @@ -423,13 +425,12 @@ return M.druggy = max(M.druggy, 30) if(dose < 1) - M.stuttering = max(M.stuttering, 3) - M.dizziness = max(150, M.dizziness) + M.apply_effect(3, STUTTER) M.make_dizzy(5) if(prob(5)) M.emote(pick("twitch", "giggle")) else if(dose < 2) - M.stuttering = max(M.stuttering, 3) + M.apply_effect(3, STUTTER) M.make_jittery(5) M.dizziness = max(150, M.dizziness) M.make_dizzy(5) @@ -437,7 +438,7 @@ if(prob(10)) M.emote(pick("twitch", "giggle")) else - M.stuttering = max(M.stuttering, 3) + M.apply_effect(3, STUTTER) M.make_jittery(10) M.dizziness = max(150, M.dizziness) M.make_dizzy(10) @@ -476,10 +477,10 @@ color = "#13BC5E" /datum/reagent/aslimetoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) // TODO: check if there's similar code anywhere else - if(M.monkeyizing) + if(M.transforming) return M << "Your flesh rapidly mutates!" - M.monkeyizing = 1 + M.transforming = 1 M.canmove = 0 M.icon = null M.overlays.Cut() diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 3b985aecade..3ba83d55c7f 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1,3 +1,34 @@ + +//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 +// Note that entries in the list are NOT duplicated. So if a reaction pertains to +// more than one chemical it will still only appear in only one of the sublists. +/proc/initialize_chemical_reactions() + var/paths = typesof(/datum/chemical_reaction) - /datum/chemical_reaction + chemical_reactions_list = list() + + for(var/path in paths) + var/datum/chemical_reaction/D = new path() + if(D.required_reagents && D.required_reagents.len) + var/reagent_id = D.required_reagents[1] + if(!chemical_reactions_list[reagent_id]) + chemical_reactions_list[reagent_id] = list() + chemical_reactions_list[reagent_id] += D + +//helper that ensures the reaction rate holds after iterating +//Ex. REACTION_RATE(0.3) means that 30% of the reagents will react each chemistry tick (~2 seconds by default). +#define REACTION_RATE(rate) (1.0 - (1.0-rate)**(1.0/PROCESS_REACTION_ITER)) + +//helper to define reaction rate in terms of half-life +//Ex. +//HALF_LIFE(0) -> Reaction completes immediately (default chems) +//HALF_LIFE(1) -> Half of the reagents react immediately, the rest over the following ticks. +//HALF_LIFE(2) -> Half of the reagents are consumed after 2 chemistry ticks. +//HALF_LIFE(3) -> Half of the reagents are consumed after 3 chemistry ticks. +#define HALF_LIFE(ticks) (ticks? 1.0 - (0.5)**(1.0/(ticks*PROCESS_REACTION_ITER)) : 1.0) + /datum/chemical_reaction var/name = null var/id = null @@ -5,18 +36,112 @@ var/list/required_reagents = list() var/list/catalysts = list() var/list/inhibitors = list() - var/result_amount = 0 + + //how far the reaction proceeds each time it is processed. Used with either REACTION_RATE or HALF_LIFE macros. + var/reaction_rate = HALF_LIFE(0) + + //if less than 1, the reaction will be inhibited if the ratio of products/reagents is too high. + //0.5 = 50% yield -> reaction will only proceed halfway until products are removed. + var/yield = 1.0 + + //If limits on reaction rate would leave less than this amount of any reagent (adjusted by the reaction ratios), + //the reaction goes to completion. This is to prevent reactions from going on forever with tiny reagent amounts. + var/min_reaction = 2 + var/mix_message = "The solution begins to bubble." + var/reaction_sound = 'sound/effects/bubbles.ogg' var/log_is_important = 0 // If this reaction should be considered important for logging. Important recipes message admins when mixed, non-important ones just log to file. /datum/chemical_reaction/proc/can_happen(var/datum/reagents/holder) + //check that all the required reagents are present + if(!holder.has_all_reagents(required_reagents)) + return 0 + + //check that all the required catalysts are present in the required amount + if(!holder.has_all_reagents(catalysts)) + return 0 + + //check that none of the inhibitors are present in the required amount + if(holder.has_any_reagent(inhibitors)) + return 0 + return 1 +/datum/chemical_reaction/proc/calc_reaction_progress(var/datum/reagents/holder, var/reaction_limit) + var/progress = reaction_limit * reaction_rate //simple exponential progression + + //calculate yield + if(1-yield > 0.001) //if yield ratio is big enough just assume it goes to completion + /* + Determine the max amount of product by applying the yield condition: + (max_product/result_amount) / reaction_limit == yield/(1-yield) + + We make use of the fact that: + reaction_limit = (holder.get_reagent_amount(reactant) / required_reagents[reactant]) of the limiting reagent. + */ + var/yield_ratio = yield/(1-yield) + var/max_product = yield_ratio * reaction_limit * result_amount //rearrange to obtain max_product + var/yield_limit = max(0, max_product - holder.get_reagent_amount(result))/result_amount + + progress = min(progress, yield_limit) //apply yield limit + + //apply min reaction progress - wasn't sure if this should go before or after applying yield + //I guess people can just have their miniscule reactions go to completion regardless of yield. + for(var/reactant in required_reagents) + var/remainder = holder.get_reagent_amount(reactant) - progress*required_reagents[reactant] + if(remainder <= min_reaction*required_reagents[reactant]) + progress = reaction_limit + break + + return progress + +/datum/chemical_reaction/proc/process(var/datum/reagents/holder) + //determine how far the reaction can proceed + var/list/reaction_limits = list() + for(var/reactant in required_reagents) + reaction_limits += holder.get_reagent_amount(reactant) / required_reagents[reactant] + + //determine how far the reaction proceeds + var/reaction_limit = min(reaction_limits) + var/progress_limit = calc_reaction_progress(holder, reaction_limit) + + var/reaction_progress = min(reaction_limit, progress_limit) //no matter what, the reaction progress cannot exceed the stoichiometric limit. + + //need to obtain the new reagent's data before anything is altered + var/data = send_data(holder, reaction_progress) + + //remove the reactants + for(var/reactant in required_reagents) + var/amt_used = required_reagents[reactant] * reaction_progress + holder.remove_reagent(reactant, amt_used, safety = 1) + + //add the product + var/amt_produced = result_amount * reaction_progress + if(result) + holder.add_reagent(result, amt_produced, data, safety = 1) + + on_reaction(holder, amt_produced) + + return reaction_progress + +//called when a reaction processes /datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume) return -/datum/chemical_reaction/proc/send_data(var/datum/reagents/T) +//called after processing reactions, if they occurred +/datum/chemical_reaction/proc/post_reaction(var/datum/reagents/holder) + var/atom/container = holder.my_atom + if(mix_message && container && !ismob(container)) + var/turf/T = get_turf(container) + var/list/seen = viewers(4, T) + for(var/mob/M in seen) + M.show_message("\icon[container] [mix_message]", 1) + playsound(T, reaction_sound, 80, 1) + +//obtains any special data that will be provided to the reaction products +//this is called just before reactants are removed. +/datum/chemical_reaction/proc/send_data(var/datum/reagents/holder, var/reaction_limit) return null /* Common reactions */ @@ -25,21 +150,21 @@ name = "Inaprovaline" id = "inaprovaline" result = "inaprovaline" - required_reagents = list("oxygen" = 1, "carbon" = 1, "sugar" = 1) + required_reagents = list("acetone" = 1, "carbon" = 1, "sugar" = 1) result_amount = 3 /datum/chemical_reaction/dylovene name = "Dylovene" id = "anti_toxin" result = "anti_toxin" - required_reagents = list("silicon" = 1, "potassium" = 1, "nitrogen" = 1) + required_reagents = list("silicon" = 1, "potassium" = 1, "ammonia" = 1) result_amount = 3 /datum/chemical_reaction/tramadol name = "Tramadol" id = "tramadol" result = "tramadol" - required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1) + required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "acetone" = 1) result_amount = 3 /datum/chemical_reaction/paracetamol @@ -54,42 +179,35 @@ id = "oxycodone" result = "oxycodone" required_reagents = list("ethanol" = 1, "tramadol" = 1) - catalysts = list("phoron" = 1) + catalysts = list("phoron" = 5) result_amount = 1 /datum/chemical_reaction/sterilizine name = "Sterilizine" id = "sterilizine" result = "sterilizine" - required_reagents = list("ethanol" = 1, "anti_toxin" = 1, "chlorine" = 1) + required_reagents = list("ethanol" = 1, "anti_toxin" = 1, "hclacid" = 1) result_amount = 3 /datum/chemical_reaction/silicate name = "Silicate" id = "silicate" result = "silicate" - required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1) + required_reagents = list("aluminum" = 1, "silicon" = 1, "acetone" = 1) result_amount = 3 /datum/chemical_reaction/mutagen name = "Unstable mutagen" id = "mutagen" result = "mutagen" - required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) + required_reagents = list("radium" = 1, "phosphorus" = 1, "hclacid" = 1) result_amount = 3 -/datum/chemical_reaction/water - 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) + required_reagents = list("aluminum" = 1, "iron" = 1, "acetone" = 1) result_amount = 3 /datum/chemical_reaction/space_drugs @@ -103,14 +221,14 @@ name = "Space Lube" id = "lube" result = "lube" - required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) + required_reagents = list("water" = 1, "silicon" = 1, "acetone" = 1) result_amount = 4 /datum/chemical_reaction/pacid name = "Polytrinic acid" id = "pacid" result = "pacid" - required_reagents = list("sacid" = 1, "chlorine" = 1, "potassium" = 1) + required_reagents = list("sacid" = 1, "hclacid" = 1, "potassium" = 1) result_amount = 3 /datum/chemical_reaction/synaptizine @@ -131,14 +249,14 @@ name = "Arithrazine" id = "arithrazine" result = "arithrazine" - required_reagents = list("hyronalin" = 1, "hydrogen" = 1) + required_reagents = list("hyronalin" = 1, "hydrazine" = 1) result_amount = 2 /datum/chemical_reaction/impedrezene name = "Impedrezene" id = "impedrezene" result = "impedrezene" - required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1) + required_reagents = list("mercury" = 1, "acetone" = 1, "sugar" = 1) result_amount = 2 /datum/chemical_reaction/kelotane @@ -154,7 +272,7 @@ id = "peridaxon" result = "peridaxon" required_reagents = list("bicaridine" = 2, "clonexadone" = 2) - catalysts = list("phoron" = 1) + catalysts = list("phoron" = 5) result_amount = 2 /datum/chemical_reaction/virus_food @@ -169,14 +287,14 @@ id = "leporazine" result = "leporazine" required_reagents = list("silicon" = 1, "copper" = 1) - catalysts = list("phoron" = 1) + 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) + required_reagents = list("potassium" = 1, "acetone" = 1, "sugar" = 1) result_amount = 3 /datum/chemical_reaction/tricordrazine @@ -190,14 +308,14 @@ name = "Alkysine" id = "alkysine" result = "alkysine" - required_reagents = list("chlorine" = 1, "nitrogen" = 1, "anti_toxin" = 1) + required_reagents = list("hclacid" = 1, "ammonia" = 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_reagents = list("acetone" = 2, "phoron" = 0.1) catalysts = list("phoron" = 1) inhibitors = list("water" = 1) // Messes with cryox result_amount = 1 @@ -206,7 +324,7 @@ name = "Dermaline" id = "dermaline" result = "dermaline" - required_reagents = list("oxygen" = 1, "phosphorus" = 1, "kelotane" = 1) + required_reagents = list("acetone" = 1, "phosphorus" = 1, "kelotane" = 1) result_amount = 3 /datum/chemical_reaction/dexalinp @@ -242,7 +360,7 @@ name = "Cryoxadone" id = "cryoxadone" result = "cryoxadone" - required_reagents = list("dexalin" = 1, "water" = 1, "oxygen" = 1) + required_reagents = list("dexalin" = 1, "water" = 1, "acetone" = 1) result_amount = 3 /datum/chemical_reaction/clonexadone @@ -250,7 +368,7 @@ id = "clonexadone" result = "clonexadone" required_reagents = list("cryoxadone" = 1, "sodium" = 1, "phoron" = 0.1) - catalysts = list("phoron" = 1) + catalysts = list("phoron" = 5) result_amount = 2 /datum/chemical_reaction/spaceacillin @@ -264,14 +382,14 @@ name = "imidazoline" id = "imidazoline" result = "imidazoline" - required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1) + required_reagents = list("carbon" = 1, "hydrazine" = 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) + required_reagents = list("acetone" = 1, "anti_toxin" = 1, "carbon" = 1) result_amount = 3 /datum/chemical_reaction/ipecac @@ -293,7 +411,7 @@ name = "Chloral Hydrate" id = "chloralhydrate" result = "chloralhydrate" - required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) + required_reagents = list("ethanol" = 1, "hclacid" = 3, "water" = 1) result_amount = 1 /datum/chemical_reaction/potassium_chloride @@ -321,7 +439,7 @@ name = "Mindbreaker Toxin" id = "mindbreaker" result = "mindbreaker" - required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1) + required_reagents = list("silicon" = 1, "hydrazine" = 1, "anti_toxin" = 1) result_amount = 3 /datum/chemical_reaction/lipozine @@ -332,19 +450,12 @@ result_amount = 3 /datum/chemical_reaction/surfactant - name = "Foam surfactant" - id = "foam surfactant" - result = "fluorosurfactant" - required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) + name = "Azosurfactant" + id = "surfactant" + result = "surfactant" + required_reagents = list("hydrazine" = 2, "carbon" = 2, "sacid" = 1) result_amount = 5 -/datum/chemical_reaction/ammonia - name = "Ammonia" - id = "ammonia" - result = "ammonia" - required_reagents = list("hydrogen" = 3, "nitrogen" = 1) - result_amount = 3 - /datum/chemical_reaction/diethylamine name = "Diethylamine" id = "diethylamine" @@ -370,7 +481,7 @@ name = "Foaming Agent" id = "foaming_agent" result = "foaming_agent" - required_reagents = list("lithium" = 1, "hydrogen" = 1) + required_reagents = list("lithium" = 1, "hydrazine" = 1) result_amount = 1 /datum/chemical_reaction/glycerol @@ -384,7 +495,7 @@ name = "Sodium Chloride" id = "sodiumchloride" result = "sodiumchloride" - required_reagents = list("sodium" = 1, "chlorine" = 1) + required_reagents = list("sodium" = 1, "hclacid" = 1) result_amount = 2 /datum/chemical_reaction/condensedcapsaicin @@ -392,14 +503,14 @@ id = "condensedcapsaicin" result = "condensedcapsaicin" required_reagents = list("capsaicin" = 2) - catalysts = list("phoron" = 1) + catalysts = list("phoron" = 5) result_amount = 1 /datum/chemical_reaction/coolant name = "Coolant" id = "coolant" result = "coolant" - required_reagents = list("tungsten" = 1, "oxygen" = 1, "water" = 1) + required_reagents = list("tungsten" = 1, "acetone" = 1, "water" = 1) result_amount = 3 log_is_important = 1 @@ -414,14 +525,14 @@ name = "Lexorin" id = "lexorin" result = "lexorin" - required_reagents = list("phoron" = 1, "hydrogen" = 1, "nitrogen" = 1) + required_reagents = list("phoron" = 1, "hydrazine" = 1, "ammonia" = 1) result_amount = 3 /datum/chemical_reaction/methylphenidate name = "Methylphenidate" id = "methylphenidate" result = "methylphenidate" - required_reagents = list("mindbreaker" = 1, "hydrogen" = 1) + required_reagents = list("mindbreaker" = 1, "hydrazine" = 1) result_amount = 3 /datum/chemical_reaction/citalopram @@ -436,7 +547,7 @@ name = "Paroxetine" id = "paroxetine" result = "paroxetine" - required_reagents = list("mindbreaker" = 1, "oxygen" = 1, "inaprovaline" = 1) + required_reagents = list("mindbreaker" = 1, "acetone" = 1, "inaprovaline" = 1) result_amount = 3 /* Solidification */ @@ -561,7 +672,7 @@ /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) + target_tile.assume_gas("phoron", created_volume, 400+T0C) spawn (0) target_tile.hotspot_expose(700, 400) holder.del_reagent("napalm") return @@ -588,7 +699,7 @@ name = "Foam" id = "foam" result = null - required_reagents = list("fluorosurfactant" = 1, "water" = 1) + required_reagents = list("surfactant" = 1, "water" = 1) result_amount = 2 mix_message = "The solution violently bubbles!" @@ -884,7 +995,7 @@ if(holder.my_atom && istype(holder.my_atom, required)) var/obj/item/slime_extract/T = holder.my_atom if(T.Uses > 0) - return 1 + return ..() return 0 /datum/chemical_reaction/slime/on_reaction(var/datum/reagents/holder) @@ -1004,7 +1115,7 @@ var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks 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) + if(M.eyecheck() < FLASH_PROTECTION_MODERATE) flick("e_flash", M.flash) for(var/i = 1, i <= 4 + rand(1,2), i++) @@ -1244,7 +1355,7 @@ id = "tofu" result = null required_reagents = list("soymilk" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 1 /datum/chemical_reaction/tofu/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1305,7 +1416,7 @@ id = "cheesewheel" result = null required_reagents = list("milk" = 40) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 1 /datum/chemical_reaction/cheesewheel/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -1394,29 +1505,29 @@ name = "Iced Tea" id = "icetea" result = "icetea" - required_reagents = list("ice" = 1, "tea" = 3) - result_amount = 4 + required_reagents = list("ice" = 1, "tea" = 2) + result_amount = 3 /datum/chemical_reaction/icecoffee name = "Iced Coffee" id = "icecoffee" result = "icecoffee" - required_reagents = list("ice" = 1, "coffee" = 3) - result_amount = 4 + required_reagents = list("ice" = 1, "coffee" = 2) + result_amount = 3 /datum/chemical_reaction/nuka_cola name = "Nuka Cola" id = "nuka_cola" result = "nuka_cola" - required_reagents = list("uranium" = 1, "cola" = 6) - result_amount = 6 + required_reagents = list("uranium" = 1, "cola" = 5) + result_amount = 5 /datum/chemical_reaction/moonshine name = "Moonshine" id = "moonshine" result = "moonshine" required_reagents = list("nutriment" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/grenadine @@ -1424,7 +1535,7 @@ id = "grenadine" result = "grenadine" required_reagents = list("berryjuice" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/wine @@ -1432,7 +1543,7 @@ id = "wine" result = "wine" required_reagents = list("grapejuice" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/pwine @@ -1440,7 +1551,7 @@ id = "pwine" result = "pwine" required_reagents = list("poisonberryjuice" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/melonliquor @@ -1448,7 +1559,7 @@ id = "melonliquor" result = "melonliquor" required_reagents = list("watermelonjuice" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/bluecuracao @@ -1456,7 +1567,7 @@ id = "bluecuracao" result = "bluecuracao" required_reagents = list("orangejuice" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/spacebeer @@ -1464,7 +1575,7 @@ id = "spacebeer" result = "beer" required_reagents = list("cornoil" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/vodka @@ -1472,7 +1583,7 @@ id = "vodka" result = "vodka" required_reagents = list("potato" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/sake @@ -1480,7 +1591,7 @@ id = "sake" result = "sake" required_reagents = list("rice" = 10) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 10 /datum/chemical_reaction/kahlua @@ -1488,7 +1599,7 @@ id = "kahlua" result = "kahlua" required_reagents = list("coffee" = 5, "sugar" = 5) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 5 /datum/chemical_reaction/gin_tonic @@ -1523,8 +1634,8 @@ name = "White Russian" id = "whiterussian" result = "whiterussian" - required_reagents = list("blackrussian" = 3, "cream" = 2) - result_amount = 5 + required_reagents = list("blackrussian" = 2, "cream" = 1) + result_amount = 3 /datum/chemical_reaction/whiskey_cola name = "Whiskey Cola" @@ -1544,15 +1655,15 @@ name = "Bloody Mary" id = "bloodymary" result = "bloodymary" - required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1) - result_amount = 4 + required_reagents = list("vodka" = 2, "tomatojuice" = 3, "limejuice" = 1) + result_amount = 6 /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 + required_reagents = list("vodka" = 2, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1) + result_amount = 6 /datum/chemical_reaction/brave_bull name = "Brave Bull" @@ -1572,22 +1683,22 @@ name = "Toxins Special" id = "phoronspecial" result = "phoronspecial" - required_reagents = list("rum" = 2, "vermouth" = 1, "phoron" = 2) - result_amount = 5 + required_reagents = list("rum" = 2, "vermouth" = 2, "phoron" = 2) + result_amount = 6 /datum/chemical_reaction/beepsky_smash name = "Beepksy Smash" id = "beepksysmash" result = "beepskysmash" - required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1) - result_amount = 4 + required_reagents = list("limejuice" = 1, "whiskey" = 1, "iron" = 1) + result_amount = 2 /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 + required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 2, "tricordrazine" = 1) + result_amount = 6 /datum/chemical_reaction/irish_cream name = "Irish Cream" @@ -1642,15 +1753,15 @@ name = "Long Island Iced Tea" id = "longislandicedtea" result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1) - result_amount = 4 + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3) + result_amount = 6 /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 + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3) + result_amount = 6 /datum/chemical_reaction/threemileisland name = "Three Mile Island Iced Tea" @@ -1670,8 +1781,8 @@ name = "Black Russian" id = "blackrussian" result = "blackrussian" - required_reagents = list("vodka" = 3, "kahlua" = 2) - result_amount = 5 + required_reagents = list("vodka" = 2, "kahlua" = 1) + result_amount = 3 /datum/chemical_reaction/manhattan name = "Manhattan" @@ -1698,8 +1809,8 @@ name = "Gin Fizz" id = "ginfizz" result = "ginfizz" - required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1) - result_amount = 4 + required_reagents = list("gin" = 1, "sodawater" = 1, "limejuice" = 1) + result_amount = 3 /datum/chemical_reaction/bahama_mama name = "Bahama mama" @@ -1726,22 +1837,22 @@ name = "Demons Blood" id = "demonsblood" result = "demonsblood" - required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) - result_amount = 4 + required_reagents = list("rum" = 3, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) + result_amount = 6 /datum/chemical_reaction/booger name = "Booger" id = "booger" result = "booger" - required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1) - result_amount = 4 + required_reagents = list("cream" = 2, "banana" = 1, "rum" = 1, "watermelonjuice" = 1) + result_amount = 5 /datum/chemical_reaction/antifreeze name = "Anti-freeze" id = "antifreeze" result = "antifreeze" - required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1) - result_amount = 4 + required_reagents = list("vodka" = 1, "cream" = 1, "ice" = 1) + result_amount = 3 /datum/chemical_reaction/barefoot name = "Barefoot" @@ -1776,7 +1887,7 @@ id = "mead" result = "mead" required_reagents = list("sugar" = 1, "water" = 1) - catalysts = list("enzyme" = 1) + catalysts = list("enzyme" = 5) result_amount = 2 /datum/chemical_reaction/iced_beer @@ -1833,14 +1944,14 @@ id = "changelingsting" result = "changelingsting" required_reagents = list("screwdrivercocktail" = 1, "limejuice" = 1, "lemonjuice" = 1) - result_amount = 5 + result_amount = 3 /datum/chemical_reaction/aloe name = "Aloe" id = "aloe" result = "aloe" required_reagents = list("cream" = 1, "whiskey" = 1, "watermelonjuice" = 1) - result_amount = 2 + result_amount = 3 /datum/chemical_reaction/andalusia name = "Andalusia" @@ -1881,8 +1992,8 @@ name = "Erika Surprise" id = "erikasurprise" result = "erikasurprise" - required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1) - result_amount = 5 + required_reagents = list("ale" = 2, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1) + result_amount = 6 /datum/chemical_reaction/devilskiss name = "Devils Kiss" @@ -1931,14 +2042,14 @@ id = "kiraspecial" result = "kiraspecial" required_reagents = list("orangejuice" = 1, "limejuice" = 1, "sodawater" = 1) - result_amount = 2 + result_amount = 3 /datum/chemical_reaction/brownstar name = "Brown Star" id = "brownstar" result = "brownstar" required_reagents = list("orangejuice" = 2, "cola" = 1) - result_amount = 2 + result_amount = 3 /datum/chemical_reaction/milkshake name = "Milkshake" @@ -1958,8 +2069,8 @@ name = "Sui Dream" id = "suidream" result = "suidream" - required_reagents = list("space_up" = 2, "bluecuracao" = 1, "melonliquor" = 1) - result_amount = 4 + required_reagents = list("space_up" = 1, "bluecuracao" = 1, "melonliquor" = 1) + result_amount = 3 /datum/chemical_reaction/luminol name = "Luminol" diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index bc75edd6ac7..0e7321089c8 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -10,18 +10,17 @@ sugar spawn_reagent = "sugar" // Chemistry - hydrogen spawn_reagent = "hydrogen" + hydrazine spawn_reagent = "hydrazine" lithium spawn_reagent = "lithium" carbon spawn_reagent = "carbon" - nitrogen spawn_reagent = "nitrogen" - oxygen spawn_reagent = "oxygen" - fluorine spawn_reagent = "fluorine" + ammonia spawn_reagent = "ammonia" + acetone spawn_reagent = "acetone" sodium spawn_reagent = "sodium" aluminum spawn_reagent = "aluminum" silicon spawn_reagent = "silicon" phosphorus spawn_reagent = "phosphorus" sulfur spawn_reagent = "sulfur" - chlorine spawn_reagent = "chlorine" + hclacid spawn_reagent = "hclacid" potassium spawn_reagent = "potassium" iron spawn_reagent = "iron" copper spawn_reagent = "copper" diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm index 161716efd86..350cb0deea9 100644 --- a/code/modules/reagents/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/dispenser/dispenser_presets.dm @@ -1,17 +1,16 @@ /obj/machinery/chemical_dispenser/full spawn_cartridges = list( - /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum, /obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/iron, /obj/item/weapon/reagent_containers/chem_disp_cartridge/copper, diff --git a/code/modules/reagents/dispenser/supply.dm b/code/modules/reagents/dispenser/supply.dm index d0b1cd559fc..0c8f6e15d6f 100644 --- a/code/modules/reagents/dispenser/supply.dm +++ b/code/modules/reagents/dispenser/supply.dm @@ -31,18 +31,17 @@ /datum/supply_packs/reagents name = "Chemistry dispenser refill" contains = list( - /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum, /obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/iron, /obj/item/weapon/reagent_containers/chem_disp_cartridge/copper, @@ -128,7 +127,7 @@ group = "Reagents" #define SEC_PACK(_tname, _type, _name, _cname, _cost, _access)\ - /datum/supply_packs/dispenser_cartridges{\ + datum/supply_packs/dispenser_cartridges{\ _tname {\ name = _name ;\ containername = _cname ;\ @@ -140,7 +139,7 @@ }\ } #define PACK(_tname, _type, _name, _cname, _cost)\ - /datum/supply_packs/dispenser_cartridges{\ + datum/supply_packs/dispenser_cartridges{\ _tname {\ name = _name ;\ containername = _cname ;\ @@ -153,18 +152,17 @@ // Chemistry-restricted (raw reagents excluding sugar/water) // Datum path Contents type Supply pack name Container name Cost Container access -SEC_PACK(hydrogen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen, "Reagent refill - Hydrogen", "hydrogen reagent cartridge crate", 15, access_chemistry) +SEC_PACK(hydrazine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine, "Reagent refill - Hydrazine", "hydrazine reagent cartridge crate", 15, access_chemistry) SEC_PACK(lithium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium, "Reagent refill - Lithium", "lithium reagent cartridge crate", 15, access_chemistry) SEC_PACK(carbon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon, "Reagent refill - Carbon", "carbon reagent cartridge crate", 15, access_chemistry) -SEC_PACK(nitrogen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen, "Reagent refill - Nitrogen", "nitrogen reagent cartridge crate", 15, access_chemistry) -SEC_PACK(oxygen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen, "Reagent refill - Oxygen", "oxygen reagent cartridge crate", 15, access_chemistry) -SEC_PACK(fluorine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine, "Reagent refill - Fluorine", "fluorine reagent cartridge crate", 15, access_chemistry) +SEC_PACK(ammonia, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia, "Reagent refill - Ammonia", "ammonia reagent cartridge crate", 15, access_chemistry) +SEC_PACK(oxygen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone, "Reagent refill - Acetone", "acetone reagent cartridge crate", 15, access_chemistry) SEC_PACK(sodium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium, "Reagent refill - Sodium", "sodium reagent cartridge crate", 15, access_chemistry) SEC_PACK(aluminium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum, "Reagent refill - Aluminum", "aluminum reagent cartridge crate", 15, access_chemistry) SEC_PACK(silicon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon, "Reagent refill - Silicon", "silicon reagent cartridge crate", 15, access_chemistry) SEC_PACK(phosphorus,/obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus, "Reagent refill - Phosphorus", "phosphorus reagent cartridge crate", 15, access_chemistry) SEC_PACK(sulfur, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur, "Reagent refill - Sulfur", "sulfur reagent cartridge crate", 15, access_chemistry) -SEC_PACK(chlorine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine, "Reagent refill - Chlorine", "chlorine reagent cartridge crate", 15, access_chemistry) +SEC_PACK(hclacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid, "Reagent refill - Hydrochloric Acid", "hydrochloric acid reagent cartridge crate", 15, access_chemistry) SEC_PACK(potassium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium, "Reagent refill - Potassium", "potassium reagent cartridge crate", 15, access_chemistry) SEC_PACK(iron, /obj/item/weapon/reagent_containers/chem_disp_cartridge/iron, "Reagent refill - Iron", "iron reagent cartridge crate", 15, access_chemistry) SEC_PACK(copper, /obj/item/weapon/reagent_containers/chem_disp_cartridge/copper, "Reagent refill - Copper", "copper reagent cartridge crate", 15, access_chemistry) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 791a0b27e0e..1164b625c58 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -73,7 +73,7 @@ user.attack_log += text("\[[time_stamp()]\] Used the [name] to splash [target.name] ([target.key]). Reagents: [contained]") msg_admin_attack("[user.name] ([user.ckey]) splashed [target.name] ([target.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") - user.visible_message("[target] has been splashed with something by [user]!", "You splash the solution onto [target].") + user.visible_message("[target] has been splashed with something by [user]!", "You splash the solution onto [target].") reagents.splash(target, reagents.total_volume) if (istype(target, /mob/living/silicon/robot)) @@ -86,10 +86,10 @@ user << "You eat \the [src]" /obj/item/weapon/reagent_containers/proc/other_feed_message_start(var/mob/user, var/mob/target) - user.visible_message("[user] is trying to feed [target] \the [src]!") + user.visible_message("[user] is trying to feed [target] \the [src]!") /obj/item/weapon/reagent_containers/proc/other_feed_message_finish(var/mob/user, var/mob/target) - user.visible_message("[user] has fed [target] \the [src]!") + user.visible_message("[user] has fed [target] \the [src]!") /obj/item/weapon/reagent_containers/proc/feed_sound(var/mob/user) return @@ -102,35 +102,33 @@ user << "\The [src] is empty." return 1 - var/types = target.find_type() + //var/types = target.find_type() var/mob/living/carbon/human/H if(istype(target, /mob/living/carbon/human)) H = target if(target == user) - if (H) - if(H.species.flags & IS_SYNTHETIC) - H << "You have a monitor for a head, where do you think you're going to put that?" + if(istype(user, /mob/living/carbon/human)) + H = user + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? You don't have a mouth!" return 1 - var/obj/item/blocked = H.check_mouth_coverage() if(blocked) user << "\The [blocked] is in the way!" return + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //puts a limit on how fast people can eat/drink things self_feed_message(user) reagents.trans_to_mob(user, amount_per_transfer_from_this, CHEM_INGEST) feed_sound(user) return 1 - else if (types & TYPE_SYNTHETIC) - if(H && (H.species.flags & IS_SYNTHETIC)) - H << "They have a monitor for a head, where do you think you're going to put that?" - return 1 - - standard_splash_mob(user, target) - return 0 else - if (H) + if(istype(target, /mob/living/carbon/human)) + H = target + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!" + return var/obj/item/blocked = H.check_mouth_coverage() if(blocked) user << "\The [blocked] is in the way!" @@ -138,6 +136,7 @@ other_feed_message_start(user, target) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!do_mob(user, target)) return @@ -153,7 +152,15 @@ return 1 /obj/item/weapon/reagent_containers/proc/standard_pour_into(var/mob/user, var/atom/target) // This goes into afterattack and yes, it's atom-level - if(!target.is_open_container() || !target.reagents) + if(!target.reagents) + return 0 + + // Ensure we don't splash beakers and similar containers. + if(!target.is_open_container() && istype(target, /obj/item/weapon/reagent_containers)) + user << "\The [target] is closed." + return 1 + // Otherwise don't care about splashing. + else if(!target.is_open_container()) return 0 if(!reagents || !reagents.total_volume) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 19c42f0ef38..7ccd2c76ce2 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -59,7 +59,17 @@ user << "The injector is empty." return - if(M.can_inject(user, 1)) + var/mob/living/carbon/human/H = M + if(istype(H)) + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + if(!affected) + user << "\The [H] is missing that limb!" + return + else if(affected.status & ORGAN_ROBOT) + user << "You cannot inject a robotic limb." + return + + if (M.can_inject(user, 1)) user << "You inject [M] with the injector." M << "You feel a tiny prick!" diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index aeea6d4b558..c352b603328 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -30,7 +30,7 @@ if(ismob(target)) var/time = 20 //2/3rds the time of a syringe - user.visible_message("[user] is trying to squirt something into [target]'s eyes!") + user.visible_message("[user] is trying to squirt something into [target]'s eyes!") if(!do_mob(user, target, time)) return @@ -40,10 +40,10 @@ var/obj/item/safe_thing = null if(victim.wear_mask) - if (victim.wear_mask.flags & MASKCOVERSEYES) + if (victim.wear_mask.body_parts_covered & EYES) safe_thing = victim.wear_mask if(victim.head) - if (victim.head.flags & MASKCOVERSEYES) + if (victim.head.body_parts_covered & EYES) safe_thing = victim.head if(victim.glasses) if (!safe_thing) @@ -65,7 +65,7 @@ return else - trans = reagents.trans_to_obj(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs + trans = reagents.trans_to(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs user << "You transfer [trans] units of the solution." else // Taking from something diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index 1b94dfcdae1..c5bcbf87ab8 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -1,10 +1,11 @@ -#define CELLS 4 +#define CELLS 8 #define CELLSIZE (32/CELLS) //////////////////////////////////////////////////////////////////////////////// /// Food. //////////////////////////////////////////////////////////////////////////////// /obj/item/weapon/reagent_containers/food + flags = OPENCONTAINER possible_transfer_amounts = null volume = 50 //Sets the default container amount for all food items. var/filling_color = "#FFFFFF" //Used by sandwiches. @@ -13,7 +14,7 @@ /obj/item/weapon/reagent_containers/food/New() ..() - if (!pixel_x && !pixel_y) + if (isnull(center_of_mass) && !pixel_x && !pixel_y) src.pixel_x = rand(-6.0, 6) //Randomizes postion src.pixel_y = rand(-6.0, 6) diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index 8155207b7e4..7d72b8bf51f 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -1,43 +1,12 @@ /obj/item/weapon/reagent_containers/food/drinks/cans + volume = 40 //just over one and a half cups amount_per_transfer_from_this = 5 - flags = 0 - - attack_self(mob/user as mob) - if (!is_open_container()) - playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1) - user << "You open the drink with an audible pop!" - flags |= OPENCONTAINER - else - return - - attack(mob/M as mob, mob/user as mob, def_zone) - if(!is_open_container()) - user << "You need to open the drink!" - return - - return ..() - - - afterattack(obj/target, mob/user, proximity) - if(!proximity) return - - if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - if(!is_open_container()) - user << "You need to open the drink!" - return - - - else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. - if(!is_open_container()) - user << "You need to open the drink!" - return - - return ..() + flags = 0 //starts closed //DRINKS /obj/item/weapon/reagent_containers/food/drinks/cans/cola - name = "Space Cola" + name = "\improper Space Cola" desc = "Cola. in space." icon_state = "cola" center_of_mass = list("x"=16, "y"=10) @@ -46,7 +15,7 @@ reagents.add_reagent("cola", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle - name = "Bottled Water" + name = "bottled water" desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles." icon_state = "waterbottle" center_of_mass = list("x"=15, "y"=8) @@ -54,28 +23,8 @@ ..() reagents.add_reagent("water", 30) -/obj/item/weapon/reagent_containers/food/drinks/cans/beer - name = "Space Beer" - desc = "Contains only water, malt and hops." - icon_state = "beer" - center_of_mass = list("x"=16, "y"=12) - New() - ..() - reagents.add_reagent("beer", 30) - -/obj/item/weapon/reagent_containers/food/drinks/cans/ale - name = "Magm-Ale" - desc = "A true dorf's drink of choice." - icon_state = "alebottle" - item_state = "beer" - center_of_mass = list("x"=16, "y"=10) - New() - ..() - reagents.add_reagent("ale", 30) - - /obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind - name = "Space Mountain Wind" + name = "\improper Space Mountain Wind" desc = "Blows right through you like a space wind." icon_state = "space_mountain_wind" center_of_mass = list("x"=16, "y"=10) @@ -84,7 +33,7 @@ reagents.add_reagent("spacemountainwind", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko - name = "Thirteen Loko" + name = "\improper Thirteen Loko" desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly." icon_state = "thirteen_loko" center_of_mass = list("x"=16, "y"=8) @@ -93,7 +42,7 @@ reagents.add_reagent("thirteenloko", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb - name = "Dr. Gibb" + name = "\improper Dr. Gibb" desc = "A delicious mixture of 42 different flavors." icon_state = "dr_gibb" center_of_mass = list("x"=16, "y"=10) @@ -102,7 +51,7 @@ reagents.add_reagent("dr_gibb", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/starkist - name = "Star-kist" + name = "\improper Star-kist" desc = "The taste of a star in liquid form. And, a bit of tuna...?" icon_state = "starkist" center_of_mass = list("x"=16, "y"=10) @@ -111,7 +60,7 @@ reagents.add_reagent("brownstar", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/space_up - name = "Space-Up" + name = "\improper Space-Up" desc = "Tastes like a hull breach in your mouth." icon_state = "space-up" center_of_mass = list("x"=16, "y"=10) @@ -120,7 +69,7 @@ reagents.add_reagent("space_up", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime - name = "Lemon-Lime" + name = "\improper Lemon-Lime" desc = "You wanted ORANGE. It gave you Lemon Lime." icon_state = "lemon-lime" center_of_mass = list("x"=16, "y"=10) @@ -129,7 +78,7 @@ reagents.add_reagent("lemon_lime", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea - name = "Vrisk Serket Iced Tea" + name = "\improper Vrisk Serket Iced Tea" desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?" icon_state = "ice_tea_can" center_of_mass = list("x"=16, "y"=10) @@ -138,7 +87,7 @@ reagents.add_reagent("icetea", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice - name = "Grapel Juice" + name = "\improper Grapel Juice" desc = "500 pages of rules of how to appropriately enter into a combat with this juice!" icon_state = "purple_can" center_of_mass = list("x"=16, "y"=10) @@ -147,7 +96,7 @@ reagents.add_reagent("grapejuice", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/tonic - name = "T-Borg's Tonic Water" + name = "\improper T-Borg's Tonic Water" desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." icon_state = "tonic" center_of_mass = list("x"=16, "y"=10) @@ -156,7 +105,7 @@ reagents.add_reagent("tonic", 50) /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater - name = "Soda Water" + name = "soda water" desc = "A can of soda water. Still water's more refreshing cousin." icon_state = "sodawater" center_of_mass = list("x"=16, "y"=10) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index e4223197268..0820f4445d1 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -14,13 +14,22 @@ return attack_self(mob/user as mob) - return + if(!is_open_container()) + open(user) + + proc/open(mob/user) + playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1) + user << "You open [src] with an audible pop!" + flags |= OPENCONTAINER attack(mob/M as mob, mob/user as mob, def_zone) - if (user.a_intent == I_HURT) - return standard_splash_mob(user, M) - return standard_feed_mob(user, M) + if(force && !(flags & NOBLUDGEON) && user.a_intent == I_HURT) + return ..() + if(standard_feed_mob(user, M)) + return + + return 0 afterattack(obj/target, mob/user, proximity) if(!proximity) return @@ -29,7 +38,24 @@ return if(standard_pour_into(user, target)) return + return ..() + standard_feed_mob(var/mob/user, var/mob/target) + if(!is_open_container()) + user << "You need to open [src]!" + return 1 + return ..() + + standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) + if(!is_open_container()) + user << "You need to open [src]!" + return 1 + return ..() + + standard_pour_into(var/mob/user, var/atom/target) + if(!is_open_container()) + user << "You need to open [src]!" + return 1 return ..() self_feed_message(var/mob/user) @@ -70,10 +96,6 @@ volume = 150 flags = CONDUCT | OPENCONTAINER -/obj/item/weapon/reagent_containers/food/drinks/golden_cup/tournament_26_06_2011 - desc = "A golden cup. It will be presented to a winner of tournament 26 june and name of the winner will be graved on it." - - ///////////////////////////////////////////////Drinks //Notes by Darem: Drinks are simply containers that start preloaded. Unlike condiments, the contents can be ingested directly // rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50. diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 5d276386cd5..6ed512ec11d 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -4,23 +4,57 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle amount_per_transfer_from_this = 5//Smaller sip size for more BaRP and less guzzling a litre of vodka before you realise it - volume = 120 + volume = 100 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. - var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) + force = 5 + var/smash_duration = 5 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it + var/obj/item/weapon/reagent_containers/glass/rag/rag = null + var/rag_underlay = "rag" + /obj/item/weapon/reagent_containers/food/drinks/bottle/New() ..() if(isGlass) unacidable = 1 -/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target as mob, mob/living/user as mob) +/obj/item/weapon/reagent_containers/food/drinks/bottle/Destroy() + if(rag) + rag.forceMove(src.loc) + rag = null + return ..() + +//when thrown on impact, bottles smash and spill their contents +/obj/item/weapon/reagent_containers/food/drinks/bottle/throw_impact(atom/hit_atom, var/speed) + ..() + + var/mob/M = thrower + if(isGlass && istype(M) && M.a_intent == I_HURT) + var/throw_dist = get_dist(throw_source, loc) + if(speed >= throw_speed && smash_check(throw_dist)) //not as reliable as smashing directly + if(reagents) + hit_atom.visible_message("The contents of \the [src] splash all over [hit_atom]!") + reagents.splash(hit_atom, reagents.total_volume) + src.smash(loc, hit_atom) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash_check(var/distance) + if(!isGlass || !smash_duration) + return 0 + + var/list/chance_table = list(90, 90, 85, 85, 60, 35, 15) //starting from distance 0 + var/idx = max(distance + 1, 1) //since list indices start at 1 + if(idx > chance_table.len) + return 0 + return prob(chance_table[idx]) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(var/newloc, atom/against = null) + if(ismob(loc)) + var/mob/M = loc + M.drop_from_inventory(src) //Creates a shattering noise and replaces the bottle with a broken_bottle - user.drop_item() - var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(user.loc) - user.put_in_active_hand(B) + var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(newloc) if(prob(33)) - new/obj/item/weapon/material/shard(target.loc) // Create a glass shard at the target's location! + new/obj/item/weapon/material/shard(newloc) // Create a glass shard at the target's location! B.icon_state = src.icon_state var/icon/I = new('icons/obj/drinks.dmi', src.icon_state) @@ -28,66 +62,91 @@ I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) B.icon = I + if(rag && rag.on_fire && isliving(against)) + rag.forceMove(loc) + var/mob/living/L = against + L.IgniteMob() + playsound(src, "shatter", 70, 1) - user.put_in_active_hand(B) src.transfer_fingerprints_to(B) qdel(src) + return B -/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob) - - if(!target) +/obj/item/weapon/reagent_containers/food/drinks/bottle/attackby(obj/item/W, mob/user) + if(!rag && istype(W, /obj/item/weapon/reagent_containers/glass/rag)) + insert_rag(W, user) return + if(rag && istype(W, /obj/item/weapon/flame)) + rag.attackby(W, user) + return + ..() - if(user.a_intent != I_HURT || !isGlass) - return ..() - - - force = 15 //Smashing bottles over someoen's head hurts. - - var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at - - var/armor_block = 0 //Get the target's armour values for normal attack damage. - var/armor_duration = 0 //The more force the bottle has, the longer the duration. - - //Calculating duration and calculating damage. - armor_block = target.run_armor_check(affecting, "melee") - armor_duration = duration + force - target.getarmor(affecting, "melee") - - //Apply the damage! - target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0) - - // You are going to knock someone out for longer if they are not wearing a helmet. - if(affecting == "head" && istype(target, /mob/living/carbon/)) - - //Display an attack message. - for(var/mob/O in viewers(user, null)) - if(target != user) O.show_message(text("\red [target] has been hit over the head with a bottle of [src.name], by [user]!"), 1) - else O.show_message(text("\red [target] hit \himself with a bottle of [src.name] on the head!"), 1) - //Weaken the target for the duration that we calculated and divide it by 5. - if(armor_duration) - target.apply_effect(min(armor_duration, 10) , WEAKEN, armor_block) // Never weaken more than a flash! - +/obj/item/weapon/reagent_containers/food/drinks/bottle/attack_self(mob/user) + if(rag) + remove_rag(user) else - //Default attack message and don't weaken the target. - for(var/mob/O in viewers(user, null)) - if(target != user) O.show_message(text("\red [target] has been attacked with a bottle of [src.name], by [user]!"), 1) - else O.show_message(text("\red [target] has attacked \himself with a bottle of [src.name]!"), 1) + ..() - //Attack logs - user.attack_log += text("\[[time_stamp()]\] Has attacked [target.name] ([target.ckey]) with a bottle!") - target.attack_log += text("\[[time_stamp()]\] Has been smashed with a bottle by [user.name] ([user.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (JMP)") +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/insert_rag(obj/item/weapon/reagent_containers/glass/rag/R, mob/user) + if(!isGlass || rag) return + if(user.unEquip(R)) + user << "You stuff [R] into [src]." + rag = R + rag.forceMove(src) + flags &= ~OPENCONTAINER + update_icon() + +/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/remove_rag(mob/user) + if(!rag) return + user.put_in_hands(rag) + rag = null + flags |= (initial(flags) & OPENCONTAINER) + update_icon() + +/obj/item/weapon/reagent_containers/food/drinks/bottle/open(mob/user) + if(rag) return + ..() + +/obj/item/weapon/reagent_containers/food/drinks/bottle/update_icon() + underlays.Cut() + if(rag) + var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.on_fire? "[rag_underlay]_lit" : rag_underlay) + underlays += underlay_image + copy_light(rag) + else + set_light(0) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + var/blocked = ..() + + if(user.a_intent != I_HURT) + return + if(!smash_check(1)) + return //won't always break on the first hit + + // You are going to knock someone out for longer if they are not wearing a helmet. + var/weaken_duration = 0 + if(blocked < 2) + weaken_duration = smash_duration + min(0, force - target.getarmor(hit_zone, "melee") + 10) + + var/mob/living/carbon/human/H = target + if(istype(H) && H.headcheck(hit_zone)) + var/obj/item/organ/affecting = H.get_organ(hit_zone) //headcheck should ensure that affecting is not null + user.visible_message("[user] smashes [src] into [H]'s [affecting.name]!") + if(weaken_duration) + target.apply_effect(min(weaken_duration, 5), WEAKEN, blocked) // Never weaken more than a flash! + else + user.visible_message("\The [user] smashes [src] into [target]!") //The reagents in the bottle splash all over the target, thanks for the idea Nodrak if(reagents) - user.visible_message("The contents of the [src] splash all over [target]!") + user.visible_message("The contents of \the [src] splash all over [target]!") reagents.splash(target, reagents.total_volume) //Finally, smash the bottle. This kills (qdel) the bottle. - src.smash(target, user) - - return + var/obj/item/weapon/broken_bottle/B = smash(target.loc, target) + user.put_in_active_hand(B) //Keeping this here for now, I'll ask if I should keep it here. /obj/item/weapon/broken_bottle @@ -96,8 +155,8 @@ desc = "A bottle with a sharp broken bottom." icon = 'icons/obj/drinks.dmi' icon_state = "broken_bottle" - force = 9.0 - throwforce = 5.0 + force = 9 + throwforce = 5 throw_speed = 3 throw_range = 5 item_state = "beer" @@ -264,6 +323,33 @@ ..() reagents.add_reagent("grenadine", 100) +/obj/item/weapon/reagent_containers/food/drinks/bottle/cola + name = "\improper Space Cola" + desc = "Cola. in space" + icon_state = "colabottle" + center_of_mass = list("x"=16, "y"=6) + New() + ..() + reagents.add_reagent("cola", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up + name = "\improper Space-Up" + desc = "Tastes like a hull breach in your mouth." + icon_state = "space-up_bottle" + center_of_mass = list("x"=16, "y"=6) + New() + ..() + reagents.add_reagent("space_up", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind + name = "\improper Space Mountain Wind" + desc = "Blows right through you like a space wind." + icon_state = "space_mountain_wind_bottle" + center_of_mass = list("x"=16, "y"=6) + New() + ..() + reagents.add_reagent("spacemountainwind", 100) + /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine name = "Warlock's Velvet" desc = "What a delightful packaging for a surely high quality wine! The vintage must be amazing!" @@ -319,6 +405,32 @@ ..() reagents.add_reagent("limejuice", 100) +//Small bottles +/obj/item/weapon/reagent_containers/food/drinks/bottle/small + volume = 50 + smash_duration = 1 + flags = 0 //starts closed + rag_underlay = "rag_small" + +/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer + name = "space beer" + desc = "Contains only water, malt and hops." + icon_state = "beer" + center_of_mass = list("x"=16, "y"=12) + New() + ..() + reagents.add_reagent("beer", 30) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale + name = "\improper Magm-Ale" + desc = "A true dorf's drink of choice." + icon_state = "alebottle" + item_state = "beer" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("ale", 30) + //aurora's drinks /obj/item/weapon/reagent_containers/food/drinks/bottle/chartreusegreen diff --git a/code/modules/reagents/reagent_containers/food/drinks/jar.dm b/code/modules/reagents/reagent_containers/food/drinks/jar.dm index 47abb8637a3..daebb0638c5 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/jar.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/jar.dm @@ -9,23 +9,14 @@ item_state = "beaker" center_of_mass = list("x"=15, "y"=8) unacidable = 1 - New() - ..() - reagents.add_reagent("slime", 50) - on_reagent_change() - if (reagents.reagent_list.len > 0) - switch(reagents.get_master_reagent_id()) - if("slime") - icon_state = "jar_slime" - name = "slime jam" - desc = "A jar of slime jam. Delicious!" - else - icon_state ="jar_what" - name = "jar of something" - desc = "You can't really tell what this is." - else - icon_state = "jar" - name = "empty jar" - desc = "A jar. You're not sure what it's supposed to hold." - return +/obj/item/weapon/reagent_containers/food/drinks/jar/on_reagent_change() + if (reagents.reagent_list.len > 0) + icon_state ="jar_what" + name = "jar of something" + desc = "You can't really tell what this is." + else + icon_state = "jar" + name = "empty jar" + desc = "A jar. You're not sure what it's supposed to hold." + return diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 0cb69d3faf6..4186c997037 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -11,7 +11,7 @@ var/slices_num var/dried_type = null var/dry = 0 - center_of_mass = list("x"=15, "y"=15) + center_of_mass = list("x"=16, "y"=16) w_class = 2 //Placeholder for effect that trigger on eating that aren't tied to reagents. @@ -41,19 +41,21 @@ return 0 if(istype(M, /mob/living/carbon)) + //TODO: replace with standard_feed_mob() call. + var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25) if(M == user) //If you're eating it yourself if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - H << "You have a monitor for a head, where do you think you're going to put that?" + if(!H.check_has_mouth()) + user << "Where do you intend to put \the [src]? You don't have a mouth!" return - var/obj/item/blocked = H.check_mouth_coverage() if(blocked) user << "\The [blocked] is in the way!" return + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //puts a limit on how fast people can eat/drink things if (fullness <= 50) M << "You hungrily chew out a piece of [src] and gobble it!" if (fullness > 50 && fullness <= 150) @@ -66,37 +68,24 @@ M << "You cannot force any more of [src] to go down your throat." return 0 else - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - user << "They have a monitor for a head, where do you think you're going to put that?" - return - - var/obj/item/blocked = H.check_mouth_coverage() - if(blocked) - user << "\The [blocked] is in the way!" - return - - if(!istype(M, /mob/living/carbon/slime)) //If you're feeding it to someone else. - - if (fullness <= (550 * (1 + M.overeatduration / 1000))) - user.visible_message("[user] attempts to feed [M] [src].") - else - user.visible_message("[user] cannot force anymore of [src] down [M]'s throat.") - return 0 - - if(!do_mob(user, M)) return - - M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]") - user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]") - msg_admin_attack("[key_name(user)] fed [key_name(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)]) (JMP)") - - user.visible_message("[user] feeds [M] [src].") - - else - user << "This creature does not seem to have a mouth!" + if(!M.can_force_feed(user, src)) return + if (fullness <= (550 * (1 + M.overeatduration / 1000))) + user.visible_message("[user] attempts to feed [M] [src].") + else + user.visible_message("[user] cannot force anymore of [src] down [M]'s throat.") + return 0 + + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(!do_mob(user, M)) return + + M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]") + user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]") + msg_admin_attack("[key_name(user)] fed [key_name(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)])") + + user.visible_message("[user] feeds [M] [src].") + if(reagents) //Handle ingestion of the reagent. playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1) if(reagents.total_volume) @@ -148,11 +137,11 @@ if (bitecount==0) return else if (bitecount==1) - user << "\blue \The [src] was bitten by someone!" + user << "\The [src] was bitten by someone!" else if (bitecount<=3) - user << "\blue \The [src] was bitten [bitecount] times!" + user << "\The [src] was bitten [bitecount] time\s!" else - user << "\blue \The [src] was bitten multiple times!" + user << "\The [src] was bitten multiple times!" /obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/storage)) @@ -162,32 +151,32 @@ // Eating with forks if(istype(W,/obj/item/weapon/material/kitchen/utensil)) var/obj/item/weapon/material/kitchen/utensil/U = W + if(U.scoop_food) + if(!U.reagents) + U.create_reagents(5) - if(!U.reagents) - U.create_reagents(5) + if (U.reagents.total_volume > 0) + user << "You already have something on your [U]." + return - if (U.reagents.total_volume > 0) - user << "\red You already have something on your [U]." + user.visible_message( \ + "\The [user] scoops up some [src] with \the [U]!", \ + "You scoop up some [src] with \the [U]!" \ + ) + + src.bitecount++ + U.overlays.Cut() + U.loaded = "[src]" + var/image/I = new(U.icon, "loadedfood") + I.color = src.filling_color + U.overlays += I + + reagents.trans_to_obj(U, min(reagents.total_volume,5)) + + if (reagents.total_volume <= 0) + qdel(src) return - user.visible_message( \ - "[user] scoops up some [src] with \the [U]!", \ - "\blue You scoop up some [src] with \the [U]!" \ - ) - - src.bitecount++ - U.overlays.Cut() - U.loaded = "[src]" - var/image/I = new(U.icon, "loadedfood") - I.color = src.filling_color - U.overlays += I - - reagents.trans_to_obj(U, min(reagents.total_volume,5)) - - if (reagents.total_volume <= 0) - qdel(src) - return - if (is_sliceable()) //these are used to allow hiding edge items in food that is not on a table/tray var/can_slice_here = isturf(src.loc) && ((locate(/obj/structure/table) in src.loc) || (locate(/obj/machinery/optable) in src.loc) || (locate(/obj/item/weapon/tray) in src.loc)) @@ -197,7 +186,7 @@ if (W.w_class >= src.w_class || is_robot_module(W)) return - user << "\red You slip [W] inside [src]." + user << "You slip \the [W] inside \the [src]." user.remove_from_mob(W) W.dropped(user) add_fingerprint(user) @@ -206,15 +195,15 @@ if (has_edge(W)) if (!can_slice_here) - user << "\red You cannot slice [src] here! You need a table or at least a tray to do it." + user << "You cannot slice \the [src] here! You need a table or at least a tray to do it." return var/slices_lost = 0 if (W.w_class > 3) - user.visible_message("\blue [user] crudely slices \the [src] with [W]!", "\blue You crudely slice \the [src] with your [W]!") + user.visible_message("\The [user] crudely slices \the [src] with [W]!", "You crudely slice \the [src] with your [W]!") slices_lost = rand(1,min(1,round(slices_num/2))) else - user.visible_message("\blue [user] slices \the [src]!", "\blue You slice \the [src]!") + user.visible_message("\The [user] slices \the [src]!", "You slice \the [src]!") var/reagents_per_slice = reagents.total_volume/slices_num for(var/i=1 to (slices_num-slices_lost)) @@ -319,6 +308,7 @@ icon_state = "aesirsalad" trash = /obj/item/trash/snack_bowl filling_color = "#468C00" + center_of_mass = list("x"=17, "y"=11) New() ..() @@ -333,6 +323,7 @@ icon_state = "candy" trash = /obj/item/trash/candy filling_color = "#7D5F46" + center_of_mass = list("x"=15, "y"=15) New() ..() @@ -344,6 +335,7 @@ name = "Donor Candy" desc = "A little treat for blood donors." trash = /obj/item/trash/candy + New() ..() reagents.add_reagent("nutriment", 10) @@ -355,6 +347,7 @@ desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas." icon_state = "candy_corn" filling_color = "#FFFCB0" + center_of_mass = list("x"=14, "y"=10) New() ..() @@ -368,6 +361,7 @@ icon_state = "chips" trash = /obj/item/trash/chips filling_color = "#E8C31E" + center_of_mass = list("x"=15, "y"=15) New() ..() @@ -379,6 +373,7 @@ desc = "COOKIE!!!" icon_state = "COOKIE!!!" filling_color = "#DBC94F" + center_of_mass = list("x"=17, "y"=18) New() ..() @@ -390,6 +385,7 @@ desc = "Such sweet, fattening food." icon_state = "chocolatebar" filling_color = "#7D5F46" + center_of_mass = list("x"=15, "y"=15) New() ..() @@ -403,6 +399,7 @@ desc = "Such sweet, fattening food." icon_state = "chocolateegg" filling_color = "#7D5F46" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -417,6 +414,7 @@ icon_state = "donut1" filling_color = "#D9C386" var/overlay_state = "box-donut1" + center_of_mass = list("x"=13, "y"=16) /obj/item/weapon/reagent_containers/food/snacks/donut/normal name = "donut" @@ -432,6 +430,7 @@ src.overlay_state = "box-donut2" src.name = "frosted donut" reagents.add_reagent("sprinkles", 2) + center_of_mass = list("x"=19, "y"=16) /obj/item/weapon/reagent_containers/food/snacks/donut/chaos name = "Chaos Donut" @@ -478,6 +477,7 @@ desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -496,6 +496,7 @@ desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -514,6 +515,7 @@ desc = "You jelly?" icon_state = "jdonut1" filling_color = "#ED1169" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -532,6 +534,8 @@ desc = "An egg!" icon_state = "egg" filling_color = "#FDFFD1" + volume = 10 + center_of_mass = list("x"=16, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/egg/New() ..() @@ -551,7 +555,7 @@ ..() new/obj/effect/decal/cleanable/egg_smudge(src.loc) src.reagents.splash(hit_atom, reagents.total_volume) - src.visible_message("\red [src.name] has been squashed.","\red You hear a smack.") + src.visible_message("\The [src] has been squashed!","You hear a smack.") qdel(src) /obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -560,10 +564,10 @@ var/clr = C.colourName if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - usr << "\blue The egg refuses to take on this color!" + usr << "The egg refuses to take on this color!" return - usr << "\blue You color \the [src] [clr]" + usr << "You color \the [src] [clr]" icon_state = "egg-[clr]" else ..() @@ -597,6 +601,7 @@ desc = "A fried egg, with a touch of salt and pepper." icon_state = "friedegg" filling_color = "#FFDF78" + center_of_mass = list("x"=16, "y"=14) New() ..() @@ -621,6 +626,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "appendix" filling_color = "#E00D34" + center_of_mass = list("x"=16, "y"=16) New() ..() @@ -633,6 +639,7 @@ icon_state = "tofu" desc = "We all love tofu." filling_color = "#FFFEE0" + center_of_mass = list("x"=17, "y"=10) New() ..() @@ -644,6 +651,7 @@ desc = "A fake turkey made from tofu." icon_state = "tofurkey" filling_color = "#FFFEE0" + center_of_mass = list("x"=16, "y"=8) New() ..() @@ -656,6 +664,7 @@ desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" icon_state = "stuffing" filling_color = "#C9AC83" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -667,6 +676,7 @@ desc = "A fillet of spess carp meat" icon_state = "fishfillet" filling_color = "#FFDEFE" + center_of_mass = list("x"=17, "y"=13) New() ..() @@ -679,6 +689,7 @@ desc = "A finger of fish." icon_state = "fishfingers" filling_color = "#FFDEFE" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -691,6 +702,7 @@ desc = "A slice from a huge mushroom." icon_state = "hugemushroomslice" filling_color = "#E0D7C5" + center_of_mass = list("x"=17, "y"=16) New() ..() @@ -703,6 +715,7 @@ desc = "A slice from a huge tomato" icon_state = "tomatomeat" filling_color = "#DB0000" + center_of_mass = list("x"=17, "y"=16) New() ..() @@ -714,6 +727,7 @@ desc = "A very manly slab of meat." icon_state = "bearmeat" filling_color = "#DB0000" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -726,6 +740,7 @@ desc = "A slab of green meat. Smells like acid." icon_state = "xenomeat" filling_color = "#43DE18" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -738,6 +753,7 @@ desc = "A great meal all round." icon_state = "meatball" filling_color = "#DB0000" + center_of_mass = list("x"=16, "y"=16) New() ..() @@ -749,6 +765,7 @@ desc = "A piece of mixed, long meat." icon_state = "sausage" filling_color = "#DB0000" + center_of_mass = list("x"=16, "y"=16) New() ..() @@ -777,6 +794,7 @@ desc = "The food of choice for the seasoned traitor." icon_state = "donkpocket" filling_color = "#DEDEAB" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -807,6 +825,7 @@ desc = "A strange looking burger. It looks almost sentient." icon_state = "brainburger" filling_color = "#F2B6EA" + center_of_mass = list("x"=15, "y"=11) New() ..() @@ -819,6 +838,7 @@ desc = "Spooky! It doesn't look very filling." icon_state = "ghostburger" filling_color = "#FFF2FF" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -835,6 +855,7 @@ name = "-burger" desc = "A bloody burger." icon_state = "hburger" + center_of_mass = list("x"=16, "y"=11) New() ..() reagents.add_reagent("protein", 6) @@ -844,6 +865,8 @@ name = "cheeseburger" desc = "The cheese adds a good flavor." icon_state = "cheeseburger" + center_of_mass = list("x"=16, "y"=11) + New() ..() reagents.add_reagent("protein", 2) @@ -854,6 +877,7 @@ desc = "The cornerstone of every nutritious breakfast." icon_state = "hburger" filling_color = "#D63C3C" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -866,6 +890,7 @@ desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp." icon_state = "fishburger" filling_color = "#FFDEFE" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -878,6 +903,7 @@ desc = "What.. is that meat?" icon_state = "tofuburger" filling_color = "#FFFEE0" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -889,6 +915,7 @@ desc = "The lettuce is the only organic component. Beep." icon_state = "roburger" filling_color = "#CCCCCC" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -903,6 +930,7 @@ icon_state = "roburger" filling_color = "#CCCCCC" volume = 100 + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -914,6 +942,7 @@ desc = "Smells caustic. Tastes like heresy." icon_state = "xburger" filling_color = "#43DE18" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -925,6 +954,7 @@ desc = "This tastes funny..." icon_state = "clownburger" filling_color = "#FF00FF" + center_of_mass = list("x"=17, "y"=12) New() ..() @@ -936,6 +966,7 @@ desc = "Its taste defies language." icon_state = "mimeburger" filling_color = "#FFFFFF" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -948,6 +979,7 @@ icon_state = "omelette" trash = /obj/item/trash/plate filling_color = "#FFF9A8" + center_of_mass = list("x"=16, "y"=13) //var/herp = 0 New() @@ -960,6 +992,7 @@ desc = "A delicious and spongy little cake" icon_state = "muffin" filling_color = "#E0CF9B" + center_of_mass = list("x"=17, "y"=4) New() ..() @@ -972,6 +1005,7 @@ icon_state = "pie" trash = /obj/item/trash/plate filling_color = "#FBFFB8" + center_of_mass = list("x"=16, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/pie/New() ..() @@ -982,7 +1016,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom) ..() new/obj/effect/decal/cleanable/pie_smudge(src.loc) - src.visible_message("\red [src.name] splats.","\red You hear a splat.") + src.visible_message("\The [src.name] splats.","You hear a splat.") qdel(src) /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis @@ -990,6 +1024,8 @@ desc = "No black birds, this is a good sign." icon_state = "berryclafoutis" trash = /obj/item/trash/plate + center_of_mass = list("x"=16, "y"=13) + New() ..() reagents.add_reagent("nutriment", 4) @@ -1002,6 +1038,7 @@ icon_state = "waffles" trash = /obj/item/trash/waffles filling_color = "#E6DEB5" + center_of_mass = list("x"=15, "y"=11) New() ..() @@ -1014,6 +1051,7 @@ icon_state = "eggplantparm" trash = /obj/item/trash/plate filling_color = "#4D2F5E" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -1026,6 +1064,7 @@ icon_state = "soylent_green" trash = /obj/item/trash/waffles filling_color = "#B8E6B5" + center_of_mass = list("x"=15, "y"=11) New() ..() @@ -1038,6 +1077,7 @@ icon_state = "soylent_yellow" trash = /obj/item/trash/waffles filling_color = "#E6FA61" + center_of_mass = list("x"=15, "y"=11) New() ..() @@ -1051,6 +1091,7 @@ desc = "An old barber recipe, very delicious!" trash = /obj/item/trash/plate filling_color = "#948051" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -1063,6 +1104,7 @@ desc = "A delicious tofu pie." trash = /obj/item/trash/plate filling_color = "#FFFEE0" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -1074,6 +1116,7 @@ desc = "Sweet and tasty poison pie." icon_state = "amanita_pie" filling_color = "#FFCCCC" + center_of_mass = list("x"=17, "y"=9) New() ..() @@ -1087,6 +1130,7 @@ desc = "I bet you love stuff made out of plump helmets!" icon_state = "plump_pie" filling_color = "#B8279B" + center_of_mass = list("x"=17, "y"=9) New() ..() @@ -1106,6 +1150,7 @@ desc = "A delicious meatpie. Probably heretical." trash = /obj/item/trash/plate filling_color = "#43DE18" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -1118,6 +1163,7 @@ icon_state = "wingfangchu" trash = /obj/item/trash/snack_bowl filling_color = "#43DE18" + center_of_mass = list("x"=17, "y"=9) New() ..() @@ -1131,6 +1177,7 @@ desc = "A human meat, on a stick." trash = /obj/item/stack/rods filling_color = "#A85340" + center_of_mass = list("x"=17, "y"=15) New() ..() @@ -1143,6 +1190,7 @@ desc = "Delicious meat, on a stick." trash = /obj/item/stack/rods filling_color = "#A85340" + center_of_mass = list("x"=17, "y"=15) New() ..() @@ -1155,6 +1203,7 @@ desc = "Vegan meat, on a stick." trash = /obj/item/stack/rods filling_color = "#FFFEE0" + center_of_mass = list("x"=17, "y"=15) New() ..() @@ -1167,6 +1216,7 @@ icon_state = "cubancarp" trash = /obj/item/trash/plate filling_color = "#E9ADFF" + center_of_mass = list("x"=12, "y"=5) New() ..() @@ -1183,6 +1233,7 @@ trash = /obj/item/trash/popcorn var/unpopped = 0 filling_color = "#FFFAD4" + center_of_mass = list("x"=16, "y"=8) New() ..() @@ -1191,7 +1242,7 @@ bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 On_Consume() if(prob(unpopped)) //lol ...what's the point? - usr << "\red You bite down on an un-popped kernel!" + usr << "You bite down on an un-popped kernel!" unpopped = max(0, unpopped-1) ..() @@ -1202,6 +1253,7 @@ desc = "Beef jerky made from the finest space cows." trash = /obj/item/trash/sosjerky filling_color = "#631212" + center_of_mass = list("x"=15, "y"=9) New() ..() @@ -1214,6 +1266,7 @@ desc = "Best raisins in the universe. Not sure why." trash = /obj/item/trash/raisins filling_color = "#343834" + center_of_mass = list("x"=15, "y"=4) New() ..() @@ -1224,6 +1277,7 @@ icon_state = "space_twinkie" desc = "Guaranteed to survive longer then you will." filling_color = "#FFE591" + center_of_mass = list("x"=15, "y"=11) New() ..() @@ -1236,6 +1290,7 @@ desc = "Bite sized cheesie snacks that will honk all over your mouth" trash = /obj/item/trash/cheesie filling_color = "#FFA305" + center_of_mass = list("x"=15, "y"=9) New() ..() @@ -1247,6 +1302,7 @@ icon_state = "syndi_cakes" desc = "An extremely moist snack cake that tastes just as good after being nuked." filling_color = "#FF5D05" + center_of_mass = list("x"=16, "y"=10) trash = /obj/item/trash/syndi_cakes New() @@ -1260,6 +1316,7 @@ desc = "Totally baked." icon_state = "loadedbakedpotato" filling_color = "#9C7A68" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -1273,6 +1330,7 @@ icon_state = "fries" trash = /obj/item/trash/plate filling_color = "#EDDD00" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -1285,6 +1343,7 @@ icon_state = "soydope" trash = /obj/item/trash/plate filling_color = "#C4BF76" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -1296,6 +1355,7 @@ desc = "A bundle of raw spaghetti." icon_state = "spagetti" filling_color = "#EDDD00" + center_of_mass = list("x"=16, "y"=16) New() ..() @@ -1308,6 +1368,7 @@ icon_state = "cheesyfries" trash = /obj/item/trash/plate filling_color = "#EDDD00" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -1320,6 +1381,7 @@ desc = "A true prophecy in each cookie!" icon_state = "fortune_cookie" filling_color = "#E8E79E" + center_of_mass = list("x"=15, "y"=14) New() ..() @@ -1331,6 +1393,7 @@ desc = "Someone should be demoted from chef for this." icon_state = "badrecipe" filling_color = "#211F02" + center_of_mass = list("x"=16, "y"=12) New() ..() @@ -1344,6 +1407,7 @@ icon_state = "meatstake" trash = /obj/item/trash/plate filling_color = "#7A3D11" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -1358,6 +1422,7 @@ icon_state = "spacylibertyduff" trash = /obj/item/trash/snack_bowl filling_color = "#42B873" + center_of_mass = list("x"=16, "y"=8) New() ..() @@ -1371,6 +1436,7 @@ icon_state = "amanitajelly" trash = /obj/item/trash/snack_bowl filling_color = "#ED0758" + center_of_mass = list("x"=16, "y"=5) New() ..() @@ -1385,6 +1451,7 @@ icon_state = "poppypretzel" bitesize = 2 filling_color = "#916E36" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -1398,6 +1465,7 @@ icon_state = "meatballsoup" trash = /obj/item/trash/snack_bowl filling_color = "#785210" + center_of_mass = list("x"=16, "y"=8) New() ..() @@ -1408,7 +1476,7 @@ /obj/item/weapon/reagent_containers/food/snacks/slimesoup name = "slime soup" desc = "If no water is available, you may substitute tears." - icon_state = "slimesoup" + icon_state = "slimesoup" //nonexistant? filling_color = "#C4DBA0" New() @@ -1422,6 +1490,7 @@ desc = "Smells like copper." icon_state = "tomatosoup" filling_color = "#FF0000" + center_of_mass = list("x"=16, "y"=7) New() ..() @@ -1435,6 +1504,7 @@ desc = "Not very funny." icon_state = "clownstears" filling_color = "#C4FBFF" + center_of_mass = list("x"=16, "y"=7) New() ..() @@ -1449,6 +1519,7 @@ icon_state = "vegetablesoup" trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" + center_of_mass = list("x"=16, "y"=8) New() ..() @@ -1462,6 +1533,7 @@ icon_state = "nettlesoup" trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" + center_of_mass = list("x"=16, "y"=7) New() ..() @@ -1476,6 +1548,7 @@ icon_state = "mysterysoup" trash = /obj/item/trash/snack_bowl filling_color = "#F082FF" + center_of_mass = list("x"=16, "y"=6) New() ..() @@ -1523,6 +1596,7 @@ icon_state = "wishsoup" trash = /obj/item/trash/snack_bowl filling_color = "#D1F4FF" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -1538,6 +1612,7 @@ icon_state = "hotchili" trash = /obj/item/trash/snack_bowl filling_color = "#FF3C00" + center_of_mass = list("x"=15, "y"=9) New() ..() @@ -1553,6 +1628,7 @@ desc = "This slush is barely a liquid!" icon_state = "coldchili" filling_color = "#2B00FF" + center_of_mass = list("x"=15, "y"=9) trash = /obj/item/trash/snack_bowl New() @@ -1570,10 +1646,13 @@ icon_state = "bacon" var/obj/item/device/radio/beacon/bacon/baconbeacon bitesize = 2 + center_of_mass = list("x"=18, "y"=13) + New() ..() reagents.add_reagent("nutriment", 4) baconbeacon = new /obj/item/device/radio/beacon/bacon(src) + On_Consume() if(!reagents.total_volume) baconbeacon.loc = usr @@ -1583,9 +1662,11 @@ /obj/item/weapon/reagent_containers/food/snacks/monkeycube name = "monkey cube" desc = "Just add water!" + flags = 0 icon_state = "monkeycube" bitesize = 12 filling_color = "#ADAC7F" + center_of_mass = list("x"=16, "y"=14) var/wrapped = 0 var/monkey_type = "Monkey" @@ -1707,6 +1788,7 @@ desc = "Forget the Big Mac. THIS is the future!" icon_state = "bigbiteburger" filling_color = "#E3D681" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -1720,6 +1802,7 @@ icon_state = "enchiladas" trash = /obj/item/trash/tray filling_color = "#A36A1F" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -1734,6 +1817,7 @@ icon_state = "monkeysdelight" trash = /obj/item/trash/tray filling_color = "#5C3C11" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -1748,6 +1832,7 @@ desc = "Bon appetit!" icon_state = "baguette" filling_color = "#E3D796" + center_of_mass = list("x"=18, "y"=12) New() ..() @@ -1761,6 +1846,7 @@ desc = "I do say so myself chap." icon_state = "fishandchips" filling_color = "#E3D796" + center_of_mass = list("x"=16, "y"=16) New() ..() @@ -1775,6 +1861,7 @@ icon_state = "sandwich" trash = /obj/item/trash/plate filling_color = "#D9BE29" + center_of_mass = list("x"=16, "y"=4) New() ..() @@ -1788,6 +1875,7 @@ icon_state = "toastedsandwich" trash = /obj/item/trash/plate filling_color = "#D9BE29" + center_of_mass = list("x"=16, "y"=4) New() ..() @@ -1815,6 +1903,7 @@ icon_state = "tomatosoup" trash = /obj/item/trash/snack_bowl filling_color = "#D92929" + center_of_mass = list("x"=16, "y"=7) New() ..() @@ -1828,6 +1917,7 @@ icon_state = "rofflewaffles" trash = /obj/item/trash/waffles filling_color = "#FF00F7" + center_of_mass = list("x"=15, "y"=11) New() ..() @@ -1840,6 +1930,7 @@ desc = "A nice and warm stew. Healthy and strong." icon_state = "stew" filling_color = "#9E673A" + center_of_mass = list("x"=16, "y"=5) New() ..() @@ -1856,6 +1947,7 @@ icon_state = "jellytoast" trash = /obj/item/trash/plate filling_color = "#B572AB" + center_of_mass = list("x"=16, "y"=8) New() ..() @@ -1877,6 +1969,7 @@ desc = "Culinary delight..?" icon_state = "jellyburger" filling_color = "#B572AB" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -1898,6 +1991,8 @@ desc = "The universes best soup! Yum!!!" icon_state = "milosoup" trash = /obj/item/trash/snack_bowl + center_of_mass = list("x"=16, "y"=7) + New() ..() reagents.add_reagent("nutriment", 8) @@ -1909,6 +2004,8 @@ desc = "Even non-vegetarians will LOVE this!" icon_state = "stewedsoymeat" trash = /obj/item/trash/plate + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 8) @@ -1920,6 +2017,7 @@ icon_state = "spagettiboiled" trash = /obj/item/trash/plate filling_color = "#FCEE81" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -1932,6 +2030,7 @@ icon_state = "boiledrice" trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" + center_of_mass = list("x"=17, "y"=11) New() ..() @@ -1944,6 +2043,7 @@ icon_state = "rpudding" trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" + center_of_mass = list("x"=17, "y"=11) New() ..() @@ -1956,6 +2056,7 @@ icon_state = "pastatomato" trash = /obj/item/trash/plate filling_color = "#DE4545" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -1969,6 +2070,7 @@ icon_state = "meatballspagetti" trash = /obj/item/trash/plate filling_color = "#DE4545" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -1981,6 +2083,7 @@ desc = "A lawyers favourite" icon_state = "spesslaw" filling_color = "#DE4545" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -1988,23 +2091,13 @@ reagents.add_reagent("nutriment", 4) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/poppypretzel - name = "Poppy Pretzel" - desc = "A large soft pretzel full of POP!" - icon_state = "poppypretzel" - filling_color = "#AB7D2E" - - New() - ..() - reagents.add_reagent("nutriment", 5) - bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/carrotfries name = "Carrot Fries" desc = "Tasty fries from fresh Carrots." icon_state = "carrotfries" trash = /obj/item/trash/plate filling_color = "#FAA005" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -2017,6 +2110,7 @@ desc = "This is a mountain of a burger. FOOD!" icon_state = "superbiteburger" filling_color = "#CCA26A" + center_of_mass = list("x"=16, "y"=3) New() ..() @@ -2029,6 +2123,7 @@ desc = "An apple coated in sugary sweetness." icon_state = "candiedapple" filling_color = "#F21873" + center_of_mass = list("x"=15, "y"=13) New() ..() @@ -2040,6 +2135,7 @@ desc = "A pie containing sweet sweet love... or apple." icon_state = "applepie" filling_color = "#E0EDC5" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -2052,6 +2148,7 @@ desc = "Taste so good, make a grown man cry." icon_state = "cherrypie" filling_color = "#FF525A" + center_of_mass = list("x"=16, "y"=11) New() ..() @@ -2063,6 +2160,7 @@ desc = "It is very bitter and winy." icon_state = "twobread" filling_color = "#DBCC9A" + center_of_mass = list("x"=15, "y"=12) New() ..() @@ -2075,6 +2173,7 @@ icon_state = "jellysandwich" trash = /obj/item/trash/plate filling_color = "#9E3A78" + center_of_mass = list("x"=16, "y"=8) New() ..() @@ -2094,7 +2193,7 @@ /obj/item/weapon/reagent_containers/food/snacks/boiledslimecore name = "Boiled slime Core" desc = "A boiled red thing." - icon_state = "boiledslimecore" + icon_state = "boiledslimecore" //nonexistant? New() ..() reagents.add_reagent("slimejelly", 5) @@ -2105,6 +2204,7 @@ desc = "it is only wafer thin." icon_state = "mint" filling_color = "#F2F2F2" + center_of_mass = list("x"=16, "y"=14) New() ..() @@ -2117,6 +2217,7 @@ icon_state = "mushroomsoup" trash = /obj/item/trash/snack_bowl filling_color = "#E386BF" + center_of_mass = list("x"=17, "y"=10) New() ..() @@ -2128,6 +2229,7 @@ desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour." icon_state = "phelmbiscuit" filling_color = "#CFB4C4" + center_of_mass = list("x"=16, "y"=13) New() ..() @@ -2147,6 +2249,7 @@ icon_state = "chawanmushi" trash = /obj/item/trash/snack_bowl filling_color = "#F0F2E4" + center_of_mass = list("x"=17, "y"=10) New() ..() @@ -2159,6 +2262,7 @@ icon_state = "beetsoup" trash = /obj/item/trash/snack_bowl filling_color = "#FAC9FF" + center_of_mass = list("x"=15, "y"=8) New() ..() @@ -2172,7 +2276,7 @@ icon_state = "herbsalad" trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" - + center_of_mass = list("x"=17, "y"=11) New() ..() reagents.add_reagent("nutriment", 8) @@ -2184,6 +2288,7 @@ icon_state = "validsalad" trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" + center_of_mass = list("x"=17, "y"=11) New() ..() @@ -2197,6 +2302,7 @@ icon_state = "gappletart" trash = /obj/item/trash/plate filling_color = "#FFFF00" + center_of_mass = list("x"=16, "y"=18) New() ..() @@ -2219,6 +2325,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice slices_num = 5 filling_color = "#FF7575" + center_of_mass = list("x"=16, "y"=9) + New() ..() reagents.add_reagent("protein", 20) @@ -2232,6 +2340,7 @@ trash = /obj/item/trash/plate filling_color = "#FF7575" bitesize = 2 + center_of_mass = list("x"=16, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread name = "xenomeatbread loaf" @@ -2240,6 +2349,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice slices_num = 5 filling_color = "#8AFF75" + center_of_mass = list("x"=16, "y"=9) + New() ..() reagents.add_reagent("protein", 20) @@ -2253,6 +2364,7 @@ trash = /obj/item/trash/plate filling_color = "#8AFF75" bitesize = 2 + center_of_mass = list("x"=16, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread name = "Banana-nut bread" @@ -2261,6 +2373,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice slices_num = 5 filling_color = "#EDE5AD" + center_of_mass = list("x"=16, "y"=9) + New() ..() reagents.add_reagent("banana", 20) @@ -2274,6 +2388,7 @@ trash = /obj/item/trash/plate filling_color = "#EDE5AD" bitesize = 2 + center_of_mass = list("x"=16, "y"=8) /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread name = "Tofubread" @@ -2282,6 +2397,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice slices_num = 5 filling_color = "#F7FFE0" + center_of_mass = list("x"=16, "y"=9) + New() ..() reagents.add_reagent("nutriment", 30) @@ -2294,6 +2411,7 @@ trash = /obj/item/trash/plate filling_color = "#F7FFE0" bitesize = 2 + center_of_mass = list("x"=16, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake @@ -2303,6 +2421,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice slices_num = 5 filling_color = "#FFD675" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 25) @@ -2316,6 +2436,7 @@ trash = /obj/item/trash/plate filling_color = "#FFD675" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake name = "Brain Cake" @@ -2324,6 +2445,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/braincakeslice slices_num = 5 filling_color = "#E6AEDB" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("protein", 25) @@ -2338,6 +2461,7 @@ trash = /obj/item/trash/plate filling_color = "#E6AEDB" bitesize = 2 + center_of_mass = list("x"=16, "y"=12) /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake name = "Cheese Cake" @@ -2346,6 +2470,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice slices_num = 5 filling_color = "#FAF7AF" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("protein", 15) @@ -2359,6 +2485,7 @@ trash = /obj/item/trash/plate filling_color = "#FAF7AF" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake name = "Vanilla Cake" @@ -2367,6 +2494,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice slices_num = 5 filling_color = "#F7EDD5" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 20) @@ -2378,6 +2507,7 @@ trash = /obj/item/trash/plate filling_color = "#F7EDD5" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake name = "Orange Cake" @@ -2386,6 +2516,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice slices_num = 5 filling_color = "#FADA8E" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 20) @@ -2397,6 +2529,7 @@ trash = /obj/item/trash/plate filling_color = "#FADA8E" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake name = "Lime Cake" @@ -2405,6 +2538,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/limecakeslice slices_num = 5 filling_color = "#CBFA8E" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 20) @@ -2416,6 +2551,7 @@ trash = /obj/item/trash/plate filling_color = "#CBFA8E" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake name = "Lemon Cake" @@ -2424,6 +2560,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice slices_num = 5 filling_color = "#FAFA8E" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 20) @@ -2435,6 +2573,7 @@ trash = /obj/item/trash/plate filling_color = "#FAFA8E" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake name = "Chocolate Cake" @@ -2443,6 +2582,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice slices_num = 5 filling_color = "#805930" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 20) @@ -2454,6 +2595,7 @@ trash = /obj/item/trash/plate filling_color = "#805930" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel name = "Cheese wheel" @@ -2462,6 +2604,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/cheesewedge slices_num = 5 filling_color = "#FFF700" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("protein", 20) @@ -2473,6 +2617,7 @@ icon_state = "cheesewedge" filling_color = "#FFF700" bitesize = 2 + center_of_mass = list("x"=16, "y"=10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake name = "Birthday Cake" @@ -2481,6 +2626,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice slices_num = 5 filling_color = "#FFD6D6" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 20) @@ -2494,6 +2641,7 @@ trash = /obj/item/trash/plate filling_color = "#FFD6D6" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread name = "Bread" @@ -2502,6 +2650,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice slices_num = 5 filling_color = "#FFE396" + center_of_mass = list("x"=16, "y"=9) New() ..() @@ -2515,6 +2664,7 @@ trash = /obj/item/trash/plate filling_color = "#D27332" bitesize = 2 + center_of_mass = list("x"=16, "y"=4) /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread @@ -2524,6 +2674,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice slices_num = 5 filling_color = "#FFF896" + center_of_mass = list("x"=16, "y"=9) + New() ..() reagents.add_reagent("protein", 15) @@ -2537,6 +2689,7 @@ trash = /obj/item/trash/plate filling_color = "#FFF896" bitesize = 2 + center_of_mass = list("x"=16, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/watermelonslice @@ -2545,6 +2698,7 @@ icon_state = "watermelonslice" filling_color = "#FF3867" bitesize = 2 + center_of_mass = list("x"=16, "y"=10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake @@ -2554,6 +2708,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/applecakeslice slices_num = 5 filling_color = "#EBF5B8" + center_of_mass = list("x"=16, "y"=10) + New() ..() reagents.add_reagent("nutriment", 15) @@ -2565,6 +2721,7 @@ trash = /obj/item/trash/plate filling_color = "#EBF5B8" bitesize = 2 + center_of_mass = list("x"=16, "y"=14) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie name = "Pumpkin Pie" @@ -2573,6 +2730,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice slices_num = 5 filling_color = "#F5B951" + center_of_mass = list("x"=16, "y"=10) New() ..() @@ -2585,12 +2743,14 @@ trash = /obj/item/trash/plate filling_color = "#F5B951" bitesize = 2 + center_of_mass = list("x"=16, "y"=12) /obj/item/weapon/reagent_containers/food/snacks/cracker name = "Cracker" desc = "It's a salted cracker." icon_state = "cracker" filling_color = "#F5DEB8" + center_of_mass = list("x"=17, "y"=6) New() ..() @@ -2610,6 +2770,8 @@ icon_state = "pizzamargherita" slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice slices_num = 6 + center_of_mass = list("x"=16, "y"=11) + New() ..() reagents.add_reagent("nutriment", 35) @@ -2623,6 +2785,7 @@ icon_state = "pizzamargheritaslice" filling_color = "#BAA14C" bitesize = 2 + center_of_mass = list("x"=18, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza name = "Meatpizza" @@ -2630,6 +2793,8 @@ icon_state = "meatpizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice slices_num = 6 + center_of_mass = list("x"=16, "y"=11) + New() ..() reagents.add_reagent("protein", 44) @@ -2642,6 +2807,7 @@ icon_state = "meatpizzaslice" filling_color = "#BAA14C" bitesize = 2 + center_of_mass = list("x"=18, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza name = "Mushroompizza" @@ -2649,6 +2815,8 @@ icon_state = "mushroompizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 + center_of_mass = list("x"=16, "y"=11) + New() ..() reagents.add_reagent("nutriment", 35) @@ -2661,6 +2829,7 @@ icon_state = "mushroompizzaslice" filling_color = "#BAA14C" bitesize = 2 + center_of_mass = list("x"=18, "y"=13) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza name = "Vegetable pizza" @@ -2668,6 +2837,8 @@ icon_state = "vegetablepizza" slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 + center_of_mass = list("x"=16, "y"=11) + New() ..() reagents.add_reagent("nutriment", 25) @@ -2682,6 +2853,7 @@ icon_state = "vegetablepizzaslice" filling_color = "#BAA14C" bitesize = 2 + center_of_mass = list("x"=18, "y"=13) /obj/item/pizzabox name = "pizza box" @@ -2751,7 +2923,7 @@ if( open && pizza ) user.put_in_hands( pizza ) - user << "\red You take the [src.pizza] out of the [src]." + user << "You take \the [src.pizza] out of \the [src]." src.pizza = null update_icon() return @@ -2765,7 +2937,7 @@ boxes -= box user.put_in_hands( box ) - user << "\red You remove the topmost [src] from your hand." + user << "You remove the topmost [src] from your hand." box.update_icon() update_icon() return @@ -2804,11 +2976,11 @@ box.update_icon() update_icon() - user << "\red You put the [box] ontop of the [src]!" + user << "You put \the [box] ontop of \the [src]!" else - user << "\red The stack is too high!" + user << "The stack is too high!" else - user << "\red Close the [box] first!" + user << "Close \the [box] first!" return @@ -2821,9 +2993,9 @@ update_icon() - user << "\red You put the [I] in the [src]!" + user << "You put \the [I] in \the [src]!" else - user << "\red You try to push the [I] through the lid but it doesn't work!" + user << "You try to push \the [I] through the lid but it doesn't work!" return if( istype(I, /obj/item/weapon/pen/) ) @@ -2865,6 +3037,7 @@ icon_state = "dionaroast" trash = /obj/item/trash/plate filling_color = "#75754B" + center_of_mass = list("x"=16, "y"=7) New() ..() @@ -2884,6 +3057,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "dough" bitesize = 2 + center_of_mass = list("x"=16, "y"=13) + New() ..() reagents.add_reagent("protein", 1) @@ -2904,6 +3079,8 @@ icon_state = "flat dough" slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice slices_num = 3 + center_of_mass = list("x"=16, "y"=16) + New() ..() reagents.add_reagent("protein", 1) @@ -2917,6 +3094,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/spagetti slices_num = 1 bitesize = 2 + center_of_mass = list("x"=17, "y"=19) + New() ..() reagents.add_reagent("nutriment", 1) @@ -2927,6 +3106,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "bun" bitesize = 2 + center_of_mass = list("x"=16, "y"=12) + New() ..() reagents.add_reagent("nutriment", 4) @@ -2980,6 +3161,8 @@ desc = "Take a bite!" icon_state = "taco" bitesize = 3 + center_of_mass = list("x"=21, "y"=12) + New() ..() reagents.add_reagent("protein", 3) @@ -2991,6 +3174,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "rawcutlet" bitesize = 1 + center_of_mass = list("x"=17, "y"=20) + New() ..() reagents.add_reagent("protein", 1) @@ -3001,6 +3186,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "cutlet" bitesize = 2 + center_of_mass = list("x"=17, "y"=20) + New() ..() reagents.add_reagent("protein", 2) @@ -3011,6 +3198,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "rawmeatball" bitesize = 2 + center_of_mass = list("x"=16, "y"=15) + New() ..() reagents.add_reagent("protein", 2) @@ -3020,6 +3209,8 @@ desc = "Unrelated to dogs, maybe." icon_state = "hotdog" bitesize = 2 + center_of_mass = list("x"=16, "y"=17) + New() ..() reagents.add_reagent("protein", 6) @@ -3030,6 +3221,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "flatbread" bitesize = 2 + center_of_mass = list("x"=16, "y"=16) + New() ..() reagents.add_reagent("nutriment", 3) @@ -3049,6 +3242,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "rawsticks" bitesize = 2 + center_of_mass = list("x"=16, "y"=12) + New() ..() reagents.add_reagent("nutriment", 3) @@ -3059,6 +3254,7 @@ icon_state = "liquidfood" trash = /obj/item/trash/liquidfood filling_color = "#A8A8A8" + center_of_mass = list("x"=16, "y"=15) New() ..() @@ -3073,6 +3269,7 @@ icon_state = "tastybread" trash = /obj/item/trash/tastybread filling_color = "#A66829" + center_of_mass = list("x"=17, "y"=16) New() ..() @@ -3084,6 +3281,7 @@ desc = "Cured fungus shipped all the way from Jargon 4, almost like jerky! Almost." icon_state = "skrellsnacks" filling_color = "#A66829" + center_of_mass = list("x"=15, "y"=12) New() ..() diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index 46bf9e4bafe..7ea52765fcd 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -4,6 +4,7 @@ icon_state = "meat" health = 180 filling_color = "#FF1C1C" + center_of_mass = list("x"=16, "y"=14) New() ..() reagents.add_reagent("protein", 9) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index a3e2bef8511..259d7a115d3 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -35,7 +35,6 @@ /obj/machinery/iv_drip, /obj/machinery/disease2/incubator, /obj/machinery/disposal, - /obj/machinery/apiary, /mob/living/simple_animal/cow, /mob/living/simple_animal/hostile/retaliate/goat, /obj/machinery/computer/centrifuge, @@ -229,20 +228,31 @@ flags = OPENCONTAINER unacidable = 0 - attackby(var/obj/D, mob/user as mob) - if(isprox(D)) - user << "You add [D] to [src]." - qdel(D) - user.put_in_hands(new /obj/item/weapon/bucket_sensor) - user.drop_from_inventory(src) - qdel(src) +/obj/item/weapon/reagent_containers/glass/bucket/attackby(var/obj/D, mob/user as mob) - update_icon() - overlays.Cut() + if(isprox(D)) + user << "You add [D] to [src]." + qdel(D) + user.put_in_hands(new /obj/item/weapon/bucket_sensor) + user.drop_from_inventory(src) + qdel(src) + return + else if(istype(D, /obj/item/weapon/mop)) + if(reagents.total_volume < 1) + user << "\The [src] is empty!" + else + reagents.trans_to_obj(D, 5) + user << "You wet \the [D] in \the [src]." + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + return + else + return ..() - if (!is_open_container()) - var/image/lid = image(icon, src, "lid_[initial(icon_state)]") - overlays += lid +/obj/item/weapon/reagent_containers/glass/bucket/update_icon() + overlays.Cut() + if (!is_open_container()) + var/image/lid = image(icon, src, "lid_[initial(icon_state)]") + overlays += lid /* /obj/item/weapon/reagent_containers/glass/blender_jug diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 11288952b3a..6d557fb1584 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -26,9 +26,19 @@ return if (!istype(M)) return - if(!M.can_inject(user, 1)) - return + var/mob/living/carbon/human/H = M + if(istype(H)) + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + if(!affected) + user << "\The [H] is missing that limb!" + return + else if(affected.status & ORGAN_ROBOT) + user << "You cannot inject a robotic limb." + return + + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(M) user << "You inject [M] with [src]." M << "You feel a tiny prick!" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index a017d8e5db6..99a6dc28f73 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -18,18 +18,11 @@ icon_state = "pill[rand(1, 20)]" attack(mob/M as mob, mob/user as mob, def_zone) + //TODO: replace with standard_feed_mob() call. + if(M == user) - - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - H << "You have a monitor for a head, where do you think you're going to put that?" - return - - var/obj/item/blocked = H.check_mouth_coverage() - if(blocked) - user << "\The [blocked] is in the way!" - return + if(!M.can_eat(src)) + return M << "You swallow \the [src]." M.drop_from_inventory(src) //icon update @@ -39,20 +32,12 @@ return 1 else if(istype(M, /mob/living/carbon/human)) - - var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - H << "They have a monitor for a head, where do you think you're going to put that?" - return - - var/obj/item/blocked = H.check_mouth_coverage() - - if(blocked) - user << "\The [blocked] is in the way!" + if(!M.can_force_feed(user, src)) return user.visible_message("[user] attempts to force [M] to swallow \the [src].") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!do_mob(user, M)) return diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index a5cbe458e0a..7e72222ae13 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -52,6 +52,8 @@ playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) + user.setClickCooldown(4) + if(reagents.has_reagent("sacid")) message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].") log_game("[key_name(user)] fired sulphuric acid from \a [src].") @@ -64,7 +66,7 @@ return /obj/item/weapon/reagent_containers/spray/proc/Spray_at(atom/A as mob|obj, mob/user as mob, proximity) - if ((A.density || istype(A, /mob/living)) && proximity)//isHuman check allows the visible message to proc when spraying lying-down people and + if (A.density && proximity) A.visible_message("[usr] sprays [A] with [src].") reagents.splash(A, amount_per_transfer_from_this) else @@ -182,7 +184,7 @@ w_class = 3.0 possible_transfer_amounts = null volume = 600 - origin_tech = "combat=3;materials=3;engineering=3" + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) /obj/item/weapon/reagent_containers/spray/chemsprayer/Spray_at(atom/A as mob|obj) var/direction = get_dir(src, A) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index b8690576de7..6000c0a1cda 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -144,13 +144,21 @@ user << "[target] is full." return + var/mob/living/carbon/human/H = target + if(istype(H)) + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + if(!affected) + user << "\The [H] is missing that limb!" + return + else if(affected.status & ORGAN_ROBOT) + user << "You cannot inject a robotic limb." + return + if(ismob(target) && target != user) var/injtime = time //Injecting through a voidsuit takes longer due to needing to find a port. - if(istype(target, /mob/living/carbon/human)) - - var/mob/living/carbon/human/H = target + if(istype(H)) if(H.wear_suit) if(istype(H.wear_suit, /obj/item/clothing/suit/space)) injtime = injtime * 2 @@ -168,12 +176,14 @@ if(injtime == time) user.visible_message("[user] is trying to inject [target] with [visible_name]!") else - var/mob/living/carbon/human/H = target if(H.get_species() == "Vaurca") user.visible_message("[user] begins hunting for an injection port on [target]'s carapace!") else user.visible_message("[user] begins hunting for an injection port on [target]'s suit!") + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(target) + if(!do_mob(user, target, injtime)) return @@ -235,7 +245,7 @@ var/hit_area = affecting.name - if((user != target) && H.check_shields(7, "the [src.name]")) + if((user != target) && H.check_shields(7, src, user, "\the [src]")) return if (target != user && H.getarmor(target_zone, "melee") > 5 && prob(50)) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 8d00fc2234a..82bc8bdfcf2 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -7,7 +7,6 @@ icon_state = "watertank" density = 1 anchored = 0 - pressure_resistance = 2*ONE_ATMOSPHERE var/amount_per_transfer_from_this = 10 var/possible_transfer_amounts = list(10,25,50,100) @@ -59,11 +58,6 @@ else return - blob_act() - if(prob(50)) - new /obj/effect/effect/water(src.loc) - qdel(src) - @@ -101,7 +95,7 @@ if (modded) user << "\red Fuel faucet is wrenched open, leaking the fuel!" if(rig) - user << "There is some kind of device rigged to the tank." + user << "There is some kind of device rigged to the tank." /obj/structure/reagent_dispensers/fueltank/attack_hand() if (rig) @@ -160,7 +154,7 @@ message_admins("[key_name_admin(user)] reset fuse on fueltank at ([loc.x],[loc.y],[loc.z]).") /obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) - if(Proj.damage_type == BRUTE || Proj.damage_type == BURN) + if(Proj.get_structure_damage()) if(istype(Proj.firer)) message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).") @@ -168,9 +162,6 @@ if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) explode() -/obj/structure/reagent_dispensers/fueltank/blob_act() - explode() - /obj/structure/reagent_dispensers/fueltank/ex_act() explode() @@ -254,10 +245,6 @@ ..() reagents.add_reagent("beer",1000) -/obj/structure/reagent_dispensers/beerkeg/blob_act() - explosion(src.loc,0,3,5,7,10) - qdel(src) - /obj/structure/reagent_dispensers/virusfood name = "Virus Food Dispenser" desc = "A dispenser of virus food." diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 957c3b574dc..2f49b7b0842 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -37,6 +37,8 @@ operating = 1 setmove() + + /obj/machinery/conveyor/proc/setmove() if(operating == 1) movedir = forwards @@ -78,6 +80,14 @@ // attack with item, place item on conveyor /obj/machinery/conveyor/attackby(var/obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/crowbar)) + if(!(stat & BROKEN)) + var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc) + C.id = id + transfer_fingerprints_to(C) + user << "You remove the conveyor belt." + qdel(src) + return if(isrobot(user)) return //Carn: fix for borgs dropping their modules on conveyor belts if(I.loc != user) return // This should stop mounted modules ending up outside the module. @@ -162,8 +172,10 @@ -/obj/machinery/conveyor_switch/New() - ..() +/obj/machinery/conveyor_switch/New(loc, newid) + ..(loc) + if(!id) + id = newid update() spawn(5) // allow map load @@ -221,6 +233,15 @@ S.position = position S.update() + +/obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/crowbar)) + var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc) + C.id = id + transfer_fingerprints_to(C) + user << "You deattach the conveyor switch." + qdel(src) + /obj/machinery/conveyor_switch/oneway var/convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.) desc = "A conveyor control switch. It appears to only go in one direction." @@ -240,3 +261,67 @@ if(S.id == src.id) S.position = position S.update() + + + +// +// CONVEYOR CONSTRUCTION STARTS HERE +// + +/obj/item/conveyor_construct + icon = 'icons/obj/recycling.dmi' + icon_state = "conveyor0" + name = "conveyor belt assembly" + desc = "A conveyor belt assembly." + w_class = 4 + var/id = "" //inherited by the belt + +/obj/item/conveyor_construct/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/conveyor_switch_construct)) + user << "You link the switch to the conveyor belt assembly." + var/obj/item/conveyor_switch_construct/C = I + id = C.id + +/obj/item/conveyor_construct/afterattack(atom/A, mob/user, proximity) + if(!proximity || !istype(A, /turf/simulated/floor) || istype(A, /area/shuttle) || user.incapacitated()) + return + var/cdir = get_dir(A, user) + if(!(cdir in cardinal) || A == user.loc) + return + for(var/obj/machinery/conveyor/CB in A) + if(CB.dir == cdir || CB.dir == turn(cdir,180)) + return + cdir |= CB.dir + qdel(CB) + var/obj/machinery/conveyor/C = new/obj/machinery/conveyor(A,cdir) + C.id = id + transfer_fingerprints_to(C) + qdel(src) + +/obj/item/conveyor_switch_construct + name = "conveyor switch assembly" + desc = "A conveyor control switch assembly." + icon = 'icons/obj/recycling.dmi' + icon_state = "switch-off" + w_class = 4 + var/id = "" //inherited by the switch + +/obj/item/conveyor_switch_construct/New() + ..() + id = rand() //this couldn't possibly go wrong + +/obj/item/conveyor_switch_construct/afterattack(atom/A, mob/user, proximity) + if(!proximity || !istype(A, /turf/simulated/floor) || istype(A, /area/shuttle) || user.incapacitated()) + return + var/found = 0 + for(var/obj/machinery/conveyor/C in view()) + if(C.id == src.id) + found = 1 + break + if(!found) + user << "\icon[src]The conveyor switch did not detect any linked conveyor belts in range." + return + var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) + transfer_fingerprints_to(NC) + qdel(src) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 3ee774e0123..31e1aa48bbe 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -9,7 +9,6 @@ icon_state = "conpipe-s" anchored = 0 density = 0 - pressure_resistance = 5*ONE_ATMOSPHERE matter = list(DEFAULT_WALL_MATERIAL = 1850) level = 2 var/sortType = "" @@ -91,6 +90,9 @@ if(invisibility) // if invisible, fade icon alpha = 128 + else + alpha = 255 + //otherwise burying half-finished pipes under floors causes them to half-fade // hide called by levelupdate if turf intact status changes // change visibility status and force update of icon @@ -219,7 +221,7 @@ ispipe = 1 var/turf/T = src.loc - if(T.intact) + if(!T.is_plating()) user << "You can only attach the [nicetype] if the floor plating is removed." return @@ -318,3 +320,9 @@ else user << "You need to attach it to the plating first!" return + +/obj/structure/disposalconstruct/hides_under_flooring() + if(anchored) + return 1 + else + return 0 diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index fc51b0eed7f..f11f7e3e130 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -130,7 +130,7 @@ if (GM.client) GM.client.perspective = EYE_PERSPECTIVE GM.client.eye = src - GM.loc = src + GM.forceMove(src) for (var/mob/C in viewers(src)) C.show_message("\red [GM.name] has been placed in the [src] by [user].", 3) qdel(G) @@ -157,7 +157,8 @@ user.drop_item() if(I) - I.loc = src + I.forceMove(src) + user << "You place \the [I] into the [src]." for(var/mob/M in viewers(src)) if(M == user) @@ -207,7 +208,8 @@ if (target.client) target.client.perspective = EYE_PERSPECTIVE target.client.eye = src - target.loc = src + + target.forceMove(src) for (var/mob/C in viewers(src)) if(C == user) @@ -217,10 +219,6 @@ update() return -// can breath normally in the disposal -/obj/machinery/disposal/alter_health() - return get_turf(src) - // attempt to move while inside /obj/machinery/disposal/relaymove(mob/user as mob) if(user.stat || src.flushing) @@ -235,7 +233,7 @@ if (user.client) user.client.eye = user.client.mob user.client.perspective = MOB_PERSPECTIVE - user.loc = src.loc + user.forceMove(src.loc) update() return @@ -344,7 +342,7 @@ // eject the contents of the disposal unit /obj/machinery/disposal/proc/eject() for(var/atom/movable/AM in src) - AM.loc = src.loc + AM.forceMove(src.loc) AM.pipe_eject(0) update() @@ -477,7 +475,7 @@ for(var/atom/movable/AM in H) target = get_offset_target_turf(src.loc, rand(5)-rand(5), rand(5)-rand(5)) - AM.loc = src.loc + AM.forceMove(src.loc) AM.pipe_eject(0) if(!istype(AM,/mob/living/silicon/robot/drone)) //Poor drones kept smashing windows and taking system damage being fired out of disposals. ~Z spawn(1) @@ -493,7 +491,7 @@ if(istype(I, /obj/item/projectile)) return if(prob(75)) - I.loc = src + I.forceMove(src) for(var/mob/M in viewers(src)) M.show_message("\The [I] lands in \the [src].", 3) else @@ -542,7 +540,7 @@ // now everything inside the disposal gets put into the holder // note AM since can contain mobs or objs for(var/atom/movable/AM in D) - AM.loc = src + AM.forceMove(src) if(istype(AM, /obj/structure/bigDelivery) && !hasmob) var/obj/structure/bigDelivery/T = AM src.destinationTag = T.sortTag @@ -562,7 +560,7 @@ D.expel(src) // no trunk connected, so expel immediately return - loc = D.trunk + forceMove(D.trunk) active = 1 set_dir(DOWN) spawn(1) @@ -619,7 +617,7 @@ // used when a a holder meets a stuck holder proc/merge(var/obj/structure/disposalholder/other) for(var/atom/movable/AM in other) - AM.loc = src // move everything in other holder to this one + AM.forceMove(src) // move everything in other holder to this one if(ismob(AM)) var/mob/M = AM if(M.client) // if a client mob, update eye to follow this holder @@ -705,7 +703,7 @@ // this is unlikely, but just dump out everything into the turf in case for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(0) qdel(H) ..() @@ -736,9 +734,9 @@ if(H2 && !H2.active) H.merge(H2) - H.loc = P + H.forceMove(P) else // if wasn't a pipe, then set loc to turf - H.loc = T + H.forceMove(T) return null return P @@ -747,7 +745,7 @@ // update the icon_state to reflect hidden status proc/update() var/turf/T = src.loc - hide(T.intact && !istype(T,/turf/space)) // space never hides pipes + hide(!T.is_plating() && !istype(T,/turf/space)) // space never hides pipes // hide called by levelupdate if turf intact status changes // change visibility status and force update of icon @@ -783,14 +781,11 @@ qdel(H) return - if(T.intact && istype(T,/turf/simulated/floor)) //intact floor, pop the tile + + if(!T.is_plating() && istype(T,/turf/simulated/floor)) //intact floor, pop the tile var/turf/simulated/floor/F = T - //F.health = 100 - F.burnt = 1 - F.intact = 0 - F.levelupdate() + F.break_tile() new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff - F.icon_state = "Floor[F.burnt ? "1" : ""]" var/turf/target if(direction) // direction is specified @@ -802,7 +797,7 @@ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) if(H) for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(direction) spawn(1) if(AM) @@ -817,7 +812,7 @@ for(var/atom/movable/AM in H) target = get_offset_target_turf(T, rand(5)-rand(5), rand(5)-rand(5)) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(0) spawn(1) if(AM) @@ -850,7 +845,7 @@ // this is unlikely, but just dump out everything into the turf in case for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(0) qdel(H) return @@ -894,7 +889,7 @@ attackby(var/obj/item/I, var/mob/user) var/turf/T = src.loc - if(T.intact) + if(!T.is_plating()) return // prevent interaction with T-scanner revealed pipes src.add_fingerprint(user) if(istype(I, /obj/item/weapon/weldingtool)) @@ -971,7 +966,7 @@ // this is unlikely, but just dump out everything into the turf in case for(var/atom/movable/AM in H) - AM.loc = T + AM.forceMove(T) AM.pipe_eject(0) qdel(H) ..() @@ -982,6 +977,9 @@ expel(H, T, 0) ..() +/obj/structure/disposalpipe/hides_under_flooring() + return 1 + // *** TEST verb //client/verb/dispstop() // for(var/obj/structure/disposalholder/H in world) @@ -1027,12 +1025,9 @@ var/obj/structure/disposalpipe/P if(nextdir == 12) - var/turf/controllerlocation = locate(1, 1, src.z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.up) - T = locate(src.x, src.y, controller.up_target) + T = GetAbove(src) if(!T) - H.loc = src.loc + H.forceMove(loc) return else for(var/obj/structure/disposalpipe/down/F in T) @@ -1048,9 +1043,9 @@ if(H2 && !H2.active) H.merge(H2) - H.loc = P + H.forceMove(P) else // if wasn't a pipe, then set loc to turf - H.loc = T + H.forceMove(T) return null return P @@ -1080,12 +1075,9 @@ var/obj/structure/disposalpipe/P if(nextdir == 11) - var/turf/controllerlocation = locate(1, 1, src.z) - for(var/obj/effect/landmark/zcontroller/controller in controllerlocation) - if(controller.down) - T = locate(src.x, src.y, controller.down_target) + T = GetBelow(src) if(!T) - H.loc = src.loc + H.forceMove(src.loc) return else for(var/obj/structure/disposalpipe/up/F in T) @@ -1101,9 +1093,9 @@ if(H2 && !H2.active) H.merge(H2) - H.loc = P + H.forceMove(P) else // if wasn't a pipe, then set loc to turf - H.loc = T + H.forceMove(T) return null return P @@ -1294,9 +1286,9 @@ if(H2 && !H2.active) H.merge(H2) - H.loc = P + H.forceMove(P) else // if wasn't a pipe, then set loc to turf - H.loc = T + H.forceMove(T) return null return P @@ -1377,7 +1369,7 @@ return var/turf/T = src.loc - if(T.intact) + if(!T.is_plating()) return // prevent interaction with T-scanner revealed pipes src.add_fingerprint(user) if(istype(I, /obj/item/weapon/weldingtool)) @@ -1484,7 +1476,7 @@ if(H) for(var/atom/movable/AM in H) - AM.loc = src.loc + AM.forceMove(src.loc) AM.pipe_eject(dir) if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z spawn(5) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index eb763258326..c729c53bb4b 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -14,101 +14,101 @@ var/label_x var/tag_x - attack_hand(mob/user as mob) - unwrap() +/obj/structure/bigDelivery/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 - qdel(src) +/obj/structure/bigDelivery/proc/unwrap() + if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 + wrapped.forceMove(get_turf(src.loc)) + if(istype(wrapped, /obj/structure/closet)) + var/obj/structure/closet/O = wrapped + O.welded = 0 + qdel(src) - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/device/destTagger)) - var/obj/item/device/destTagger/O = W - if(O.currTag) - if(src.sortTag != O.currTag) - user << "You have labeled the destination as [O.currTag]." - if(!src.sortTag) - src.sortTag = O.currTag - update_icon() - else - src.sortTag = O.currTag - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) +/obj/structure/bigDelivery/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/destTagger)) + var/obj/item/device/destTagger/O = W + if(O.currTag) + if(src.sortTag != O.currTag) + user << "You have labeled the destination as [O.currTag]." + if(!src.sortTag) + src.sortTag = O.currTag + update_icon() else - user << "The package is already labeled for [O.currTag]." + src.sortTag = O.currTag + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) else - user << "You need to set a destination first!" + user << "The package is already labeled for [O.currTag]." + else + user << "You need to set a destination first!" - else if(istype(W, /obj/item/weapon/pen)) - switch(alert("What would you like to alter?",,"Title","Description", "Cancel")) - if("Title") - var/str = sanitizeSafe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN) - if(!str || !length(str)) - usr << " Invalid text." - return - user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\ - "You title \the [src]: \"[str]\"",\ - "You hear someone scribbling a note.") - name = "[name] ([str])" - if(!examtext && !nameset) - nameset = 1 - update_icon() - else - nameset = 1 - if("Description") - var/str = sanitize(input(usr,"Label text?","Set label","")) - if(!str || !length(str)) - usr << "\red Invalid text." - return - if(!examtext && !nameset) - examtext = str - update_icon() - else - examtext = str - user.visible_message("\The [user] labels \the [src] with \a [W], scribbling down: \"[examtext]\"",\ - "You label \the [src]: \"[examtext]\"",\ - "You hear someone scribbling a note.") - return + else if(istype(W, /obj/item/weapon/pen)) + switch(alert("What would you like to alter?",,"Title","Description", "Cancel")) + if("Title") + var/str = sanitizeSafe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN) + if(!str || !length(str)) + usr << " Invalid text." + return + user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\ + "You title \the [src]: \"[str]\"",\ + "You hear someone scribbling a note.") + name = "[name] ([str])" + if(!examtext && !nameset) + nameset = 1 + update_icon() + else + nameset = 1 + if("Description") + var/str = sanitize(input(usr,"Label text?","Set label","")) + if(!str || !length(str)) + usr << "\red Invalid text." + return + if(!examtext && !nameset) + examtext = str + update_icon() + else + examtext = str + user.visible_message("\The [user] labels \the [src] with \a [W], scribbling down: \"[examtext]\"",\ + "You label \the [src]: \"[examtext]\"",\ + "You hear someone scribbling a note.") + return - update_icon() - overlays = new() - if(nameset || examtext) - var/image/I = new/image('icons/obj/storage.dmi',"delivery_label") - if(icon_state == "deliverycloset") - I.pixel_x = 2 - if(label_y == null) - label_y = rand(-6, 11) - I.pixel_y = label_y - else if(icon_state == "deliverycrate") - if(label_x == null) - label_x = rand(-8, 6) - I.pixel_x = label_x - I.pixel_y = -3 - overlays += I - if(src.sortTag) - var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag") - if(icon_state == "deliverycloset") - if(tag_x == null) - tag_x = rand(-2, 3) - I.pixel_x = tag_x - I.pixel_y = 9 - else if(icon_state == "deliverycrate") - if(tag_x == null) - tag_x = rand(-8, 6) - I.pixel_x = tag_x - I.pixel_y = -3 - overlays += I +/obj/structure/bigDelivery/update_icon() + overlays = new() + if(nameset || examtext) + var/image/I = new/image('icons/obj/storage.dmi',"delivery_label") + if(icon_state == "deliverycloset") + I.pixel_x = 2 + if(label_y == null) + label_y = rand(-6, 11) + I.pixel_y = label_y + else if(icon_state == "deliverycrate") + if(label_x == null) + label_x = rand(-8, 6) + I.pixel_x = label_x + I.pixel_y = -3 + overlays += I + if(src.sortTag) + var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag") + if(icon_state == "deliverycloset") + if(tag_x == null) + tag_x = rand(-2, 3) + I.pixel_x = tag_x + I.pixel_y = 9 + else if(icon_state == "deliverycrate") + if(tag_x == null) + tag_x = rand(-8, 6) + I.pixel_x = tag_x + I.pixel_y = -3 + overlays += I - examine(mob/user) - if(..(user, 4)) - if(sortTag) - user << "It is labeled \"[sortTag]\"" - if(examtext) - user << "It has a note attached which reads, \"[examtext]\"" - return +/obj/structure/bigDelivery/examine(mob/user) + if(..(user, 4)) + if(sortTag) + user << "It is labeled \"[sortTag]\"" + if(examtext) + user << "It has a note attached which reads, \"[examtext]\"" + return /obj/item/smallDelivery desc = "A small wrapped package." @@ -121,98 +121,98 @@ var/nameset = 0 var/tag_x - attack_self(mob/user as mob) - if (src.wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = user.loc - if(ishuman(user)) - user.put_in_hands(wrapped) - else - wrapped.loc = get_turf(src) +/obj/item/smallDelivery/attack_self(mob/user as mob) + if (src.wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 + wrapped.forceMove(user.loc) + if(ishuman(user)) + user.put_in_hands(wrapped) + else + wrapped.forceMove(get_turf(src)) - qdel(src) - return + qdel(src) + return - attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/device/destTagger)) - var/obj/item/device/destTagger/O = W - if(O.currTag) - if(src.sortTag != O.currTag) - user << "You have labeled the destination as [O.currTag]." - if(!src.sortTag) - src.sortTag = O.currTag - update_icon() - else - src.sortTag = O.currTag - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) +/obj/item/smallDelivery/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/destTagger)) + var/obj/item/device/destTagger/O = W + if(O.currTag) + if(src.sortTag != O.currTag) + user << "You have labeled the destination as [O.currTag]." + if(!src.sortTag) + src.sortTag = O.currTag + update_icon() else - user << "The package is already labeled for [O.currTag]." + src.sortTag = O.currTag + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) else - user << "You need to set a destination first!" + user << "The package is already labeled for [O.currTag]." + else + user << "You need to set a destination first!" - else if(istype(W, /obj/item/weapon/pen)) - switch(alert("What would you like to alter?",,"Title","Description", "Cancel")) - if("Title") - var/str = sanitizeSafe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN) - if(!str || !length(str)) - usr << " Invalid text." - return - user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\ - "You title \the [src]: \"[str]\"",\ - "You hear someone scribbling a note.") - name = "[name] ([str])" - if(!examtext && !nameset) - nameset = 1 - update_icon() - else - nameset = 1 + else if(istype(W, /obj/item/weapon/pen)) + switch(alert("What would you like to alter?",,"Title","Description", "Cancel")) + if("Title") + var/str = sanitizeSafe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN) + if(!str || !length(str)) + usr << " Invalid text." + return + user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\ + "You title \the [src]: \"[str]\"",\ + "You hear someone scribbling a note.") + name = "[name] ([str])" + if(!examtext && !nameset) + nameset = 1 + update_icon() + else + nameset = 1 - if("Description") - var/str = sanitize(input(usr,"Label text?","Set label","")) - if(!str || !length(str)) - usr << "\red Invalid text." - return - if(!examtext && !nameset) - examtext = str - update_icon() - else - examtext = str - user.visible_message("\The [user] labels \the [src] with \a [W], scribbling down: \"[examtext]\"",\ - "You label \the [src]: \"[examtext]\"",\ - "You hear someone scribbling a note.") - return + if("Description") + var/str = sanitize(input(usr,"Label text?","Set label","")) + if(!str || !length(str)) + usr << "\red Invalid text." + return + if(!examtext && !nameset) + examtext = str + update_icon() + else + examtext = str + user.visible_message("\The [user] labels \the [src] with \a [W], scribbling down: \"[examtext]\"",\ + "You label \the [src]: \"[examtext]\"",\ + "You hear someone scribbling a note.") + return - update_icon() - overlays = new() - if((nameset || examtext) && icon_state != "deliverycrate1") - var/image/I = new/image('icons/obj/storage.dmi',"delivery_label") - if(icon_state == "deliverycrate5") - I.pixel_y = -1 - overlays += I - if(src.sortTag) - var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag") - switch(icon_state) - if("deliverycrate1") - I.pixel_y = -5 - if("deliverycrate2") - I.pixel_y = -2 - if("deliverycrate3") - I.pixel_y = 0 - if("deliverycrate4") - if(tag_x == null) - tag_x = rand(0,5) - I.pixel_x = tag_x - I.pixel_y = 3 - if("deliverycrate5") - I.pixel_y = -3 - overlays += I +/obj/item/smallDelivery/update_icon() + overlays = new() + if((nameset || examtext) && icon_state != "deliverycrate1") + var/image/I = new/image('icons/obj/storage.dmi',"delivery_label") + if(icon_state == "deliverycrate5") + I.pixel_y = -1 + overlays += I + if(src.sortTag) + var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag") + switch(icon_state) + if("deliverycrate1") + I.pixel_y = -5 + if("deliverycrate2") + I.pixel_y = -2 + if("deliverycrate3") + I.pixel_y = 0 + if("deliverycrate4") + if(tag_x == null) + tag_x = rand(0,5) + I.pixel_x = tag_x + I.pixel_y = 3 + if("deliverycrate5") + I.pixel_y = -3 + overlays += I - examine(mob/user) - if(..(user, 4)) - if(sortTag) - user << "It is labeled \"[sortTag]\"" - if(examtext) - user << "It has a note attached which reads, \"[examtext]\"" - return +/obj/item/smallDelivery/examine(mob/user) + if(..(user, 4)) + if(sortTag) + user << "It is labeled \"[sortTag]\"" + if(examtext) + user << "It has a note attached which reads, \"[examtext]\"" + return /obj/item/weapon/packageWrap name = "package wrapper" @@ -222,92 +222,92 @@ var/amount = 25.0 - afterattack(var/obj/target as obj, mob/user as mob, proximity) - if(!proximity) return - if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete - return - if(istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \ - || istype(target, /obj/item/weapon/gift) || istype(target, /obj/item/weapon/evidencebag)) - return - if(target.anchored) - return - if(target in user) - return - if(user in target) //no wrapping closets that you are inside - it's not physically possible - return - - user.attack_log += text("\[[time_stamp()]\] Has used [src.name] on \ref[target]") - - - if (istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box))) - var/obj/item/O = target - if (src.amount > 1) - var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up! - if(!istype(O.loc, /turf)) - if(user.client) - user.client.screen -= O - P.wrapped = O - O.loc = P - var/i = round(O.w_class) - if(i in list(1,2,3,4,5)) - P.icon_state = "deliverycrate[i]" - switch(i) - if(1) P.name = "tiny parcel" - if(3) P.name = "normal-sized parcel" - if(4) P.name = "large parcel" - if(5) P.name = "huge parcel" - if(i < 1) - P.icon_state = "deliverycrate1" - P.name = "tiny parcel" - if(i > 5) - P.icon_state = "deliverycrate5" - P.name = "huge parcel" - P.add_fingerprint(usr) - O.add_fingerprint(usr) - src.add_fingerprint(usr) - src.amount -= 1 - user.visible_message("\The [user] wraps \a [target] with \a [src].",\ - "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ - "You hear someone taping paper around a small object.") - else if (istype(target, /obj/structure/closet/crate)) - var/obj/structure/closet/crate/O = target - if (src.amount > 3 && !O.opened) - var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) - P.icon_state = "deliverycrate" - P.wrapped = O - O.loc = P - src.amount -= 3 - user.visible_message("\The [user] wraps \a [target] with \a [src].",\ - "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ - "You hear someone taping paper around a large object.") - else if(src.amount < 3) - user << "You need more paper." - else if (istype (target, /obj/structure/closet)) - var/obj/structure/closet/O = target - if (src.amount > 3 && !O.opened) - var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) - P.wrapped = O - O.welded = 1 - O.loc = P - src.amount -= 3 - user.visible_message("\The [user] wraps \a [target] with \a [src].",\ - "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ - "You hear someone taping paper around a large object.") - else if(src.amount < 3) - user << "You need more paper." - else - 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 ) - qdel(src) - return +/obj/item/weapon/packageWrap/afterattack(var/obj/target as obj, mob/user as mob, proximity) + if(!proximity) return + if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete + return + if(istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \ + || istype(target, /obj/item/weapon/gift) || istype(target, /obj/item/weapon/evidencebag)) + return + if(target.anchored) + return + if(target in user) + return + if(user in target) //no wrapping closets that you are inside - it's not physically possible return - examine(mob/user) - if(..(user, 0)) - user << "\blue There are [amount] units of package wrap left!" + user.attack_log += text("\[[time_stamp()]\] Has used [src.name] on \ref[target]") + + if (istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box))) + var/obj/item/O = target + if (src.amount > 1) + var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up! + if(!istype(O.loc, /turf)) + if(user.client) + user.client.screen -= O + P.wrapped = O + O.forceMove(P) + var/i = round(O.w_class) + if(i in list(1,2,3,4,5)) + P.icon_state = "deliverycrate[i]" + switch(i) + if(1) P.name = "tiny parcel" + if(3) P.name = "normal-sized parcel" + if(4) P.name = "large parcel" + if(5) P.name = "huge parcel" + if(i < 1) + P.icon_state = "deliverycrate1" + P.name = "tiny parcel" + if(i > 5) + P.icon_state = "deliverycrate5" + P.name = "huge parcel" + P.add_fingerprint(usr) + O.add_fingerprint(usr) + src.add_fingerprint(usr) + src.amount -= 1 + user.visible_message("\The [user] wraps \a [target] with \a [src].",\ + "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ + "You hear someone taping paper around a small object.") + else if (istype(target, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/O = target + if (src.amount > 3 && !O.opened) + var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) + P.icon_state = "deliverycrate" + P.wrapped = O + O.forceMove(P) + src.amount -= 3 + user.visible_message("\The [user] wraps \a [target] with \a [src].",\ + "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ + "You hear someone taping paper around a large object.") + else if(src.amount < 3) + user << "You need more paper." + else if (istype (target, /obj/structure/closet)) + var/obj/structure/closet/O = target + if (src.amount > 3 && !O.opened) + var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) + P.wrapped = O + O.welded = 1 + O.forceMove(P) + src.amount -= 3 + user.visible_message("\The [user] wraps \a [target] with \a [src].",\ + "You wrap \the [target], leaving [amount] units of paper on \the [src].",\ + "You hear someone taping paper around a large object.") + else if(src.amount < 3) + user << "You need more paper." + else + 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 ) + qdel(src) return + return + +/obj/item/weapon/packageWrap/examine(mob/user) + if(..(user, 0)) + user << "\blue There are [amount] units of package wrap left!" + + return /obj/structure/bigDelivery/Destroy() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 @@ -331,30 +331,36 @@ flags = CONDUCT slot_flags = SLOT_BELT - proc/openwindow(mob/user as mob) - var/dat = "

      TagMaster 2.3

      " +/obj/item/device/destTagger/proc/openwindow(mob/user as mob) + var/dat = "

      TagMaster 2.3

      " - dat += "" - for(var/i = 1, i <= tagger_locations.len, i++) - dat += "" + dat += "
      [tagger_locations[i]]
      " + for(var/i = 1, i <= tagger_locations.len, i++) + dat += "" - if (i%4==0) - dat += "" + if (i%4==0) + dat += "" - dat += "
      [tagger_locations[i]]

      Current Selection: [currTag ? currTag : "None"]
      " + dat += "
      Current Selection: [currTag ? currTag : "None"]
      " + dat += "
      Enter custom location." + user << browse(dat, "window=destTagScreen;size=450x375") + onclose(user, "destTagScreen") - user << browse(dat, "window=destTagScreen;size=450x350") - onclose(user, "destTagScreen") +/obj/item/device/destTagger/attack_self(mob/user as mob) + openwindow(user) + return - attack_self(mob/user as mob) - openwindow(user) - return - - Topic(href, href_list) - src.add_fingerprint(usr) - if(href_list["nextTag"] && href_list["nextTag"] in tagger_locations) - src.currTag = href_list["nextTag"] - openwindow(usr) +/obj/item/device/destTagger/Topic(href, href_list) + src.add_fingerprint(usr) + if(href_list["nextTag"] && href_list["nextTag"] in tagger_locations) + src.currTag = href_list["nextTag"] + if(href_list["nextTag"] == "CUSTOM") + var/dest = input("Please enter custom location.", "Location", src.currTag ? src.currTag : "None") + if(dest != "None") + src.currTag = dest + else + src.currTag = 0 + openwindow(usr) /obj/machinery/disposal/deliveryChute name = "Delivery chute" @@ -364,94 +370,94 @@ var/c_mode = 0 - New() - ..() - spawn(5) - trunk = locate() in src.loc - if(trunk) - trunk.linked = src // link the pipe trunk to self +/obj/machinery/disposal/deliveryChute/New() + ..() + spawn(5) + trunk = locate() in src.loc + if(trunk) + trunk.linked = src // link the pipe trunk to self - interact() - return +/obj/machinery/disposal/deliveryChute/interact() + return +/obj/machinery/disposal/deliveryChute/update() + return + +/obj/machinery/disposal/deliveryChute/Bumped(var/atom/movable/AM) //Go straight into the chute + if(istype(AM, /obj/item/projectile) || istype(AM, /obj/effect)) return + switch(dir) + if(NORTH) + if(AM.loc.y != src.loc.y+1) return + if(EAST) + if(AM.loc.x != src.loc.x+1) return + if(SOUTH) + if(AM.loc.y != src.loc.y-1) return + if(WEST) + if(AM.loc.x != src.loc.x-1) return + + if(istype(AM, /obj)) + var/obj/O = AM + O.forceMove(src) + else if(istype(AM, /mob)) + var/mob/M = AM + M.forceMove(src) + src.flush() + +/obj/machinery/disposal/deliveryChute/flush() + flushing = 1 + flick("intake-closing", src) + var/obj/structure/disposalholder/H = new() // virtual holder object which actually + // travels through the pipes. + air_contents = new() // new empty gas resv. + + sleep(10) + playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0) + sleep(5) // wait for animation to finish + + H.init(src) // copy the contents of disposer to holder + + H.start(src) // start the holder processing movement + flushing = 0 + // now reset disposal state + flush = 0 + if(mode == 2) // if was ready, + mode = 1 // switch to charging update() + return + +/obj/machinery/disposal/deliveryChute/attackby(var/obj/item/I, var/mob/user) + if(!I || !user) return - Bumped(var/atom/movable/AM) //Go straight into the chute - if(istype(AM, /obj/item/projectile) || istype(AM, /obj/effect)) return - switch(dir) - if(NORTH) - if(AM.loc.y != src.loc.y+1) return - if(EAST) - if(AM.loc.x != src.loc.x+1) return - if(SOUTH) - if(AM.loc.y != src.loc.y-1) return - if(WEST) - if(AM.loc.x != src.loc.x-1) return - - if(istype(AM, /obj)) - var/obj/O = AM - O.loc = src - else if(istype(AM, /mob)) - var/mob/M = AM - M.loc = src - src.flush() - - flush() - flushing = 1 - flick("intake-closing", src) - var/obj/structure/disposalholder/H = new() // virtual holder object which actually - // travels through the pipes. - air_contents = new() // new empty gas resv. - - sleep(10) - playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0) - sleep(5) // wait for animation to finish - - H.init(src) // copy the contents of disposer to holder - - H.start(src) // start the holder processing movement - flushing = 0 - // now reset disposal state - flush = 0 - if(mode == 2) // if was ready, - mode = 1 // switch to charging - update() - return - - attackby(var/obj/item/I, var/mob/user) - if(!I || !user) + if(istype(I, /obj/item/weapon/screwdriver)) + if(c_mode==0) + c_mode=1 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You remove the screws around the power connection." return - - if(istype(I, /obj/item/weapon/screwdriver)) - if(c_mode==0) - c_mode=1 - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You remove the screws around the power connection." - return - else if(c_mode==1) - c_mode=0 - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You attach the screws around the power connection." - return - else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1) - var/obj/item/weapon/weldingtool/W = I - if(W.remove_fuel(0,user)) + else if(c_mode==1) + c_mode=0 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + user << "You attach the screws around the power connection." + return + else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1) + var/obj/item/weapon/weldingtool/W = I + if(W.remove_fuel(1,user)) + user << "You start slicing the floorweld off the delivery chute." + if(do_after(user,20)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off the delivery chute." - if(do_after(user,20)) - if(!src || !W.isOn()) return - user << "You sliced the floorweld off the delivery chute." - var/obj/structure/disposalconstruct/C = new (src.loc) - C.ptype = 8 // 8 = Delivery chute - C.update() - C.anchored = 1 - C.density = 1 - qdel(src) - return - else - user << "You need more welding fuel to complete this task." - return + if(!src || !W.isOn()) return + user << "You sliced the floorweld off the delivery chute." + var/obj/structure/disposalconstruct/C = new (src.loc) + C.ptype = 8 // 8 = Delivery chute + C.update() + C.anchored = 1 + C.density = 1 + qdel(src) + return + else + user << "You need more welding fuel to complete this task." + return /obj/machinery/disposal/deliveryChute/Destroy() if(trunk) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 437bf8c8146..c19483576da 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -1,20 +1,21 @@ /*///////////////Circuit Imprinter (By Darem)//////////////////////// Used to print new circuit boards (for computers and similar systems) and AI modules. Each circuit board pattern are stored in a /datum/desgin on the linked R&D console. You can then print them out in a fasion similar to a regular lathe. However, instead of -using metal and glass, it uses glass and reagents (usually sulfuric acis). - +using metal and glass, it uses glass and reagents (usually sulphuric acid). */ + /obj/machinery/r_n_d/circuit_imprinter name = "Circuit Imprinter" icon_state = "circuit_imprinter" flags = OPENCONTAINER - var/g_amount = 0 - var/gold_amount = 0 - var/diamond_amount = 0 - var/uranium_amount = 0 - var/max_material_amount = 75000.0 + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0) + var/list/datum/design/queue = list() + var/progress = 0 + + var/max_material_storage = 75000 var/mat_efficiency = 1 + var/speed = 1 use_power = 1 idle_power_usage = 30 @@ -30,60 +31,76 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src) RefreshParts() +/obj/machinery/r_n_d/circuit_imprinter/process() + ..() + if(stat) + update_icon() + return + if(queue.len == 0) + busy = 0 + update_icon() + return + var/datum/design/D = queue[1] + if(canBuild(D)) + busy = 1 + progress += speed + if(progress >= D.time) + build(D) + progress = 0 + removeFromQueue(1) + if(linked_console) + linked_console.updateUsrDialog() + update_icon() + else + if(busy) + visible_message("\icon [src] flashes: insufficient materials: [getLackingMaterials(D)].") + busy = 0 + update_icon() + /obj/machinery/r_n_d/circuit_imprinter/RefreshParts() var/T = 0 for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) T += G.reagents.maximum_volume - var/datum/reagents/R = new/datum/reagents(T) //Holder for the reagents used as materials. - reagents = R - R.my_atom = src - T = 0 + create_reagents(T) + max_material_storage = 0 for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) - T += M.rating - max_material_amount = T * 75000.0 + max_material_storage += M.rating * 75000 T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating mat_efficiency = 1 - (T - 1) / 4 + speed = T /obj/machinery/r_n_d/circuit_imprinter/update_icon() if(panel_open) icon_state = "circuit_imprinter_t" + else if(busy) + icon_state = "circuit_imprinter_ani" else icon_state = "circuit_imprinter" -/obj/machinery/r_n_d/circuit_imprinter/blob_act() - if(prob(50)) - qdel(src) - -/obj/machinery/r_n_d/circuit_imprinter/meteorhit() - qdel(src) - return - /obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials() - return g_amount + gold_amount + diamond_amount + uranium_amount + var/t = 0 + for(var/f in materials) + t += materials[f] + return t /obj/machinery/r_n_d/circuit_imprinter/dismantle() for(var/obj/I in component_parts) if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker)) reagents.trans_to_obj(I, reagents.total_volume) - if(g_amount >= 3750) - var/obj/item/stack/material/glass/G = new /obj/item/stack/material/glass(loc) - G.amount = round(g_amount / 3750) - if(gold_amount >= 2000) - var/obj/item/stack/material/gold/G = new /obj/item/stack/material/gold(loc) - G.amount = round(gold_amount / 2000) - if(diamond_amount >= 2000) - var/obj/item/stack/material/diamond/G = new /obj/item/stack/material/diamond(loc) - G.amount = round(diamond_amount / 2000) - if(uranium_amount >= 2000) - var/obj/item/stack/material/uranium/G = new /obj/item/stack/material/uranium(loc) - G.amount = round(uranium_amount / 2000) + for(var/f in materials) + if(materials[f] >= SHEET_MATERIAL_AMOUNT) + var/path = getMaterialType(f) + if(path) + var/obj/item/stack/S = new f(loc) + S.amount = round(materials[f] / SHEET_MATERIAL_AMOUNT) ..() /obj/machinery/r_n_d/circuit_imprinter/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(shocked) - shock(user, 50) + if(busy) + user << "\The [src] is busy. Please wait for completion of previous operation." + return 1 if(default_deconstruction_screwdriver(user, O)) if(linked_console) linked_console.linked_imprinter = null @@ -96,55 +113,90 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). if(panel_open) user << "You can't load \the [src] while it's opened." return 1 - if(disabled) - user << "\The [src] appears to not be working!" - return if(!linked_console) - user << "\The [src] must be linked to an R&D console first!" + user << "\The [src] must be linked to an R&D console first." return 1 if(O.is_open_container()) return 0 + if(!istype(O, /obj/item/stack/material)) + 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." + + if(TotalMaterials() + SHEET_MATERIAL_AMOUNT > max_material_storage) + user << "\The [src]'s material bin is full. Please remove material before adding more." return 1 - if(istype(O, /obj/item/stack/material) && O.get_material_name() in list("glass", "gold", "diamond", "uranium")) - - var/obj/item/stack/material/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 - var/stacktype = stack.type - if(do_after(usr, 16) && stack.use(amount)) - user << "You add [amount] sheets to \the [src]." - use_power(max(1000, (3750 * amount / 10))) - switch(stacktype) - if(/obj/item/stack/material/glass) - g_amount += amount * 3750 - if(/obj/item/stack/material/gold) - gold_amount += amount * 2000 - if(/obj/item/stack/material/diamond) - diamond_amount += amount * 2000 - if(/obj/item/stack/material/uranium) - uranium_amount += amount * 2000 - busy = 0 - updateUsrDialog() + var/obj/item/stack/material/stack = O + var/amount = round(input("How many sheets do you want to add?") as num) + if(!O) return + if(amount <= 0)//No negative numbers + return + if(amount > stack.get_amount()) + amount = stack.get_amount() + if(max_material_storage - TotalMaterials() < (amount * SHEET_MATERIAL_AMOUNT)) //Can't overfill + amount = min(stack.get_amount(), round((max_material_storage - TotalMaterials()) / SHEET_MATERIAL_AMOUNT)) - ..() + busy = 1 + use_power(max(1000, (SHEET_MATERIAL_AMOUNT * amount / 10))) + var/stacktype = stack.type + var/t = getMaterialName(stacktype) + if(t) + if(do_after(usr, 16)) + if(stack.use(amount)) + user << "You add [amount] sheets to \the [src]." + materials[t] += amount * SHEET_MATERIAL_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) - return \ No newline at end of file +/obj/machinery/r_n_d/circuit_imprinter/proc/addToQueue(var/datum/design/D) + queue += D + return + +/obj/machinery/r_n_d/circuit_imprinter/proc/removeFromQueue(var/index) + queue.Cut(index, index + 1) + return + +/obj/machinery/r_n_d/circuit_imprinter/proc/canBuild(var/datum/design/D) + for(var/M in D.materials) + if(materials[M] < D.materials[M]) + return 0 + for(var/C in D.chemicals) + if(!reagents.has_reagent(C, D.chemicals[C])) + return 0 + return 1 + +/obj/machinery/r_n_d/circuit_imprinter/proc/getLackingMaterials(var/datum/design/D) + var/ret = "" + for(var/M in D.materials) + if(materials[M] < D.materials[M]) + if(ret != "") + ret += ", " + ret += "[D.materials[M] - materials[M]] [M]" + for(var/C in D.chemicals) + if(!reagents.has_reagent(C, D.chemicals[C])) + if(ret != "") + ret += ", " + ret += C + return ret + +/obj/machinery/r_n_d/circuit_imprinter/proc/build(var/datum/design/D) + var/power = active_power_usage + for(var/M in D.materials) + power += round(D.materials[M] / 5) + power = max(active_power_usage, power) + use_power(power) + for(var/M in D.materials) + materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency) + for(var/C in D.chemicals) + reagents.remove_reagent(C, D.chemicals[C] * mat_efficiency) + + if(D.build_path) + var/obj/new_item = D.Fabricate(src, src) + new_item.loc = loc + if(mat_efficiency != 1) // No matter out of nowhere + if(new_item.matter && new_item.matter.len > 0) + for(var/i in new_item.matter) + new_item.matter[i] = new_item.matter[i] * mat_efficiency diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 0f96859356c..8da9a9724fe 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - /*************************************************************** ** Design Datums ** ** All the data for building stuff and tracking reliability. ** @@ -7,320 +5,327 @@ /* For the materials datum, it assumes you need reagents unless specified otherwise. To designate a material that isn't a reagent, you use one of the material IDs below. These are NOT ids in the usual sense (they aren't defined in the object or part of a datum), -they are simply references used as part of a "has materials?" type proc. They all start with a $ to denote that they aren't reagents. +they are simply references used as part of a "has materials?" type proc. They all start with a to denote that they aren't reagents. The currently supporting non-reagent materials: -- $metal (/obj/item/stack/metal). One sheet = 3750 units. -- $glass (/obj/item/stack/glass). One sheet = 3750 units. -- $phoron (/obj/item/stack/phoron). One sheet = 3750 units. -- $silver (/obj/item/stack/silver). One sheet = 3750 units. -- $gold (/obj/item/stack/gold). One sheet = 3750 units. -- $uranium (/obj/item/stack/uranium). One sheet = 3750 units. -- $diamond (/obj/item/stack/diamond). One sheet = 3750 units. -(Insert new ones here) Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from metal). Only add raw materials. Design Guidlines -- The reliability formula for all R&D built items is reliability_base (a fixed number) + total tech levels required to make it + -reliability_mod (starts at 0, gets improved through experimentation). Example: PACMAN generator. 79 base reliablity + 6 tech -(3 phorontech, 3 powerstorage) + 0 (since it's completely new) = 85% reliability. Reliability is the chance it works CORRECTLY. - When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed. -- A single sheet of anything is 3750 units of material. Materials besides metal/glass require help from other jobs (mining for +- A single sheet of anything is 2000 units of material. Materials besides metal/glass require help from other jobs (mining for other types of metals and chemistry for reagents). -- Add the AUTOLATHE tag to - -Research type IDs, for quick reference - -materials = Materials Research -engineering = Engineering Research -phorontech = Phoron Research -powerstorage = Power Manipulation Technology -bluespace = Blue-Space Research -biotech = Biological Technology -combat = Combat Systems Research -magnets = Electromagnetic Spectrum Research -programming = Data Theory Research -syndicate = Illegal Technologies Research - */ -#define IMPRINTER 1 //For circuits. Uses glass/chemicals. -#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals -#define AUTOLATHE 4 //Uses glass/metal only. -#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually. -#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars. -//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable. +//Note: More then one of these can be added to a design. -datum/design //Datum for object designs, used in construction +// #TODO-MERGE: Go over this file and make sure everything's fine. We might have missing vars. + +/datum/design //Datum for object designs, used in construction var/name = null //Name of the created object. If null it will be 'guessed' from build_path if possible. var/desc = null //Description of the created object. If null it will use group_desc and name where applicable. var/item_name = null //An item name before it is modified by various name-modifying procs var/id = "id" //ID of the created object for easy refernece. Alphanumeric, lower-case, no symbols. var/list/req_tech = list() //IDs of that techs the object originated from and the minimum level requirements. - var/reliability_mod = 0 //Reliability modifier of the device at it's starting point. - var/reliability_base = 100 //Base reliability of a device before modifiers. - var/reliability = 100 //Reliability of the device. var/build_type = null //Flag as to what kind machine the design is built in. See defines. var/list/materials = list() //List of materials. Format: "id" = amount. + var/list/chemicals = list() //List of chemicals. var/build_path = null //The path of the object that gets created. - var/locked = 0 //If true it will spawn inside a lockbox with currently sec access. + var/time = 10 //How many ticks it requires to build var/category = null //Primarily used for Mech Fabricators, but can be used for anything. + var/sort_string = "ZZZZZ" //Sorting order -//A proc to calculate the reliability of a design based on tech levels and innate modifiers. -//Input: A list of /datum/tech; Output: The new reliabilty. -datum/design/proc/CalcReliability(var/list/temp_techs) - var/new_reliability = reliability_mod + reliability_base - for(var/datum/tech/T in temp_techs) - if(T.id in req_tech) - new_reliability += T.level - new_reliability = between(reliability_base, new_reliability, 100) - reliability = new_reliability - return - -datum/design/New() +/datum/design/New() ..() item_name = name AssembleDesignInfo() //These procs are used in subtypes for assigning names and descriptions dynamically -datum/design/proc/AssembleDesignInfo() +/datum/design/proc/AssembleDesignInfo() AssembleDesignName() AssembleDesignDesc() return -datum/design/proc/AssembleDesignName() +/datum/design/proc/AssembleDesignName() if(!name && build_path) //Get name from build path if posible var/atom/movable/A = build_path name = initial(A.name) item_name = name return -datum/design/proc/AssembleDesignDesc() +/datum/design/proc/AssembleDesignDesc() if(!desc) //Try to make up a nice description if we don't have one desc = "Allows for the construction of \a [item_name]." return -/////////////////////////////////// -/////General Type Definitions////// -/////////////////////////////////// -datum/design/circuit - build_type = IMPRINTER - req_tech = list("programming" = 2) - materials = list("$glass" = 2000, "sacid" = 20) +//Returns a new instance of the item for this design +//This is to allow additional initialization to be performed, including possibly additional contructor arguments. +/datum/design/proc/Fabricate(var/newloc, var/fabricator) + return new build_path(newloc) -datum/design/circuit/AssembleDesignName() - ..() - name = "Circuit design ([item_name])" - -datum/design/circuit/AssembleDesignDesc() - if(!desc) - desc = "Allows for the construction of \a [item_name] circuit board." - -datum/design/item +/datum/design/item build_type = PROTOLATHE -/////////////////////////////////// -//////////Computer Boards////////// -/////////////////////////////////// -datum/design/circuit/seccamera - name = "security camera monitor" - id = "seccamera" - build_path = /obj/item/weapon/circuitboard/security +/datum/design/item/design_disk + name = "Design Storage Disk" + desc = "Produce additional disks for storing device designs." + id = "design_disk" + req_tech = list(TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) + build_path = /obj/item/weapon/disk/design_disk + sort_string = "GAAAA" -datum/design/circuit/aicore - name = "AI core" - id = "aicore" - req_tech = list("programming" = 4, "biotech" = 3) - build_path = /obj/item/weapon/circuitboard/aicore +/datum/design/item/tech_disk + name = "Technology Data Storage Disk" + desc = "Produce additional disks for storing technology data." + id = "tech_disk" + req_tech = list(TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) + build_path = /obj/item/weapon/disk/tech_disk + sort_string = "GAAAB" -datum/design/circuit/aiupload - name = "AI upload console" - id = "aiupload" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/aiupload +/datum/design/item/stock_part + build_type = PROTOLATHE -datum/design/circuit/borgupload - name = "cyborg upload console" - id = "borgupload" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/borgupload +/datum/design/item/stock_part/AssembleDesignName() + ..() + name = "Component design ([item_name])" -datum/design/circuit/operating - name = "patient monitoring console" - id = "operating" - build_path = /obj/item/weapon/circuitboard/operating +/datum/design/item/stock_part/AssembleDesignDesc() + if(!desc) + desc = "A stock part used in the construction of various devices." -datum/design/circuit/pandemic - name = "PanD.E.M.I.C. 2200" - id = "pandemic" - build_path = /obj/item/weapon/circuitboard/pandemic +/datum/design/item/stock_part/basic_capacitor + id = "basic_capacitor" + req_tech = list(TECH_POWER = 1) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + build_path = /obj/item/weapon/stock_parts/capacitor + sort_string = "CAAAA" -datum/design/circuit/scan_console - name = "DNA machine" - id = "scan_console" - build_path = /obj/item/weapon/circuitboard/scan_consolenew +/datum/design/item/stock_part/adv_capacitor + id = "adv_capacitor" + req_tech = list(TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + build_path = /obj/item/weapon/stock_parts/capacitor/adv + sort_string = "CAAAB" -datum/design/circuit/comconsole - name = "communications console" - id = "comconsole" - build_path = /obj/item/weapon/circuitboard/communications +/datum/design/item/stock_part/super_capacitor + id = "super_capacitor" + req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20) + build_path = /obj/item/weapon/stock_parts/capacitor/super + sort_string = "CAAAC" -datum/design/circuit/idcardconsole - name = "ID card modification console" - id = "idcardconsole" - build_path = /obj/item/weapon/circuitboard/card +/datum/design/item/stock_part/micro_mani + id = "micro_mani" + req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator + sort_string = "CAABA" -datum/design/circuit/crewconsole - name = "crew monitoring console" - id = "crewconsole" - req_tech = list("programming" = 3, "magnets" = 2, "biotech" = 2) - build_path = /obj/item/weapon/circuitboard/crew +/datum/design/item/stock_part/nano_mani + id = "nano_mani" + req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator/nano + sort_string = "CAABB" -datum/design/circuit/teleconsole - name = "teleporter control console" - id = "teleconsole" - req_tech = list("programming" = 3, "bluespace" = 2) +/datum/design/item/stock_part/pico_mani + id = "pico_mani" + req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator/pico + sort_string = "CAABC" -datum/design/circuit/emp_data - name = "employment records console" - id = "emp_data" - build_path = /obj/item/weapon/circuitboard/skills +/datum/design/item/stock_part/basic_matter_bin + id = "basic_matter_bin" + req_tech = list(TECH_MATERIAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 80) + build_path = /obj/item/weapon/stock_parts/matter_bin + sort_string = "CAACA" -datum/design/circuit/med_data - name = "medical records console" - id = "med_data" - build_path = /obj/item/weapon/circuitboard/med_data +/datum/design/item/stock_part/adv_matter_bin + id = "adv_matter_bin" + req_tech = list(TECH_MATERIAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 80) + build_path = /obj/item/weapon/stock_parts/matter_bin/adv + sort_string = "CAACB" -datum/design/circuit/secdata - name = "security records console" - id = "sec_data" - build_path = /obj/item/weapon/circuitboard/secure_data +/datum/design/item/stock_part/super_matter_bin + id = "super_matter_bin" + req_tech = list(TECH_MATERIAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 80) + build_path = /obj/item/weapon/stock_parts/matter_bin/super + sort_string = "CAACC" -datum/design/circuit/atmosalerts - name = "atmosphere alert console" - id = "atmosalerts" - build_path = /obj/item/weapon/circuitboard/atmos_alert +/datum/design/item/stock_part/basic_micro_laser + id = "basic_micro_laser" + req_tech = list(TECH_MAGNET = 1) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) + build_path = /obj/item/weapon/stock_parts/micro_laser + sort_string = "CAADA" -datum/design/circuit/air_management - name = "atmosphere monitoring console" - id = "air_management" - build_path = /obj/item/weapon/circuitboard/air_management +/datum/design/item/stock_part/high_micro_laser + id = "high_micro_laser" + req_tech = list(TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) + build_path = /obj/item/weapon/stock_parts/micro_laser/high + sort_string = "CAADB" -datum/design/circuit/rcon_console - name = "RCON remote control console" - id = "rcon_console" - req_tech = list("programming" = 4, "engineering" = 3, "powerstorage" = 5) - build_path = /obj/item/weapon/circuitboard/rcon_console +/datum/design/item/stock_part/ultra_micro_laser + id = "ultra_micro_laser" + req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10) + build_path = /obj/item/weapon/stock_parts/micro_laser/ultra + sort_string = "CAADC" -/* Uncomment if someone makes these buildable -datum/design/circuit/general_alert - name = "general alert console" - id = "general_alert" - build_path = /obj/item/weapon/circuitboard/general_alert -*/ +/datum/design/item/stock_part/basic_sensor + id = "basic_sensor" + req_tech = list(TECH_MAGNET = 1) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) + build_path = /obj/item/weapon/stock_parts/scanning_module + sort_string = "CAAEA" -datum/design/circuit/robocontrol - name = "robotics control console" - id = "robocontrol" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/robotics +/datum/design/item/stock_part/adv_sensor + id = "adv_sensor" + req_tech = list(TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) + build_path = /obj/item/weapon/stock_parts/scanning_module/adv + sort_string = "CAAEB" -datum/design/circuit/dronecontrol - name = "drone control console" - id = "dronecontrol" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/drone_control +/datum/design/item/stock_part/phasic_sensor + id = "phasic_sensor" + req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, "silver" = 10) + build_path = /obj/item/weapon/stock_parts/scanning_module/phasic + sort_string = "CAAEC" -datum/design/circuit/clonecontrol - name = "cloning control console" - id = "clonecontrol" - req_tech = list("programming" = 3, "biotech" = 3) - build_path = /obj/item/weapon/circuitboard/cloning +/datum/design/item/stock_part/RPED + name = "Rapid Part Exchange Device" + desc = "Special mechanical module made to store, sort, and apply standard machine parts." + id = "rped" + req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000) + build_path = /obj/item/weapon/storage/part_replacer + sort_string = "CBAAA" -datum/design/circuit/clonepod - name = "clone pod" - id = "clonepod" - req_tech = list("programming" = 3, "biotech" = 3) - build_path = /obj/item/weapon/circuitboard/clonepod +/datum/design/item/powercell + build_type = PROTOLATHE | MECHFAB -datum/design/circuit/clonescanner - name = "cloning scanner" - id = "clonescanner" - req_tech = list("programming" = 3, "biotech" = 3) - build_path = /obj/item/weapon/circuitboard/clonescanner +/datum/design/item/powercell/AssembleDesignName() + name = "Power cell model ([item_name])" -datum/design/circuit/arcademachine - name = "arcade machine" - id = "arcademachine" - req_tech = list("programming" = 1) - build_path = /obj/item/weapon/circuitboard/arcade +/datum/design/item/powercell/AssembleDesignDesc() + if(build_path) + var/obj/item/weapon/cell/C = build_path + desc = "Allows the construction of power cells that can hold [initial(C.maxcharge)] units of energy." -datum/design/circuit/powermonitor - name = "power monitoring console" - id = "powermonitor" - build_path = /obj/item/weapon/circuitboard/powermonitor +/datum/design/item/powercell/Fabricate() + var/obj/item/weapon/cell/C = ..() + C.charge = 0 //shouldn't produce power out of thin air. + return C -datum/design/circuit/solarcontrol - name = "solar control console" - id = "solarcontrol" - build_path = /obj/item/weapon/circuitboard/solar_control +/datum/design/item/powercell/basic + name = "basic" + build_type = PROTOLATHE | MECHFAB + id = "basic_cell" + req_tech = list(TECH_POWER = 1) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) + build_path = /obj/item/weapon/cell + category = "Misc" + sort_string = "DAAAA" -datum/design/circuit/prisonmanage - name = "prisoner management console" - id = "prisonmanage" - build_path = /obj/item/weapon/circuitboard/prisoner +/datum/design/item/powercell/high + name = "high-capacity" + build_type = PROTOLATHE | MECHFAB + id = "high_cell" + req_tech = list(TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60) + build_path = /obj/item/weapon/cell/high + category = "Misc" + sort_string = "DAAAB" -datum/design/circuit/mechacontrol - name = "exosuit control console" - id = "mechacontrol" - req_tech = list("programming" = 3) - build_path = /obj/item/weapon/circuitboard/mecha_control +/datum/design/item/powercell/super + name = "super-capacity" + id = "super_cell" + req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) + build_path = /obj/item/weapon/cell/super + category = "Misc" + sort_string = "DAAAC" -datum/design/circuit/mechapower - name = "mech bay power control console" - id = "mechapower" - build_path = /obj/item/weapon/circuitboard/mech_bay_power_console +/datum/design/item/powercell/hyper + name = "hyper-capacity" + id = "hyper_cell" + req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 400, "gold" = 150, "silver" = 150, "glass" = 70) + build_path = /obj/item/weapon/cell/hyper + category = "Misc" + sort_string = "DAAAD" -datum/design/circuit/rdconsole - name = "R&D control console" - id = "rdconsole" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/rdconsole +/datum/design/item/hud + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) -datum/design/circuit/ordercomp - name = "supply ordering console" - id = "ordercomp" - build_path = /obj/item/weapon/circuitboard/ordercomp +/datum/design/item/hud/AssembleDesignName() + ..() + name = "HUD glasses prototype ([item_name])" -datum/design/circuit/supplycomp - name = "supply control console" - id = "supplycomp" - req_tech = list("programming" = 3) - build_path = /obj/item/weapon/circuitboard/supplycomp +/datum/design/item/hud/AssembleDesignDesc() + desc = "Allows for the construction of \a [item_name] HUD glasses." -datum/design/circuit/comm_monitor - name = "telecommunications monitoring console" - id = "comm_monitor" - req_tech = list("programming" = 3) - build_path = /obj/item/weapon/circuitboard/comm_monitor +/datum/design/item/hud/health + name = "health scanner" + id = "health_hud" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 3) + build_path = /obj/item/clothing/glasses/hud/health + sort_string = "GAAAA" -datum/design/circuit/comm_server - name = "telecommunications server monitoring console" - id = "comm_server" - req_tech = list("programming" = 3) - build_path = /obj/item/weapon/circuitboard/comm_server +/datum/design/item/hud/security + name = "security records" + id = "security_hud" + req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) + build_path = /obj/item/clothing/glasses/hud/security + sort_string = "GAAAB" -datum/design/circuit/message_monitor - name = "messaging monitor console" - id = "message_monitor" - req_tech = list("programming" = 5) - build_path = /obj/item/weapon/circuitboard/message_monitor +/datum/design/item/mesons + name = "Optical meson scanners design" + desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else." + id = "mesons" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + build_path = /obj/item/clothing/glasses/meson + sort_string = "GAAAC" -datum/design/circuit/aifixer - name = "AI integrity restorer" - id = "aifixer" - req_tech = list("programming" = 3, "biotech" = 2) - build_path = /obj/item/weapon/circuitboard/aifixer +/datum/design/item/weapon/mining/AssembleDesignName() + ..() + name = "Mining equipment design ([item_name])" + +/datum/design/item/weapon/mining/jackhammer + id = "jackhammer" + req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500) + build_path = /obj/item/weapon/pickaxe/jackhammer + sort_string = "KAAAA" + +/datum/design/item/weapon/mining/drill + id = "drill" + req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners. + build_path = /obj/item/weapon/pickaxe/drill + sort_string = "KAAAB" + +/datum/design/item/weapon/mining/plasmacutter + id = "plasmacutter" + req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500) + build_path = /obj/item/weapon/pickaxe/plasmacutter + sort_string = "KAAAC" + +/datum/design/item/weapon/mining/pick_diamond + id = "pick_diamond" + req_tech = list(TECH_MATERIAL = 6) + materials = list("diamond" = 3000) + build_path = /obj/item/weapon/pickaxe/diamond + sort_string = "KAAAD" datum/design/circuit/telesci_console name = "telepad control console" @@ -334,996 +339,1142 @@ datum/design/circuit/telepad req_tech = list("programming" = 4, "bluespace" = 4, "materials" = 3, "engineering" = 3) build_path = /obj/item/weapon/circuitboard/telesci_pad +/datum/design/item/weapon/mining/drill_diamond + id = "drill_diamond" + req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000) + build_path = /obj/item/weapon/pickaxe/diamonddrill + sort_string = "KAAAE" + /////////////////////////////////// /////////Shield Generators///////// /////////////////////////////////// -datum/design/circuit/shield - req_tech = list("bluespace" = 4, "phorontech" = 3) - materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 5000, "$gold" = 10000) +/datum/design/circuit/shield + req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3) + materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 10000, "$diamond" = 5000, "$gold" = 10000) -datum/design/circuit/shield/AssembleDesignName() - name = "Shield generator circuit design ([name])" -datum/design/circuit/shield/AssembleDesignDesc() - if(!desc) - desc = "Allows for the construction of \a [name] shield generator." +/datum/design/item/medical + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20) -datum/design/circuit/shield/bubble - name = "bubble" - id = "shield_gen" - build_path = /obj/item/weapon/circuitboard/shield_gen - -datum/design/circuit/shield/hull - name = "hull" - id = "shield_gen_ex" - build_path = /obj/item/weapon/circuitboard/shield_gen_ex - -datum/design/circuit/shield/capacitor - name = "capacitor" - desc = "Allows for the construction of a shield capacitor circuit board." - id = "shield_cap" - req_tech = list("magnets" = 3, "powerstorage" = 4) - build_path = /obj/item/weapon/circuitboard/shield_cap - -/////////////////////////////////// -//////////AI Module Disks////////// -/////////////////////////////////// -datum/design/aimodule/ - build_type = IMPRINTER - materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100) - -datum/design/aimodule/AssembleDesignName() - name = "AI module design ([name])" -datum/design/aimodule/AssembleDesignDesc() - desc = "Allows for the construction of \a '[name]' AI module." - -datum/design/aimodule/safeguard - name = "Safeguard" - id = "safeguard" - req_tech = list("programming" = 3, "materials" = 4) - build_path = /obj/item/weapon/aiModule/safeguard - -datum/design/aimodule/onehuman - name = "OneCrewMember" - id = "onehuman" - req_tech = list("programming" = 4, "materials" = 6) - build_path = /obj/item/weapon/aiModule/oneHuman - -datum/design/aimodule/protectstation - name = "ProtectStation" - id = "protectstation" - req_tech = list("programming" = 3, "materials" = 6) - build_path = /obj/item/weapon/aiModule/protectStation - -datum/design/aimodule/notele - name = "TeleporterOffline" - id = "notele" - req_tech = list("programming" = 3) - build_path = /obj/item/weapon/aiModule/teleporterOffline - -datum/design/aimodule/quarantine - name = "Quarantine" - id = "quarantine" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4) - build_path = /obj/item/weapon/aiModule/quarantine - -datum/design/aimodule/oxygen - name = "OxygenIsToxicToHumans" - id = "oxygen" - req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4) - build_path = /obj/item/weapon/aiModule/oxygen - -datum/design/aimodule/freeform - name = "Freeform" - id = "freeform" - req_tech = list("programming" = 4, "materials" = 4) - build_path = /obj/item/weapon/aiModule/freeform - -datum/design/aimodule/reset - name = "Reset" - id = "reset" - req_tech = list("programming" = 3, "materials" = 6) - build_path = /obj/item/weapon/aiModule/reset - -datum/design/aimodule/purge - name = "Purge" - id = "purge" - req_tech = list("programming" = 4, "materials" = 6) - build_path = /obj/item/weapon/aiModule/purge - -// *** Core modules -datum/design/aimodule/core - req_tech = list("programming" = 4, "materials" = 6) - -datum/design/aimodule/core/AssembleDesignName() - name = "AI core module design ([name])" -datum/design/aimodule/core/AssembleDesignDesc() - desc = "Allows for the construction of \a '[name]' AI core module." - -datum/design/aimodule/core/freeformcore - name = "Freeform" - id = "freeformcore" - build_path = /obj/item/weapon/aiModule/freeformcore - -datum/design/aimodule/core/asimov - name = "Asimov" - id = "asimov" - build_path = /obj/item/weapon/aiModule/asimov - -datum/design/aimodule/core/paladin - name = "P.A.L.A.D.I.N." - id = "paladin" - build_path = /obj/item/weapon/aiModule/paladin - -datum/design/aimodule/core/tyrant - name = "T.Y.R.A.N.T." - id = "tyrant" - req_tech = list("programming" = 4, "syndicate" = 2, "materials" = 6) - build_path = /obj/item/weapon/aiModule/tyrant - -/////////////////////////////////// -////////Telecomms Machinery//////// -/////////////////////////////////// -datum/design/circuit/tcom - req_tech = list("programming" = 4, "engineering" = 4) - -datum/design/circuit/tcom/AssembleDesignName() - name = "Telecommunications machinery circuit design ([name])" -datum/design/circuit/tcom/AssembleDesignDesc() - desc = "Allows for the construction of a telecommunications [name] circuit board." - - -datum/design/circuit/tcom/server - name = "server mainframe" - id = "tcom-server" - build_path = /obj/item/weapon/circuitboard/telecomms/server - -datum/design/circuit/tcom/processor - name = "processor unit" - id = "tcom-processor" - build_path = /obj/item/weapon/circuitboard/telecomms/processor - -datum/design/circuit/tcom/bus - name = "bus mainframe" - id = "tcom-bus" - build_path = /obj/item/weapon/circuitboard/telecomms/bus - -datum/design/circuit/tcom/hub - name = "hub mainframe" - id = "tcom-hub" - build_path = /obj/item/weapon/circuitboard/telecomms/hub - -datum/design/circuit/tcom/relay - name = "relay mainframe" - id = "tcom-relay" - req_tech = list("programming" = 3, "engineering" = 4, "bluespace" = 3) - build_path = /obj/item/weapon/circuitboard/telecomms/relay - -datum/design/circuit/tcom/broadcaster - name = "subspace broadcaster" - id = "tcom-broadcaster" - req_tech = list("programming" = 4, "engineering" = 4, "bluespace" = 2) - build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster - -datum/design/circuit/tcom/receiver - name = "subspace receiver" - id = "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////////// -/////////////////////////////////// -datum/design/circuit/mecha - req_tech = list("programming" = 3) - -datum/design/circuit/mecha/AssembleDesignName() - name = "Exosuit module circuit design ([name])" -datum/design/circuit/mecha/AssembleDesignDesc() - desc = "Allows for the construction of \a [name] module." - - -datum/design/circuit/mecha/ripley_main - name = "APLU 'Ripley' central control" - id = "ripley_main" - build_path = /obj/item/weapon/circuitboard/mecha/ripley/main - -datum/design/circuit/mecha/ripley_peri - name = "APLU 'Ripley' peripherals control" - id = "ripley_peri" - build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals - -datum/design/circuit/mecha/odysseus_main - name = "'Odysseus' central control" - id = "odysseus_main" - req_tech = list("programming" = 3,"biotech" = 2) - build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main - -datum/design/circuit/mecha/odysseus_peri - name = "'Odysseus' peripherals control" - id = "odysseus_peri" - req_tech = list("programming" = 3,"biotech" = 2) - build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals - -datum/design/circuit/mecha/gygax_main - name = "'Gygax' central control" - id = "gygax_main" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/mecha/gygax/main - -datum/design/circuit/mecha/gygax_peri - name = "'Gygax' peripherals control" - id = "gygax_peri" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals - -datum/design/circuit/mecha/gygax_targ - name = "'Gygax' weapon control and targeting" - id = "gygax_targ" - req_tech = list("programming" = 4, "combat" = 2) - build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting - -datum/design/circuit/mecha/durand_main - name = "'Durand' central control" - id = "durand_main" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/mecha/durand/main - -datum/design/circuit/mecha/durand_peri - name = "'Durand' peripherals control" - id = "durand_peri" - req_tech = list("programming" = 4) - build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals - -datum/design/circuit/mecha/durand_targ - name = "'Durand' weapon control and targeting" - id = "durand_targ" - req_tech = list("programming" = 4, "combat" = 2) - build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting - -datum/design/circuit/mecha/honker_main - name = "'H.O.N.K' central control" - id = "honker_main" - build_path = /obj/item/weapon/circuitboard/mecha/honker/main - -datum/design/circuit/mecha/honker_peri - name = "'H.O.N.K' peripherals control" - id = "honker_peri" - build_path = /obj/item/weapon/circuitboard/mecha/honker/peripherals - -datum/design/circuit/mecha/honker_targ - name = "'H.O.N.K' weapon control and targeting" - id = "honker_targ" - build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting - -//////////////////////////////////////// -/////////// Mecha Equpment ///////////// -//////////////////////////////////////// - -datum/design/item/mecha - build_type = MECHFAB - req_tech = list("combat" = 3) - category = "Exosuit Equipment" - -datum/design/item/mecha/AssembleDesignName() - ..() - name = "Exosuit module design ([item_name])" -datum/design/item/mecha/weapon/AssembleDesignName() - ..() - name = "Exosuit weapon design ([item_name])" -datum/design/item/mecha/AssembleDesignDesc() - if(!desc) - desc = "Allows for the construction of \a '[item_name]' exosuit module." - -// *** Weapon modules -datum/design/item/mecha/weapon/scattershot - id = "mech_scattershot" - req_tech = list("combat" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - -datum/design/item/mecha/weapon/laser - id = "mech_laser" - req_tech = list("combat" = 3, "magnets" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser - -datum/design/item/mecha/weapon/laser_rigged - desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits." - id = "mech_laser_rigged" - req_tech = list("combat" = 2, "magnets" = 2) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser - -datum/design/item/mecha/weapon/laser_heavy - id = "mech_laser_heavy" - req_tech = list("combat" = 4, "magnets" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy - -datum/design/item/mecha/weapon/ion - id = "mech_ion" - req_tech = list("combat" = 4, "magnets" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion - -datum/design/item/mecha/weapon/grenade_launcher - id = "mech_grenade_launcher" - req_tech = list("combat" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang - -datum/design/item/mecha/weapon/clusterbang_launcher - desc = "A weapon that violates the Geneva Convention at 6 rounds per minute." - id = "clusterbang_launcher" - req_tech = list("combat"= 5, "materials" = 5, "syndicate" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited - -// *** Nonweapon modules -datum/design/item/mecha/wormhole_gen - desc = "An exosuit module that can generate small quasi-stable wormholes." - id = "mech_wormhole_gen" - req_tech = list("bluespace" = 3, "magnets" = 2) - build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator - -datum/design/item/mecha/teleporter - desc = "An exosuit module that allows teleportation to any position in view." - id = "mech_teleporter" - req_tech = list("bluespace" = 10, "magnets" = 5) - build_path = /obj/item/mecha_parts/mecha_equipment/teleporter - -datum/design/item/mecha/rcd - desc = "An exosuit-mounted rapid construction device." - id = "mech_rcd" - req_tech = list("materials" = 4, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd - -datum/design/item/mecha/gravcatapult - desc = "An exosuit-mounted gravitational catapult." - id = "mech_gravcatapult" - req_tech = list("bluespace" = 2, "magnets" = 3, "engineering" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult - -datum/design/item/mecha/repair_droid - desc = "Automated repair droid, exosuits' best companion. BEEP BOOP" - id = "mech_repair_droid" - req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid - -datum/design/item/mecha/phoron_generator - desc = "Exosuit-mounted phoron generator." - id = "mech_phoron_generator" - req_tech = list("phorontech" = 2, "powerstorage"= 2, "engineering" = 2) - build_path = /obj/item/mecha_parts/mecha_equipment/generator - -datum/design/item/mecha/energy_relay - id = "mech_energy_relay" - req_tech = list("magnets" = 4, "powerstorage" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay - -datum/design/item/mecha/ccw_armor - desc = "Exosuit close-combat armor booster." - id = "mech_ccw_armor" - req_tech = list("materials" = 5, "combat" = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster - -datum/design/item/mecha/proj_armor - desc = "Exosuit projectile armor booster." - id = "mech_proj_armor" - req_tech = list("materials" = 5, "combat" = 5, "engineering"=3) - build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster - -datum/design/item/mecha/syringe_gun - desc = "Exosuit-mounted syringe gun and chemical synthesizer." - id = "mech_syringe_gun" - req_tech = list("materials" = 3, "biotech"=4, "magnets"=4, "programming"=3) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun - -datum/design/item/mecha/diamond_drill - desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger." - id = "mech_diamond_drill" - req_tech = list("materials" = 4, "engineering" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill - -datum/design/item/mecha/generator_nuclear - desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy." - id = "mech_generator_nuclear" - req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear - - -//////////////////////////////////////// -//////////Disk Construction Disks/////// -//////////////////////////////////////// -datum/design/design_disk - name = "Design Storage Disk" - desc = "Produce additional disks for storing device designs." - id = "design_disk" - req_tech = list("programming" = 1) - build_type = PROTOLATHE | AUTOLATHE - materials = list("$metal" = 30, "$glass" = 10) - build_path = /obj/item/weapon/disk/design_disk - -datum/design/tech_disk - name = "Technology Data Storage Disk" - desc = "Produce additional disks for storing technology data." - id = "tech_disk" - req_tech = list("programming" = 1) - build_type = PROTOLATHE | AUTOLATHE - materials = list("$metal" = 30, "$glass" = 10) - build_path = /obj/item/weapon/disk/tech_disk - -/////////////////////////////////// -/////Non-Board Computer Stuff////// -/////////////////////////////////// - -datum/design/item/intellicard - name = "'intelliCard', AI preservation and transportation system" - desc = "Allows for the construction of an intelliCard." - id = "intellicard" - req_tech = list("programming" = 4, "materials" = 4) - materials = list("$glass" = 1000, "$gold" = 200) - build_path = /obj/item/device/aicard - -datum/design/item/paicard - name = "'pAI', personal artificial intelligence device" - id = "paicard" - req_tech = list("programming" = 2) - materials = list("$glass" = 500, "$metal" = 500) - build_path = /obj/item/device/paicard - -datum/design/item/posibrain - id = "posibrain" - req_tech = list("engineering" = 4, "materials" = 6, "bluespace" = 2, "programming" = 4) - materials = list("$metal" = 2000, "$glass" = 1000, "$silver" = 1000, "$gold" = 500, "$phoron" = 500, "$diamond" = 100) - build_path = /obj/item/device/mmi/digital/posibrain - -//////////////////////////////////////// -/////////////Stock Parts//////////////// -//////////////////////////////////////// -datum/design/item/stock_part - build_type = PROTOLATHE - -datum/design/item/stock_part/AssembleDesignName() - ..() - name = "Component design ([item_name])" - -datum/design/item/stock_part/AssembleDesignDesc() - if(!desc) - desc = "A stock part used in the construction of various devices." - -/datum/design/item/stock_part/RPED - name = "Rapid Part Exchange Device" - desc = "Special mechanical module made to store, sort, and apply standard machine parts." - id = "rped" - req_tech = list("engineering" = 3, "materials" = 3) - materials = list("$metal" = 15000, "$glass" = 5000) - build_path = /obj/item/weapon/storage/part_replacer - -datum/design/item/stock_part/basic_capacitor - build_type = PROTOLATHE | AUTOLATHE - id = "basic_capacitor" - req_tech = list("powerstorage" = 1) - materials = list("$metal" = 50, "$glass" = 50) - build_path = /obj/item/weapon/stock_parts/capacitor - -datum/design/item/stock_part/basic_sensor - build_type = PROTOLATHE | AUTOLATHE - id = "basic_sensor" - req_tech = list("magnets" = 1) - materials = list("$metal" = 50, "$glass" = 20) - build_path = /obj/item/weapon/stock_parts/scanning_module - -datum/design/item/stock_part/micro_mani - build_type = PROTOLATHE | AUTOLATHE - id = "micro_mani" - req_tech = list("materials" = 1, "programming" = 1) - materials = list("$metal" = 30) - build_path = /obj/item/weapon/stock_parts/manipulator - -datum/design/item/stock_part/basic_micro_laser - build_type = PROTOLATHE | AUTOLATHE - id = "basic_micro_laser" - req_tech = list("magnets" = 1) - materials = list("$metal" = 10, "$glass" = 20) - build_path = /obj/item/weapon/stock_parts/micro_laser - -datum/design/item/stock_part/basic_matter_bin - build_type = PROTOLATHE | AUTOLATHE - id = "basic_matter_bin" - req_tech = list("materials" = 1) - materials = list("$metal" = 80) - build_path = /obj/item/weapon/stock_parts/matter_bin - -datum/design/item/stock_part/adv_capacitor - id = "adv_capacitor" - req_tech = list("powerstorage" = 3) - materials = list("$metal" = 50, "$glass" = 50) - build_path = /obj/item/weapon/stock_parts/capacitor/adv - -datum/design/item/stock_part/adv_sensor - id = "adv_sensor" - req_tech = list("magnets" = 3) - materials = list("$metal" = 50, "$glass" = 20) - build_path = /obj/item/weapon/stock_parts/scanning_module/adv - -datum/design/item/stock_part/nano_mani - id = "nano_mani" - req_tech = list("materials" = 3, "programming" = 2) - materials = list("$metal" = 30) - build_path = /obj/item/weapon/stock_parts/manipulator/nano - -datum/design/item/stock_part/high_micro_laser - id = "high_micro_laser" - req_tech = list("magnets" = 3) - materials = list("$metal" = 10, "$glass" = 20) - build_path = /obj/item/weapon/stock_parts/micro_laser/high - -datum/design/item/stock_part/adv_matter_bin - id = "adv_matter_bin" - req_tech = list("materials" = 3) - materials = list("$metal" = 80) - build_path = /obj/item/weapon/stock_parts/matter_bin/adv - -datum/design/item/stock_part/super_capacitor - id = "super_capacitor" - req_tech = list("powerstorage" = 5, "materials" = 4) - reliability_base = 71 - materials = list("$metal" = 50, "$glass" = 50, "$gold" = 20) - build_path = /obj/item/weapon/stock_parts/capacitor/super - -datum/design/item/stock_part/phasic_sensor - id = "phasic_sensor" - req_tech = list("magnets" = 5, "materials" = 3) - materials = list("$metal" = 50, "$glass" = 20, "$silver" = 10) - reliability_base = 72 - build_path = /obj/item/weapon/stock_parts/scanning_module/phasic - -datum/design/item/stock_part/pico_mani - id = "pico_mani" - req_tech = list("materials" = 5, "programming" = 2) - materials = list("$metal" = 30) - reliability_base = 73 - build_path = /obj/item/weapon/stock_parts/manipulator/pico - -datum/design/item/stock_part/ultra_micro_laser - id = "ultra_micro_laser" - req_tech = list("magnets" = 5, "materials" = 5) - materials = list("$metal" = 10, "$glass" = 20, "$uranium" = 10) - reliability_base = 70 - build_path = /obj/item/weapon/stock_parts/micro_laser/ultra - -datum/design/item/stock_part/super_matter_bin - id = "super_matter_bin" - req_tech = list("materials" = 5) - materials = list("$metal" = 80) - reliability_base = 75 - build_path = /obj/item/weapon/stock_parts/matter_bin/super - -///////////////////////////////////////// -//////////Tcommsat Stock Parts/////////// -///////////////////////////////////////// - -datum/design/item/stock_part/subspace_ansible - id = "s-ansible" - req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2) - materials = list("$metal" = 80, "$silver" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/ansible - -datum/design/item/stock_part/hyperwave_filter - id = "s-filter" - req_tech = list("programming" = 3, "magnets" = 3) - materials = list("$metal" = 40, "$silver" = 10) - build_path = /obj/item/weapon/stock_parts/subspace/filter - -datum/design/item/stock_part/subspace_amplifier - id = "s-amplifier" - req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2) - materials = list("$metal" = 10, "$gold" = 30, "$uranium" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/amplifier - -datum/design/item/stock_part/subspace_treatment - id = "s-treatment" - req_tech = list("programming" = 3, "magnets" = 2, "materials" = 4, "bluespace" = 2) - materials = list("$metal" = 10, "$silver" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/treatment - -datum/design/item/stock_part/subspace_analyzer - id = "s-analyzer" - req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2) - materials = list("$metal" = 10, "$gold" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/analyzer - -datum/design/item/stock_part/subspace_crystal - id = "s-crystal" - req_tech = list("magnets" = 4, "materials" = 4, "bluespace" = 2) - materials = list("$glass" = 1000, "$silver" = 20, "$gold" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/crystal - -datum/design/item/stock_part/subspace_transmitter - id = "s-transmitter" - req_tech = list("magnets" = 5, "materials" = 5, "bluespace" = 3) - materials = list("$glass" = 100, "$silver" = 10, "$uranium" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/transmitter - -//////////////////////////////////////// -//////////Misc Circuit Boards/////////// -//////////////////////////////////////// - -datum/design/circuit/destructive_analyzer - name = "destructive analyzer" - id = "destructive_analyzer" - req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2) - build_path = /obj/item/weapon/circuitboard/destructive_analyzer - -datum/design/circuit/protolathe - name = "protolathe" - id = "protolathe" - req_tech = list("programming" = 2, "engineering" = 2) - build_path = /obj/item/weapon/circuitboard/protolathe - -datum/design/circuit/circuit_imprinter - name = "circuit imprinter" - id = "circuit_imprinter" - req_tech = list("programming" = 2, "engineering" = 2) - build_path = /obj/item/weapon/circuitboard/circuit_imprinter - -datum/design/circuit/autolathe - name = "autolathe board" - id = "autolathe" - req_tech = list("programming" = 2, "engineering" = 2) - build_path = /obj/item/weapon/circuitboard/autolathe - -datum/design/circuit/rdservercontrol - name = "R&D server control console" - id = "rdservercontrol" - req_tech = list("programming" = 3) - build_path = /obj/item/weapon/circuitboard/rdservercontrol - -datum/design/circuit/rdserver - name = "R&D server" - id = "rdserver" - req_tech = list("programming" = 3) - build_path = /obj/item/weapon/circuitboard/rdserver - -datum/design/circuit/mechfab - name = "exosuit fabricator" - id = "mechfab" - req_tech = list("programming" = 3, "engineering" = 3) - build_path = /obj/item/weapon/circuitboard/mechfab - -datum/design/circuit/gas_heater - name = "gas heating system" - id = "gasheater" - req_tech = list("powerstorage" = 2, "engineering" = 1) - build_path = /obj/item/weapon/circuitboard/unary_atmos/heater - -datum/design/circuit/gas_cooler - name = "gas cooling system" - id = "gascooler" - req_tech = list("magnets" = 2, "engineering" = 2) - build_path = /obj/item/weapon/circuitboard/unary_atmos/cooler - -datum/design/circuit/secure_airlock - name = "secure airlock electronics" - desc = "Allows for the construction of a tamper-resistant airlock electronics." - id = "securedoor" - req_tech = list("programming" = 3) - build_path = /obj/item/weapon/airlock_electronics/secure - -datum/design/circuit/biogenerator - name = "biogenerator" - id = "biogenerator" - req_tech = list("programming" = 2) - build_path = /obj/item/weapon/circuitboard/biogenerator - -datum/design/circuit/recharge_station - name = "cyborg recharge station" - id = "recharge_station" - req_tech = list("programming" = 3, "engineering" = 2) - build_path = /obj/item/weapon/circuitboard/recharge_station - -///////////////////////////////////////// -////////Power Stuff Circuitboards//////// -///////////////////////////////////////// -datum/design/circuit/pacman - name = "PACMAN-type generator" - id = "pacman" - req_tech = list("programming" = 3, "phorontech" = 3, "powerstorage" = 3, "engineering" = 3) - reliability_base = 79 - materials = list("$glass" = 2000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/pacman - -datum/design/circuit/superpacman - name = "SUPERPACMAN-type generator" - id = "superpacman" - req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) - reliability_base = 76 - materials = list("$glass" = 2000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/pacman/super - -datum/design/circuit/mrspacman - name = "MRSPACMAN-type generator" - id = "mrspacman" - req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5) - reliability_base = 74 - materials = list("$glass" = 2000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/pacman/mrs - -datum/design/circuit/batteryrack - name = "cell rack PSU" - id = "batteryrack" - req_tech = list("powerstorage" = 3, "engineering" = 2) - materials = list("$glass" = 2000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/batteryrack - -datum/design/circuit/smes_cell - name = "'SMES' superconductive magnetic energy storage" - desc = "Allows for the construction of circuit boards used to build a SMES." - id = "smes_cell" - req_tech = list("powerstorage" = 7, "engineering" = 5) - //A uniquely-priced board; probably not the best idea - materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 1000, "$silver" = 1000, "$diamond" = 500) - build_path = /obj/item/weapon/circuitboard/smes - -//////////////////////////////////////// -///////////////Power Items////////////// -//////////////////////////////////////// -datum/design/item/light_replacer - name = "Light replacer" - desc = "A device to automatically replace lights. Refill with working lightbulbs." - id = "light_replacer" - req_tech = list("magnets" = 3, "materials" = 4) - materials = list("$metal" = 1500, "$silver" = 150, "$glass" = 3000) - build_path = /obj/item/device/lightreplacer - -// *** Power cells -datum/design/item/powercell - build_type = PROTOLATHE | MECHFAB - -datum/design/item/powercell/AssembleDesignName() - name = "Power cell model ([item_name])" - -datum/design/item/powercell/AssembleDesignDesc() - if(build_path) - var/obj/item/weapon/cell/C = build_path - desc = "Allows the construction of power cells that can hold [initial(C.maxcharge)] units of energy." - -datum/design/item/powercell/basic - name = "basic" - build_type = PROTOLATHE | AUTOLATHE | MECHFAB - id = "basic_cell" - req_tech = list("powerstorage" = 1) - materials = list("$metal" = 700, "$glass" = 50) - build_path = /obj/item/weapon/cell - category = "Misc" - -datum/design/item/powercell/high - name = "high-capacity" - build_type = PROTOLATHE | AUTOLATHE | MECHFAB - id = "high_cell" - req_tech = list("powerstorage" = 2) - materials = list("$metal" = 700, "$glass" = 60) - build_path = /obj/item/weapon/cell/high - category = "Misc" - -datum/design/item/powercell/super - name = "super-capacity" - id = "super_cell" - req_tech = list("powerstorage" = 3, "materials" = 2) - reliability_base = 75 - materials = list("$metal" = 700, "$glass" = 70) - build_path = /obj/item/weapon/cell/super - category = "Misc" - -datum/design/item/powercell/hyper - name = "hyper-capacity" - id = "hyper_cell" - req_tech = list("powerstorage" = 5, "materials" = 4) - reliability_base = 70 - materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70) - build_path = /obj/item/weapon/cell/hyper - category = "Misc" - -///////////////////////////////////////// -////////////Medical Tools//////////////// -///////////////////////////////////////// -datum/design/item/medical - materials = list("$metal" = 30, "$glass" = 20) - -datum/design/item/medical/AssembleDesignName() +/datum/design/item/medical/AssembleDesignName() ..() name = "Biotech device prototype ([item_name])" -datum/design/item/medical/robot_scanner +/datum/design/item/medical/robot_scanner desc = "A hand-held scanner able to diagnose robotic injuries." id = "robot_scanner" - req_tech = list("magnets" = 3, "biotech" = 2, "engineering" = 3) - materials = list("$metal" = 500, "$glass" = 200) + req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) build_path = /obj/item/device/robotanalyzer + sort_string = "MACFA" -datum/design/item/medical/mass_spectrometer +/datum/design/item/medical/mass_spectrometer desc = "A device for analyzing chemicals in blood." id = "mass_spectrometer" - req_tech = list("biotech" = 2, "magnets" = 2) - reliability_base = 76 + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) build_path = /obj/item/device/mass_spectrometer + sort_string = "MACAA" -datum/design/item/medical/adv_mass_spectrometer +/datum/design/item/medical/adv_mass_spectrometer desc = "A device for analyzing chemicals in blood and their quantities." id = "adv_mass_spectrometer" - req_tech = list("biotech" = 2, "magnets" = 4) - reliability_base = 74 + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) build_path = /obj/item/device/mass_spectrometer/adv + sort_string = "MACAB" -datum/design/item/medical/reagent_scanner +/datum/design/item/medical/reagent_scanner desc = "A device for identifying chemicals." id = "reagent_scanner" - req_tech = list("biotech" = 2, "magnets" = 2) - reliability_base = 76 + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) build_path = /obj/item/device/reagent_scanner + sort_string = "MACBA" -datum/design/item/medical/adv_reagent_scanner +/datum/design/item/medical/adv_reagent_scanner desc = "A device for identifying chemicals and their proportions." id = "adv_reagent_scanner" - req_tech = list("biotech" = 2, "magnets" = 4) - reliability_base = 74 + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) build_path = /obj/item/device/reagent_scanner/adv + sort_string = "MACBB" -datum/design/item/medical/mmi - id = "mmi" - req_tech = list("programming" = 2, "biotech" = 3) - build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 1000, "$glass" = 500) - reliability_base = 76 - build_path = /obj/item/device/mmi - category = "Misc" - -datum/design/item/medical/mmi_radio - id = "mmi_radio" - req_tech = list("programming" = 2, "biotech" = 4) - build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 1200, "$glass" = 500) - reliability_base = 74 - build_path = /obj/item/device/mmi/radio_enabled - category = "Misc" - -datum/design/item/medical/synthetic_flash - id = "sflash" - req_tech = list("magnets" = 3, "combat" = 2) - build_type = MECHFAB - materials = list("$metal" = 750, "$glass" = 750) - reliability_base = 76 - build_path = /obj/item/device/flash/synthetic - category = "Misc" - -datum/design/item/medical/nanopaste - desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." - id = "nanopaste" - req_tech = list("materials" = 4, "engineering" = 3) - build_type = PROTOLATHE | MECHFAB - materials = list("$metal" = 7000, "$glass" = 7000) - build_path = /obj/item/stack/nanopaste - -datum/design/item/scalpel_laser1 - name = "Basic Laser Scalpel" - desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." - id = "scalpel_laser1" - req_tech = list("biotech" = 2, "materials" = 2, "magnets" = 2) - materials = list("$metal" = 12500, "$glass" = 7500) - build_path = /obj/item/weapon/scalpel/laser1 - -datum/design/item/scalpel_laser2 - name = "Improved Laser Scalpel" - desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced." - id = "scalpel_laser2" - req_tech = list("biotech" = 3, "materials" = 4, "magnets" = 4) - materials = list("$metal" = 12500, "$glass" = 7500, "$silver" = 2500) - build_path = /obj/item/weapon/scalpel/laser2 - -datum/design/item/scalpel_laser3 - name = "Advanced Laser Scalpel" - desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!" - id = "scalpel_laser3" - req_tech = list("biotech" = 4, "materials" = 6, "magnets" = 5) - materials = list("$metal" = 12500, "$glass" = 7500, "$silver" = 2000, "$gold" = 1500) - build_path = /obj/item/weapon/scalpel/laser3 - -datum/design/item/scalpel_manager - name = "Incision Management System" - desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps." - id = "scalpel_manager" - req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4) - materials = list ("$metal" = 12500, "$glass" = 7500, "$silver" = 1500, "$gold" = 1500, "$diamond" = 750) - build_path = /obj/item/weapon/scalpel/manager - -// *** Beakers (not really a subtype of design/item/medical) -datum/design/item/beaker/AssembleDesignName() +/datum/design/item/beaker/AssembleDesignName() name = "Beaker prototype ([item_name])" -datum/design/item/beaker/bluespace - name = "bluespace" - desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." - id = "bluespacebeaker" - req_tech = list("bluespace" = 2, "materials" = 6) - materials = list("$metal" = 3000, "$phoron" = 3000, "$diamond" = 500) - reliability_base = 76 - build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace - -datum/design/item/beaker/noreact +/datum/design/item/beaker/noreact name = "cryostasis" desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." id = "splitbeaker" - req_tech = list("materials" = 2) - materials = list("$metal" = 3000) - reliability_base = 76 + req_tech = list(TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact - category = "Misc" + sort_string = "MADAA" -// *** Implants (not really a subtype of design/item/medical) -datum/design/item/implant - materials = list("$metal" = 50, "$glass" = 50) +/datum/design/item/beaker/bluespace + name = TECH_BLUESPACE + desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." + id = "bluespacebeaker" + req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500) + build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace + sort_string = "MADAB" -datum/design/item/implant/AssembleDesignName() +/datum/design/item/medical/nanopaste + desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." + id = "nanopaste" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) + build_path = /obj/item/stack/nanopaste + sort_string = "MBAAA" + +/datum/design/item/scalpel_laser1 + name = "Basic Laser Scalpel" + desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." + id = "scalpel_laser1" + req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500) + build_path = /obj/item/weapon/scalpel/laser1 + sort_string = "MBBAA" + +/datum/design/item/scalpel_laser2 + name = "Improved Laser Scalpel" + desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced." + id = "scalpel_laser2" + req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 4, TECH_MAGNET = 4) + materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500) + build_path = /obj/item/weapon/scalpel/laser2 + sort_string = "MBBAB" + +/datum/design/item/scalpel_laser3 + name = "Advanced Laser Scalpel" + desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!" + id = "scalpel_laser3" + req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 5) + materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500) + build_path = /obj/item/weapon/scalpel/laser3 + sort_string = "MBBAC" + +/datum/design/item/scalpel_manager + name = "Incision Management System" + desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps." + id = "scalpel_manager" + req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 5, TECH_DATA = 4) + materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750) + build_path = /obj/item/weapon/scalpel/manager + sort_string = "MBBAD" + +/datum/design/item/implant + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + +/datum/design/item/implant/AssembleDesignName() ..() name = "Implantable biocircuit design ([item_name])" - // Removal of loyalty implants. Can't think of a way to add this to the config option. -datum/design/item/implant/loyalty - name = "loyalty" - id = "implant_loyal" - req_tech = list("materials" = 2, "biotech" = 3) - materials = list("$metal" = 7000, "$glass" = 7000) - build_path = /obj/item/weapon/implantcase/loyalty - - -datum/design/item/implant/chemical +/datum/design/item/implant/chemical name = "chemical" id = "implant_chem" - req_tech = list("materials" = 2, "biotech" = 3) + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3) build_path = /obj/item/weapon/implantcase/chem + sort_string = "MFAAA" -datum/design/item/implant/freedom +/datum/design/item/implant/freedom name = "freedom" id = "implant_free" - req_tech = list("syndicate" = 2, "biotech" = 3) + req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3) build_path = /obj/item/weapon/implantcase/freedom + sort_string = "MFAAB" -///////////////////////////////////////// -/////////////////Weapons///////////////// -///////////////////////////////////////// -datum/design/item/weapon/AssembleDesignName() +/datum/design/item/weapon/AssembleDesignName() ..() name = "Weapon prototype ([item_name])" -datum/design/item/weapon/AssembleDesignDesc() +/datum/design/item/weapon/AssembleDesignDesc() if(!desc) if(build_path) var/obj/item/I = build_path desc = initial(I.desc) ..() -datum/design/item/weapon/nuclear_gun +/datum/design/item/weapon/stunrevolver + id = "stunrevolver" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/weapon/gun/energy/stunrevolver + sort_string = "TAAAA" + +/datum/design/item/weapon/nuclear_gun id = "nuclear_gun" - req_tech = list("combat" = 3, "materials" = 5, "powerstorage" = 3) - materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 500) - reliability_base = 76 + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500) build_path = /obj/item/weapon/gun/energy/gun/nuclear - locked = 1 + sort_string = "TAAAB" + +/datum/design/item/weapon/lasercannon + desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core." + id = "lasercannon" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000) + build_path = /obj/item/weapon/gun/energy/lasercannon + sort_string = "TAAAC" + +/datum/design/item/weapon/phoronpistol + id = "ppistol" + req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) + build_path = /obj/item/weapon/gun/energy/toxgun + sort_string = "TAAAD" + +/datum/design/item/weapon/decloner + id = "decloner" + req_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 7, TECH_BIO = 5, TECH_POWER = 6) + materials = list("gold" = 5000,"uranium" = 10000, "mutagen" = 40) + build_path = /obj/item/weapon/gun/energy/decloner + sort_string = "TAAAE" + +/datum/design/item/weapon/smg + id = "smg" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "silver" = 2000, "diamond" = 1000) + build_path = /obj/item/weapon/gun/projectile/automatic + sort_string = "TAABA" + +/datum/design/item/weapon/ammo_9mm + id = "ammo_9mm" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100) + build_path = /obj/item/ammo_magazine/c9mm + sort_string = "TAACA" + +/datum/design/item/weapon/stunshell + desc = "A stunning shell for a shotgun." + id = "stunshell" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/ammo_casing/shotgun/stunshell + sort_string = "TAACB" + +/datum/design/item/weapon/chemsprayer + desc = "An advanced chem spraying device." + id = "chemsprayer" + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer + sort_string = "TABAA" + +/datum/design/item/weapon/rapidsyringe + id = "rapidsyringe" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + build_path = /obj/item/weapon/gun/launcher/syringe/rapid + sort_string = "TABAB" + +/datum/design/item/weapon/temp_gun + desc = "A gun that shoots high-powered glass-encased energy temperature bullets." + id = "temp_gun" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000) + build_path = /obj/item/weapon/gun/energy/temperature + sort_string = "TABAC" + +/datum/design/item/weapon/large_grenade + id = "large_Grenade" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/grenade/chem_grenade/large + sort_string = "TACAA" + +/datum/design/item/weapon/flora_gun + id = "flora_gun" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) + build_path = /obj/item/weapon/gun/energy/floragun + sort_string = "TBAAA" + +/datum/design/item/stock_part/subspace_ansible + id = "s-ansible" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/ansible + sort_string = "UAAAA" + +/datum/design/item/stock_part/hyperwave_filter + id = "s-filter" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10) + build_path = /obj/item/weapon/stock_parts/subspace/filter + sort_string = "UAAAB" + +/datum/design/item/stock_part/subspace_amplifier + id = "s-amplifier" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/amplifier + sort_string = "UAAAC" + +/datum/design/item/stock_part/subspace_treatment + id = "s-treatment" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/treatment + sort_string = "UAAAD" + +/datum/design/item/stock_part/subspace_analyzer + id = "s-analyzer" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/analyzer + sort_string = "UAAAE" + +/datum/design/item/stock_part/subspace_crystal + id = "s-crystal" + req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list("glass" = 1000, "silver" = 20, "gold" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/crystal + sort_string = "UAAAF" + +/datum/design/item/stock_part/subspace_transmitter + id = "s-transmitter" + req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3) + materials = list("glass" = 100, "silver" = 10, "uranium" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/transmitter + sort_string = "UAAAG" + +/datum/design/item/light_replacer + name = "Light replacer" + desc = "A device to automatically replace lights. Refill with working lightbulbs." + id = "light_replacer" + req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000) + build_path = /obj/item/device/lightreplacer + sort_string = "VAAAH" + +/datum/design/item/paicard + name = "'pAI', personal artificial intelligence device" + id = "paicard" + req_tech = list(TECH_DATA = 2) + materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500) + build_path = /obj/item/device/paicard + sort_string = "VABAI" + +/datum/design/item/intellicard + name = "'intelliCard', AI preservation and transportation system" + desc = "Allows for the construction of an intelliCard." + id = "intellicard" + req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) + materials = list("glass" = 1000, "gold" = 200) + build_path = /obj/item/device/aicard + sort_string = "VACAA" + +/datum/design/item/posibrain + name = "Positronic brain" + id = "posibrain" + req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) + build_type = PROTOLATHE | MECHFAB + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) + build_path = /obj/item/device/mmi/digital/posibrain + category = "Misc" + sort_string = "VACAB" + +/datum/design/item/mmi + name = "Man-machine interface" + id = "mmi" + req_tech = list(TECH_DATA = 2, TECH_BIO = 3) + build_type = PROTOLATHE | MECHFAB + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) + build_path = /obj/item/device/mmi + category = "Misc" + sort_string = "VACBA" + +/datum/design/item/mmi_radio + name = "Radio-enabled man-machine interface" + id = "mmi_radio" + req_tech = list(TECH_DATA = 2, TECH_BIO = 4) + build_type = PROTOLATHE | MECHFAB + materials = list(DEFAULT_WALL_MATERIAL = 1200, "glass" = 500) + build_path = /obj/item/device/mmi/radio_enabled + category = "Misc" + sort_string = "VACBB" + +/datum/design/item/beacon + name = "Bluespace tracking beacon design" + id = "beacon" + req_tech = list(TECH_BLUESPACE = 1) + materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10) + build_path = /obj/item/device/radio/beacon + sort_string = "VADAA" + +/datum/design/item/bag_holding + name = "'Bag of Holding', an infinite capacity bag prototype" + desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy." + id = "bag_holding" + req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) + materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) + build_path = /obj/item/weapon/storage/backpack/holding + sort_string = "VAEAA" + +/datum/design/item/binaryencrypt + name = "Binary encryption key" + desc = "Allows for deciphering the binary channel on-the-fly." + id = "binaryencrypt" + req_tech = list(TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300) + build_path = /obj/item/device/encryptionkey/binary + sort_string = "VASAA" + +/datum/design/item/chameleon + name = "Holographic equipment kit" + desc = "A kit of dangerous, high-tech equipment with changeable looks." + id = "chameleon" + req_tech = list(TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500) + build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon + sort_string = "VASBA" + +// Modular computer components +// Hard drives +/datum/design/item/modularcomponent/disk/normal + name = "basic hard drive" + id = "hdd_basic" + req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100) + build_path = /obj/item/weapon/computer_hardware/hard_drive/ + sort_string = "VBAAA" + +/datum/design/item/modularcomponent/disk/advanced + name = "advanced hard drive" + id = "hdd_advanced" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200) + build_path = /obj/item/weapon/computer_hardware/hard_drive/advanced + sort_string = "VBAAB" + +/datum/design/item/modularcomponent/disk/super + name = "super hard drive" + id = "hdd_super" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 400) + build_path = /obj/item/weapon/computer_hardware/hard_drive/super + sort_string = "VBAAC" + +/datum/design/item/modularcomponent/disk/cluster + name = "cluster hard drive" + id = "hdd_cluster" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 16000, "glass" = 800) + build_path = /obj/item/weapon/computer_hardware/hard_drive/cluster + sort_string = "VBAAD" + +/datum/design/item/modularcomponent/disk/small + name = "small hard drive" + id = "hdd_small" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200) + build_path = /obj/item/weapon/computer_hardware/hard_drive/small + sort_string = "VBAAE" + +/datum/design/item/modularcomponent/disk/micro + name = "micro hard drive" + id = "hdd_micro" + req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100) + build_path = /obj/item/weapon/computer_hardware/hard_drive/micro + sort_string = "VBAAF" + +// Network cards +/datum/design/item/modularcomponent/netcard/basic + name = "basic network card" + id = "netcard_basic" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 100) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/network_card + sort_string = "VBAAG" + +/datum/design/item/modularcomponent/netcard/advanced + name = "advanced network card" + id = "netcard_advanced" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/network_card/advanced + sort_string = "VBAAH" + +/datum/design/item/modularcomponent/netcard/wired + name = "wired network card" + id = "netcard_wired" + req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 400) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/network_card/wired + sort_string = "VBAAI" + +// Data crystals (USB flash drives) +/datum/design/item/modularcomponent/portabledrive/basic + name = "basic data crystal" + id = "portadrive_basic" + req_tech = list(TECH_DATA = 1) + build_type = IMPRINTER + materials = list("glass" = 8000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable + sort_string = "VBAAJ" + +/datum/design/item/modularcomponent/portabledrive/advanced + name = "advanced data crystal" + id = "portadrive_advanced" + req_tech = list(TECH_DATA = 2) + build_type = IMPRINTER + materials = list("glass" = 16000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced + sort_string = "VBAAK" + +/datum/design/item/modularcomponent/portabledrive/super + name = "super data crystal" + id = "portadrive_super" + req_tech = list(TECH_DATA = 4) + build_type = IMPRINTER + materials = list("glass" = 32000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super + sort_string = "VBAAL" + +// Card slot +/datum/design/item/modularcomponent/cardslot + name = "RFID card slot" + id = "cardslot" + req_tech = list(TECH_DATA = 2) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/computer_hardware/card_slot + sort_string = "VBAAM" + +// Nano printer +/datum/design/item/modularcomponent/nanoprinter + name = "nano printer" + id = "nanoprinter" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/computer_hardware/nano_printer + sort_string = "VBAAN" + +// Card slot +/datum/design/item/modularcomponent/teslalink + name = "tesla link" + id = "teslalink" + req_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 10000) + build_path = /obj/item/weapon/computer_hardware/tesla_link + sort_string = "VBAAO" + +// Batteries +/datum/design/item/modularcomponent/battery/normal + name = "standard battery module" + id = "bat_normal" + req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/weapon/computer_hardware/battery_module + sort_string = "VBAAP" + +/datum/design/item/modularcomponent/battery/advanced + name = "advanced battery module" + id = "bat_advanced" + req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/weapon/computer_hardware/battery_module/advanced + sort_string = "VBAAQ" + +/datum/design/item/modularcomponent/battery/super + name = "super battery module" + id = "bat_super" + req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 8000) + build_path = /obj/item/weapon/computer_hardware/battery_module/super + sort_string = "VBAAR" + +/datum/design/item/modularcomponent/battery/ultra + name = "ultra battery module" + id = "bat_ultra" + req_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 4) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 16000) + build_path = /obj/item/weapon/computer_hardware/battery_module/ultra + sort_string = "VBAAS" + +/datum/design/item/modularcomponent/battery/nano + name = "nano battery module" + id = "bat_nano" + req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/weapon/computer_hardware/battery_module/nano + sort_string = "VBAAT" + +/datum/design/item/modularcomponent/battery/micro + name = "micro battery module" + id = "bat_micro" + req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/weapon/computer_hardware/battery_module/micro + sort_string = "VBAAU" + +/datum/design/item/modularcomponent/cpu/ + name = "computer processor unit" + id = "cpu_normal" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 8000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit + sort_string = "VBAAV" + +/datum/design/item/modularcomponent/cpu/small + name = "computer microprocessor unit" + id = "cpu_small" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 4000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit/small + sort_string = "VBAAW" + +/datum/design/item/modularcomponent/cpu/photonic + name = "computer photonic processor unit" + id = "pcpu_normal" + req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 32000, glass = 8000) + chemicals = list("sacid" = 40) + build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic + sort_string = "VBAAX" + +/datum/design/item/modularcomponent/cpu/photonic/small + name = "computer photonic microprocessor unit" + id = "pcpu_small" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small + sort_string = "VBAAY" +/* +CIRCUITS BELOW +*/ + +/datum/design/circuit + build_type = IMPRINTER + req_tech = list(TECH_DATA = 2) + materials = list("glass" = 2000) + chemicals = list("sacid" = 20) + time = 5 + +/datum/design/circuit/AssembleDesignName() + ..() + if(build_path) + var/obj/item/weapon/circuitboard/C = build_path + if(initial(C.board_type) == "machine") + name = "Machine circuit design ([item_name])" + else if(initial(C.board_type) == "computer") + name = "Computer circuit design ([item_name])" + else + name = "Circuit design ([item_name])" + +/datum/design/circuit/AssembleDesignDesc() + if(!desc) + desc = "Allows for the construction of \a [item_name] circuit board." + +/datum/design/circuit/arcademachine + name = "battle arcade machine" + id = "arcademachine" + req_tech = list(TECH_DATA = 1) + build_path = /obj/item/weapon/circuitboard/arcade/battle + sort_string = "MAAAA" + +/datum/design/circuit/oriontrail + name = "orion trail arcade machine" + id = "oriontrail" + req_tech = list(TECH_DATA = 1) + build_path = /obj/item/weapon/circuitboard/arcade/orion_trail + sort_string = "MABAA" + +/datum/design/circuit/seccamera + name = "security camera monitor" + id = "seccamera" + build_path = /obj/item/weapon/circuitboard/security + sort_string = "DAAAA" + +/datum/design/circuit/secdata + name = "security records console" + id = "sec_data" + build_path = /obj/item/weapon/circuitboard/secure_data + sort_string = "DABAA" + +/datum/design/circuit/prisonmanage + name = "prisoner management console" + id = "prisonmanage" + build_path = /obj/item/weapon/circuitboard/prisoner + sort_string = "DACAA" + +/datum/design/circuit/med_data + name = "medical records console" + id = "med_data" + build_path = /obj/item/weapon/circuitboard/med_data + sort_string = "FAAAA" + +/datum/design/circuit/operating + name = "patient monitoring console" + id = "operating" + build_path = /obj/item/weapon/circuitboard/operating + sort_string = "FACAA" + +/datum/design/circuit/pandemic + name = "PanD.E.M.I.C. 2200" + id = "pandemic" + build_path = /obj/item/weapon/circuitboard/pandemic + sort_string = "FAEAA" + +/datum/design/circuit/scan_console + name = "DNA machine" + id = "scan_console" + build_path = /obj/item/weapon/circuitboard/scan_consolenew + sort_string = "FAGAA" + +/datum/design/circuit/clonecontrol + name = "cloning control console" + id = "clonecontrol" + req_tech = list(TECH_DATA = 3, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/cloning + sort_string = "FAGAC" + +/datum/design/circuit/clonepod + name = "clone pod" + id = "clonepod" + req_tech = list(TECH_DATA = 3, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/clonepod + sort_string = "FAGAE" + +/datum/design/circuit/clonescanner + name = "cloning scanner" + id = "clonescanner" + req_tech = list(TECH_DATA = 3, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/clonescanner + sort_string = "FAGAG" + +/datum/design/circuit/crewconsole + name = "crew monitoring console" + id = "crewconsole" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_BIO = 2) + build_path = /obj/item/weapon/circuitboard/crew + sort_string = "FAGAI" + +/datum/design/circuit/teleconsole + name = "teleporter control console" + id = "teleconsole" + req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2) + build_path = /obj/item/weapon/circuitboard/teleporter + sort_string = "HAAAA" + +/datum/design/circuit/robocontrol + name = "robotics control console" + id = "robocontrol" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/robotics + sort_string = "HAAAB" + +/datum/design/circuit/mechacontrol + name = "exosuit control console" + id = "mechacontrol" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/weapon/circuitboard/mecha_control + sort_string = "HAAAC" + +/datum/design/circuit/rdconsole + name = "R&D control console" + id = "rdconsole" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/rdconsole + sort_string = "HAAAE" + +/datum/design/circuit/aifixer + name = "AI integrity restorer" + id = "aifixer" + req_tech = list(TECH_DATA = 3, TECH_BIO = 2) + build_path = /obj/item/weapon/circuitboard/aifixer + sort_string = "HAAAF" + +/datum/design/circuit/comm_monitor + name = "telecommunications monitoring console" + id = "comm_monitor" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/weapon/circuitboard/comm_monitor + sort_string = "HAACA" + +/datum/design/circuit/comm_server + name = "telecommunications server monitoring console" + id = "comm_server" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/weapon/circuitboard/comm_server + sort_string = "HAACB" + +/datum/design/circuit/message_monitor + name = "messaging monitor console" + id = "message_monitor" + req_tech = list(TECH_DATA = 5) + build_path = /obj/item/weapon/circuitboard/message_monitor + sort_string = "HAACC" + +/datum/design/circuit/aiupload + name = "AI upload console" + id = "aiupload" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/aiupload + sort_string = "HAABA" + +/datum/design/circuit/borgupload + name = "cyborg upload console" + id = "borgupload" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/borgupload + sort_string = "HAABB" + +/datum/design/circuit/destructive_analyzer + name = "destructive analyzer" + id = "destructive_analyzer" + req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/destructive_analyzer + sort_string = "HABAA" + +/datum/design/circuit/protolathe + name = "protolathe" + id = "protolathe" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/protolathe + sort_string = "HABAB" + +/datum/design/circuit/circuit_imprinter + name = "circuit imprinter" + id = "circuit_imprinter" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/circuit_imprinter + sort_string = "HABAC" + +/datum/design/circuit/autolathe + name = "autolathe board" + id = "autolathe" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/autolathe + sort_string = "HABAD" + +/datum/design/circuit/rdservercontrol + name = "R&D server control console" + id = "rdservercontrol" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/weapon/circuitboard/rdservercontrol + sort_string = "HABBA" + +/datum/design/circuit/rdserver + name = "R&D server" + id = "rdserver" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/weapon/circuitboard/rdserver + sort_string = "HABBB" + +/datum/design/circuit/mechfab + name = "exosuit fabricator" + id = "mechfab" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/weapon/circuitboard/mechfab + sort_string = "HABAE" + +/datum/design/circuit/mech_recharger + name = "mech recharger" + id = "mech_recharger" + req_tech = list(TECH_DATA = 2, TECH_POWER = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/mech_recharger + sort_string = "HACAA" + +/datum/design/circuit/recharge_station + name = "cyborg recharge station" + id = "recharge_station" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/recharge_station + sort_string = "HACAC" + +/datum/design/circuit/atmosalerts + name = "atmosphere alert console" + id = "atmosalerts" + build_path = /obj/item/weapon/circuitboard/atmos_alert + sort_string = "JAAAA" + +/datum/design/circuit/air_management + name = "atmosphere monitoring console" + id = "air_management" + build_path = /obj/item/weapon/circuitboard/air_management + sort_string = "JAAAB" + +/datum/design/circuit/rcon_console + name = "RCON remote control console" + id = "rcon_console" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_POWER = 5) + build_path = /obj/item/weapon/circuitboard/rcon_console + sort_string = "JAAAC" + +/datum/design/circuit/dronecontrol + name = "drone control console" + id = "dronecontrol" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/drone_control + sort_string = "JAAAD" + +/datum/design/circuit/powermonitor + name = "power monitoring console" + id = "powermonitor" + build_path = /obj/item/weapon/circuitboard/powermonitor + sort_string = "JAAAE" + +/datum/design/circuit/solarcontrol + name = "solar control console" + id = "solarcontrol" + build_path = /obj/item/weapon/circuitboard/solar_control + sort_string = "JAAAF" + +/datum/design/circuit/pacman + name = "PACMAN-type generator" + id = "pacman" + req_tech = list(TECH_DATA = 3, TECH_PHORON = 3, TECH_POWER = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/weapon/circuitboard/pacman + sort_string = "JBAAA" + +/datum/design/circuit/superpacman + name = "SUPERPACMAN-type generator" + id = "superpacman" + req_tech = list(TECH_DATA = 3, TECH_POWER = 4, TECH_ENGINEERING = 4) + build_path = /obj/item/weapon/circuitboard/pacman/super + sort_string = "JBAAB" + +/datum/design/circuit/mrspacman + name = "MRSPACMAN-type generator" + id = "mrspacman" + req_tech = list(TECH_DATA = 3, TECH_POWER = 5, TECH_ENGINEERING = 5) + build_path = /obj/item/weapon/circuitboard/pacman/mrs + sort_string = "JBAAC" + +/datum/design/circuit/batteryrack + name = "cell rack PSU" + id = "batteryrack" + req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/batteryrack + sort_string = "JBABA" + +/datum/design/circuit/smes_cell + name = "'SMES' superconductive magnetic energy storage" + desc = "Allows for the construction of circuit boards used to build a SMES." + id = "smes_cell" + req_tech = list(TECH_POWER = 7, TECH_ENGINEERING = 5) + build_path = /obj/item/weapon/circuitboard/smes + sort_string = "JBABB" + +/datum/design/circuit/gas_heater + name = "gas heating system" + id = "gasheater" + req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 1) + build_path = /obj/item/weapon/circuitboard/unary_atmos/heater + sort_string = "JCAAA" + +/datum/design/circuit/gas_cooler + name = "gas cooling system" + id = "gascooler" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/unary_atmos/cooler + sort_string = "JCAAB" + +/datum/design/circuit/secure_airlock + name = "secure airlock electronics" + desc = "Allows for the construction of a tamper-resistant airlock electronics." + id = "securedoor" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/weapon/airlock_electronics/secure + sort_string = "JDAAA" + +/datum/design/circuit/ordercomp + name = "supply ordering console" + id = "ordercomp" + build_path = /obj/item/weapon/circuitboard/ordercomp + sort_string = "KAAAA" + +/datum/design/circuit/supplycomp + name = "supply control console" + id = "supplycomp" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/weapon/circuitboard/supplycomp + sort_string = "KAAAB" + +/datum/design/circuit/biogenerator + name = "biogenerator" + id = "biogenerator" + req_tech = list(TECH_DATA = 2) + build_path = /obj/item/weapon/circuitboard/biogenerator + sort_string = "KBAAA" + +/datum/design/circuit/comconsole + name = "communications console" + id = "comconsole" + build_path = /obj/item/weapon/circuitboard/communications + sort_string = "LAAAA" + +/datum/design/circuit/emp_data + name = "employment records console" + id = "emp_data" + build_path = /obj/item/weapon/circuitboard/skills + sort_string = "LAAAC" + +/datum/design/circuit/mecha + req_tech = list(TECH_DATA = 3) + +/datum/design/circuit/mecha/AssembleDesignName() + name = "Exosuit module circuit design ([name])" +/datum/design/circuit/mecha/AssembleDesignDesc() + desc = "Allows for the construction of \a [name] module." + +/datum/design/circuit/mecha/ripley_main + name = "APLU 'Ripley' central control" + id = "ripley_main" + build_path = /obj/item/weapon/circuitboard/mecha/ripley/main + sort_string = "NAAAA" + +/datum/design/circuit/mecha/ripley_peri + name = "APLU 'Ripley' peripherals control" + id = "ripley_peri" + build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals + sort_string = "NAAAB" + +/datum/design/circuit/mecha/odysseus_main + name = "'Odysseus' central control" + id = "odysseus_main" + req_tech = list(TECH_DATA = 3,TECH_BIO = 2) + build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main + sort_string = "NAABA" + +/datum/design/circuit/mecha/odysseus_peri + name = "'Odysseus' peripherals control" + id = "odysseus_peri" + req_tech = list(TECH_DATA = 3,TECH_BIO = 2) + build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals + sort_string = "NAABB" + +/datum/design/circuit/mecha/gygax_main + name = "'Gygax' central control" + id = "gygax_main" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/gygax/main + sort_string = "NAACA" + +/datum/design/circuit/mecha/gygax_peri + name = "'Gygax' peripherals control" + id = "gygax_peri" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals + sort_string = "NAACB" + +/datum/design/circuit/mecha/gygax_targ + name = "'Gygax' weapon control and targeting" + id = "gygax_targ" + req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) + build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting + sort_string = "NAACC" + +/datum/design/circuit/mecha/durand_main + name = "'Durand' central control" + id = "durand_main" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/durand/main + sort_string = "NAADA" + +/datum/design/circuit/mecha/durand_peri + name = "'Durand' peripherals control" + id = "durand_peri" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals + sort_string = "NAADB" + +/datum/design/circuit/mecha/durand_targ + name = "'Durand' weapon control and targeting" + id = "durand_targ" + req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) + build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting + sort_string = "NAADC" + +/datum/design/circuit/tcom + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) + +/datum/design/circuit/tcom/AssembleDesignName() + name = "Telecommunications machinery circuit design ([name])" +/datum/design/circuit/tcom/AssembleDesignDesc() + desc = "Allows for the construction of a telecommunications [name] circuit board." + +/datum/design/circuit/tcom/server + name = "server mainframe" + id = "tcom-server" + build_path = /obj/item/weapon/circuitboard/telecomms/server + sort_string = "PAAAA" + +/datum/design/circuit/tcom/processor + name = "processor unit" + id = "tcom-processor" + build_path = /obj/item/weapon/circuitboard/telecomms/processor + sort_string = "PAAAB" + + // #TODO-MERGE: Add in loyalty implant printing from lathe. +/datum/design/circuit/tcom/bus + name = "bus mainframe" + id = "tcom-bus" + build_path = /obj/item/weapon/circuitboard/telecomms/bus + sort_string = "PAAAC" + +/datum/design/circuit/tcom/hub + name = "hub mainframe" + id = "tcom-hub" + build_path = /obj/item/weapon/circuitboard/telecomms/hub + sort_string = "PAAAD" + +/datum/design/circuit/tcom/relay + name = "relay mainframe" + id = "tcom-relay" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 4, TECH_BLUESPACE = 3) + build_path = /obj/item/weapon/circuitboard/telecomms/relay + sort_string = "PAAAE" + +/datum/design/circuit/tcom/broadcaster + name = "subspace broadcaster" + id = "tcom-broadcaster" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_BLUESPACE = 2) + build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster + sort_string = "PAAAF" datum/design/item/weapon/lasshotgun id = "laser_shotgun" req_tech = list("combat" = 3, "materials" = 5, "powerstorage" = 4) materials = list("$metal" = 5000, "$glass" = 1500, "$uranium" = 500, "$diamond" = 500) - reliability_base = 76 build_path = /obj/item/weapon/gun/energy/laser/shotgun - locked = 1 datum/design/item/weapon/stunrevolver id = "stunrevolver" req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2) materials = list("$metal" = 4000) build_path = /obj/item/weapon/gun/energy/stunrevolver - locked = 1 datum/design/item/weapon/lasercannon desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core." @@ -1331,50 +1482,65 @@ datum/design/item/weapon/lasercannon req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3) materials = list("$metal" = 10000, "$glass" = 1000, "$diamond" = 2000) build_path = /obj/item/weapon/gun/energy/rifle/laser/heavy - locked = 1 datum/design/item/weapon/decloner id = "decloner" req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6) materials = list("$gold" = 5000,"$uranium" = 10000) build_path = /obj/item/weapon/gun/energy/decloner - locked = 1 -datum/design/item/weapon/chemsprayer - desc = "An advanced chem spraying device." - id = "chemsprayer" - req_tech = list("materials" = 3, "engineering" = 3, "biotech" = 2) - materials = list("$metal" = 5000, "$glass" = 1000) - reliability_base = 100 - build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer -datum/design/item/weapon/rapidsyringe - id = "rapidsyringe" - req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) - materials = list("$metal" = 5000, "$glass" = 1000) - build_path = /obj/item/weapon/gun/launcher/syringe/rapid +/datum/design/circuit/tcom/receiver + name = "subspace receiver" + id = "tcom-receiver" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2) + build_path = /obj/item/weapon/circuitboard/telecomms/receiver + sort_string = "PAAAG" -datum/design/item/weapon/largecrossbow - name = "Energy Crossbow" - desc = "A weapon favoured by syndicate infiltration teams." - id = "largecrossbow" - req_tech = list("combat" = 4, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3) - materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000) - build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow +/datum/design/circuit/shield + req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3) + materials = list("glass" = 2000, "gold" = 1000) -datum/design/item/weapon/temp_gun - desc = "A gun that shoots high-powered glass-encased energy temperature bullets." - id = "temp_gun" - req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2) - materials = list("$metal" = 5000, "$glass" = 500, "$silver" = 3000) - build_path = /obj/item/weapon/gun/energy/temperature - locked = 1 +/datum/design/circuit/shield/AssembleDesignName() + name = "Shield generator circuit design ([name])" +/datum/design/circuit/shield/AssembleDesignDesc() + if(!desc) + desc = "Allows for the construction of \a [name] shield generator." -datum/design/item/weapon/flora_gun - id = "flora_gun" - req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3) - materials = list("$metal" = 2000, "$glass" = 500, "$uranium" = 500) - build_path = /obj/item/weapon/gun/energy/floragun +/datum/design/circuit/shield/bubble + name = "bubble" + id = "shield_gen" + build_path = /obj/item/weapon/circuitboard/shield_gen + sort_string = "VAAAA" + +/datum/design/circuit/shield/hull + name = "hull" + id = "shield_gen_ex" + build_path = /obj/item/weapon/circuitboard/shield_gen_ex + sort_string = "VAAAB" + +/datum/design/circuit/shield/capacitor + name = "capacitor" + desc = "Allows for the construction of a shield capacitor circuit board." + id = "shield_cap" + req_tech = list(TECH_MAGNET = 3, TECH_POWER = 4) + build_path = /obj/item/weapon/circuitboard/shield_cap + sort_string = "VAAAC" + +/datum/design/circuit/ntnet_relay + name = "NTNet Quantum Relay" + id = "ntnet_relay" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/ntnet_relay + sort_string = "WAAAA" +// #TODO-MERGE: Add in large crossbow and temperature gun. + +/datum/design/circuit/aicore + name = "AI core" + id = "aicore" + req_tech = list(TECH_DATA = 4, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/aicore + sort_string = "XAAAA" datum/design/item/weapon/mousegun id = "mousegun" @@ -1392,42 +1558,38 @@ datum/design/item/weapon/large_grenade id = "large_Grenade" req_tech = list("combat" = 3, "materials" = 2) materials = list("$metal" = 3000) - reliability_base = 79 build_path = /obj/item/weapon/grenade/chem_grenade/large -datum/design/item/weapon/smg - id = "smg" - req_tech = list("combat" = 4, "materials" = 3) - materials = list("$metal" = 8000, "$silver" = 2000, "$diamond" = 1000) - build_path = /obj/item/weapon/gun/projectile/automatic - locked = 1 +/datum/design/aimodule + build_type = IMPRINTER + materials = list("glass" = 2000, "gold" = 100) -datum/design/item/weapon/ammo_9mm - id = "ammo_9mm" - req_tech = list("combat" = 4, "materials" = 3) - materials = list("$metal" = 3750, "$silver" = 100) - build_path = /obj/item/ammo_magazine/c9mm +/datum/design/aimodule/AssembleDesignName() + name = "AI module design ([name])" -datum/design/item/weapon/trod - id = "trod" - name = "tungsten rod pack" - desc = "moderately expensive superdense tungsten rods." - req_tech = list("combat" = 2, "materials" = 4) - materials = list("$metal" = 10000, "$gold" = 3750) - build_path = /obj/item/ammo_magazine/trodpack +/datum/design/aimodule/AssembleDesignDesc() + desc = "Allows for the construction of \a '[name]' AI module." -datum/design/item/weapon/stunshell - desc = "A stunning shell for a shotgun." - id = "stunshell" - req_tech = list("combat" = 3, "materials" = 3) - materials = list("$metal" = 4000) - build_path = /obj/item/ammo_casing/shotgun/stunshell +/datum/design/aimodule/safeguard + name = "Safeguard" + id = "safeguard" + req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) + build_path = /obj/item/weapon/aiModule/safeguard + sort_string = "XABAA" -datum/design/item/weapon/phoronpistol - id = "ppistol" - req_tech = list("combat" = 5, "phorontech" = 4) - materials = list("$metal" = 5000, "$glass" = 1000, "$phoron" = 3000) - build_path = /obj/item/weapon/gun/energy/toxgun +/datum/design/aimodule/onehuman + name = "OneCrewMember" + id = "onehuman" + req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/oneHuman + sort_string = "XABAB" + +/datum/design/aimodule/protectstation + name = "ProtectStation" + id = "protectstation" + req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/protectStation + sort_string = "XABAC" datum/design/item/weapon/eglaive id = "eglaive" @@ -1480,7 +1642,6 @@ datum/design/item/forcegloves build_type = PROTOLATHE materials = list("$metal" = 4000) build_path = "/obj/item/clothing/gloves/force/basic" - locked = 1 category = "Weapons" ///////////////////////////////////////// @@ -1491,219 +1652,198 @@ datum/design/item/weapon/mining/AssembleDesignName() ..() name = "Mining equipment design ([item_name])" -datum/design/item/weapon/mining/jackhammer - id = "jackhammer" - req_tech = list("materials" = 3, "powerstorage" = 2, "engineering" = 2) - materials = list("$metal" = 2000, "$glass" = 500, "$silver" = 500) - build_path = /obj/item/weapon/pickaxe/jackhammer +/datum/design/aimodule/notele + name = "TeleporterOffline" + id = "notele" + req_tech = list(TECH_DATA = 3) + build_path = /obj/item/weapon/aiModule/teleporterOffline + sort_string = "XABAD" -datum/design/item/weapon/mining/drill - id = "drill" - req_tech = list("materials" = 2, "powerstorage" = 3, "engineering" = 2) - materials = list("$metal" = 6000, "$glass" = 1000) //expensive, but no need for miners. - build_path = /obj/item/weapon/pickaxe/drill +/datum/design/aimodule/quarantine + name = "Quarantine" + id = "quarantine" + req_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4) + build_path = /obj/item/weapon/aiModule/quarantine + sort_string = "XABAE" -datum/design/item/weapon/mining/plasmacutter - id = "plasmacutter" - req_tech = list("materials" = 4, "phorontech" = 3, "engineering" = 3) - materials = list("$metal" = 1500, "$glass" = 500, "$gold" = 500, "$phoron" = 500) - reliability_base = 79 - build_path = /obj/item/weapon/pickaxe/plasmacutter +/datum/design/aimodule/oxygen + name = "OxygenIsToxicToHumans" + id = "oxygen" + req_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4) + build_path = /obj/item/weapon/aiModule/oxygen + sort_string = "XABAF" -datum/design/item/weapon/mining/pick_diamond - id = "pick_diamond" - req_tech = list("materials" = 6) - materials = list("$diamond" = 3000) - build_path = /obj/item/weapon/pickaxe/diamond +/datum/design/aimodule/freeform + name = "Freeform" + id = "freeform" + req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) + build_path = /obj/item/weapon/aiModule/freeform + sort_string = "XABAG" -datum/design/item/weapon/mining/drill_diamond - id = "drill_diamond" - req_tech = list("materials" = 6, "powerstorage" = 4, "engineering" = 4) - materials = list("$metal" = 3000, "$glass" = 1000, "$diamond" = 3750) //Yes, a whole diamond is needed. - reliability_base = 79 - build_path = /obj/item/weapon/pickaxe/diamonddrill +/datum/design/aimodule/reset + name = "Reset" + id = "reset" + req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/reset + sort_string = "XAAAA" -///////////////////////////////////////// -//////////////Blue Space///////////////// -///////////////////////////////////////// -datum/design/item/beacon - name = "Bluespace tracking beacon design" - id = "beacon" - req_tech = list("bluespace" = 1) - materials = list ("$metal" = 20, "$glass" = 10) - build_path = /obj/item/device/radio/beacon +/datum/design/aimodule/purge + name = "Purge" + id = "purge" + req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/purge + sort_string = "XAAAB" -datum/design/item/bag_holding - name = "'Bag of Holding', an infinite capacity bag prototype" - desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy." - id = "bag_holding" - req_tech = list("bluespace" = 4, "materials" = 6) - materials = list("$gold" = 3000, "$diamond" = 1500, "$uranium" = 250) - reliability_base = 80 - build_path = /obj/item/weapon/storage/backpack/holding +// Core modules +/datum/design/aimodule/core + req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6) -datum/design/bluespace_crystal - name = "Artificial bluespace crystal" - desc = "A small blue crystal with mystical properties." - id = "bluespace_crystal" - req_tech = list("bluespace" = 5, "materials" = 7) - build_type = PROTOLATHE - materials = list("$gold" = 1500, "$diamond" = 3000, "$phoron" = 1500) - reliability_base = 100 - build_path = /obj/item/bluespace_crystal/artificial +/datum/design/aimodule/core/AssembleDesignName() + name = "AI core module design ([name])" -///////////////////////////////////////// -/////////////////HUDs//////////////////// -///////////////////////////////////////// -datum/design/item/hud - materials = list("$metal" = 50, "$glass" = 50) +/datum/design/aimodule/core/AssembleDesignDesc() + desc = "Allows for the construction of \a '[name]' AI core module." -datum/design/item/hud/AssembleDesignName() - ..() - name = "HUD glasses prototype ([item_name])" +/datum/design/aimodule/core/freeformcore + name = "Freeform" + id = "freeformcore" + build_path = /obj/item/weapon/aiModule/freeformcore + sort_string = "XACAA" -datum/design/item/hud/AssembleDesignDesc() - desc = "Allows for the construction of \a [item_name] HUD glasses." +/datum/design/aimodule/core/asimov + name = "Asimov" + id = "asimov" + build_path = /obj/item/weapon/aiModule/asimov + sort_string = "XACAB" -datum/design/item/hud/health - name = "health scanner" - id = "health_hud" - req_tech = list("biotech" = 2, "magnets" = 3) - build_path = /obj/item/clothing/glasses/hud/health +/datum/design/aimodule/core/paladin + name = "P.A.L.A.D.I.N." + id = "paladin" + build_path = /obj/item/weapon/aiModule/paladin + sort_string = "XACAC" -datum/design/item/hud/security - name = "security records" - id = "security_hud" - req_tech = list("magnets" = 3, "combat" = 2) - build_path = /obj/item/clothing/glasses/hud/security - locked = 1 +/datum/design/aimodule/core/tyrant + name = "T.Y.R.A.N.T." + id = "tyrant" + req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/tyrant + sort_string = "XACAD" -///////////////////////////////////////// -////////////////PDA Stuff//////////////// -///////////////////////////////////////// -datum/design/item/pda +/datum/design/item/pda name = "PDA design" desc = "Cheaper than whiny non-digital assistants." id = "pda" - req_tech = list("engineering" = 2, "powerstorage" = 3) - materials = list("$metal" = 50, "$glass" = 50) + req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) build_path = /obj/item/device/pda + sort_string = "VAAAA" -// *** Cartridges -datum/design/item/pda_cartridge - req_tech = list("engineering" = 2, "powerstorage" = 3) - materials = list("$metal" = 50, "$glass" = 50) +// Cartridges +/datum/design/item/pda_cartridge + req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) -datum/design/item/pda_cartridge/AssembleDesignName() +/datum/design/item/pda_cartridge/AssembleDesignName() ..() name = "PDA accessory ([item_name])" -datum/design/item/pda_cartridge/cart_basic +/datum/design/item/pda_cartridge/cart_basic id = "cart_basic" build_path = /obj/item/weapon/cartridge -datum/design/item/pda_cartridge/engineering + sort_string = "VBAAA" + +/datum/design/item/pda_cartridge/engineering id = "cart_engineering" build_path = /obj/item/weapon/cartridge/engineering -datum/design/item/pda_cartridge/atmos + sort_string = "VBAAB" + +/datum/design/item/pda_cartridge/atmos id = "cart_atmos" build_path = /obj/item/weapon/cartridge/atmos -datum/design/item/pda_cartridge/medical + sort_string = "VBAAC" + +/datum/design/item/pda_cartridge/medical id = "cart_medical" build_path = /obj/item/weapon/cartridge/medical -datum/design/item/pda_cartridge/chemistry + sort_string = "VBAAD" + +/datum/design/item/pda_cartridge/chemistry id = "cart_chemistry" build_path = /obj/item/weapon/cartridge/chemistry -datum/design/item/pda_cartridge/security + sort_string = "VBAAE" + +/datum/design/item/pda_cartridge/security id = "cart_security" build_path = /obj/item/weapon/cartridge/security - locked = 1 -datum/design/item/pda_cartridge/janitor + sort_string = "VBAAF" + +/datum/design/item/pda_cartridge/janitor id = "cart_janitor" build_path = /obj/item/weapon/cartridge/janitor -/* -datum/design/item/pda_cartridge/clown - id = "cart_clown" - build_path = /obj/item/weapon/cartridge/clown" -datum/design/item/pda_cartridge/mime - id = "cart_mime" - build_path = /obj/item/weapon/cartridge/mime" -*/ -datum/design/item/pda_cartridge/science + sort_string = "VBAAG" + +/datum/design/item/pda_cartridge/science id = "cart_science" build_path = /obj/item/weapon/cartridge/signal/science -datum/design/item/pda_cartridge/quartermaster + sort_string = "VBAAH" + +/datum/design/item/pda_cartridge/quartermaster id = "cart_quartermaster" build_path = /obj/item/weapon/cartridge/quartermaster - locked = 1 -datum/design/item/pda_cartridge/hop + sort_string = "VBAAI" + +/datum/design/item/pda_cartridge/hop id = "cart_hop" build_path = /obj/item/weapon/cartridge/hop - locked = 1 -datum/design/item/pda_cartridge/hos + sort_string = "VBAAJ" + +/datum/design/item/pda_cartridge/hos id = "cart_hos" build_path = /obj/item/weapon/cartridge/hos - locked = 1 -datum/design/item/pda_cartridge/ce + sort_string = "VBAAK" + +/datum/design/item/pda_cartridge/ce id = "cart_ce" build_path = /obj/item/weapon/cartridge/ce - locked = 1 -datum/design/item/pda_cartridge/cmo + sort_string = "VBAAL" + +/datum/design/item/pda_cartridge/cmo id = "cart_cmo" build_path = /obj/item/weapon/cartridge/cmo - locked = 1 -datum/design/item/pda_cartridge/rd + sort_string = "VBAAM" + +/datum/design/item/pda_cartridge/rd id = "cart_rd" build_path = /obj/item/weapon/cartridge/rd - locked = 1 -datum/design/item/pda_cartridge/captain + sort_string = "VBAAN" + +/datum/design/item/pda_cartridge/captain id = "cart_captain" build_path = /obj/item/weapon/cartridge/captain - locked = 1 + sort_string = "VBAAO" -///////////////////////////////////////// -///////////////Misc Stuff//////////////// -///////////////////////////////////////// -datum/design/item/borg_syndicate_module - name = "Cyborg lethal weapons upgrade" - desc = "Allows for the construction of lethal upgrades for cyborgs." - id = "borg_syndicate_module" - build_type = MECHFAB - req_tech = list("combat" = 4, "syndicate" = 3) - build_path = /obj/item/borg/upgrade/syndicate - category = "Cyborg Upgrade Modules" +/* Uncomment if someone makes these buildable +/datum/design/circuit/general_alert + name = "general alert console" + id = "general_alert" + build_path = /obj/item/weapon/circuitboard/general_alert -datum/design/item/mesons - name = "Optical meson scanners design" - desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else." - id = "mesons" - req_tech = list("magnets" = 2, "engineering" = 2) - materials = list("$metal" = 50, "$glass" = 50) - build_path = /obj/item/clothing/glasses/meson - -datum/design/item/binaryencrypt - name = "Binary encryption key" - desc = "Allows for deciphering the binary channel on-the-fly." - id = "binaryencrypt" - req_tech = list("syndicate" = 2) - materials = list("$metal" = 300, "$glass" = 300) - build_path = /obj/item/device/encryptionkey/binary - -datum/design/item/chameleon - name = "Holographic equipment kit" - desc = "A kit of dangerous, high-tech equipment with changeable looks." - id = "chameleon" - req_tech = list("syndicate" = 2) - materials = list("$metal" = 500) - build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon - -datum/design/item/experimental_welder - name = "Experimental Welding Tool" - desc = "A scientifically-enhanced welding tool that uses fuel-producing microbes to gradually replenish its fuel supply" - id = "experimental_welder" - req_tech = list("materials" = 4, "engineering" = 4) - materials = list("$metal" = 500) - build_path =/obj/item/weapon/weldingtool/experimental +// Removal of loyalty implants. Can't think of a way to add this to the config option. +/datum/design/item/implant/loyalty + name = "loyalty" + id = "implant_loyal" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) + build_path = /obj/item/weapon/implantcase/loyalty" +/datum/design/rust_core_control + name = "Circuit Design (RUST core controller)" + desc = "Allows for the construction of circuit boards used to build a core control console for the RUST fusion engine." + id = "rust_core_control" + req_tech = list("programming" = 4, "engineering" = 4) + build_type = IMPRINTER + materials = list("glass" = 2000, "sacid" = 20) + build_path = "/obj/item/weapon/circuitboard/rust_core_control" datum/design/item/advanced_light_replacer name = "Advanced Light Replacer" desc = "A specialised light replacer which stores more lights, refills faster from boxes, and sucks up broken bulbs." @@ -1712,21 +1852,54 @@ datum/design/item/advanced_light_replacer materials = list("$metal" = 500) build_path =/obj/item/device/lightreplacer/advanced -//////exosuit modules - allow robotics to print some modules, maybe a generic rig, but more things for them to do --Alberyk +datum/design/rust_fuel_control + name = "Circuit Design (RUST fuel controller)" + desc = "Allows for the construction of circuit boards used to build a fuel injector control console for the RUST fusion engine." + id = "rust_fuel_control" + req_tech = list("programming" = 4, "engineering" = 4) + build_type = IMPRINTER + materials = list("glass" = 2000, "sacid" = 20) + build_path = "/obj/item/weapon/circuitboard/rust_fuel_control" -datum/design/item/rigmodule - build_type = MECHFAB - req_tech = list("programming" = 2) - category = "Hardsuit Modules" +datum/design/rust_fuel_port + name = "Internal circuitry (RUST fuel port)" + desc = "Allows for the construction of circuit boards used to build a fuel injection port for the RUST fusion engine." + id = "rust_fuel_port" + req_tech = list("engineering" = 4, "materials" = 5) + build_type = IMPRINTER + materials = list("glass" = 2000, "sacid" = 20, "uranium" = 3000) + build_path = "/obj/item/weapon/module/rust_fuel_port" -datum/design/item/rigmodule/AssembleDesignName() - ..() - name = "Hardsuit modules design ([item_name])" +datum/design/rust_fuel_compressor + name = "Circuit Design (RUST fuel compressor)" + desc = "Allows for the construction of circuit boards used to build a fuel compressor of the RUST fusion engine." + id = "rust_fuel_compressor" + req_tech = list("materials" = 6, "phorontech" = 4) + build_type = IMPRINTER + materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 1000) + build_path = "/obj/item/weapon/module/rust_fuel_compressor" -datum/design/item/mecha/weapon/AssembleDesignDesc() - if(build_path) - desc = "Allows for the construction of \a '[item_name]' hardsuit module." +datum/design/rust_core + name = "Internal circuitry (RUST tokamak core)" + desc = "The circuit board that for a RUST-pattern tokamak fusion core." + id = "pacman" + req_tech = list(bluespace = 3, phorontech = 4, magnets = 5, powerstorage = 6) + build_type = IMPRINTER + materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 2000) + build_path = "/obj/item/weapon/circuitboard/rust_core" +datum/design/rust_injector + name = "Internal circuitry (RUST tokamak core)" + desc = "The circuit board that for a RUST-pattern particle accelerator." + id = "pacman" + req_tech = list(powerstorage = 3, engineering = 4, phorontech = 4, materials = 6) + build_type = IMPRINTER + materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "uranium" = 2000) + build_path = "/obj/item/weapon/circuitboard/rust_core" +*/ + +// #TODO-MERGE: Exosuit modules into buildable again +/* datum/design/item/rigmodule/iss_module desc = "Allows for the construction of an integrated intelligence system module suitable for most hardsuits." id = "iss_module" @@ -1824,3 +1997,5 @@ datum/design/item/rigmodule/egun_module req_tech = list("materials" = 3, "powerstorage" = 4, "combat" = 4) materials = list("$glass" = 2250, "$metal" = 7000, "$uranium" = 3250, "$gold" = 2500) build_path = /obj/item/rig_module/mounted/egun + +*/ diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 3f8e3edebf6..7dfaf81ed72 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - /* Destructive Analyzer @@ -7,12 +5,12 @@ It is used to destroy hand-held objects and advance technological research. Cont Note: Must be placed within 3 tiles of the R&D Console */ + /obj/machinery/r_n_d/destructive_analyzer name = "destructive analyzer" icon_state = "d_analyzer" var/obj/item/weapon/loaded_item = null - var/decon_mod = 1 - var/min_reliability = 90 + var/decon_mod = 0 use_power = 1 idle_power_usage = 30 @@ -32,11 +30,6 @@ Note: Must be placed within 3 tiles of the R&D Console for(var/obj/item/weapon/stock_parts/S in component_parts) T += S.rating decon_mod = T * 0.1 - min_reliability = 90 - T - -/obj/machinery/r_n_d/destructive_analyzer/meteorhit() - qdel(src) - return /obj/machinery/r_n_d/destructive_analyzer/update_icon() if(panel_open) @@ -47,8 +40,12 @@ Note: Must be placed within 3 tiles of the R&D Console icon_state = "d_analyzer" /obj/machinery/r_n_d/destructive_analyzer/attackby(var/obj/O as obj, var/mob/user as mob) - if(shocked) - shock(user, 50) + if(busy) + user << "\The [src] is busy right now." + return + if(loaded_item) + user << "There is something already loaded into \the [src]." + return 1 if(default_deconstruction_screwdriver(user, O)) if(linked_console) linked_console.linked_destroy = null @@ -61,32 +58,23 @@ Note: Must be placed within 3 tiles of the R&D Console if(panel_open) user << "You can't load \the [src] while it's opened." return 1 - if(disabled) - return if(!linked_console) - user << "\The [src] must be linked to an R&D console first!" - return - if(busy) - user << "\The [src] is busy right now." + user << "\The [src] must be linked to an R&D console first." return if(istype(O, /obj/item) && !loaded_item) if(isrobot(user)) //Don't put your module items in there! return if(!O.origin_tech) - user << "This doesn't seem to have a tech origin!" + user << "This doesn't seem to have a tech origin." return - var/list/temp_tech = ConvertReqString2List(O.origin_tech) - if(temp_tech.len == 0) - user << "You cannot deconstruct this item!" - return - if(O.reliability < min_reliability && O.crit_fail == 0) - usr << "Item is neither reliable enough nor broken enough to learn from." + if(O.origin_tech.len == 0) + user << "You cannot deconstruct this item." return busy = 1 loaded_item = O user.drop_item() O.loc = src - user << "You add \the [O] to \the [src]!" + user << "You add \the [O] to \the [src]." flick("d_analyzer_la", src) spawn(10) update_icon() diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm new file mode 100644 index 00000000000..1a3ef67b9b1 --- /dev/null +++ b/code/modules/research/mechfab_designs.dm @@ -0,0 +1,611 @@ +/datum/design/item/mechfab + build_type = MECHFAB + category = "Misc" + req_tech = list(TECH_MATERIAL = 1) + +/datum/design/item/mechfab/robot + category = "Robot" + +//if the fabricator is a mech fab pass the manufacturer info over to the robot part constructor +/datum/design/item/mechfab/robot/Fabricate(var/newloc, var/fabricator) + if(istype(fabricator, /obj/machinery/mecha_part_fabricator)) + var/obj/machinery/mecha_part_fabricator/mechfab = fabricator + return new build_path(newloc, mechfab.manufacturer) + return ..() + +/datum/design/item/mechfab/robot/exoskeleton + name = "Robot exoskeleton" + id = "robot_exoskeleton" + build_path = /obj/item/robot_parts/robot_suit + time = 50 + materials = list(DEFAULT_WALL_MATERIAL = 50000) + +/datum/design/item/mechfab/robot/torso + name = "Robot torso" + id = "robot_torso" + build_path = /obj/item/robot_parts/chest + time = 35 + materials = list(DEFAULT_WALL_MATERIAL = 40000) + +/datum/design/item/mechfab/robot/head + name = "Robot head" + id = "robot_head" + build_path = /obj/item/robot_parts/head + time = 35 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/robot/l_arm + name = "Robot left arm" + id = "robot_l_arm" + build_path = /obj/item/robot_parts/l_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 18000) + +/datum/design/item/mechfab/robot/r_arm + name = "Robot right arm" + id = "robot_r_arm" + build_path = /obj/item/robot_parts/r_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 18000) + +/datum/design/item/mechfab/robot/l_leg + name = "Robot left leg" + id = "robot_l_leg" + build_path = /obj/item/robot_parts/l_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/mechfab/robot/r_leg + name = "Robot right leg" + id = "robot_r_leg" + build_path = /obj/item/robot_parts/r_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/mechfab/robot/component + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 5000) + +/datum/design/item/mechfab/robot/component/binary_communication_device + name = "Binary communication device" + id = "binary_communication_device" + build_path = /obj/item/robot_parts/robot_component/binary_communication_device + +/datum/design/item/mechfab/robot/component/radio + name = "Radio" + id = "radio" + build_path = /obj/item/robot_parts/robot_component/radio + +/datum/design/item/mechfab/robot/component/actuator + name = "Actuator" + id = "actuator" + build_path = /obj/item/robot_parts/robot_component/actuator + +/datum/design/item/mechfab/robot/component/diagnosis_unit + name = "Diagnosis unit" + id = "diagnosis_unit" + build_path = /obj/item/robot_parts/robot_component/diagnosis_unit + +/datum/design/item/mechfab/robot/component/camera + name = "Camera" + id = "camera" + build_path = /obj/item/robot_parts/robot_component/camera + +/datum/design/item/mechfab/robot/component/armour + name = "Armour plating" + id = "armour" + build_path = /obj/item/robot_parts/robot_component/armour + +/datum/design/item/mechfab/ripley + category = "Ripley" + +/datum/design/item/mechfab/ripley/chassis + name = "Ripley chassis" + id = "ripley_chassis" + build_path = /obj/item/mecha_parts/chassis/ripley + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 20000) + +/datum/design/item/mechfab/ripley/chassis/firefighter + name = "Firefigher chassis" + id = "firefighter_chassis" + build_path = /obj/item/mecha_parts/chassis/firefighter + +/datum/design/item/mechfab/ripley/torso + name = "Ripley torso" + id = "ripley_torso" + build_path = /obj/item/mecha_parts/part/ripley_torso + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 40000, "glass" = 15000) + +/datum/design/item/mechfab/ripley/left_arm + name = "Ripley left arm" + id = "ripley_left_arm" + build_path = /obj/item/mecha_parts/part/ripley_left_arm + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/ripley/right_arm + name = "Ripley right arm" + id = "ripley_right_arm" + build_path = /obj/item/mecha_parts/part/ripley_right_arm + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/ripley/left_leg + name = "Ripley left leg" + id = "ripley_left_leg" + build_path = /obj/item/mecha_parts/part/ripley_left_leg + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 30000) + +/datum/design/item/mechfab/ripley/right_leg + name = "Ripley right leg" + id = "ripley_right_leg" + build_path = /obj/item/mecha_parts/part/ripley_right_leg + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 30000) + +/datum/design/item/mechfab/odysseus + category = "Odysseus" + +/datum/design/item/mechfab/odysseus/chassis + name = "Odysseus chassis" + id = "odysseus_chassis" + build_path = /obj/item/mecha_parts/chassis/odysseus + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 20000) + +/datum/design/item/mechfab/odysseus/torso + name = "Odysseus torso" + id = "odysseus_torso" + build_path = /obj/item/mecha_parts/part/odysseus_torso + time = 18 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/odysseus/head + name = "Odysseus head" + id = "odysseus_head" + build_path = /obj/item/mecha_parts/part/odysseus_head + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 10000) + +/datum/design/item/mechfab/odysseus/left_arm + name = "Odysseus left arm" + id = "odysseus_left_arm" + build_path = /obj/item/mecha_parts/part/odysseus_left_arm + time = 12 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/mechfab/odysseus/right_arm + name = "Odysseus right arm" + id = "odysseus_right_arm" + build_path = /obj/item/mecha_parts/part/odysseus_right_arm + time = 12 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/mechfab/odysseus/left_leg + name = "Odysseus left leg" + id = "odysseus_left_leg" + build_path = /obj/item/mecha_parts/part/odysseus_left_leg + time = 13 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/mechfab/odysseus/right_leg + name = "Odysseus right leg" + id = "odysseus_right_leg" + build_path = /obj/item/mecha_parts/part/odysseus_right_leg + time = 13 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/mechfab/gygax + category = "Gygax" + +/datum/design/item/mechfab/gygax/chassis + name = "Gygax chassis" + id = "gygax_chassis" + build_path = /obj/item/mecha_parts/chassis/gygax + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/gygax/torso + name = "Gygax torso" + id = "gygax_torso" + build_path = /obj/item/mecha_parts/part/gygax_torso + time = 30 + materials = list(DEFAULT_WALL_MATERIAL = 50000, "glass" = 20000) + +/datum/design/item/mechfab/gygax/head + name = "Gygax head" + id = "gygax_head" + build_path = /obj/item/mecha_parts/part/gygax_head + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 20000, "glass" = 10000) + +/datum/design/item/mechfab/gygax/left_arm + name = "Gygax left arm" + id = "gygax_left_arm" + build_path = /obj/item/mecha_parts/part/gygax_left_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 30000) + +/datum/design/item/mechfab/gygax/right_arm + name = "Gygax right arm" + id = "gygax_right_arm" + build_path = /obj/item/mecha_parts/part/gygax_right_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 30000) + +/datum/design/item/mechfab/gygax/left_leg + name = "Gygax left leg" + id = "gygax_left_leg" + build_path = /obj/item/mecha_parts/part/gygax_left_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 35000) + +/datum/design/item/mechfab/gygax/right_leg + name = "Gygax right leg" + id = "gygax_right_leg" + build_path = /obj/item/mecha_parts/part/gygax_right_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 35000) + +/datum/design/item/mechfab/gygax/armour + name = "Gygax armour plates" + id = "gygax_armour" + build_path = /obj/item/mecha_parts/part/gygax_armour + time = 60 + materials = list(DEFAULT_WALL_MATERIAL = 50000, "diamond" = 10000) + +/datum/design/item/mechfab/durand + category = "Durand" + +/datum/design/item/mechfab/durand/chassis + name = "Durand chassis" + id = "durand_chassis" + build_path = /obj/item/mecha_parts/chassis/durand + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/durand/torso + name = "Durand torso" + id = "durand_torso" + build_path = /obj/item/mecha_parts/part/durand_torso + time = 30 + materials = list(DEFAULT_WALL_MATERIAL = 55000, "glass" = 20000, "silver" = 10000) + +/datum/design/item/mechfab/durand/head + name = "Durand head" + id = "durand_head" + build_path = /obj/item/mecha_parts/part/durand_head + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 10000, "silver" = 3000) + +/datum/design/item/mechfab/durand/left_arm + name = "Durand left arm" + id = "durand_left_arm" + build_path = /obj/item/mecha_parts/part/durand_left_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000) + +/datum/design/item/mechfab/durand/right_arm + name = "Durand right arm" + id = "durand_right_arm" + build_path = /obj/item/mecha_parts/part/durand_right_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000) + +/datum/design/item/mechfab/durand/left_leg + name = "Durand left leg" + id = "durand_left_leg" + build_path = /obj/item/mecha_parts/part/durand_left_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000) + +/datum/design/item/mechfab/durand/right_leg + name = "Durand right leg" + id = "durand_right_leg" + build_path = /obj/item/mecha_parts/part/durand_right_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000) + +/datum/design/item/mechfab/durand/armour + name = "Durand armour plates" + id = "durand_armour" + build_path = /obj/item/mecha_parts/part/durand_armour + time = 60 + materials = list(DEFAULT_WALL_MATERIAL = 50000, "uranium" = 10000) + +/datum/design/item/robot_upgrade + build_type = MECHFAB + time = 12 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + category = "Cyborg Upgrade Modules" + +/datum/design/item/robot_upgrade/rename + name = "Rename module" + desc = "Used to rename a cyborg." + id = "borg_rename_module" + build_path = /obj/item/borg/upgrade/rename + +/datum/design/item/robot_upgrade/reset + name = "Reset module" + desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." + id = "borg_reset_module" + build_path = /obj/item/borg/upgrade/reset + +/datum/design/item/robot_upgrade/floodlight + name = "Floodlight module" + desc = "Used to boost cyborg's integrated light intensity." + id = "borg_floodlight_module" + build_path = /obj/item/borg/upgrade/floodlight + +/datum/design/item/robot_upgrade/restart + name = "Emergency restart module" + desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." + id = "borg_restart_module" + materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 5000) + build_path = /obj/item/borg/upgrade/restart + +/datum/design/item/robot_upgrade/vtec + name = "VTEC module" + desc = "Used to kick in a robot's VTEC systems, increasing their speed." + id = "borg_vtec_module" + materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 5000) + build_path = /obj/item/borg/upgrade/vtec + +/datum/design/item/robot_upgrade/tasercooler + name = "Rapid taser cooling module" + desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." + id = "borg_taser_module" + materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 2000, "diamond" = 500) + build_path = /obj/item/borg/upgrade/tasercooler + +/datum/design/item/robot_upgrade/jetpack + name = "Jetpack module" + desc = "A carbon dioxide jetpack suitable for low-gravity mining operations." + id = "borg_jetpack_module" + materials = list(DEFAULT_WALL_MATERIAL = 10000, "phoron" = 15000, "uranium" = 20000) + build_path = /obj/item/robot_parts/robot_component/jetpack + +/* +//Commented out by nanako +/datum/design/item/robot_upgrade/rcd + name = "RCD module" + desc = "A rapid construction device module for use during construction operations." + id = "borg_rcd_module" + materials = list(DEFAULT_WALL_MATERIAL = 25000, "phoron" = 15000, "uranium" = 20000) + build_path = /obj/item/borg/upgrade/rcd +*/ +/datum/design/item/robot_upgrade/syndicate + name = "Illegal upgrade" + desc = "Allows for the construction of lethal upgrades for cyborgs." + id = "borg_syndicate_module" + req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "diamond" = 10000) + build_path = /obj/item/borg/upgrade/syndicate + +/datum/design/item/mecha_tracking + name = "Exosuit tracking beacon" + build_type = MECHFAB + time = 5 + materials = list(DEFAULT_WALL_MATERIAL = 500) + build_path = /obj/item/mecha_parts/mecha_tracking + category = "Misc" + +/datum/design/item/mecha + build_type = MECHFAB + category = "Exosuit Equipment" + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/mecha/AssembleDesignDesc() + if(!desc) + desc = "Allows for the construction of \a '[item_name]' exosuit module." + +/datum/design/item/mecha/hydraulic_clamp + name = "Hydraulic clamp" + id = "hydraulic_clamp" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp + +/datum/design/item/mecha/drill + name = "Drill" + id = "drill" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill + +/datum/design/item/mecha/extinguisher + name = "Extinguisher" + id = "extinguisher" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/extinguisher + +/datum/design/item/mecha/cable_layer + name = "Cable layer" + id = "mech_cable_layer" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/cable_layer + +/datum/design/item/mecha/sleeper + name = "Sleeper" + id = "mech_sleeper" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/sleeper + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 10000) + +/datum/design/item/mecha/syringe_gun + name = "Syringe gun" + id = "mech_syringe_gun" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000) + +/* +/datum/design/item/mecha/syringe_gun + desc = "Exosuit-mounted syringe gun and chemical synthesizer." + id = "mech_syringe_gun" + req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun + */ + +/datum/design/item/mecha/passenger + name = "Passenger compartment" + id = "mech_passenger" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/passenger + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + +//obj/item/mecha_parts/mecha_equipment/repair_droid, +//obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING + +/datum/design/item/mecha/generator + name = "Phoron generator" + id = "mech_generator" + build_path = /obj/item/mecha_parts/mecha_equipment/generator + +/datum/design/item/mecha/taser + name = "PBT \"Pacifier\" mounted taser" + id = "mech_taser" + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser + +/datum/design/item/mecha/lmg + name = "Ultra AC 2" + id = "mech_lmg" + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg + +/datum/design/item/mecha/weapon + req_tech = list(TECH_COMBAT = 3) + +// *** Weapon modules +/datum/design/item/mecha/weapon/scattershot + name = "LBX AC 10 \"Scattershot\"" + id = "mech_scattershot" + req_tech = list(TECH_COMBAT = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot + +/datum/design/item/mecha/weapon/laser + name = "CH-PS \"Immolator\" laser" + id = "mech_laser" + req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser + +/datum/design/item/mecha/weapon/laser_rigged + name = "Jury-rigged welder-laser" + desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits." + id = "mech_laser_rigged" + req_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser + +/datum/design/item/mecha/weapon/laser_heavy + name = "CH-LC \"Solaris\" laser cannon" + id = "mech_laser_heavy" + req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy + +/datum/design/item/mecha/weapon/ion + name = "mkIV ion heavy cannon" + id = "mech_ion" + req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion + +/datum/design/item/mecha/weapon/grenade_launcher + name = "SGL-6 grenade launcher" + id = "mech_grenade_launcher" + req_tech = list(TECH_COMBAT = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang + +/datum/design/item/mecha/weapon/clusterbang_launcher + name = "SOP-6 grenade launcher" + desc = "A weapon that violates the Geneva Convention at 6 rounds per minute." + id = "clusterbang_launcher" + req_tech = list(TECH_COMBAT= 5, TECH_MATERIAL = 5, TECH_ILLEGAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 6000, "uranium" = 6000) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited + +// *** Nonweapon modules +/datum/design/item/mecha/wormhole_gen + name = "Wormhole generator" + desc = "An exosuit module that can generate small quasi-stable wormholes." + id = "mech_wormhole_gen" + req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 2) + build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator + +/datum/design/item/mecha/teleporter + name = "Teleporter" + desc = "An exosuit module that allows teleportation to any position in view." + id = "mech_teleporter" + req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5) + build_path = /obj/item/mecha_parts/mecha_equipment/teleporter + +/datum/design/item/mecha/rcd + name = "RCD" + desc = "An exosuit-mounted rapid construction device." + id = "mech_rcd" + time = 120 + materials = list(DEFAULT_WALL_MATERIAL = 30000, "phoron" = 25000, "silver" = 20000, "gold" = 20000) + req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER = 4, TECH_ENGINEERING = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd + +/datum/design/item/mecha/gravcatapult + name = "Gravitational catapult" + desc = "An exosuit-mounted gravitational catapult." + id = "mech_gravcatapult" + req_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult + +/datum/design/item/mecha/repair_droid + name = "Repair droid" + desc = "Automated repair droid, exosuits' best companion. BEEP BOOP" + id = "mech_repair_droid" + req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 1000, "silver" = 2000, "glass" = 5000) + build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid + +/datum/design/item/mecha/phoron_generator + desc = "Phoron reactor." + id = "mech_phoron_generator" + req_tech = list(TECH_PHORON = 2, TECH_POWER= 2, TECH_ENGINEERING = 2) + build_path = /obj/item/mecha_parts/mecha_equipment/generator + materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 500, "glass" = 1000) + +/datum/design/item/mecha/energy_relay + name = "Energy relay" + id = "mech_energy_relay" + req_tech = list(TECH_MAGNET = 4, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 2000, "silver" = 3000, "glass" = 2000) + build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay + +/datum/design/item/mecha/ccw_armor + name = "CCW armor booster" + desc = "Exosuit close-combat armor booster." + id = "mech_ccw_armor" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4) + materials = list(DEFAULT_WALL_MATERIAL = 20000, "silver" = 5000) + build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster + +/datum/design/item/mecha/proj_armor + desc = "Exosuit projectile armor booster." + id = "mech_proj_armor" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 5000) + build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster + +/datum/design/item/mecha/diamond_drill + name = "Diamond drill" + desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger." + id = "mech_diamond_drill" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "diamond" = 6500) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill + +/datum/design/item/mecha/generator_nuclear + name = "Nuclear reactor" + desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy." + id = "mech_generator_nuclear" + req_tech = list(TECH_POWER= 3, TECH_ENGINEERING = 3, TECH_MATERIAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 500, "glass" = 1000) + build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear + +/datum/design/item/synthetic_flash + name = "Synthetic flash" + id = "sflash" + req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) + build_type = MECHFAB + materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 750) + build_path = /obj/item/device/flash/synthetic + category = "Misc" \ No newline at end of file diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 859131529d1..6259d3c8919 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -108,6 +108,32 @@ var/global/list/obj/machinery/message_server/message_servers = list() /obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1) rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth) + var/authmsg = "[message]
      " + if (id_auth) + authmsg += "[id_auth]
      " + if (stamp) + authmsg += "[stamp]
      " + for (var/obj/machinery/requests_console/Console in allConsoles) + if (ckey(Console.department) == ckey(recipient)) + if(Console.inoperable()) + Console.message_log += "Message lost due to console failure.
      Please contact [station_name()] system adminsitrator or AI for technical assistance.
      " + continue + if(Console.newmessagepriority < priority) + Console.newmessagepriority = priority + Console.icon_state = "req_comp[priority]" + switch(priority) + if(2) + if(!Console.silent) + playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) + Console.audible_message(text("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5) + Console.message_log += "High Priority message from [sender]
      [authmsg]" + else + if(!Console.silent) + playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1) + Console.audible_message(text("\icon[Console] *The Requests Console beeps: 'Message from [sender]'"),,4) + Console.message_log += "Message from [sender]
      [authmsg]" + Console.set_light(2) + /obj/machinery/message_server/attack_hand(user as mob) // user << "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentCom delays." diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 409a0f7424e..c91a22d89f5 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -1,12 +1,3 @@ -/* -Protolathe - -Similar to an autolathe, you load glass and metal sheets (but not other objects) into it to be used as raw materials for the stuff -it creates. All the menus and other manipulation commands are in the R&D console. - -Note: Must be placed west/left of and R&D console to function. - -*/ /obj/machinery/r_n_d/protolathe name = "Protolathe" icon_state = "protolathe" @@ -16,16 +7,14 @@ Note: Must be placed west/left of and R&D console to function. idle_power_usage = 30 active_power_usage = 5000 - var/max_material_storage = 100000 //All this could probably be done better with a list but meh. - var/m_amount = 0.0 - var/g_amount = 0.0 - var/gold_amount = 0.0 - var/silver_amount = 0.0 - var/phoron_amount = 0.0 - var/uranium_amount = 0.0 - var/diamond_amount = 0.0 + var/max_material_storage = 100000 + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0) + + var/list/datum/design/queue = list() + var/progress = 0 var/mat_efficiency = 1 + var/speed = 1 /obj/machinery/r_n_d/protolathe/New() ..() @@ -39,61 +28,76 @@ Note: Must be placed west/left of and R&D console to function. component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src) RefreshParts() +/obj/machinery/r_n_d/protolathe/process() + ..() + if(stat) + update_icon() + return + if(queue.len == 0) + busy = 0 + update_icon() + return + var/datum/design/D = queue[1] + if(canBuild(D)) + busy = 1 + progress += speed + if(progress >= D.time) + build(D) + progress = 0 + removeFromQueue(1) + if(linked_console) + linked_console.updateUsrDialog() + update_icon() + else + if(busy) + visible_message("\icon [src] flashes: insufficient materials: [getLackingMaterials(D)].") + busy = 0 + update_icon() + /obj/machinery/r_n_d/protolathe/proc/TotalMaterials() //returns the total of all the stored materials. Makes code neater. - return m_amount + g_amount + gold_amount + silver_amount + phoron_amount + uranium_amount + diamond_amount + var/t = 0 + for(var/f in materials) + t += materials[f] + return t /obj/machinery/r_n_d/protolathe/RefreshParts() var/T = 0 for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) T += G.reagents.maximum_volume - var/datum/reagents/R = new/datum/reagents(T) //Holder for the reagents used as materials. - reagents = R - R.my_atom = src - T = 0 + create_reagents(T) + max_material_storage = 0 for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) - T += M.rating - max_material_storage = T * 75000 + max_material_storage += M.rating * 75000 T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating mat_efficiency = 1 - (T - 2) / 8 + speed = T / 2 /obj/machinery/r_n_d/protolathe/dismantle() for(var/obj/I in component_parts) if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker)) reagents.trans_to_obj(I, reagents.total_volume) - if(m_amount >= 3750) - var/obj/item/stack/material/steel/G = new /obj/item/stack/material/steel(loc) - G.amount = round(m_amount / G.perunit) - if(g_amount >= 3750) - var/obj/item/stack/material/glass/G = new /obj/item/stack/material/glass(loc) - G.amount = round(g_amount / G.perunit) - if(phoron_amount >= 2000) - var/obj/item/stack/material/phoron/G = new /obj/item/stack/material/phoron(loc) - G.amount = round(phoron_amount / G.perunit) - if(silver_amount >= 2000) - var/obj/item/stack/material/silver/G = new /obj/item/stack/material/silver(loc) - G.amount = round(silver_amount / G.perunit) - if(gold_amount >= 2000) - var/obj/item/stack/material/gold/G = new /obj/item/stack/material/gold(loc) - G.amount = round(gold_amount / G.perunit) - if(uranium_amount >= 2000) - var/obj/item/stack/material/uranium/G = new /obj/item/stack/material/uranium(loc) - G.amount = round(uranium_amount / G.perunit) - if(diamond_amount >= 2000) - var/obj/item/stack/material/diamond/G = new /obj/item/stack/material/diamond(loc) - G.amount = round(diamond_amount / G.perunit) + for(var/f in materials) + if(materials[f] >= SHEET_MATERIAL_AMOUNT) + var/path = getMaterialType(f) + if(path) + var/obj/item/stack/S = new f(loc) + S.amount = round(materials[f] / SHEET_MATERIAL_AMOUNT) ..() /obj/machinery/r_n_d/protolathe/update_icon() if(panel_open) icon_state = "protolathe_t" + else if(busy) + icon_state = "protolathe_n" else icon_state = "protolathe" /obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(shocked) - shock(user, 50) + if(busy) + user << "\The [src] is busy. Please wait for completion of previous operation." + return 1 if(default_deconstruction_screwdriver(user, O)) if(linked_console) linked_console.linked_lathe = null @@ -108,68 +112,93 @@ Note: Must be placed west/left of and R&D console to function. if(panel_open) user << "You can't load \the [src] while it's opened." return 1 - if(disabled) - return if(!linked_console) user << "\The [src] must be linked to an R&D console first!" return 1 - if(busy) - user << "\The [src] is busy. Please wait for completion of previous operation." + if(!istype(O, /obj/item/stack/material)) + user << "You cannot insert this item into \the [src]!" return 1 if(stat) return 1 - if(istype(O,/obj/item/stack/material)) - var/obj/item/stack/material/S = O - if(TotalMaterials() + S.perunit > max_material_storage) - user << "\The [src]'s material bin is full. Please remove material before adding more." - return 1 - var/obj/item/stack/material/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)) + if(TotalMaterials() + SHEET_MATERIAL_AMOUNT > max_material_storage) + user << "\The [src]'s material bin is full. Please remove material before adding more." + return 1 - overlays += "protolathe_[stack.name]" - sleep(10) - overlays -= "protolathe_[stack.name]" - - icon_state = "protolathe" - busy = 1 - use_power(max(1000, (3750 * amount / 10))) - var/material/material = stack.get_material() - if(istype(material) && do_after(user, 16) && stack.use(amount)) - user << "You add [amount] sheets to \the [src]." - icon_state = "protolathe" - - var/amount_to_add = amount * material.stack_per_sheet - switch(material.name) - if(DEFAULT_WALL_MATERIAL) - m_amount += amount_to_add - if("glass") - g_amount += amount_to_add - if("gold") - gold_amount += amount_to_add - if("silver") - silver_amount += amount_to_add - if("phoron") - phoron_amount += amount_to_add - if("uranium") - uranium_amount += amount_to_add - if("diamond") - diamond_amount += amount_to_add - busy = 0 - updateUsrDialog() + var/obj/item/stack/material/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 + return + if(amount > stack.get_amount()) + amount = stack.get_amount() + if(max_material_storage - TotalMaterials() < (amount * SHEET_MATERIAL_AMOUNT)) //Can't overfill + amount = min(stack.get_amount(), round((max_material_storage - TotalMaterials()) / SHEET_MATERIAL_AMOUNT)) -//This is to stop these machines being hackable via clicking. -/obj/machinery/r_n_d/protolathe/attack_hand(mob/user as mob) - return \ No newline at end of file + var/stacktype = stack.type + var/t = getMaterialName(stacktype) + overlays += "protolathe_[t]" + spawn(10) + overlays -= "protolathe_[t]" + + busy = 1 + use_power(max(1000, (SHEET_MATERIAL_AMOUNT * amount / 10))) + if(t) + if(do_after(user, 16)) + if(stack.use(amount)) + user << "You add [amount] sheets to \the [src]." + materials[t] += amount * SHEET_MATERIAL_AMOUNT + busy = 0 + updateUsrDialog() + return + +/obj/machinery/r_n_d/protolathe/proc/addToQueue(var/datum/design/D) + queue += D + return + +/obj/machinery/r_n_d/protolathe/proc/removeFromQueue(var/index) + queue.Cut(index, index + 1) + return + +/obj/machinery/r_n_d/protolathe/proc/canBuild(var/datum/design/D) + for(var/M in D.materials) + if(materials[M] < D.materials[M]) + return 0 + for(var/C in D.chemicals) + if(!reagents.has_reagent(C, D.chemicals[C])) + return 0 + return 1 + +/obj/machinery/r_n_d/protolathe/proc/getLackingMaterials(var/datum/design/D) + var/ret = "" + for(var/M in D.materials) + if(materials[M] < D.materials[M]) + if(ret != "") + ret += ", " + ret += "[D.materials[M] - materials[M]] [M]" + for(var/C in D.chemicals) + if(!reagents.has_reagent(C, D.chemicals[C])) + if(ret != "") + ret += ", " + ret += C + return ret + +/obj/machinery/r_n_d/protolathe/proc/build(var/datum/design/D) + var/power = active_power_usage + for(var/M in D.materials) + power += round(D.materials[M] / 5) + power = max(active_power_usage, power) + use_power(power) + for(var/M in D.materials) + materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency) + for(var/C in D.chemicals) + reagents.remove_reagent(C, D.chemicals[C] * mat_efficiency) + + if(D.build_path) + var/obj/new_item = D.Fabricate(src, src) + new_item.loc = loc + if(mat_efficiency != 1) // No matter out of nowhere + if(new_item.matter && new_item.matter.len > 0) + for(var/i in new_item.matter) + new_item.matter[i] = new_item.matter[i] * mat_efficiency diff --git a/code/modules/research/rd-readme.dm b/code/modules/research/rd-readme.dm index 92e2c5b28ec..0f983951451 100644 --- a/code/modules/research/rd-readme.dm +++ b/code/modules/research/rd-readme.dm @@ -3,7 +3,7 @@ Research and Development System. (Designed specifically for the /tg/station 13 ( ///////////////Overview/////////////////// This system is a "tech tree" research and development system designed for SS13. It allows a "researcher" job (this document assumes -the "scientist" job is given this role) the tools necessiary to research new and better technologies. In general, the system works +the "scientist" job is given this role) the tools necessary to research new and better technologies. In general, the system works by breaking existing technology and using what you learn from to advance your knowledge of SCIENCE! As your knowledge progresses, you can build newer (and better?) devices (which you can also, eventually, deconstruct to advance your knowledge). @@ -29,211 +29,4 @@ Each tech path should have at LEAST one item at every level (levels 1 - 20). Thi researching. Existing tech (ie, anything you can find on the station or get from the quartermaster) shouldn't go higher then level 5 or 7. Everything past that should be stuff you research. -Below is a checklist to make sure every tree is filled. As new items get added to R&D, add them here if there is an empty slot. -When thinking about new stuff, check here to see if there are any slots unfilled. - -//MATERIALS -1 | Metal -2 | Solid Phoron -3 | Silver -4 | Gold, Super Capacitor -5 | Uranium, Nuclear Gun, SUPERPACMAN -6 | Diamond, MRSPACMAN -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - -//PHORON TECH -1 | -2 | Solid Phoron -3 | Pacman Generator -4 | -5 | -6 | -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - -//POWER TECH -1 | Basic Capacitor, Basic Cell -2 | High-Capacity Cell (10,000) -3 | Super-Capacity Cell (20,000), Powersink, PACMAN -4 | SUPERPACMAN -5 | MRSPACMAN, Super Capacitor -6 | Hyper-Capacity Cell (30,000) -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - -//BLUE SPACE -1 | -2 | Teleporter Console Board -3 | Teleport Gun, Hand Tele -4 | Teleportation Scroll -5 | -6 | -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - -//BIOTECH -1 | Bruise Pack, Scalpel -2 | PANDEMIC Board, Mass Spectrometer -3 | AI Core, Brains (MMI) -4 | MMI+Radio -5 | -6 | -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - -//MAGNETS -1 | Basic Sensor -2 | Comm Console Board -3 | Adv Sensor -4 | Adv Mass Spectrometer, Chameleon Projector -5 | Phasic Sensor -6 | -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - -//PROGRAMMING -1 | Arcade Board -2 | Sec Camera -3 | Cloning Machine Console Board -4 | AI Core, Intellicard -5 | Pico-Manipulator, Ultra-Micro-Laser -6 | -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - -//SYNDICATE -1 | Sleepypen -2 | TYRANT Module, Emag -3 | Cloaking Device, Power Sink -4 | -5 | -6 | -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - -//COMBAT -1 | Flashbang, Mousetrap, Nettle -2 | Stun Baton -3 | Power Axe, Death Nettle, Nuclear Gun -4 | -5 | -6 | -7 | -8 | -9 | -10 | -11 | -12 | -13 | -14 | -15 | -16 | -17 | -18 | -19 | -20 | - - - - - - - */ \ No newline at end of file diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 1243e8516a1..cf25b891b54 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -29,7 +29,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole name = "R&D control console" - icon_state = "rdcomp" + icon_keyboard = "rd_key" + icon_screen = "rdcomp" light_color = "#a97faa" circuit = /obj/item/weapon/circuitboard/rdconsole var/datum/research/files //Stores all the collected research data. @@ -43,7 +44,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/screen = 1.0 //Which screen is currently showing. var/id = 0 //ID of the computer (for server restrictions). var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console - var/errored = 0 //Errored during item construction. req_access = list(access_research) //Data and setting manipulation requires scientist access. @@ -58,43 +58,43 @@ won't update every console in existence) but it's more of a hassle to do. Also, qdel(check_tech) check_tech = null break - return return_name /obj/machinery/computer/rdconsole/proc/CallMaterialName(var/ID) + var/return_name = ID + switch(return_name) + if("metal") + return_name = "Metal" + if("glass") + return_name = "Glass" + if("gold") + return_name = "Gold" + if("silver") + return_name = "Silver" + if("phoron") + return_name = "Solid Phoron" + if("uranium") + return_name = "Uranium" + if("diamond") + return_name = "Diamond" + return return_name + +/obj/machinery/computer/rdconsole/proc/CallReagentName(var/ID) + var/return_name = ID var/datum/reagent/temp_reagent - var/return_name = null - if (copytext(ID, 1, 2) == "$") - return_name = copytext(ID, 2) - switch(return_name) - if(DEFAULT_WALL_MATERIAL) - return_name = "Steel" - if("glass") - return_name = "Glass" - if("gold") - return_name = "Gold" - if("silver") - return_name = "Silver" - if("phoron") - return_name = "Solid Phoron" - if("uranium") - return_name = "Uranium" - if("diamond") - return_name = "Diamond" - else - for(var/R in typesof(/datum/reagent) - /datum/reagent) + for(var/R in (typesof(/datum/reagent) - /datum/reagent)) + temp_reagent = null + temp_reagent = new R() + if(temp_reagent.id == ID) + return_name = temp_reagent.name + qdel(temp_reagent) temp_reagent = null - temp_reagent = new R() - if(temp_reagent.id == ID) - return_name = temp_reagent.name - qdel(temp_reagent) - temp_reagent = null - break + break return return_name /obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any). - for(var/obj/machinery/r_n_d/D in oview(3,src)) - if(D.linked_console != null || D.disabled || D.panel_open) + for(var/obj/machinery/r_n_d/D in range(3, src)) + if(D.linked_console != null || D.panel_open) continue if(istype(D, /obj/machinery/r_n_d/destructive_analyzer)) if(linked_destroy == null) @@ -110,8 +110,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, D.linked_console = src return -//Have it automatically push research to the centcomm server so wild griffins can't fuck up R&D's work --NEO -/obj/machinery/computer/rdconsole/proc/griefProtection() +/obj/machinery/computer/rdconsole/proc/griefProtection() //Have it automatically push research to the centcomm server so wild griffins can't fuck up R&D's work for(var/obj/machinery/r_n_d/server/centcom/C in machines) for(var/datum/tech/T in files.known_tech) C.files.AddTech2Known(T) @@ -130,11 +129,6 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/initialize() SyncRDevices() -/* Instead of calling this every tick, it is only being called when needed -/obj/machinery/computer/rdconsole/process() - griefProtection() -*/ - /obj/machinery/computer/rdconsole/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) //Loading a disk into it. if(istype(D, /obj/item/weapon/disk)) @@ -142,18 +136,16 @@ won't update every console in existence) but it's more of a hassle to do. Also, user << "A disk is already loaded into the machine." return - if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D - else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D + if(istype(D, /obj/item/weapon/disk/tech_disk)) + t_disk = D + else if (istype(D, /obj/item/weapon/disk/design_disk)) + d_disk = D else - user << "\red Machine cannot accept disks in that format." + user << "Machine cannot accept disks in that format." return user.drop_item() D.loc = src - user << "\blue You add the disk to the machine!" - 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" + user << "You add \the [D] to the machine." else //The construction/deconstruction of the console code. ..() @@ -161,6 +153,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, src.updateUsrDialog() return +/obj/machinery/computer/rdconsole/emp_act(var/remaining_charges, var/mob/user) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols." + return 1 + /obj/machinery/computer/rdconsole/Topic(href, href_list) if(..()) return 1 @@ -170,17 +169,11 @@ won't update every console in existence) but it's more of a hassle to do. Also, usr.set_machine(src) if(href_list["menu"]) //Switches menu screens. Converts a sent text string into a number. Saves a LOT of code. var/temp_screen = text2num(href_list["menu"]) - if(temp_screen <= 1.1 || (3 <= temp_screen && 4.9 >= temp_screen) || src.allowed(usr) || emagged) //Unless you are making something, you need access. + if(temp_screen <= 1.1 || (3 <= temp_screen && 4.9 >= temp_screen) || allowed(usr) || emagged) //Unless you are making something, you need access. screen = temp_screen else usr << "Unauthorized Access." - else if(href_list["reset"]) - warning("RnD console has errored during protolathe operation. Resetting.") - errored = 0 - screen = 1.0 - updateUsrDialog() - else if(href_list["updt_tech"]) //Update the research holder with information from the technology disk. screen = 0.0 spawn(50) @@ -193,7 +186,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, t_disk.stored = null else if(href_list["eject_tech"]) //Eject the technology disk. - t_disk:loc = src.loc + t_disk.loc = loc t_disk = null screen = 1.0 @@ -216,7 +209,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, d_disk.blueprint = null else if(href_list["eject_design"]) //Eject the design disk. - d_disk:loc = src.loc + d_disk.loc = loc d_disk = null screen = 1.0 @@ -230,7 +223,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["eject_item"]) //Eject the item inside the destructive analyzer. if(linked_destroy) if(linked_destroy.busy) - usr << "\red The destructive analyzer is busy at the moment." + usr << "The destructive analyzer is busy at the moment." else if(linked_destroy.loaded_item) linked_destroy.loaded_item.loc = linked_destroy.loc @@ -241,9 +234,10 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder. if(linked_destroy) if(linked_destroy.busy) - usr << "\red The destructive analyzer is busy at the moment." + usr << "The destructive analyzer is busy at the moment." else - if(alert("Proceeding will destroy loaded item. Continue?", "Destructive analyzer confirmation", "Yes", "No") == "No" || !linked_destroy) return + if(alert("Proceeding will destroy loaded item. Continue?", "Destructive analyzer confirmation", "Yes", "No") == "No" || !linked_destroy) + return linked_destroy.busy = 1 screen = 0.1 updateUsrDialog() @@ -251,21 +245,19 @@ won't update every console in existence) but it's more of a hassle to do. Also, spawn(24) if(linked_destroy) linked_destroy.busy = 0 - if(!linked_destroy.hacked) - if(!linked_destroy.loaded_item) - usr <<"\red The destructive analyzer appears to be empty." - screen = 1.0 - return - if(linked_destroy.loaded_item.reliability >= linked_destroy.min_reliability) - 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) - files.UpdateDesign(linked_destroy.loaded_item.type) - if(linked_lathe && linked_destroy.loaded_item.matter) //Also sends salvaged materials to a linked protolathe, if any. - linked_lathe.m_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.matter[DEFAULT_WALL_MATERIAL]*linked_destroy.decon_mod)) - linked_lathe.g_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.matter["glass"]*linked_destroy.decon_mod)) - linked_destroy.loaded_item = null + if(!linked_destroy.loaded_item) + usr <<"The destructive analyzer appears to be empty." + screen = 1.0 + return + + for(var/T in linked_destroy.loaded_item.origin_tech) + files.UpdateTech(T, linked_destroy.loaded_item.origin_tech[T]) + if(linked_lathe && linked_destroy.loaded_item.matter) // Also sends salvaged materials to a linked protolathe, if any. + for(var/t in linked_destroy.loaded_item.matter) + if(t in linked_lathe.materials) + linked_lathe.materials[t] += min(linked_lathe.max_material_storage - linked_lathe.TotalMaterials(), linked_destroy.loaded_item.matter[t] * linked_destroy.decon_mod) + + linked_destroy.loaded_item = null for(var/obj/I in linked_destroy.contents) for(var/mob/M in I.contents) M.death() @@ -281,12 +273,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(!(I in linked_destroy.component_parts)) qdel(I) linked_destroy.icon_state = "d_analyzer" + use_power(linked_destroy.active_power_usage) screen = 1.0 updateUsrDialog() else if(href_list["lock"]) //Lock the console from use by anyone without tox access. - if(src.allowed(usr)) + if(allowed(usr)) screen = text2num(href_list["lock"]) else usr << "Unauthorized Access." @@ -294,15 +287,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected. screen = 0.0 if(!sync) - usr << "\red You must connect to the network first!" + usr << "You must connect to the network first." else griefProtection() //Putting this here because I dont trust the sync process spawn(30) if(src) for(var/obj/machinery/r_n_d/server/S in machines) var/server_processed = 0 - if(S.disabled) - continue if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) for(var/datum/tech/T in files.known_tech) S.files.AddTech2Known(T) @@ -310,7 +301,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, S.files.AddDesign2Known(D) S.files.RefreshResearch() server_processed = 1 - if(((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) || S.hacked) + if((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) for(var/datum/tech/T in S.files.known_tech) files.AddTech2Known(T) for(var/datum/design/D in S.files.known_designs) @@ -333,58 +324,10 @@ won't update every console in existence) but it's more of a hassle to do. Also, being_built = D break if(being_built) - var/power = linked_lathe.active_power_usage - for(var/M in being_built.materials) - power += round(being_built.materials[M] / 5) - power = max(linked_lathe.active_power_usage, power) - screen = 0.3 - linked_lathe.busy = 1 - flick("protolathe_n",linked_lathe) - var/key = usr.key //so we don't lose the info during the spawn delay - spawn(16) - use_power(power) - spawn(16) - errored = 1 - for(var/M in being_built.materials) - switch(M) - if("$metal") - linked_lathe.m_amount = max(0, (linked_lathe.m_amount-being_built.materials[M]*linked_lathe.mat_efficiency)) - if("$glass") - linked_lathe.g_amount = max(0, (linked_lathe.g_amount-being_built.materials[M]*linked_lathe.mat_efficiency)) - if("$gold") - linked_lathe.gold_amount = max(0, (linked_lathe.gold_amount-being_built.materials[M]*linked_lathe.mat_efficiency)) - if("$silver") - linked_lathe.silver_amount = max(0, (linked_lathe.silver_amount-being_built.materials[M]*linked_lathe.mat_efficiency)) - if("$phoron") - linked_lathe.phoron_amount = max(0, (linked_lathe.phoron_amount-being_built.materials[M]*linked_lathe.mat_efficiency)) - if("$uranium") - linked_lathe.uranium_amount = max(0, (linked_lathe.uranium_amount-being_built.materials[M]*linked_lathe.mat_efficiency)) - if("$diamond") - linked_lathe.diamond_amount = max(0, (linked_lathe.diamond_amount-being_built.materials[M]*linked_lathe.mat_efficiency)) - else - linked_lathe.reagents.remove_reagent(M, being_built.materials[M]*linked_lathe.mat_efficiency) + linked_lathe.addToQueue(being_built) - if(being_built.build_path) - var/obj/new_item = new being_built.build_path(src) - if( new_item.type == /obj/item/weapon/storage/backpack/holding ) - new_item.investigate_log("built by [key]","singulo") - new_item.reliability = being_built.reliability - if(linked_lathe.hacked) being_built.reliability = max((reliability / 2), 0) - /*if(being_built.locked) - var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc) - new_item.loc = L - L.name += " ([new_item.name])"*/ - else - new_item.loc = linked_lathe.loc - if(linked_lathe.mat_efficiency != 1) // No matter out of nowhere - if(new_item.matter && new_item.matter.len > 0) - for(var/i in new_item.matter) - new_item.matter[i] = new_item.matter[i] * linked_lathe.mat_efficiency - linked_lathe.busy = 0 - screen = 3.1 - errored = 0 - new_item.Created() - updateUsrDialog() + screen = 3.1 + updateUsrDialog() else if(href_list["imprint"]) //Causes the Circuit Imprinter to build something. if(linked_imprinter) @@ -394,36 +337,9 @@ won't update every console in existence) but it's more of a hassle to do. Also, being_built = D break if(being_built) - var/power = linked_imprinter.active_power_usage - for(var/M in being_built.materials) - power += round(being_built.materials[M] / 5) - power = max(linked_imprinter.active_power_usage, power) - screen = 0.4 - linked_imprinter.busy = 1 - flick("circuit_imprinter_ani",linked_imprinter) - spawn(16) - errored = 1 - use_power(power) - for(var/M in being_built.materials) - switch(M) - if("$glass") - linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M]*linked_imprinter.mat_efficiency)) - if("$gold") - linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]*linked_imprinter.mat_efficiency)) - if("$diamond") - linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]*linked_imprinter.mat_efficiency)) - if("$uranium") - linked_imprinter.uranium_amount = max(0, (linked_imprinter.uranium_amount-being_built.materials[M]*linked_imprinter.mat_efficiency)) - else - linked_imprinter.reagents.remove_reagent(M, being_built.materials[M]*linked_imprinter.mat_efficiency) - var/obj/new_item = new being_built.build_path(src) - new_item.reliability = being_built.reliability - if(linked_imprinter.hacked) being_built.reliability = max((reliability / 2), 0) - new_item.loc = linked_imprinter.loc - linked_imprinter.busy = 0 - screen = 4.1 - errored = 0 - updateUsrDialog() + linked_imprinter.addToQueue(being_built) + screen = 4.1 + updateUsrDialog() else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it) linked_imprinter.reagents.del_reagent(href_list["dispose"]) @@ -431,70 +347,45 @@ won't update every console in existence) but it's more of a hassle to do. Also, else if(href_list["disposeallI"] && linked_imprinter) //Causes the circuit imprinter to dispose of all it's reagents. linked_imprinter.reagents.clear_reagents() + else if(href_list["removeI"] && linked_lathe) + linked_imprinter.removeFromQueue(text2num(href_list["removeI"])) + else if(href_list["disposeP"] && linked_lathe) //Causes the protolathe to dispose of a single reagent (all of it) linked_lathe.reagents.del_reagent(href_list["dispose"]) else if(href_list["disposeallP"] && linked_lathe) //Causes the protolathe to dispose of all it's reagents. linked_lathe.reagents.clear_reagents() - else if(href_list["lathe_ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material - var/desired_num_sheets = text2num(href_list["amount"]) - var/res_amount, type - var/material/M = get_material_by_name(href_list["lathe_ejectsheet"]) - if(istype(M)) - type = M.stack_type - switch(M.name) - if(DEFAULT_WALL_MATERIAL) - res_amount = "m_amount" - if("glass") - res_amount = "g_amount" - if("gold") - res_amount = "gold_amount" - if("silver") - res_amount = "silver_amount" - if("phoron") - res_amount = "phoron_amount" - if("uranium") - res_amount = "uranium_amount" - if("diamond") - res_amount = "diamond_amount" + else if(href_list["removeP"] && linked_lathe) + linked_lathe.removeFromQueue(text2num(href_list["removeP"])) + + else if(href_list["lathe_ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material + var/num_sheets = min(text2num(href_list["amount"]), round(linked_lathe.materials[href_list["lathe_ejectsheet"]] / SHEET_MATERIAL_AMOUNT)) + + if(num_sheets < 1) + return + + var/mattype = linked_lathe.getMaterialType(href_list["lathe_ejectsheet"]) + + var/obj/item/stack/material/M = new mattype(linked_lathe.loc) + M.amount = num_sheets + linked_lathe.materials[href_list["lathe_ejectsheet"]] -= num_sheets * SHEET_MATERIAL_AMOUNT - if(ispath(type) && hasvar(linked_lathe, res_amount)) - var/obj/item/stack/material/sheet = new type(linked_lathe.loc) - var/available_num_sheets = round(linked_lathe.vars[res_amount]/sheet.perunit) - if(available_num_sheets>0) - 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 - 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 - switch(href_list["imprinter_ejectsheet"]) - if("glass") - type = /obj/item/stack/material/glass - res_amount = "g_amount" - if("gold") - type = /obj/item/stack/material/gold - res_amount = "gold_amount" - if("diamond") - type = /obj/item/stack/material/diamond - res_amount = "diamond_amount" - if("uranium") - type = /obj/item/stack/material/uranium - res_amount = "uranium_amount" - if(ispath(type) && hasvar(linked_imprinter, res_amount)) - var/obj/item/stack/material/sheet = new type(linked_imprinter.loc) - var/available_num_sheets = round(linked_imprinter.vars[res_amount]/sheet.perunit) - if(available_num_sheets>0) - 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 - qdel(sheet) + var/num_sheets = min(text2num(href_list["amount"]), round(linked_imprinter.materials[href_list["imprinter_ejectsheet"]] / SHEET_MATERIAL_AMOUNT)) + + if(num_sheets < 1) + return + + var/mattype = linked_imprinter.getMaterialType(href_list["imprinter_ejectsheet"]) + + var/obj/item/stack/material/M = new mattype(linked_imprinter.loc) + M.amount = num_sheets + linked_imprinter.materials[href_list["imprinter_ejectsheet"]] -= num_sheets * SHEET_MATERIAL_AMOUNT else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with. screen = 0.0 - spawn(20) + spawn(10) SyncRDevices() screen = 1.7 updateUsrDialog() @@ -548,6 +439,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/dat dat += "
        " for(var/datum/tech/T in files.known_tech) + if(T.level < 1) + continue dat += "
      • " dat += "[T.name]" dat += "
          " @@ -587,17 +480,14 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(linked_imprinter == null) screen = 4.0 - if(errored) - dat += "An error has occured when constructing prototype. Try refreshing the console." - dat += "
          If problem persists submit bug report stating which item you tried to build." - dat += "
          RESET CONSOLE

          " - switch(screen) //////////////////////R&D CONSOLE SCREENS////////////////// - if(0.0) dat += "Updating Database...." + if(0.0) + dat += "Updating Database..." - if(0.1) dat += "Processing and Updating Database..." + if(0.1) + dat += "Processing and Updating Database..." if(0.2) dat += "SYSTEM LOCKED

          " @@ -676,11 +566,9 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Load Design to Disk || " else dat += "Name: [d_disk.blueprint.name]
          " - dat += "Level: [between(0, (d_disk.blueprint.reliability + rand(-15,15)), 100)]
          " switch(d_disk.blueprint.build_type) if(IMPRINTER) dat += "Lathe Type: Circuit Imprinter
          " if(PROTOLATHE) dat += "Lathe Type: Proto-lathe
          " - if(AUTOLATHE) dat += "Lathe Type: Auto-lathe
          " dat += "Required Materials:
          " for(var/M in d_disk.blueprint.materials) if(copytext(M, 1, 2) == "$") dat += "* [copytext(M, 2)] x [d_disk.blueprint.materials[M]]
          " @@ -751,9 +639,8 @@ 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 = ConvertReqString2List(linked_destroy.loaded_item.origin_tech) - for(var/T in temp_tech) - dat += "
          • [CallTechName(T)] [temp_tech[T]]" + for(var/T in linked_destroy.loaded_item.origin_tech) + dat += "
          • [CallTechName(T)] [linked_destroy.loaded_item.origin_tech[T]]" for(var/datum/tech/F in files.known_tech) if(F.name == CallTechName(T)) dat += " (Current: [F.level])" @@ -769,6 +656,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(3.1) dat += "Main Menu || " + dat += "View Queue || " dat += "Material Storage || " dat += "Chemical Storage
            " dat += "Protolathe Menu:

            " @@ -779,35 +667,16 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(!D.build_path || !(D.build_type & PROTOLATHE)) continue var/temp_dat - var/check_materials = 1 for(var/M in D.materials) - temp_dat += ", [D.materials[M]*linked_lathe.mat_efficiency] [CallMaterialName(M)]" - if(copytext(M, 1, 2) == "$") - switch(M) - if("$glass") - if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.g_amount) check_materials = 0 - if("$metal") - if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.m_amount) check_materials = 0 - if("$gold") - if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.gold_amount) check_materials = 0 - if("$silver") - if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.silver_amount) check_materials = 0 - if("$phoron") - if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.phoron_amount) check_materials = 0 - if("$uranium") - if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.uranium_amount) check_materials = 0 - if("$diamond") - if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.diamond_amount) check_materials = 0 - else if (!linked_lathe.reagents.has_reagent(M, D.materials[M]*linked_lathe.mat_efficiency)) - check_materials = 0 + temp_dat += ", [D.materials[M]] [CallMaterialName(M)]" + for(var/T in D.chemicals) + temp_dat += ", [D.chemicals[T]*linked_imprinter.mat_efficiency] [CallReagentName(T)]" if(temp_dat) - temp_dat = " \[[copytext(temp_dat,3)]\]" - if(check_materials) + temp_dat = " \[[copytext(temp_dat, 3)]\]" + if(linked_lathe.canBuild(D)) dat += "
          • [D.name][temp_dat]" else dat += "
          • [D.name][temp_dat]" - if(D.reliability < 100) - dat += " (Reliability: [D.reliability])" dat += "
          " if(3.2) //Protolathe Material Storage Sub-menu @@ -815,33 +684,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Protolathe Menu
          " dat += "Material Storage

          " dat += "
            " - for(var/M in list(DEFAULT_WALL_MATERIAL, "glass", "gold", "silver", "phoron", "uranium", "diamond")) - var/amount - var/sheetsize = 2000 - switch(M) - if(DEFAULT_WALL_MATERIAL) - amount = linked_lathe.m_amount - sheetsize = 3750 - if("glass") - amount = linked_lathe.g_amount - sheetsize = 3750 - if("gold") - amount = linked_lathe.gold_amount - if("silver") - amount = linked_lathe.silver_amount - if("phoron") - amount = linked_lathe.phoron_amount - if("uranium") - amount = linked_lathe.uranium_amount - if("diamond") - amount = linked_lathe.diamond_amount - else - continue + for(var/M in linked_lathe.materials) + var/amount = linked_lathe.materials[M] dat += "
          • [capitalize(M)]: [amount] cm3" - if(amount >= sheetsize) + if(amount >= SHEET_MATERIAL_AMOUNT) dat += " || Eject " - for (var/C in list(1,3,5,10,15,20,25,30,40)) - if(amount < C * sheetsize) + for (var/C in list(1, 3, 5, 10, 15, 20, 25, 30, 40)) + if(amount < C * SHEET_MATERIAL_AMOUNT) break dat += "[C > 1 ? ", " : ""][C] " @@ -858,6 +707,24 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "(Purge)
            " dat += "Disposal All Chemicals in Storage
            " + if(3.4) // Protolathe queue + dat += "Main Menu || " + dat += "Protolathe Menu
            " + dat += "Queue

            " + if(!linked_lathe.queue.len) + dat += "Empty" + else + var/tmp = 1 + for(var/datum/design/D in linked_lathe.queue) + if(tmp == 1) + if(linked_lathe.busy) + dat += "1: [D.name]
            " + else + dat += "1: [D.name] (Awaiting materials) (Remove)
            " + else + dat += "[tmp]: [D.name] (Remove)
            " + ++tmp + ///////////////////CIRCUIT IMPRINTER SCREENS//////////////////// if(4.0) dat += "Main Menu
            " @@ -865,6 +732,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(4.1) dat += "Main Menu || " + dat += "View Queue || " dat += "Material Storage || " dat += "Chemical Storage
            " dat += "Circuit Imprinter Menu:

            " @@ -875,29 +743,16 @@ won't update every console in existence) but it's more of a hassle to do. Also, if(!D.build_path || !(D.build_type & IMPRINTER)) continue var/temp_dat - var/check_materials = 1 for(var/M in D.materials) temp_dat += ", [D.materials[M]*linked_imprinter.mat_efficiency] [CallMaterialName(M)]" - if(copytext(M, 1, 2) == "$") - switch(M) - if("$glass") - if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.g_amount) check_materials = 0 - if("$gold") - if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.gold_amount) check_materials = 0 - if("$diamond") - if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.diamond_amount) check_materials = 0 - if("$uranium") - if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.uranium_amount) check_materials = 0 - else if (!linked_imprinter.reagents.has_reagent(M, D.materials[M]*linked_imprinter.mat_efficiency)) - check_materials = 0 + for(var/T in D.chemicals) + temp_dat += ", [D.chemicals[T]*linked_imprinter.mat_efficiency] [CallReagentName(T)]" if(temp_dat) temp_dat = " \[[copytext(temp_dat,3)]\]" - if (check_materials) + if(linked_imprinter.canBuild(D)) dat += "
          • [D.name][temp_dat]" else dat += "
          • [D.name][temp_dat]" - if(D.reliability < 100) - dat += " (Reliability: [D.reliability])" dat += "
          " if(4.2) @@ -914,24 +769,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "Circuit Imprinter Menu
          " dat += "Material Storage

          " dat += "
            " - for(var/M in list("glass", "gold", "diamond", "uranium")) - var/amount - var/sheetsize = 2000 - switch(M) - if("glass") - amount = linked_imprinter.g_amount - sheetsize = 3750 - if("gold") - amount = linked_imprinter.gold_amount - if("diamond") - amount = linked_imprinter.diamond_amount - if("uranium") - amount = linked_imprinter.uranium_amount + for(var/M in linked_imprinter.materials) + var/amount = linked_imprinter.materials[M] dat += "
          • [capitalize(M)]: [amount] cm3" - if(amount >= sheetsize) + if(amount >= SHEET_MATERIAL_AMOUNT) dat += " || Eject: " - for (var/C in list(1,3,5,10,15,20,25,30,40)) - if(amount < C * sheetsize) + for (var/C in list(1, 3, 5, 10, 15, 20, 25, 30, 40)) + if(amount < C * SHEET_MATERIAL_AMOUNT) break dat += "[C > 1 ? ", " : ""][C] " @@ -939,6 +783,21 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "" dat += "
          " + if(4.4) + dat += "Main Menu || " + dat += "Circuit Imprinter Menu
          " + dat += "Queue

          " + if(linked_imprinter.queue.len == 0) + dat += "Empty" + else + var/tmp = 1 + for(var/datum/design/D in linked_imprinter.queue) + if(tmp == 1) + dat += "1: [D.name]
          " + else + dat += "[tmp]: [D.name] (Remove)
          " + ++tmp + ///////////////////Research Information Browser//////////////////// if(5.0) dat += "Main Menu || " diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 4f0b81e5315..031c82a9584 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -2,7 +2,6 @@ //All devices that link into the R&D console fall into thise type for easy identification and some shared procs. - /obj/machinery/r_n_d name = "R&D Device" icon = 'icons/obj/machines/research.dmi' @@ -10,83 +9,42 @@ anchored = 1 use_power = 1 var/busy = 0 - var/hacked = 0 - var/disabled = 0 - var/shocked = 0 - var/list/wires = list() - var/hack_wire - var/disable_wire - var/shock_wire var/obj/machinery/computer/rdconsole/linked_console -/obj/machinery/r_n_d/New() - ..() - wires["Red"] = 0 - wires["Blue"] = 0 - wires["Green"] = 0 - wires["Yellow"] = 0 - wires["Black"] = 0 - wires["White"] = 0 - var/list/w = list("Red","Blue","Green","Yellow","Black","White") - src.hack_wire = pick(w) - w -= src.hack_wire - src.shock_wire = pick(w) - w -= src.shock_wire - src.disable_wire = pick(w) - w -= src.disable_wire - /obj/machinery/r_n_d/attack_hand(mob/user as mob) - if (shocked) - shock(user,50) - if(panel_open) - var/dat as text - dat += "[src.name] Wires:
          " - for(var/wire in src.wires) - dat += text("[wire] Wire: [src.wires[wire] ? "Mend" : "Cut"] Pulse
          ") - - dat += text("The red light is [src.disabled ? "off" : "on"].
          ") - dat += text("The green light is [src.shocked ? "off" : "on"].
          ") - dat += text("The blue light is [src.hacked ? "off" : "on"].
          ") - user << browse("[src.name] Hacking[dat]","window=hack_win") return +/obj/machinery/r_n_d/proc/getMaterialType(var/name) + switch(name) + if(DEFAULT_WALL_MATERIAL) + return /obj/item/stack/material/steel + if("glass") + return /obj/item/stack/material/glass + if("gold") + return /obj/item/stack/material/gold + if("silver") + return /obj/item/stack/material/silver + if("phoron") + return /obj/item/stack/material/phoron + if("uranium") + return /obj/item/stack/material/uranium + if("diamond") + return /obj/item/stack/material/diamond + return null -/obj/machinery/r_n_d/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - if(href_list["pulse"]) - var/temp_wire = href_list["wire"] - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - else - if(src.wires[temp_wire]) - usr << "You can't pulse a cut wire." - else - if(src.hack_wire == href_list["wire"]) - src.hacked = !src.hacked - spawn(100) src.hacked = !src.hacked - if(src.disable_wire == href_list["wire"]) - src.disabled = !src.disabled - src.shock(usr,50) - spawn(100) src.disabled = !src.disabled - if(src.shock_wire == href_list["wire"]) - src.shocked = !src.shocked - src.shock(usr,50) - spawn(100) src.shocked = !src.shocked - if(href_list["cut"]) - if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) - usr << "You need wirecutters!" - else - var/temp_wire = href_list["wire"] - wires[temp_wire] = !wires[temp_wire] - if(src.hack_wire == temp_wire) - src.hacked = !src.hacked - if(src.disable_wire == temp_wire) - src.disabled = !src.disabled - src.shock(usr,50) - if(src.shock_wire == temp_wire) - src.shocked = !src.shocked - src.shock(usr,50) - src.updateUsrDialog() +/obj/machinery/r_n_d/proc/getMaterialName(var/type) + switch(type) + if(/obj/item/stack/material/steel) + return DEFAULT_WALL_MATERIAL + if(/obj/item/stack/material/glass) + return "glass" + if(/obj/item/stack/material/gold) + return "gold" + if(/obj/item/stack/material/silver) + return "silver" + if(/obj/item/stack/material/phoron) + return "phoron" + if(/obj/item/stack/material/uranium) + return "uranium" + if(/obj/item/stack/material/diamond) + return "diamond" \ No newline at end of file diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index a397728b733..8dc8a12263f 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -45,16 +45,13 @@ research holder datum. ***************************************************************/ /datum/research //Holder for all the existing, archived, and known tech. Individual to console. - - //Datum/tech go here. - var/list/possible_tech = list() //List of all tech in the game that players have access to (barring special events). - var/list/known_tech = list() //List of locally known tech. - var/list/possible_designs = list() //List of all designs (at base reliability). - var/list/known_designs = list() //List of available designs (at base reliability). + var/list/known_tech = list() //List of locally known tech. Datum/tech go here. + var/list/possible_designs = list() //List of all designs. + var/list/known_designs = list() //List of available designs. /datum/research/New() //Insert techs into possible_tech here. Known_tech automatically updated. for(var/T in typesof(/datum/tech) - /datum/tech) - possible_tech += new T(src) + known_tech += new T(src) for(var/D in typesof(/datum/design) - /datum/design) possible_designs += new D(src) RefreshResearch() @@ -63,59 +60,26 @@ research holder datum. /datum/research/techonly/New() for(var/T in typesof(/datum/tech) - /datum/tech) - possible_tech += new T(src) + known_tech += new T(src) RefreshResearch() - -//Checks to see if tech has all the required pre-reqs. -//Input: datum/tech; Output: 0/1 (false/true) -/datum/research/proc/TechHasReqs(var/datum/tech/T) - if(T.req_tech.len == 0) - return 1 - var/matches = 0 - for(var/req in T.req_tech) - for(var/datum/tech/known in known_tech) - if((req == known.id) && (known.level >= T.req_tech[req])) - matches++ - break - if(matches == T.req_tech.len) - return 1 - else - return 0 - //Checks to see if design has all the required pre-reqs. //Input: datum/design; Output: 0/1 (false/true) /datum/research/proc/DesignHasReqs(var/datum/design/D) if(D.req_tech.len == 0) return 1 - var/matches = 0 + var/list/k_tech = list() + for(var/datum/tech/known in known_tech) k_tech[known.id] = known.level + for(var/req in D.req_tech) - if(!isnull(k_tech[req]) && k_tech[req] >= D.req_tech[req]) - matches++ - if(matches == D.req_tech.len) - return 1 - else - return 0 -/* -//Checks to see if design has all the required pre-reqs. -//Input: datum/design; Output: 0/1 (false/true) -/datum/research/proc/DesignHasReqs(var/datum/design/D) - if(D.req_tech.len == 0) - return 1 - var/matches = 0 - for(var/req in D.req_tech) - for(var/datum/tech/known in known_tech) - if((req == known.id) && (known.level >= D.req_tech[req])) - matches++ - break - if(matches == D.req_tech.len) - return 1 - else - return 0 -*/ + if(isnull(k_tech[req]) || k_tech[req] < D.req_tech[req]) + return 0 + + return 1 + //Adds a tech to known_tech list. Checks to make sure there aren't duplicates and updates existing tech's levels if needed. //Input: datum/tech; Output: Null /datum/research/proc/AddTech2Known(var/datum/tech/T) @@ -124,143 +88,107 @@ research holder datum. if(T.level > known.level) known.level = T.level return - known_tech += T return /datum/research/proc/AddDesign2Known(var/datum/design/D) - for(var/datum/design/known in known_designs) - if(D.id == known.id) - if(D.reliability_mod > known.reliability_mod) - known.reliability_mod = D.reliability_mod + if(!known_designs.len) // Special case + known_designs.Add(D) + return + for(var/i = 1 to known_designs.len) + var/datum/design/A = known_designs[i] + if(A.id == D.id) // We are guaranteed to reach this if the ids are the same, because sort_string will also be the same return - known_designs += D + if(A.sort_string > D.sort_string) + known_designs.Insert(i, D) + return + known_designs.Add(D) return -//Refreshes known_tech and known_designs list. Then updates the reliability vars of the designs in the known_designs list. +//Refreshes known_tech and known_designs list //Input/Output: n/a /datum/research/proc/RefreshResearch() - for(var/datum/tech/PT in possible_tech) - if(TechHasReqs(PT)) - AddTech2Known(PT) for(var/datum/design/PD in possible_designs) if(DesignHasReqs(PD)) AddDesign2Known(PD) for(var/datum/tech/T in known_tech) - T = between(1,T.level,20) - for(var/datum/design/D in known_designs) - D.CalcReliability(known_tech) + T = between(0, T.level, 20) return //Refreshes the levels of a given tech. //Input: Tech's ID and Level; Output: null /datum/research/proc/UpdateTech(var/ID, var/level) for(var/datum/tech/KT in known_tech) - if(KT.id == ID) - if(KT.level <= level) KT.level = max((KT.level + 1), (level - 1)) + if(KT.id == ID && KT.level <= level) + KT.level = max(KT.level + 1, level - 1) return -/datum/research/proc/UpdateDesign(var/path) - for(var/datum/design/KD in known_designs) - if(KD.build_path == path) - KD.reliability_mod += rand(1,2) - break - return - - - - /*************************************************************** ** Technology Datums ** ** Includes all the various technoliges and what they make. ** ***************************************************************/ -datum/tech //Datum of individual technologies. +/datum/tech //Datum of individual technologies. var/name = "name" //Name of the technology. var/desc = "description" //General description of what it does and what it makes. var/id = "id" //An easily referenced ID. Must be alphanumeric, lower-case, and no symbols. var/level = 1 //A simple number scale of the research level. Level 0 = Secret tech. - var/list/req_tech = list() //List of ids associated values of techs required to research this tech. "id" = # - -//Trunk Technologies (don't require any other techs and you start knowning them). - -datum/tech/materials +/datum/tech/materials name = "Materials Research" desc = "Development of new and improved materials." - id = "materials" + id = TECH_MATERIAL -datum/tech/engineering +/datum/tech/engineering name = "Engineering Research" desc = "Development of new and improved engineering parts." - id = "engineering" + id = TECH_ENGINEERING -datum/tech/phorontech +/datum/tech/phorontech name = "Phoron Research" desc = "Research into the mysterious substance colloqually known as 'phoron'." - id = "phorontech" + id = TECH_PHORON -datum/tech/powerstorage +/datum/tech/powerstorage name = "Power Manipulation Technology" desc = "The various technologies behind the storage and generation of electicity." - id = "powerstorage" + id = TECH_POWER -datum/tech/bluespace +/datum/tech/bluespace name = "'Blue-space' Research" desc = "Research into the sub-reality known as 'blue-space'" - id = "bluespace" + id = TECH_BLUESPACE -datum/tech/biotech +/datum/tech/biotech name = "Biological Technology" desc = "Research into the deeper mysteries of life and organic substances." - id = "biotech" + id = TECH_BIO -datum/tech/combat +/datum/tech/combat name = "Combat Systems Research" desc = "The development of offensive and defensive systems." - id = "combat" + id = TECH_COMBAT -datum/tech/magnets +/datum/tech/magnets name = "Electromagnetic Spectrum Research" desc = "Research into the electromagnetic spectrum. No clue how they actually work, though." - id = "magnets" + id = TECH_MAGNET -datum/tech/programming +/datum/tech/programming name = "Data Theory Research" desc = "The development of new computer and artificial intelligence and data storage systems." - id = "programming" + id = TECH_DATA -datum/tech/syndicate +/datum/tech/syndicate name = "Illegal Technologies Research" - desc = "The study of technologies that violate standard Nanotrasen regulations." - id = "syndicate" + desc = "The study of technologies that violate standard government regulations." + id = TECH_ILLEGAL + level = 0 -/* -datum/tech/arcane +/datum/tech/arcane name = "Arcane Research" desc = "Research into the occult and arcane field for use in practical science" - id = "arcane" - level = 0 //It didn't become "secret" as advertised. - -//Branch Techs -datum/tech/explosives - name = "Explosives Research" - desc = "The creation and application of explosive materials." - id = "explosives" - req_tech = list("materials" = 3) - -datum/tech/generators - name = "Power Generation Technology" - desc = "Research into more powerful and more reliable sources." - id = "generators" - req_tech = list("powerstorage" = 2) - -datum/tech/robotics - name = "Robotics Technology" - desc = "The development of advanced automated, autonomous machines." - id = "robotics" - req_tech = list("materials" = 3, "programming" = 3) -*/ - + id = TECH_ARCANE + level = 0 /obj/item/weapon/disk/tech_disk name = "technology disk" @@ -273,8 +201,8 @@ datum/tech/robotics var/datum/tech/stored /obj/item/weapon/disk/tech_disk/New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + pixel_x = rand(-5.0, 5) + pixel_y = rand(-5.0, 5) /obj/item/weapon/disk/design_disk name = "component design disk" @@ -283,9 +211,9 @@ datum/tech/robotics icon_state = "datadisk2" item_state = "card-id" w_class = 2.0 - matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) var/datum/design/blueprint /obj/item/weapon/disk/design_disk/New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + pixel_x = rand(-5.0, 5) + pixel_y = rand(-5.0, 5) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index d57c9957552..efb05b90d75 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -4,7 +4,7 @@ icon_state = "server" var/datum/research/files var/health = 100 - var/list/id_with_upload = list() //List of R&D consoles with upload to server access. + var/list/id_with_upload = list() //List of R&D consoles with upload to server access. var/list/id_with_download = list() //List of R&D consoles with download from server access. var/id_with_upload_string = "" //String versions for easy editing in map editor. var/id_with_download_string = "" @@ -22,7 +22,7 @@ component_parts += new /obj/item/stack/cable_coil(src) component_parts += new /obj/item/stack/cable_coil(src) RefreshParts() - src.initialize(); //Agouri + initialize(); /obj/machinery/r_n_d/server/Destroy() griefProtection() @@ -35,7 +35,8 @@ idle_power_usage /= max(1, tot_rating) /obj/machinery/r_n_d/server/initialize() - if(!files) files = new /datum/research(src) + if(!files) + files = new /datum/research(src) var/list/temp_list if(!id_with_upload.len) temp_list = list() @@ -70,27 +71,14 @@ produce_heat() delay = initial(delay) -/obj/machinery/r_n_d/server/meteorhit(var/obj/O as obj) - griefProtection() - ..() - - /obj/machinery/r_n_d/server/emp_act(severity) griefProtection() ..() - /obj/machinery/r_n_d/server/ex_act(severity) griefProtection() ..() - -/obj/machinery/r_n_d/server/blob_act() - griefProtection() - ..() - - - //Backup files to centcomm to help admins recover data after greifer attacks /obj/machinery/r_n_d/server/proc/griefProtection() for(var/obj/machinery/r_n_d/server/centcom/C in machines) @@ -101,10 +89,10 @@ C.files.RefreshResearch() /obj/machinery/r_n_d/server/proc/produce_heat() - if (!produces_heat) + if(!produces_heat) return - if (!use_power) + if(!use_power) return if(!(stat & (NOPOWER|BROKEN))) //Blatently stolen from telecoms @@ -124,46 +112,15 @@ env.merge(removed) /obj/machinery/r_n_d/server/attackby(var/obj/item/O as obj, var/mob/user as mob) - if (disabled) + if(default_deconstruction_screwdriver(user, O)) return - if (shocked) - shock(user,50) - if (istype(O, /obj/item/weapon/screwdriver)) - if (!panel_open) - panel_open = 1 - icon_state = "server_o" - user << "You open the maintenance hatch of [src]." - else - panel_open = 0 - icon_state = "server" - user << "You close the maintenance hatch of [src]." + if(default_deconstruction_crowbar(user, O)) return - if (panel_open) - if(istype(O, /obj/item/weapon/crowbar)) - griefProtection() - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) - M.state = 2 - M.icon_state = "box_1" - for(var/obj/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 - I.loc = src.loc - qdel(src) - return 1 - -/obj/machinery/r_n_d/server/attack_hand(mob/user as mob) - if (disabled) + if(default_part_replacement(user, O)) return - if (shocked) - shock(user,50) - return - - - /obj/machinery/r_n_d/server/centcom - name = "Centcom Central R&D Database" + name = "Central R&D Database" server_id = -1 /obj/machinery/r_n_d/server/centcom/initialize() @@ -190,12 +147,12 @@ no_id_servers -= S /obj/machinery/r_n_d/server/centcom/process() - return PROCESS_KILL //don't need process() - + return PROCESS_KILL //don't need process() /obj/machinery/computer/rdservercontrol name = "R&D Server Controller" - icon_state = "rdcomp" + icon_keyboard = "rd_key" + icon_screen = "rdcomp" light_color = "#a97faa" circuit = /obj/item/weapon/circuitboard/rdservercontrol var/screen = 0 @@ -210,8 +167,8 @@ add_fingerprint(usr) usr.set_machine(src) - if(!src.allowed(usr) && !emagged) - usr << "\red You do not have the required access level" + if(!allowed(usr) && !emagged) + usr << "You do not have the required access level" return if(href_list["main"]) @@ -267,7 +224,6 @@ if(choice == "Continue") for(var/datum/design/D in temp_server.files.known_designs) if(D.id == href_list["reset_design"]) - D.reliability_mod = 0 temp_server.files.known_designs -= D break temp_server.files.RefreshResearch() @@ -336,14 +292,13 @@ onclose(user, "server_control") return -/obj/machinery/computer/rdservercontrol/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) - if(istype(D, /obj/item/weapon/card/emag) && !emagged) +/obj/machinery/computer/rdservercontrol/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" - src.updateUsrDialog() - return ..() - + user << "You you disable the security protocols." + src.updateUsrDialog() + return 1 /obj/machinery/r_n_d/server/robotics name = "Robotics R&D Server" @@ -351,7 +306,6 @@ id_with_download_string = "1;2" server_id = 2 - /obj/machinery/r_n_d/server/core name = "Core R&D Server" id_with_upload_string = "1" diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm index c8e0f78dca8..591d146fcc8 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm @@ -18,44 +18,6 @@ #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" @@ -82,37 +44,34 @@ var/list/valid_secondary_effect_types = list(\ if(prob(75)) secondary_effect.ToggleActivate(0) - icon_num = rand(0,11) + icon_num = rand(0,13) icon_state = "ano[icon_num]0" if(icon_num == 7 || icon_num == 8) - name = "large crystal" + name = "large alien 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)) + if(prob(75)) my_effect.trigger = TRIGGER_ENERGY - else if(icon_num == 9) + else if(icon_num == 1 || icon_num == 6) + desc = "There appears to be some kind of environmental scanner on it." + if(prob(75)) + my_effect.trigger = rand(5,8) + else if(icon_num == 9 || icon_num == 11 || icon_num == 13) 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) + else if(icon_num == 2 || icon_num == 3 || icon_num == 4) + desc = "A large alien device, there appear to be vents in the side." + if(prob(75)) + my_effect.trigger = rand(7,12) + else if(icon_num == 10 || icon_num == 12) name = "sealed alien pod" - desc = "A strange alien device." - if(prob(25)) + if(prob(75)) 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 @@ -235,7 +194,7 @@ var/list/valid_secondary_effect_types = list(\ src.add_fingerprint(user) if(my_effect.trigger == TRIGGER_TOUCH) - user << "You touch [src]." + 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")]." @@ -321,7 +280,7 @@ var/list/valid_secondary_effect_types = list(\ warn = 1 if(warn) - M << "You accidentally touch [src]." + M << "You accidentally touch [src]." ..() /obj/machinery/artifact/bullet_act(var/obj/item/projectile/P) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm index 1244f802cc6..0d6bd0eb63e 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm @@ -1,70 +1,70 @@ - -/datum/artifact_effect/badfeeling - effecttype = "badfeeling" - effect_type = 2 - var/list/messages = list("You feel worried.",\ - "Something doesn't feel right.",\ - "You get a strange feeling in your gut.",\ - "Your instincts are trying to warn you about something.",\ - "Someone just walked over your grave.",\ - "There's a strange feeling in the air.",\ - "There's a strange smell in the air.",\ - "The tips of your fingers feel tingly.",\ - "You feel witchy.",\ - "You have a terrible sense of foreboding.",\ - "You've got a bad feeling about this.",\ - "Your scalp prickles.",\ - "The light seems to flicker.",\ - "The shadows seem to lengthen.",\ - "The walls are getting closer.",\ - "Something is wrong") - - var/list/drastic_messages = list("You've got to get out of here!",\ - "Someone's trying to kill you!",\ - "There's something out there!",\ - "What's happening to you?",\ - "OH GOD!",\ - "HELP ME!") - -/datum/artifact_effect/badfeeling/DoEffectTouch(var/mob/user) - if(user) - if (istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(prob(50)) - if(prob(75)) - H << "[pick(drastic_messages)]" - else - H << "[pick(messages)]" - - if(prob(50)) - H.dizziness += rand(3,5) - -/datum/artifact_effect/badfeeling/DoEffectAura() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(src.effectrange,T)) - if(prob(5)) - if(prob(75)) - H << "[pick(messages)]" - else - H << "[pick(drastic_messages)]" - - if(prob(10)) - H.dizziness += rand(3,5) - return 1 - -/datum/artifact_effect/badfeeling/DoEffectPulse() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(src.effectrange,T)) - if(prob(50)) - if(prob(95)) - H << "[pick(drastic_messages)]" - else - H << "[pick(messages)]" - - if(prob(50)) - H.dizziness += rand(3,5) - else if(prob(25)) - H.dizziness += rand(5,15) - return 1 + +/datum/artifact_effect/badfeeling + effecttype = "badfeeling" + effect_type = 2 + var/list/messages = list("You feel worried.",\ + "Something doesn't feel right.",\ + "You get a strange feeling in your gut.",\ + "Your instincts are trying to warn you about something.",\ + "Someone just walked over your grave.",\ + "There's a strange feeling in the air.",\ + "There's a strange smell in the air.",\ + "The tips of your fingers feel tingly.",\ + "You feel witchy.",\ + "You have a terrible sense of foreboding.",\ + "You've got a bad feeling about this.",\ + "Your scalp prickles.",\ + "The light seems to flicker.",\ + "The shadows seem to lengthen.",\ + "The walls are getting closer.",\ + "Something is wrong") + + var/list/drastic_messages = list("You've got to get out of here!",\ + "Someone's trying to kill you!",\ + "There's something out there!",\ + "What's happening to you?",\ + "OH GOD!",\ + "HELP ME!") + +/datum/artifact_effect/badfeeling/DoEffectTouch(var/mob/user) + if(user) + if (istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(prob(50)) + if(prob(75)) + H << "[pick(drastic_messages)]" + else + H << "[pick(messages)]" + + if(prob(50)) + H.dizziness += rand(3,5) + +/datum/artifact_effect/badfeeling/DoEffectAura() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/human/H in range(src.effectrange,T)) + if(prob(5)) + if(prob(75)) + H << "[pick(messages)]" + else + H << "[pick(drastic_messages)]" + + if(prob(10)) + H.dizziness += rand(3,5) + return 1 + +/datum/artifact_effect/badfeeling/DoEffectPulse() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/human/H in range(src.effectrange,T)) + if(prob(50)) + if(prob(95)) + H << "[pick(drastic_messages)]" + else + H << "[pick(messages)]" + + if(prob(50)) + H.dizziness += rand(3,5) + else if(prob(25)) + H.dizziness += rand(5,15) + return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm index bc45260b2cc..61719bc9161 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm @@ -1,68 +1,68 @@ - -/datum/artifact_effect/goodfeeling - effecttype = "goodfeeling" - effect_type = 2 - var/list/messages = list("You feel good.",\ - "Everything seems to be going alright",\ - "You've got a good feeling about this",\ - "Your instincts tell you everything is going to be getting better.",\ - "There's a good feeling in the air.",\ - "Something smells... good.",\ - "The tips of your fingers feel tingly.",\ - "You've got a good feeling about this.",\ - "You feel happy.",\ - "You fight the urge to smile.",\ - "Your scalp prickles.",\ - "All the colours seem a bit more vibrant.",\ - "Everything seems a little lighter.",\ - "The troubles of the world seem to fade away.") - - var/list/drastic_messages = list("You want to hug everyone you meet!",\ - "Everything is going so well!",\ - "You feel euphoric.",\ - "You feel giddy.",\ - "You're so happy suddenly, you almost want to dance and sing.",\ - "You feel like the world is out to help you.") - -/datum/artifact_effect/goodfeeling/DoEffectTouch(var/mob/user) - if(user) - if (istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(prob(50)) - if(prob(75)) - H << "[pick(drastic_messages)]" - else - H << "[pick(messages)]" - - if(prob(50)) - H.dizziness += rand(3,5) - -/datum/artifact_effect/goodfeeling/DoEffectAura() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(src.effectrange,T)) - if(prob(5)) - if(prob(75)) - H << "[pick(messages)]" - else - H << "[pick(drastic_messages)]" - - if(prob(5)) - H.dizziness += rand(3,5) - return 1 - -/datum/artifact_effect/goodfeeling/DoEffectPulse() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(src.effectrange,T)) - if(prob(50)) - if(prob(95)) - H << "[pick(drastic_messages)]" - else - H << "[pick(messages)]" - - if(prob(50)) - H.dizziness += rand(3,5) - else if(prob(25)) - H.dizziness += rand(5,15) - return 1 + +/datum/artifact_effect/goodfeeling + effecttype = "goodfeeling" + effect_type = 2 + var/list/messages = list("You feel good.",\ + "Everything seems to be going alright",\ + "You've got a good feeling about this",\ + "Your instincts tell you everything is going to be getting better.",\ + "There's a good feeling in the air.",\ + "Something smells... good.",\ + "The tips of your fingers feel tingly.",\ + "You've got a good feeling about this.",\ + "You feel happy.",\ + "You fight the urge to smile.",\ + "Your scalp prickles.",\ + "All the colours seem a bit more vibrant.",\ + "Everything seems a little lighter.",\ + "The troubles of the world seem to fade away.") + + var/list/drastic_messages = list("You want to hug everyone you meet!",\ + "Everything is going so well!",\ + "You feel euphoric.",\ + "You feel giddy.",\ + "You're so happy suddenly, you almost want to dance and sing.",\ + "You feel like the world is out to help you.") + +/datum/artifact_effect/goodfeeling/DoEffectTouch(var/mob/user) + if(user) + if (istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(prob(50)) + if(prob(75)) + H << "[pick(drastic_messages)]" + else + H << "[pick(messages)]" + + if(prob(50)) + H.dizziness += rand(3,5) + +/datum/artifact_effect/goodfeeling/DoEffectAura() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/human/H in range(src.effectrange,T)) + if(prob(5)) + if(prob(75)) + H << "[pick(messages)]" + else + H << "[pick(drastic_messages)]" + + if(prob(5)) + H.dizziness += rand(3,5) + return 1 + +/datum/artifact_effect/goodfeeling/DoEffectPulse() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/human/H in range(src.effectrange,T)) + if(prob(50)) + if(prob(95)) + H << "[pick(drastic_messages)]" + else + H << "[pick(messages)]" + + if(prob(50)) + H.dizziness += rand(3,5) + else if(prob(25)) + H.dizziness += rand(5,15) + return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm index 0c81a604a2f..7ffeffa8eb3 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm @@ -8,13 +8,13 @@ var/weakness = GetAnomalySusceptibility(toucher) if(iscarbon(toucher) && prob(weakness * 100)) var/mob/living/carbon/C = toucher - C << "\red A painful discharge of energy strikes you!" + C << "A painful discharge of energy strikes you!" C.adjustOxyLoss(rand(5,25) * weakness) C.adjustToxLoss(rand(5,25) * weakness) C.adjustBruteLoss(rand(5,25) * weakness) C.adjustFireLoss(rand(5,25) * weakness) C.adjustBrainLoss(rand(5,25) * weakness) - C.radiation += 25 * weakness + C.apply_effect(25 * weakness, IRRADIATE) C.nutrition -= min(50 * weakness, C.nutrition) C.make_dizzy(6 * weakness) C.weakened += 6 * weakness @@ -26,7 +26,7 @@ var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) if(prob(10)) - C << "\red You feel a painful force radiating from something nearby." + C << "You feel a painful force radiating from something nearby." C.adjustBruteLoss(1 * weakness) C.adjustFireLoss(1 * weakness) C.adjustToxLoss(1 * weakness) @@ -40,7 +40,7 @@ for (var/mob/living/carbon/C in range(effectrange, T)) var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) - C << "\red A wave of painful energy strikes you!" + C << "A wave of painful energy strikes you!" C.adjustBruteLoss(3 * weakness) C.adjustFireLoss(3 * weakness) C.adjustToxLoss(3 * weakness) diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm index 84799cc552e..33cb2d52ff4 100644 --- a/code/modules/research/xenoarchaeology/finds/finds.dm +++ b/code/modules/research/xenoarchaeology/finds/finds.dm @@ -30,7 +30,7 @@ icon_state = "strange" var/obj/item/weapon/inside var/method = 0// 0 = fire, 1 = brush, 2 = pick - origin_tech = "materials=5" + origin_tech = list(TECH_MATERIAL = 5) /obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0) ..(loc) diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/research/xenoarchaeology/finds/finds_misc.dm index f494505b63f..03071c760b1 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_misc.dm @@ -10,24 +10,3 @@ /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/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm index b2c0fb38986..af73f541d60 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_special.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm @@ -127,7 +127,7 @@ playsound(src.loc, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3) nearby_mobs.Add(M) - var/target = pick("chest","groin","head","l_arm","r_arm","r_leg","l_leg","l_hand","r_hand","l_foot","r_foot") + var/target = pick(M.organs_by_name) M.apply_damage(rand(5, 10), BRUTE, target) M << "\red The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out." var/obj/effect/decal/cleanable/blood/splatter/animated/B = new(M.loc) diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm index ccd8293ed02..62dde2edd56 100644 --- a/code/modules/research/xenoarchaeology/machinery/coolant.dm +++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm @@ -9,13 +9,10 @@ reagents.add_reagent("coolant",1000) /obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj) - if(Proj.damage_type == BRUTE || Proj.damage_type == BURN) + if(Proj.get_structure_damage()) if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) explode() -/obj/structure/reagent_dispensers/coolanttank/blob_act() - explode() - /obj/structure/reagent_dispensers/coolanttank/ex_act() explode() diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm index b2d8cef42c8..daafa65acaf 100644 --- a/code/modules/research/xenoarchaeology/misc.dm +++ b/code/modules/research/xenoarchaeology/misc.dm @@ -105,6 +105,7 @@ new /obj/item/weapon/pickaxe/hand(src) new /obj/item/weapon/storage/bag/fossils(src) new /obj/item/weapon/hand_labeler(src) + new /obj/item/taperoll/research(src) return //---- Isolation room air alarms diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm index 7450dd06032..6b77e800eb3 100644 --- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm +++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm @@ -131,10 +131,10 @@ usr.drop_item() I.loc = src auth_card = I - if(attempt_unlock(I)) - usr << "You insert [I], the console flashes \'Access granted.\'" + if(attempt_unlock(I, usr)) + usr << "You insert [I], the console flashes \'Access granted.\'" else - usr << "You insert [I], the console flashes \'Access denied.\'" + usr << "You insert [I], the console flashes \'Access denied.\'" else if(href_list["ejectcard"]) if(auth_card) if(ishuman(usr)) @@ -215,25 +215,27 @@ else if(istype(W, /obj/item/weapon/card)) var/obj/item/weapon/card/I = W if(!auth_card) - if(attempt_unlock(I)) + if(attempt_unlock(I, user)) user << "You swipe [I], the console flashes \'Access granted.\'" else user << "You swipe [I], console flashes \'Access denied.\'" else user << "Remove [auth_card] first." -/obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/weapon/card/C) +/obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/weapon/card/C, var/mob/user) if(!open) - if(istype(C, /obj/item/weapon/card/emag) && cell.charge > 0) - //put sparks here - if(prob(95)) - locked = 0 + if(istype(C, /obj/item/weapon/card/emag)) + C.resolve_attackby(src, user) else if(istype(C, /obj/item/weapon/card/id) && check_access(C)) locked = 0 - if(!locked) return 1 +/obj/machinery/suspension_gen/emag_act(var/remaining_charges, var/mob/user) + if(cell.charge > 0 && locked) + locked = 0 + return 1 + //checks for whether the machine can be activated or not should already have occurred by this point /obj/machinery/suspension_gen/proc/activate() //depending on the field type, we might pickup certain items diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm index e16db119c55..bc9d0ca21f5 100644 --- a/code/modules/research/xenoarchaeology/tools/tools.dm +++ b/code/modules/research/xenoarchaeology/tools/tools.dm @@ -30,7 +30,6 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - storage_slots = 50 - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class + max_storage_space = 100 max_w_class = 3 can_hold = list(/obj/item/weapon/fossil) diff --git a/code/modules/scripting/IDE.dm b/code/modules/scripting/IDE.dm index 2e84639917b..3974e2dee48 100644 --- a/code/modules/scripting/IDE.dm +++ b/code/modules/scripting/IDE.dm @@ -16,13 +16,13 @@ client/verb/tcssave() src << output(null, "tcserror") // clear the errors else src << output(null, "tcserror") - src << output("Failed to save: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to save: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") else src << output(null, "tcserror") - src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") else src << output(null, "tcserror") - src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") client/verb/tcscompile() @@ -44,7 +44,7 @@ client/verb/tcscompile() if(compileerrors.len) src << output("Compile Errors", "tcserror") for(var/scriptError/e in compileerrors) - src << output("\t>[e.message]", "tcserror") + src << output("\t>[e.message]", "tcserror") src << output("([compileerrors.len] errors)", "tcserror") // Output compile errors to all other people viewing the code too @@ -53,28 +53,28 @@ client/verb/tcscompile() M << output(null, "tcserror") M << output("Compile Errors", "tcserror") for(var/scriptError/e in compileerrors) - M << output("\t>[e.message]", "tcserror") + M << output("\t>[e.message]", "tcserror") M << output("([compileerrors.len] errors)", "tcserror") else - src << output("TCS compilation successful!", "tcserror") + src << output("TCS compilation successful!", "tcserror") src << output("(0 errors)", "tcserror") for(var/mob/M in Machine.viewingcode) if(M.client) - M << output("TCS compilation successful!", "tcserror") + M << output("TCS compilation successful!", "tcserror") M << output("(0 errors)", "tcserror") else src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to compile: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") else src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") else src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") client/verb/tcsrun() set hidden = 1 @@ -95,7 +95,7 @@ client/verb/tcsrun() if(compileerrors.len) src << output("Compile Errors", "tcserror") for(var/scriptError/e in compileerrors) - src << output("\t>[e.message]", "tcserror") + src << output("\t>[e.message]", "tcserror") src << output("([compileerrors.len] errors)", "tcserror") // Output compile errors to all other people viewing the code too @@ -104,17 +104,17 @@ client/verb/tcsrun() M << output(null, "tcserror") M << output("Compile Errors", "tcserror") for(var/scriptError/e in compileerrors) - M << output("\t>[e.message]", "tcserror") + M << output("\t>[e.message]", "tcserror") M << output("([compileerrors.len] errors)", "tcserror") else // Finally, we run the code! - src << output("TCS compilation successful! Code executed.", "tcserror") + src << output("TCS compilation successful! Code executed.", "tcserror") src << output("(0 errors)", "tcserror") for(var/mob/M in Machine.viewingcode) if(M.client) - M << output("TCS compilation successful!", "tcserror") + M << output("TCS compilation successful!", "tcserror") M << output("(0 errors)", "tcserror") var/datum/signal/signal = new() @@ -133,13 +133,13 @@ client/verb/tcsrun() else src << output(null, "tcserror") - src << output("Failed to run: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to run: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") else src << output(null, "tcserror") - src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") else src << output(null, "tcserror") - src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") + src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") client/verb/exittcs() @@ -174,13 +174,13 @@ client/verb/tcsrevert() src << output(null, "tcserror") // clear the errors else src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate server machine.", "tcserror") + src << output("Failed to revert: Unable to locate server machine.", "tcserror") else src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate machine.", "tcserror") + src << output("Failed to revert: Unable to locate machine.", "tcserror") else src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate machine.", "tcserror") + src << output("Failed to revert: Unable to locate machine.", "tcserror") client/verb/tcsclearmem() @@ -196,16 +196,16 @@ client/verb/tcsclearmem() Server.memory = list() // clear the memory // Show results src << output(null, "tcserror") - src << output("Server memory cleared!", "tcserror") + src << output("Server memory cleared!", "tcserror") for(var/mob/M in Machine.viewingcode) if(M.client) - M << output("Server memory cleared!", "tcserror") + M << output("Server memory cleared!", "tcserror") else src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate server machine.", "tcserror") + src << output("Failed to clear memory: Unable to locate server machine.", "tcserror") else src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate machine.", "tcserror") + src << output("Failed to clear memory: Unable to locate machine.", "tcserror") else src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate machine.", "tcserror") + src << output("Failed to clear memory: Unable to locate machine.", "tcserror") diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 4fdd54f31bd..87c6fa5ea36 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -248,7 +248,7 @@ datum/signal if(source in S.stored_names) newsign.data["name"] = source else - newsign.data["name"] = "[html_encode(uppertext(source))]" + newsign.data["name"] = "[html_encode(uppertext(source))]" newsign.data["realname"] = newsign.data["name"] newsign.data["job"] = job newsign.data["compression"] = 0 diff --git a/code/modules/security levels/security levels.dm b/code/modules/security levels/security levels.dm index 1892af891ed..4b73c0dd28d 100644 --- a/code/modules/security levels/security levels.dm +++ b/code/modules/security levels/security levels.dm @@ -25,46 +25,31 @@ if(SEC_LEVEL_GREEN) security_announcement_down.Announce("[config.alert_desc_green]", "Attention! Security level lowered to green") security_level = SEC_LEVEL_GREEN - for(var/obj/machinery/firealarm/FA in machines) - if(FA.z in config.contact_levels) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_green") if(SEC_LEVEL_BLUE) if(security_level < SEC_LEVEL_BLUE) security_announcement_up.Announce("[config.alert_desc_blue_upto]", "Attention! Security level elevated to blue") else security_announcement_down.Announce("[config.alert_desc_blue_downto]", "Attention! Security level lowered to blue") security_level = SEC_LEVEL_BLUE - for(var/obj/machinery/firealarm/FA in machines) - if(FA.z in config.contact_levels) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue") if(SEC_LEVEL_RED) if(security_level < SEC_LEVEL_RED) security_announcement_up.Announce("[config.alert_desc_red_upto]", "Attention! Code red!") else security_announcement_down.Announce("[config.alert_desc_red_downto]", "Attention! Code red!") security_level = SEC_LEVEL_RED - /* - At the time of commit, setting status displays didn't work properly var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) if(CC) CC.post_status("alert", "redalert")*/ - - for(var/obj/machinery/firealarm/FA in machines) - if(FA.z in config.contact_levels) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_red") - if(SEC_LEVEL_DELTA) security_announcement_up.Announce("[config.alert_desc_delta]", "Attention! Delta security level reached!", new_sound = 'sound/effects/siren.ogg') security_level = SEC_LEVEL_DELTA - for(var/obj/machinery/firealarm/FA in machines) - if(FA.z in config.contact_levels) - FA.overlays = list() - FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta") - else - return + + var/newlevel = get_security_level() + for(var/obj/machinery/firealarm/FA in machines) + if(FA.z in config.contact_levels) + FA.set_security_level(newlevel) + /proc/get_security_level() switch(security_level) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 15bfa973ed8..106fea353de 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -59,15 +59,8 @@ ..() -/obj/machinery/shield/meteorhit() - src.health -= max_health*0.75 //3/4 health as damage - check_failure() - opacity = 1 - spawn(20) if(src) opacity = 0 - return - /obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage + health -= Proj.get_structure_damage() ..() check_failure() opacity = 1 @@ -94,9 +87,6 @@ if(prob(50)) qdel(src) -/obj/machinery/shield/blob_act() - qdel(src) - /obj/machinery/shield/hitby(AM as mob|obj) //Let everyone know we've been hit! @@ -130,7 +120,6 @@ density = 1 opacity = 0 anchored = 0 - pressure_resistance = 2*ONE_ATMOSPHERE req_access = list(access_engine) var/const/max_health = 100 var/health = max_health @@ -225,13 +214,6 @@ update_icon() return -/obj/machinery/shieldgen/meteorhit(obj/O as obj) - src.health -= max_health*0.25 //A quarter of the machine's health - if (prob(5)) - src.malfunction = 1 - src.checkhp() - return - /obj/machinery/shieldgen/ex_act(severity) switch(severity) if(1.0) @@ -281,13 +263,15 @@ else user << "The device must first be secured to the floor." return - -/obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/card/emag)) + +/obj/machinery/shieldgen/emag_act(var/remaining_charges, var/mob/user) + if(!malfunction) malfunction = 1 update_icon() + return 1 - else if(istype(W, /obj/item/weapon/screwdriver)) +/obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) if(is_open) user << "\blue You close the panel." diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 074d3abbfa9..04b471182b6 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -25,12 +25,7 @@ Stress(0.5 + severity) /obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj) - Stress(Proj.damage / 10) - -/obj/effect/energy_field/meteorhit(obj/effect/meteor/M as obj) - if(M) - walk(M,0) - Stress(2) + Stress(Proj.get_structure_damage() / 10) /obj/effect/energy_field/proc/Stress(var/severity) strength -= severity diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 708798818ae..696caa5ed47 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -214,7 +214,7 @@ ..() /obj/machinery/shieldwallgen/bullet_act(var/obj/item/projectile/Proj) - storedpower -= 400 * Proj.damage + storedpower -= 400 * Proj.get_structure_damage() ..() return @@ -285,7 +285,7 @@ G = gen_primary else G = gen_secondary - G.storedpower -= 400 * Proj.damage + G.storedpower -= 400 * Proj.get_structure_damage() ..() return diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index f51c1fafb91..78d00d3f90e 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -26,6 +26,16 @@ possible_gen.owned_capacitor = src break ..() + +/obj/machinery/shield_capacitor/emag_act(var/remaining_charges, var/mob/user) + if(prob(75)) + src.locked = !src.locked + user << "Controls are now [src.locked ? "locked." : "unlocked."]" + . = 1 + updateDialog() + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() /obj/machinery/shield_capacitor/attackby(obj/item/W, mob/user) @@ -37,15 +47,6 @@ updateDialog() else user << "\red Access denied." - else if(istype(W, /obj/item/weapon/card/emag)) - if(prob(75)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - updateDialog() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - else if(istype(W, /obj/item/weapon/wrench)) src.anchored = !src.anchored src.visible_message("\blue \icon[src] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 544998ce615..90e32d64925 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -44,6 +44,16 @@ field.Remove(D) D.loc = null ..() + +/obj/machinery/shield_gen/emag_act(var/remaining_charges, var/mob/user) + if(prob(75)) + src.locked = !src.locked + user << "Controls are now [src.locked ? "locked." : "unlocked."]" + . = 1 + updateDialog() + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() /obj/machinery/shield_gen/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/card/id)) @@ -54,15 +64,6 @@ updateDialog() else user << "\red Access denied." - else if(istype(W, /obj/item/weapon/card/emag)) - if(prob(75)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - updateDialog() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - else if(istype(W, /obj/item/weapon/wrench)) src.anchored = !src.anchored src.visible_message("\blue \icon[src] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].") diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index dff1ce5eb18..fd6aabc4a23 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -102,19 +102,15 @@ ui.open() ui.set_auto_update(1) -/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/emag) && !emagged) - user << "\blue You emag the [src], arming the escape pod!" +/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/emag_act(var/remaining_charges, var/mob/user) + if (!emagged) + user << "You emag the [src], arming the escape pod!" emagged = 1 if (istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod)) var/datum/computer/file/embedded_program/docking/simple/escape_pod/P = docking_program if (!P.armed) P.arm() - return - - ..() - - + return 1 //A docking controller program for a simple door based docking port /datum/computer/file/embedded_program/docking/simple/escape_pod diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 4a86591cf90..b6857a3f823 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -1,7 +1,8 @@ /obj/machinery/computer/shuttle_control name = "shuttle control console" icon = 'icons/obj/computer.dmi' - icon_state = "shuttle" + icon_keyboard = "atmos_key" + icon_screen = "shuttle" circuit = null var/shuttle_tag // Used to coordinate data in shuttle controller. @@ -83,15 +84,13 @@ else if(href_list["cancel"]) shuttle.cancel_launch(src) -/obj/machinery/computer/shuttle_control/attackby(obj/item/weapon/W as obj, mob/user as mob) - - if (istype(W, /obj/item/weapon/card/emag)) - src.req_access = list() - src.req_one_access = list() +/obj/machinery/computer/shuttle_control/emag_act(var/remaining_charges, var/mob/user) + if (!hacked) + req_access = list() + req_one_access = list() hacked = 1 - usr << "You short out the console's ID checking system. It's now available to everyone!" - else - ..() + user << "You short out the console's ID checking system. It's now available to everyone!" + return 1 /obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj) visible_message("\The [Proj] ricochets off \the [src]!") diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index ea572e8fb43..4b9a33a3ae3 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -28,9 +28,9 @@ emergency_shuttle.departed = 1 if (emergency_shuttle.evac) - priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at Central Command.") + priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at [dock_name].") else - priority_announcement.Announce("The Crew Transfer Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at Central Command.") + priority_announcement.Announce("The Crew Transfer Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at [dock_name].") /datum/shuttle/ferry/emergency/can_launch(var/user) if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) @@ -155,15 +155,13 @@ return 1 - - - -/obj/machinery/computer/shuttle_control/emergency/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/emag) && !emagged) +/obj/machinery/computer/shuttle_control/emergency/emag_act(var/remaining_charges, var/mob/user) + if (!emagged) user << "You short out \the [src]'s authorization protocols." emagged = 1 - return + return 1 +/obj/machinery/computer/shuttle_control/emergency/attackby(obj/item/weapon/W as obj, mob/user as mob) read_authorization(W) ..() @@ -187,7 +185,7 @@ else if (!shuttle.location) shuttle_status = "Standing-by at [station_name]." else - shuttle_status = "Standing-by at Central Command." + shuttle_status = "Standing-by at [dock_name]." if(WAIT_LAUNCH, FORCE_LAUNCH) shuttle_status = "Shuttle has recieved command and will depart shortly." if(WAIT_ARRIVE) diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index a61ee69c727..5ef0c921709 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -62,7 +62,7 @@ var/obj/machinery/computer/C = user if(world.time <= reset_time) - C.visible_message("\blue Central Command will not allow the Special Operations shuttle to launch yet.") + C.visible_message("\blue [boss_name] will not allow the Special Operations shuttle to launch yet.") if (((world.time - reset_time)/10) > 60) C.visible_message("\blue [-((world.time - reset_time)/10)/60] minutes remain!") else @@ -93,12 +93,12 @@ if (!location) //just arrived home for(var/turf/T in get_area_turfs(destination)) var/mob/M = locate(/mob) in T - M << "\red You have arrived at Central Command. Operation has ended!" + M << "You have arrived at [boss_name]. Operation has ended!" else //just left for the station launch_mauraders() for(var/turf/T in get_area_turfs(destination)) var/mob/M = locate(/mob) in T - M << "\red You have arrived at [station_name]. Commence operation!" + M << "You have arrived at [station_name]. Commence operation!" var/obj/machinery/light/small/readylight/light = locate() in T if(light) light.set_state(1) diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm index 141cf97d8aa..35bc9a8315a 100644 --- a/code/modules/shuttles/shuttles_multi.dm +++ b/code/modules/shuttles/shuttles_multi.dm @@ -34,12 +34,12 @@ 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 @@ -59,18 +59,19 @@ if(cloaked || isnull(departure_message)) return - command_announcement.Announce(departure_message,(announcer ? announcer : "Central Command")) + command_announcement.Announce(departure_message,(announcer ? announcer : "[boss_name]")) /datum/shuttle/multi_shuttle/proc/announce_arrival() if(cloaked || isnull(arrival_message)) return - command_announcement.Announce(arrival_message,(announcer ? announcer : "Central Command")) + command_announcement.Announce(arrival_message,(announcer ? announcer : "[boss_name]")) /obj/machinery/computer/shuttle_control/multi - icon_state = "syndishuttle" + icon_keyboard = "syndie_key" + icon_screen = "syndishuttle" /obj/machinery/computer/shuttle_control/multi/attack_hand(user as mob) @@ -99,15 +100,15 @@ dat += "
          Toggle cloaking field
          " dat += "Move ship
          " dat += "Return to base
    13. " - + //Docking dat += "


      " if(MS.skip_docking_checks()) - dat += "Docking Status: Not in use.
      " + 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") @@ -118,16 +119,17 @@ dat += "Undocking" if("docked") dat += "Docked" - + if(override_en) dat += " (Override Enabled)" - + dat += ". \[Refresh\]

      " - + switch(docking_status) if("undocked") - dat += "Dock
    " + dat += "Dock" if("docked") - dat += "Undock
    " + dat += "Undock" + dat += "
    " user << browse("[dat]", "window=[shuttle_tag]shuttlecontrol;size=300x600") @@ -139,11 +141,11 @@ 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) @@ -165,11 +167,11 @@ 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 @@ -178,7 +180,7 @@ 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 @@ -186,7 +188,7 @@ 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. @@ -207,11 +209,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 diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm index 6dff0fdb65d..1302513bfeb 100644 --- a/code/modules/spells/aoe_turf/conjure/conjure.dm +++ b/code/modules/spells/aoe_turf/conjure/conjure.dm @@ -45,7 +45,7 @@ How they spawn stuff is decided by behaviour vars, which are explained below 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 << "" + user << "You can't build things on shuttles!" continue spawn_place.ChangeTurf(summoned_object_type) summoned_object = spawn_place diff --git a/code/modules/spells/aoe_turf/conjure/construct.dm b/code/modules/spells/aoe_turf/conjure/construct.dm index e33d1f2b3cb..3885e16ad8a 100644 --- a/code/modules/spells/aoe_turf/conjure/construct.dm +++ b/code/modules/spells/aoe_turf/conjure/construct.dm @@ -30,7 +30,7 @@ invocation = "none" invocation_type = SpI_NONE range = 0 - summon_type = list(/turf/simulated/floor/engine/cult) + summon_type = list(/turf/simulated/floor/cult) hud_state = "const_floor" diff --git a/code/modules/spells/construct_spells.dm b/code/modules/spells/construct_spells.dm index 342f240d3cf..b2cec77dbc1 100644 --- a/code/modules/spells/construct_spells.dm +++ b/code/modules/spells/construct_spells.dm @@ -2,8 +2,6 @@ proc/findNullRod(var/atom/target) if(istype(target,/obj/item/weapon/nullrod)) - var/turf/T = get_turf(target) - T.turf_animation('icons/effects/96x96.dmi',"nullding",-32,-32,MOB_LAYER+1,'sound/piano/Ab7.ogg') return 1 else if(target.contents) for(var/atom/A in target.contents) diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index d553b165537..e48db592ad6 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -16,7 +16,7 @@ /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 + target.transforming = 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) @@ -33,7 +33,7 @@ target.buckled = null jaunt_disappear(animation, target) target.loc = holder - target.monkeyizing=0 //mob is safely inside holder now, no need for protection. + target.transforming=0 //mob is safely inside holder now, no need for protection. jaunt_steam(mobloc) sleep(duration) mobloc = holder.last_valid_turf diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm index 185cdfece46..fef039d191c 100644 --- a/code/modules/spells/targeted/projectile/projectile.dm +++ b/code/modules/spells/targeted/projectile/projectile.dm @@ -15,7 +15,7 @@ If the spell_projectile is seeking, it will update its target every process and var/proj_step_delay = 1 //lower = faster var/cast_prox_range = 1 -/spell/targeted/projectile/cast(list/targets, mob/user = usr) +/spell/targeted/projectile/cast(list/targets, mob/user = usr, var/target_zone) if(istext(proj_type)) proj_type = text2path(proj_type) // sanity filters @@ -26,19 +26,14 @@ If the spell_projectile is seeking, it will update its target every process and 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 - projectile.launch(target) + projectile.launch(target, target_zone="chest") return /spell/targeted/projectile/proc/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder) diff --git a/code/modules/spells/targeted/subjugate.dm b/code/modules/spells/targeted/subjugate.dm index 2ef3e53d1ec..2abd66fffad 100644 --- a/code/modules/spells/targeted/subjugate.dm +++ b/code/modules/spells/targeted/subjugate.dm @@ -7,13 +7,13 @@ spell_flags = 0 invocation = "DII ODA BAJI" invocation_type = SpI_WHISPER - message = "You suddenly feel completely overwhelmed!" + message = "You suddenly feel completely overwhelmed!" max_targets = 1 - amt_dizziness = 150 - amt_confused = 150 - amt_stuttering = 150 + amt_dizziness = 100 + amt_confused = 100 + amt_stuttering = 100 compatible_mobs = list(/mob/living/carbon/human) diff --git a/code/modules/supermatter/setup_supermatter.dm b/code/modules/supermatter/setup_supermatter.dm new file mode 100644 index 00000000000..eeaaa348a75 --- /dev/null +++ b/code/modules/supermatter/setup_supermatter.dm @@ -0,0 +1,251 @@ +#define SETUP_OK 1 // All good +#define SETUP_WARNING 2 // Something that shouldn't happen happened, but it's not critical so we will continue +#define SETUP_ERROR 3 // Something bad happened, and it's important so we won't continue setup. +#define SETUP_DELAYED 4 // Wait for other things first. + + +#define ENERGY_NITROGEN 115 // Roughly 8 emitter shots. +#define ENERGY_CARBONDIOXIDE 150 // Roughly 10 emitter shots. +#define ENERGY_PHORON 300 // Roughly 20 emitter shots. Phoron can take more but this is enough to max out both SMESs anyway. + + +/datum/admins/proc/setup_supermatter() + set category = "Debug" + set name = "Setup Supermatter" + set desc = "Allows you to start the Supermatter engine." + + if (!istype(src,/datum/admins)) + src = usr.client.holder + if (!istype(src,/datum/admins)) + usr << "Error: you are not an admin!" + return + + var/response = input(usr, "Are you sure? This will start up the engine with selected gas as coolant.", "Engine setup") as null|anything in list("N2", "CO2", "PH", "Abort") + if(!response || response == "Abort") + return + + var/errors = 0 + var/warnings = 0 + var/success = 0 + + log_and_message_admins("## SUPERMATTER SETUP - Setup initiated by [usr] using coolant type [response].") + + // CONFIGURATION PHASE + // Coolant canisters, set types according to response. + for(var/obj/effect/engine_setup/coolant_canister/C in world) + switch(response) + if("N2") + C.canister_type = /obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/ + continue + if("CO2") + C.canister_type = /obj/machinery/portable_atmospherics/canister/carbon_dioxide/engine_setup/ + continue + if("PH") + C.canister_type = /obj/machinery/portable_atmospherics/canister/phoron/engine_setup/ + continue + + for(var/obj/effect/engine_setup/core/C in world) + switch(response) + if("N2") + C.energy_setting = ENERGY_NITROGEN + continue + if("CO2") + C.energy_setting = ENERGY_CARBONDIOXIDE + continue + if("PH") + C.energy_setting = ENERGY_PHORON + continue + + for(var/obj/effect/engine_setup/filter/F in world) + F.coolant = response + + var/list/delayed_objects = list() + // SETUP PHASE + for(var/obj/effect/engine_setup/S in world) + var/result = S.activate(0) + switch(result) + if(SETUP_OK) + success++ + continue + if(SETUP_WARNING) + warnings++ + continue + if(SETUP_ERROR) + errors++ + log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") + break + if(SETUP_DELAYED) + delayed_objects.Add(S) + continue + + if(!errors) + for(var/obj/effect/engine_setup/S in delayed_objects) + var/result = S.activate(1) + switch(result) + if(SETUP_OK) + success++ + continue + if(SETUP_WARNING) + warnings++ + continue + if(SETUP_ERROR) + errors++ + log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") + break + + log_and_message_admins("## SUPERMATTER SETUP - Setup completed with [errors] errors, [warnings] warnings and [success] successful steps.") + + return + + + +/obj/effect/engine_setup/ + name = "Engine Setup Marker" + desc = "You shouldn't see this." + invisibility = 101 + anchored = 1 + density = 0 + icon = 'icons/mob/screen1.dmi' + icon_state = "x2" + +/obj/effect/engine_setup/proc/activate(var/last = 0) + return 1 + + + +// Tries to locate a pump, enables it, and sets it to MAX. Triggers warning if unable to locate a pump. +/obj/effect/engine_setup/pump_max/ + name = "Pump Setup Marker" + +/obj/effect/engine_setup/pump_max/activate() + ..() + var/obj/machinery/atmospherics/binary/pump/P = locate() in get_turf(src) + if(!P) + log_and_message_admins("## WARNING: Unable to locate pump at [x] [y] [z]!") + return SETUP_WARNING + P.target_pressure = P.max_pressure_setting + P.use_power = 1 + P.update_icon() + return SETUP_OK + + + +// Spawns an empty canister on this turf, if it has a connector port. Triggers warning if unable to find a connector port +/obj/effect/engine_setup/empty_canister/ + name = "Empty Canister Marker" + +/obj/effect/engine_setup/empty_canister/activate() + ..() + var/obj/machinery/atmospherics/portables_connector/P = locate() in get_turf(src) + if(!P) + log_and_message_admins("## WARNING: Unable to locate connector port at [x] [y] [z]!") + return SETUP_WARNING + new/obj/machinery/portable_atmospherics/canister(get_turf(src)) // Canisters automatically connect to connectors in New() + return SETUP_OK + + + + +// Spawns a coolant canister on this turf, if it has a connector port. +// Triggers error when unable to locate connector port or when coolant canister type is unset. +/obj/effect/engine_setup/coolant_canister/ + name = "Coolant Canister Marker" + var/canister_type = null + +/obj/effect/engine_setup/coolant_canister/activate() + ..() + var/obj/machinery/atmospherics/portables_connector/P = locate() in get_turf(src) + if(!P) + log_and_message_admins("## ERROR: Unable to locate coolant connector port at [x] [y] [z]!") + return SETUP_ERROR + if(!canister_type) + log_and_message_admins("## ERROR: Canister type unset at [x] [y] [z]!") + return SETUP_ERROR + new canister_type(get_turf(src)) + return SETUP_OK + + + +// Energises the supermatter. Errors when unable to locate supermatter. +/obj/effect/engine_setup/core/ + name = "Supermatter Core Marker" + var/energy_setting = 0 + +/obj/effect/engine_setup/core/activate(var/last = 0) + if(!last) + return SETUP_DELAYED + ..() + var/obj/machinery/power/supermatter/SM = locate() in get_turf(src) + if(!SM) + log_and_message_admins("## ERROR: Unable to locate supermatter core at [x] [y] [z]!") + return SETUP_ERROR + if(!energy_setting) + log_and_message_admins("## ERROR: Energy setting unset at [x] [y] [z]!") + return SETUP_ERROR + SM.power = energy_setting + return SETUP_OK + + + +// Tries to enable the SMES on max input/output settings. With load balancing it should be fine as long as engine outputs at least ~500kW +/obj/effect/engine_setup/smes/ + name = "SMES Marker" + +/obj/effect/engine_setup/smes/activate() + ..() + var/obj/machinery/power/smes/S = locate() in get_turf(src) + if(!S) + log_and_message_admins("## WARNING: Unable to locate SMES unit at [x] [y] [z]!") + return SETUP_WARNING + S.input_attempt = 1 + S.output_attempt = 1 + S.input_level = S.input_level_max + S.output_level = S.output_level_max + S.update_icon() + return SETUP_OK + + + +// Sets up filters. This assumes filters are set to filter out N2 back to the core loop by default! +/obj/effect/engine_setup/filter/ + name = "Omni Filter Marker" + var/coolant = null + +/obj/effect/engine_setup/filter/activate() + ..() + var/obj/machinery/atmospherics/omni/filter/F = locate() in get_turf(src) + if(!F) + log_and_message_admins("## WARNING: Unable to locate omni filter at [x] [y] [z]!") + return SETUP_WARNING + if(!coolant) + log_and_message_admins("## WARNING: No coolant type set at [x] [y] [z]!") + return SETUP_WARNING + + // Non-nitrogen coolant, adjust the filter's config first. + if(coolant != "N2") + for(var/datum/omni_port/P in F.ports) + if(P.mode != ATM_N2) + continue + if(coolant == "PH") + P.mode = ATM_P + break + else if(coolant == "CO2") + P.mode = ATM_CO2 + break + else + log_and_message_admins("## WARNING: Inapropriate filter coolant type set at [x] [y] [z]!") + return SETUP_WARNING + F.rebuild_filtering_list() + + F.use_power = 1 + F.update_icon() + return SETUP_OK + + +#undef SETUP_OK +#undef SETUP_WARNING +#undef SETUP_ERROR +#undef SETUP_DELAYED +#undef ENERGY_NITROGEN +#undef ENERGY_CARBONDIOXIDE +#undef ENERGY_PHORON diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 693bc29368c..479696cdd1f 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -121,10 +121,15 @@ if(lum != light_range || clr != light_color) set_light(lum, l_color = clr) -/obj/machinery/power/supermatter/proc/announce_warning() +/obj/machinery/power/supermatter/proc/get_integrity() var/integrity = damage / explosion_point integrity = round(100 - integrity * 100) integrity = integrity < 0 ? 0 : integrity + return integrity + + +/obj/machinery/power/supermatter/proc/announce_warning() + var/integrity = get_integrity() var/alert_msg = " Integrity at [integrity]%" if(damage > emergency_point) @@ -151,6 +156,19 @@ public_alert = 0 +/obj/machinery/power/supermatter/get_transit_zlevel() + //don't send it back to the station -- most of the time + if(prob(99)) + var/list/candidates = accessible_z_levels.Copy() + for(var/zlevel in config.station_levels) + candidates.Remove("[zlevel]") + candidates.Remove("[src.z]") + + if(candidates.len) + return text2num(pickweight(candidates)) + + return ..() + /obj/machinery/power/supermatter/process() var/turf/L = loc @@ -264,21 +282,22 @@ // Then bring it inside to explode instantly upon landing on a valid turf. + var/proj_damage = Proj.get_structure_damage() if(istype(Proj, /obj/item/projectile/beam)) - power += Proj.damage * config_bullet_energy * CHARGING_FACTOR / POWER_FACTOR + power += proj_damage * config_bullet_energy * CHARGING_FACTOR / POWER_FACTOR else - damage += Proj.damage * config_bullet_energy + damage += proj_damage * config_bullet_energy return 0 /obj/machinery/power/supermatter/attack_robot(mob/user as mob) if(Adjacent(user)) return attack_hand(user) else - user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update." + ui_interact(user) return /obj/machinery/power/supermatter/attack_ai(mob/user as mob) - user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update." + ui_interact(user) /obj/machinery/power/supermatter/attack_hand(mob/user as mob) user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.",\ @@ -287,6 +306,31 @@ Consume(user) +// This is purely informational UI that may be accessed by AIs or robots +/obj/machinery/power/supermatter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + + data["integrity_percentage"] = round(get_integrity()) + var/datum/gas_mixture/env = null + if(!istype(src.loc, /turf/space)) + env = src.loc.return_air() + + if(!env) + data["ambient_temp"] = 0 + data["ambient_pressure"] = 0 + else + data["ambient_temp"] = round(env.temperature) + data["ambient_pressure"] = round(env.return_pressure()) + data["detonating"] = grav_pulling + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "supermatter_crystal.tmpl", "Supermatter Crystal", 500, 300) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + + /* /obj/machinery/power/supermatter/proc/transfer_energy() for(var/obj/machinery/power/rad_collector/R in rad_collectors) @@ -348,7 +392,7 @@ defer_powernet_rebuild = 1 // Let's just make this one loop. for(var/atom/X in orange(pull_radius,src)) - X.singularity_pull(src, STAGE_FIVE) + spawn() X.singularity_pull(src, STAGE_FIVE) if(defer_powernet_rebuild != 2) defer_powernet_rebuild = 0 diff --git a/code/modules/surgery/_defines.dm b/code/modules/surgery/_defines.dm new file mode 100644 index 00000000000..900f3e45456 --- /dev/null +++ b/code/modules/surgery/_defines.dm @@ -0,0 +1 @@ +#define SURGERY_FAILURE -1 diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index b2ccbb10032..25addbd40a4 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -18,7 +18,7 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.open >= 2 && affected.stage == 0 + return affected && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -52,7 +52,7 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.name != "head" && affected.open >= 2 && affected.stage == 1 + return affected && affected.name != "head" && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -91,7 +91,7 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.name == "head" && affected.open >= 2 && affected.stage == 1 + return affected && affected.name == "head" && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \ @@ -127,7 +127,7 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.open >= 2 && affected.stage == 2 + return affected && affected.open >= 2 && !(affected.status & ORGAN_ROBOT) && affected.stage == 2 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) diff --git a/code/modules/surgery/brainrepair.dm b/code/modules/surgery/brainrepair.dm deleted file mode 100644 index 6935b09d244..00000000000 --- a/code/modules/surgery/brainrepair.dm +++ /dev/null @@ -1,70 +0,0 @@ -////////////////////////////////////////////////////////////////// -// BRAIN DAMAGE FIXING // -////////////////////////////////////////////////////////////////// - -/datum/surgery_step/brain/bone_chips - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/weapon/wirecutters = 75, \ - /obj/item/weapon/material/kitchen/utensil/fork = 20 - ) - - priority = 3 - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(!affected) return - var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"] - return (sponge && sponge.damage > 0 && sponge.damage <= 20) && affected.open == 3 - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts taking bone chips out of [target]'s brain with \the [tool].", \ - "You start taking bone chips out of [target]'s brain with \the [tool].") - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] takes out all the bone chips in [target]'s brain with \the [tool].", \ - "\blue You take out all the bone chips in [target]'s brain with \the [tool].") - var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"] - if (sponge) - sponge.damage = 0 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user]'s hand slips, jabbing \the [tool] in [target]'s brain!", \ - "\red Your hand slips, jabbing \the [tool] in [target]'s brain!") - target.apply_damage(30, BRUTE, "head", 1, sharp=1) - -/datum/surgery_step/brain/hematoma - allowed_tools = list( - /obj/item/weapon/FixOVein = 100, \ - /obj/item/stack/cable_coil = 75 - ) - - priority = 3 - min_duration = 90 - max_duration = 110 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(!affected) return - var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"] - return (sponge && sponge.damage > 20) && affected.open == 3 - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts mending hematoma in [target]'s brain with \the [tool].", \ - "You start mending hematoma in [target]'s brain with \the [tool].") - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] mends hematoma in [target]'s brain with \the [tool].", \ - "\blue You mend hematoma in [target]'s brain with \the [tool].") - var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"] - if (sponge) - sponge.damage = 20 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user]'s hand slips, bruising [target]'s brain with \the [tool]!", \ - "\red Your hand slips, bruising [target]'s brain with \the [tool]!") - target.apply_damage(20, BRUTE, "head", 1, sharp=1) \ No newline at end of file diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index 93a1bbf0e5c..762c2b71c46 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -12,7 +12,7 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.encased && affected.open >= 2 + return affected && !(affected.status & ORGAN_ROBOT) && affected.encased && affected.open >= 2 /datum/surgery_step/open_encased/saw diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm deleted file mode 100644 index 7b69fea7ff6..00000000000 --- a/code/modules/surgery/eye.dm +++ /dev/null @@ -1,147 +0,0 @@ -//Procedures in this file: Eye mending surgery -////////////////////////////////////////////////////////////////// -// EYE SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery_step/eye - priority = 2 - can_infect = 1 - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if (!hasorgans(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if (!affected) - return 0 - - var/obj/item/organ/eyes = target.internal_organs_by_name["eyes"] - - return target_zone == "eyes" && eyes - -/datum/surgery_step/eye/cut_open - allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/material/knife = 75, \ - /obj/item/weapon/material/shard = 50, \ - ) - - min_duration = 90 - max_duration = 110 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return ..() - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts to separate the corneas on [target]'s eyes with \the [tool].", \ - "You start to separate the corneas on [target]'s eyes with \the [tool].") - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has separated the corneas on [target]'s eyes with \the [tool]." , \ - "\blue You have separated the corneas on [target]'s eyes with \the [tool].",) - target.op_stage.eyes = 1 - target.blinded += 1.5 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \ - "\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" ) - affected.createwound(CUT, 10) - eyes.take_damage(5, 0) - -/datum/surgery_step/eye/lift_eyes - allowed_tools = list( - /obj/item/weapon/retractor = 100, \ - /obj/item/weapon/material/kitchen/utensil/fork = 50 - ) - - min_duration = 30 - max_duration = 40 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return ..() && target.op_stage.eyes == 1 - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts lifting corneas from [target]'s eyes with \the [tool].", \ - "You start lifting corneas from [target]'s eyes with \the [tool].") - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has lifted the corneas from [target]'s eyes from with \the [tool]." , \ - "\blue You has lifted the corneas from [target]'s eyes from with \the [tool]." ) - target.op_stage.eyes = 2 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \ - "\red Your hand slips, damaging [target]'s eyes with \the [tool]!") - target.apply_damage(10, BRUTE, affected) - eyes.take_damage(5, 0) - -/datum/surgery_step/eye/mend_eyes - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/stack/cable_coil = 75, \ - /obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity. - ) - - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return ..() && target.op_stage.eyes == 2 - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts mending the nerves and lenses in [target]'s eyes with \the [tool].", \ - "You start mending the nerves and lenses in [target]'s eyes with the [tool].") - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] mends the nerves and lenses in [target]'s with \the [tool]." , \ - "\blue You mend the nerves and lenses in [target]'s with \the [tool].") - target.op_stage.eyes = 3 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \ - "\red Your hand slips, stabbing \the [tool] into [target]'s eye!") - target.apply_damage(10, BRUTE, affected, sharp=1) - eyes.take_damage(5, 0) - -/datum/surgery_step/eye/cauterize - allowed_tools = list( - /obj/item/weapon/cautery = 100, \ - /obj/item/clothing/mask/smokable/cigarette = 75, \ - /obj/item/weapon/flame/lighter = 50, \ - /obj/item/weapon/weldingtool = 25 - ) - - min_duration = 70 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - return ..() - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] is beginning to cauterize the incision around [target]'s eyes with \the [tool]." , \ - "You are beginning to cauterize the incision around [target]'s eyes with \the [tool].") - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \ - "\blue You cauterize the incision around [target]'s eyes with \the [tool].") - if (target.op_stage.eyes == 3) - target.disabilities &= ~NEARSIGHTED - target.sdisabilities &= ~BLIND - eyes.damage = 0 - target.op_stage.eyes = 0 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"] - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \ - "\red Your hand slips, searing [target]'s eyes with \the [tool]!") - target.apply_damage(5, BURN, affected) - eyes.take_damage(5, 0) \ No newline at end of file diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 0a42f7c1374..7272ecf49e0 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -10,7 +10,7 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if (!affected) + if (!affected || (affected.status & ORGAN_ROBOT)) return 0 return target_zone == "mouth" diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index ccf0e62bc0f..6e97ecb3633 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -17,8 +17,6 @@ return 0 if (affected.is_stump()) return 0 - if (target_zone == "head" && target.species && (target.species.flags & IS_SYNTHETIC)) - return 1 if (affected.status & ORGAN_ROBOT) return 0 return 1 diff --git a/code/modules/surgery/headreattach.dm b/code/modules/surgery/headreattach.dm deleted file mode 100644 index ad47b144293..00000000000 --- a/code/modules/surgery/headreattach.dm +++ /dev/null @@ -1,33 +0,0 @@ -//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 - - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - 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 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 - user.drop_from_inventory(head) - head.replaced(target) - head.loc = target - head.status = 0 - target.update_body() - target.updatehealth() - target.UpdateDamageIcon() - - 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 neck!", \ - "\red Your hand slips, damaging [target]'s neck!") - target.apply_damage(10, BRUTE, null, sharp=1) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 741d82a250b..36691105aa7 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -32,6 +32,12 @@ return "abdominal" return "" + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) + user.visible_message("\red [user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \ + "\red Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!") + affected.createwound(CUT, 20) + /datum/surgery_step/cavity/make_space allowed_tools = list( /obj/item/weapon/surgicaldrill = 100, \ @@ -60,12 +66,6 @@ user.visible_message("\blue [user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \ "\blue You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." ) - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!") - affected.createwound(CUT, 20) - /datum/surgery_step/cavity/close_space priority = 2 allowed_tools = list( @@ -96,12 +96,6 @@ user.visible_message("\blue [user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \ "\blue You mend [target]'s [get_cavity(affected)] cavity walls with \the [tool]." ) - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!") - affected.createwound(CUT, 20) - /datum/surgery_step/cavity/place_item priority = 0 allowed_tools = list(/obj/item = 100) @@ -135,7 +129,7 @@ user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) - if (tool.w_class > get_max_wclass(affected)/2 && prob(50)) + if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && !(affected.status & ORGAN_ROBOT)) user << "\red You tear some blood vessels trying to fit such a big object in this cavity." var/datum/wound/internal_bleeding/I = new (10) affected.wounds += I @@ -145,12 +139,6 @@ tool.loc = affected affected.cavity = 0 - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!") - affected.createwound(CUT, 20) - ////////////////////////////////////////////////////////////////// // IMPLANT/ITEM REMOVAL SURGERY // ////////////////////////////////////////////////////////////////// @@ -171,9 +159,9 @@ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.name] with \the [tool].", \ - "You start poking around inside the incision on [target]'s [affected.name] with \the [tool]" ) - target.custom_pain("The pain in your chest is living hell!",1) + user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ + "You start poking around inside [target]'s [affected.name] with \the [tool]" ) + target.custom_pain("The pain in your [affected.name] is living hell!",1) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -225,10 +213,8 @@ "\blue You could not find anything inside [target]'s [affected.name]." ) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + ..() var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!") - affected.createwound(CUT, 20) if (affected.implants.len) var/fail_prob = 10 fail_prob += 100 - tool_quality(tool) diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm new file mode 100644 index 00000000000..ef4a0428e37 --- /dev/null +++ b/code/modules/surgery/limb_reattach.dm @@ -0,0 +1,128 @@ +//Procedures in this file: Robotic limbs attachment, meat limbs attachment +////////////////////////////////////////////////////////////////// +// LIMB SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/limb/ + priority = 3 // Must be higher than /datum/surgery_step/internal + can_infect = 0 + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if (affected) + return 0 + var/list/organ_data = target.species.has_limbs["[target_zone]"] + return !isnull(organ_data) + +/datum/surgery_step/limb/attach + allowed_tools = list(/obj/item/organ/external = 100) + + min_duration = 50 + max_duration = 70 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/E = tool + user.visible_message("[user] starts attaching [E.name] to [target]'s [E.amputation_point].", \ + "You start attaching [E.name] to [target]'s [E.amputation_point].") + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/E = tool + user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].", \ + "You have attached [target]'s [E.name] to the [E.amputation_point].") + user.drop_from_inventory(E) + E.replaced(target) + target.update_body() + target.updatehealth() + target.UpdateDamageIcon() + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/E = tool + user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \ + " Your hand slips, damaging [target]'s [E.amputation_point]!") + target.apply_damage(10, BRUTE, null, sharp=1) + +/datum/surgery_step/limb/connect + allowed_tools = list( + /obj/item/weapon/hemostat = 100, \ + /obj/item/stack/cable_coil = 75, \ + /obj/item/device/assembly/mousetrap = 20 + ) + can_infect = 1 + + min_duration = 100 + max_duration = 120 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/E = target.get_organ(target_zone) + return E && !E.is_stump() && (E.status & ORGAN_DESTROYED) + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/E = target.get_organ(target_zone) + user.visible_message("[user] starts connecting tendons and muscles in [target]'s [E.amputation_point] with [tool].", \ + "You start connecting tendons and muscle in [target]'s [E.amputation_point].") + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/E = target.get_organ(target_zone) + user.visible_message("[user] has connected tendons and muscles in [target]'s [E.amputation_point] with [tool].", \ + "You have connected tendons and muscles in [target]'s [E.amputation_point] with [tool].") + E.status &= ~ORGAN_DESTROYED + if(E.children) + for(var/obj/item/organ/external/C in E.children) + C.status &= ~ORGAN_DESTROYED + target.update_body() + target.updatehealth() + target.UpdateDamageIcon() + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/E = tool + user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \ + " Your hand slips, damaging [target]'s [E.amputation_point]!") + target.apply_damage(10, BRUTE, null, sharp=1) + +/datum/surgery_step/limb/mechanize + allowed_tools = list(/obj/item/robot_parts = 100) + + min_duration = 80 + max_duration = 100 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(..()) + var/obj/item/robot_parts/p = tool + if (p.part) + if (!(target_zone in p.part)) + return 0 + return isnull(target.get_organ(target_zone)) + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts attaching \the [tool] to [target].", \ + "You start attaching \the [tool] to [target].") + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/robot_parts/L = tool + user.visible_message("[user] has attached \the [tool] to [target].", \ + "You have attached \the [tool] to [target].") + + if(L.part) + for(var/part_name in L.part) + if(!isnull(target.get_organ(part_name))) + continue + var/list/organ_data = target.species.has_limbs["[part_name]"] + if(!organ_data) + continue + var/new_limb_type = organ_data["path"] + var/obj/item/organ/external/new_limb = new new_limb_type(target) + new_limb.robotize(L.model_info) + if(L.sabotaged) + new_limb.sabotaged = 1 + + target.update_body() + target.updatehealth() + target.UpdateDamageIcon() + + qdel(tool) + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(" [user]'s hand slips, damaging [target]'s flesh!", \ + " Your hand slips, damaging [target]'s flesh!") + target.apply_damage(10, BRUTE, null, sharp=1) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 90c77a4b790..0c48a4ce8c9 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -12,46 +12,6 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) return affected && affected.open == (affected.encased ? 3 : 2) -////////////////////////////////////////////////////////////////// -// ALIEN EMBRYO SURGERY // -////////////////////////////////////////////////////////////////// -/datum/surgery_step/internal/remove_embryo - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/weapon/wirecutters = 75, \ - /obj/item/weapon/material/kitchen/utensil/fork = 20 - ) - blood_level = 2 - - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/embryo = 0 - for(var/obj/item/alien_embryo/A in target) - embryo = 1 - break - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - return ..() && affected && embryo && affected.open == 3 && target_zone == "chest" - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]." - var/self_msg = "You start to pull something out from [target]'s ribcage with \the [tool]." - user.visible_message(msg, self_msg) - target.custom_pain("Something hurts horribly in your chest!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user] rips the larva out of [target]'s ribcage!", - "You rip the larva out of [target]'s ribcage!") - - for(var/obj/item/alien_embryo/A in target) - A.loc = A.loc.loc - - ////////////////////////////////////////////////////////////////// // CHEST INTERNAL ORGAN SURGERY // ////////////////////////////////////////////////////////////////// @@ -112,8 +72,8 @@ for(var/obj/item/organ/I in affected.internal_organs) if(I && I.damage > 0) if(I.robotic < 2) - user.visible_message("\blue [user] treats damage to [target]'s [I.name] with [tool_name].", \ - "\blue You treat damage to [target]'s [I.name] with [tool_name]." ) + user.visible_message("[user] treats damage to [target]'s [I.name] with [tool_name].", \ + "You treat damage to [target]'s [I.name] with [tool_name]." ) I.damage = 0 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -122,8 +82,8 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!") var/dam_amt = 2 if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) @@ -138,75 +98,6 @@ if(I && I.damage > 0) I.take_damage(dam_amt,0) -/datum/surgery_step/internal/fix_organ_robotic //For artificial organs - allowed_tools = list( - /obj/item/stack/nanopaste = 100, \ - /obj/item/weapon/bonegel = 30, \ - /obj/item/weapon/screwdriver = 70, \ - ) - - min_duration = 70 - max_duration = 90 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(!affected) return - var/is_organ_damaged = 0 - for(var/obj/item/organ/I in affected.internal_organs) - if(I.damage > 0 && I.robotic >= 2) - is_organ_damaged = 1 - break - return ..() && is_organ_damaged - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - for(var/obj/item/organ/I in affected.internal_organs) - if(I && I.damage > 0) - if(I.robotic >= 2) - user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \ - "You start mending the damage to [target]'s [I.name]'s mechanisms." ) - - target.custom_pain("The pain in your [affected.name] is living hell!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - for(var/obj/item/organ/I in affected.internal_organs) - - if(I && I.damage > 0) - if(I.robotic >= 2) - user.visible_message("\blue [user] repairs [target]'s [I.name] with [tool].", \ - "\blue You repair [target]'s [I.name] with [tool]." ) - I.damage = 0 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - user.visible_message("\red [user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!") - - target.adjustToxLoss(5) - affected.createwound(CUT, 5) - - for(var/obj/item/organ/I in affected.internal_organs) - if(I) - I.take_damage(rand(3,5),0) - - /datum/surgery_step/internal/detatch_organ allowed_tools = list( @@ -223,6 +114,11 @@ if (!..()) return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + if(!(affected && !(affected.status & ORGAN_ROBOT))) + return 0 + target.op_stage.current_organ = null var/list/attached_organs = list() @@ -249,8 +145,8 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has separated [target]'s [target.op_stage.current_organ] with \the [tool]." , \ - "\blue You have separated [target]'s [target.op_stage.current_organ] with \the [tool].") + user.visible_message("[user] has separated [target]'s [target.op_stage.current_organ] with \the [tool]." , \ + "You have separated [target]'s [target.op_stage.current_organ] with \the [tool].") var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] if(I && istype(I)) @@ -258,8 +154,8 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!") affected.createwound(CUT, rand(30,50), 1) /datum/surgery_step/internal/remove_organ @@ -283,7 +179,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.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) removable_organs |= organ var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs @@ -300,8 +196,8 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has removed [target]'s [target.op_stage.current_organ] with \the [tool].", \ - "\blue You have removed [target]'s [target.op_stage.current_organ] with \the [tool].") + user.visible_message("[user] has removed [target]'s [target.op_stage.current_organ] with \the [tool].", \ + "You have removed [target]'s [target.op_stage.current_organ] with \the [tool].") // Extract the organ! if(target.op_stage.current_organ) @@ -313,8 +209,8 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") affected.createwound(BRUISE, 20) /datum/surgery_step/internal/replace_organ @@ -336,9 +232,13 @@ if(!istype(O)) return 0 + if((affected.status & ORGAN_ROBOT) && !(O.status & ORGAN_ROBOT)) + user << "You cannot install a naked organ into a robotic body." + return SURGERY_FAILURE + if(!target.species) - user << "\red You have no idea what species this person is. Report this on the bug tracker." - return 2 + user << "You have no idea what species this person is. Report this on the bug tracker." + return SURGERY_FAILURE var/o_is = (O.gender == PLURAL) ? "are" : "is" var/o_a = (O.gender == PLURAL) ? "" : "a " @@ -349,23 +249,23 @@ else if(target.species.has_organ[O.organ_tag]) if(O.damage > (O.max_damage * 0.75)) - user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." - return 2 + user << "\The [O.organ_tag] [o_is] in no state to be transplanted." + return SURGERY_FAILURE if(!target.internal_organs_by_name[O.organ_tag]) organ_missing = 1 else - user << "\red \The [target] already has [o_a][O.organ_tag]." - return 2 + user << "\The [target] already has [o_a][O.organ_tag]." + return SURGERY_FAILURE if(O && affected.limb_name == O.parent_organ) organ_compatible = 1 else - user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.name]." - return 2 + user << "\The [O.organ_tag] [o_do] normally go in \the [affected.name]." + return SURGERY_FAILURE else - user << "\red You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag]." - return 2 + user << "You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag]." + return SURGERY_FAILURE return ..() && organ_missing && organ_compatible @@ -378,8 +278,8 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] has transplanted \the [tool] into [target]'s [affected.name].", \ - "\blue You have transplanted \the [tool] into [target]'s [affected.name].") + user.visible_message("[user] has transplanted \the [tool] into [target]'s [affected.name].", \ + "You have transplanted \the [tool] into [target]'s [affected.name].") var/obj/item/organ/O = tool if(istype(O)) user.remove_from_mob(O) @@ -387,8 +287,8 @@ playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\red [user]'s hand slips, damaging \the [tool]!", \ - "\red Your hand slips, damaging \the [tool]!") + user.visible_message("[user]'s hand slips, damaging \the [tool]!", \ + "Your hand slips, damaging \the [tool]!") var/obj/item/organ/I = tool if(istype(I)) I.take_damage(rand(3,5),0) @@ -412,7 +312,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 && I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone) + if(I && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && 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 @@ -429,8 +329,8 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \ - "\blue You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].") + user.visible_message("[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \ + "You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].") var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] if(I && istype(I)) @@ -438,8 +338,8 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") + user.visible_message("[user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") affected.createwound(BRUISE, 20) ////////////////////////////////////////////////////////////////// diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 7c79e508ddd..fc2e6c5bd6f 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -88,8 +88,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] has cut away necrotic tissue in [target]'s [affected.name] with \the [tool].", \ "\blue You have cut away necrotic tissue in [target]'s [affected.name] with \the [tool].") - affected.open = 3 - playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) + affected.status &= ~ORGAN_DEAD fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -188,7 +187,7 @@ return 0 if(istype(tool,/obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/welder = tool - if(!welder.isOn()) + if(!welder.isOn() || !welder.remove_fuel(1,user)) return 0 return (target_zone == "chest") && istype(target.back, /obj/item/weapon/rig) && !(target.back.canremove) diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm deleted file mode 100644 index d8214837bf6..00000000000 --- a/code/modules/surgery/robolimbs.dm +++ /dev/null @@ -1,62 +0,0 @@ -//Procedures in this file: Robotic limbs attachment -////////////////////////////////////////////////////////////////// -// LIMB SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery_step/limb/ - can_infect = 0 - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if (!hasorgans(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if (affected) - return 0 - var/list/organ_data = target.species.has_limbs["[target_zone]"] - return !isnull(organ_data) && !(target_zone in list("head","groin","chest")) - -/datum/surgery_step/limb/attach - allowed_tools = list(/obj/item/robot_parts = 100) - - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if(..()) - var/obj/item/robot_parts/p = tool - if (p.part) - if (!(target_zone in p.part)) - return 0 - return isnull(target.get_organ(target_zone)) - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts attaching \the [tool] to [target].", \ - "You start attaching \the [tool] to [target].") - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/robot_parts/L = tool - user.visible_message("\blue [user] has attached \the [tool] to [target].", \ - "\blue You have attached \the [tool] to [target].") - - if(L.part) - for(var/part_name in L.part) - if(!isnull(target.get_organ(part_name))) - continue - var/list/organ_data = target.species.has_limbs["[part_name]"] - if(!organ_data) - continue - var/new_limb_type = organ_data["path"] - var/obj/item/organ/external/new_limb = new new_limb_type(target) - new_limb.robotize(L.model_info) - if(L.sabotaged) - new_limb.sabotaged = 1 - - target.update_body() - target.updatehealth() - target.UpdateDamageIcon() - - 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!", \ - "\red Your hand slips, damaging [target]'s flesh!") - target.apply_damage(10, BRUTE, null, sharp=1) diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm new file mode 100644 index 00000000000..24bc8484722 --- /dev/null +++ b/code/modules/surgery/robotics.dm @@ -0,0 +1,430 @@ +//Procedures in this file: Gneric surgery steps +////////////////////////////////////////////////////////////////// +// COMMON STEPS // +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/robotics/ + can_infect = 0 + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (isslime(target)) + return 0 + if (target_zone == "eyes") //there are specific steps for eye surgery + return 0 + if (!hasorgans(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if (affected == null) + return 0 + if (affected.status & ORGAN_DESTROYED) + return 0 + if (!(affected.status & ORGAN_ROBOT)) + return 0 + return 1 + +/datum/surgery_step/robotics/unscrew_hatch + allowed_tools = list( + /obj/item/weapon/screwdriver = 100, + /obj/item/weapon/coin = 50, + /obj/item/weapon/material/kitchen/utensil/knife = 50 + ) + + min_duration = 90 + max_duration = 110 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(..()) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + return affected && affected.open == 0 && target_zone != "mouth" + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ + "You start to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].") + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ + "You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].",) + affected.open = 1 + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \ + "Your [tool] slips, failing to unscrew [target]'s [affected.name].") + +/datum/surgery_step/robotics/open_hatch + allowed_tools = list( + /obj/item/weapon/retractor = 100, + /obj/item/weapon/crowbar = 100, + /obj/item/weapon/material/kitchen/utensil = 50 + ) + + min_duration = 30 + max_duration = 40 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(..()) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + return affected && affected.open == 1 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].", + "You start to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].") + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ + "You open the maintenance hatch on [target]'s [affected.name] with \the [tool].") + affected.open = 2 + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].", + "Your [tool] slips, failing to open the hatch on [target]'s [affected.name].") + +/datum/surgery_step/robotics/close_hatch + allowed_tools = list( + /obj/item/weapon/retractor = 100, + /obj/item/weapon/crowbar = 100, + /obj/item/weapon/material/kitchen/utensil = 50 + ) + + min_duration = 70 + max_duration = 100 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(..()) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + return affected && affected.open && target_zone != "mouth" + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool]." , \ + "You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].") + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \ + "You close and secure the hatch on [target]'s [affected.name] with \the [tool].") + affected.open = 0 + affected.germ_level = 0 + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].", + "Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].") + +/datum/surgery_step/robotics/repair_brute + allowed_tools = list( + /obj/item/weapon/weldingtool = 100, + /obj/item/weapon/pickaxe/plasmacutter = 50 + ) + + min_duration = 50 + max_duration = 60 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(..()) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(istype(tool,/obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/welder = tool + if(!welder.isOn() || !welder.remove_fuel(1,user)) + return 0 + return affected && affected.open == 2 && affected.brute_dam > 0 && target_zone != "mouth" + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] begins to patch damage to [target]'s [affected.name]'s support structure with \the [tool]." , \ + "You begin to patch damage to [target]'s [affected.name]'s support structure with \the [tool].") + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] finishes patching damage to [target]'s [affected.name] with \the [tool].", \ + "You finish patching damage to [target]'s [affected.name] with \the [tool].") + affected.heal_damage(rand(30,50),0,1,1) + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].", + "Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].") + target.apply_damage(rand(5,10), BURN, affected) + +/datum/surgery_step/robotics/repair_burn + allowed_tools = list( + /obj/item/stack/cable_coil = 100 + ) + + min_duration = 50 + max_duration = 60 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(..()) + var/obj/item/stack/cable_coil/C = tool + var/obj/item/organ/external/affected = target.get_organ(target_zone) + var/limb_can_operate = (affected && affected.open == 2 && affected.burn_dam > 0 && target_zone != "mouth") + if(limb_can_operate) + if(istype(C)) + if(!C.get_amount() >= 3) + user << "You need three or more cable pieces to repair this damage." + return SURGERY_FAILURE + C.use(3) + return 1 + return 0 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] begins to splice new cabling into [target]'s [affected.name]." , \ + "You begin to splice new cabling into [target]'s [affected.name].") + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] finishes splicing cable into [target]'s [affected.name].", \ + "You finishes splicing new cable into [target]'s [affected.name].") + affected.heal_damage(0,rand(30,50),1,1) + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] causes a short circuit in [target]'s [affected.name]!", + "You cause a short circuit in [target]'s [affected.name]!") + target.apply_damage(rand(5,10), BURN, affected) + +/datum/surgery_step/robotics/fix_organ_robotic //For artificial organs + allowed_tools = list( + /obj/item/stack/nanopaste = 100, \ + /obj/item/weapon/bonegel = 30, \ + /obj/item/weapon/screwdriver = 70, \ + ) + + min_duration = 70 + max_duration = 90 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(!affected) return + var/is_organ_damaged = 0 + for(var/obj/item/organ/I in affected.internal_organs) + if(I.damage > 0 && I.robotic >= 2) + is_organ_damaged = 1 + break + return affected.open == 2 && is_organ_damaged + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + for(var/obj/item/organ/I in affected.internal_organs) + if(I && I.damage > 0) + if(I.robotic >= 2) + user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \ + "You start mending the damage to [target]'s [I.name]'s mechanisms." ) + + target.custom_pain("The pain in your [affected.name] is living hell!",1) + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + for(var/obj/item/organ/I in affected.internal_organs) + + if(I && I.damage > 0) + if(I.robotic >= 2) + user.visible_message("[user] repairs [target]'s [I.name] with [tool].", \ + "You repair [target]'s [I.name] with [tool]." ) + I.damage = 0 + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + user.visible_message("[user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!") + + target.adjustToxLoss(5) + affected.createwound(CUT, 5) + + for(var/obj/item/organ/I in affected.internal_organs) + if(I) + I.take_damage(rand(3,5),0) + +/datum/surgery_step/robotics/detatch_organ_robotic + + allowed_tools = list( + /obj/item/device/multitool = 100 + ) + + min_duration = 90 + max_duration = 110 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(!(affected && (affected.status & ORGAN_ROBOT))) + return 0 + if(affected.open != 2) + return 0 + + target.op_stage.current_organ = null + + 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 && !(I.status & ORGAN_CUT_AWAY) && 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 + if(!organ_to_remove) + return 0 + + target.op_stage.current_organ = organ_to_remove + + return ..() && organ_to_remove + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts to decouple [target]'s [target.op_stage.current_organ] with \the [tool].", \ + "You start to decouple [target]'s [target.op_stage.current_organ] with \the [tool]." ) + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool]." , \ + "You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].") + + var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] + if(I && istype(I)) + I.status |= ORGAN_CUT_AWAY + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user]'s hand slips, disconnecting \the [tool].", \ + "Your hand slips, disconnecting \the [tool].") + +/datum/surgery_step/robotics/attach_organ_robotic + allowed_tools = list( + /obj/item/weapon/screwdriver = 100, + ) + + min_duration = 100 + max_duration = 120 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(!(affected && (affected.status & ORGAN_ROBOT))) + return 0 + if(affected.open != 2) + return 0 + + target.op_stage.current_organ = null + + 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 && (I.status & ORGAN_CUT_AWAY) && (I.status & ORGAN_ROBOT) && 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 + if(!organ_to_replace) + return 0 + + target.op_stage.current_organ = organ_to_replace + return ..() + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \ + "You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].") + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \ + "You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].") + + var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ] + if(I && istype(I)) + I.status &= ~ORGAN_CUT_AWAY + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user]'s hand slips, disconnecting \the [tool].", \ + "Your hand slips, disconnecting \the [tool].") + +/datum/surgery_step/robotics/install_mmi + allowed_tools = list( + /obj/item/device/mmi = 100 + ) + + min_duration = 60 + max_duration = 80 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + if(target_zone != "head") + return + + var/obj/item/device/mmi/M = tool + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(!(affected && affected.open == 2)) + return 0 + + if(!istype(M)) + return 0 + + if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD) + user << "That brain is not usable." + return SURGERY_FAILURE + + if(!(affected.status & ORGAN_ROBOT)) + user << "You cannot install a computer brain into a meat skull." + return SURGERY_FAILURE + + if(!target.species) + user << "You have no idea what species this person is. Report this on the bug tracker." + return SURGERY_FAILURE + + if(!target.species.has_organ["brain"]) + user << "You're pretty sure [target.species.name_plural] don't normally have a brain." + return SURGERY_FAILURE + + if(!isnull(target.internal_organs["brain"])) + user << "Your subject already has a brain." + return SURGERY_FAILURE + + return 1 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts installing \the [tool] into [target]'s [affected.name].", \ + "You start installing \the [tool] into [target]'s [affected.name].") + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] has installed \the [tool] into [target]'s [affected.name].", \ + "You have installed \the [tool] into [target]'s [affected.name].") + + var/obj/item/device/mmi/M = tool + var/obj/item/organ/mmi_holder/holder = new(target, 1) + target.internal_organs_by_name["brain"] = holder + user.drop_from_inventory(tool) + tool.loc = holder + holder.stored_mmi = tool + holder.update_from_mmi() + + if(M.brainmob && M.brainmob.mind) + M.brainmob.mind.transfer_to(target) + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user]'s hand slips.", \ + "Your hand slips.") \ No newline at end of file diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 6e57a4f37b4..e582d1222f7 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -84,14 +84,14 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) return 0 var/zone = user.zone_sel.selecting if(zone in M.op_stage.in_progress) //Can't operate on someone repeatedly. - user << "\red You can't operate on this area while surgery is already in progress." + user << "You can't operate on this area while surgery is already in progress." return 1 for(var/datum/surgery_step/S in surgery_steps) //check if tool is right or close enough and if this step is possible if(S.tool_quality(tool)) var/step_is_valid = S.can_use(user, M, zone, tool) if(step_is_valid && S.is_valid_target(M)) - if(step_is_valid == 2) // This is a failure that already has a message for failing. + if(step_is_valid == SURGERY_FAILURE) // This is a failure that already has a message for failing. return 1 M.op_stage.in_progress += zone S.begin_step(user, M, zone, tool) //start on it @@ -101,7 +101,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) else if ((tool in user.contents) && user.Adjacent(M)) //or S.fail_step(user, M, zone, tool) //malpractice~ else // This failing silently was a pain. - user << "\red You must remain close to your patient to conduct surgery." + user << "You must remain close to your patient to conduct surgery." M.op_stage.in_progress -= zone // Clear the in-progress flag. if (ishuman(M)) var/mob/living/carbon/human/H = M @@ -109,8 +109,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) return 1 //don't want to do weapony things after surgery if (user.a_intent == I_HELP) - user << "\red You can't see any useful way to use [tool] on [M]." - return 1 + user << "You can't see any useful way to use [tool] on [M]." return 0 proc/sort_surgeries() diff --git a/code/modules/surgery/~defines.dm b/code/modules/surgery/~defines.dm new file mode 100644 index 00000000000..6b27ac56f5b --- /dev/null +++ b/code/modules/surgery/~defines.dm @@ -0,0 +1 @@ +#undef SURGERY_FAILURE diff --git a/code/modules/tables/debug.dm b/code/modules/tables/debug.dm new file mode 100644 index 00000000000..d1b7a968a93 --- /dev/null +++ b/code/modules/tables/debug.dm @@ -0,0 +1,22 @@ + +// Mostly for debugging table connections +// This file is not #included in the .dme. + +/obj/structure/table/debug + New() + material = get_material_by_name("debugium") + ..() + +/material/debug + name = "debugium" + stack_type = /obj/item/stack/material/debug + icon_base = "debug" + icon_reinf = "rdebug" + icon_colour = "#FFFFFF" + +/obj/item/stack/material/debug + name = "debugium" + icon = 'icons/obj/tables.dmi' + icon_state = "debugium" + default_type = "debugium" + diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 10f595f16a4..b9a2980efac 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -63,8 +63,9 @@ take_damage(rand(50,150)) -/obj/structure/table/New() +/obj/structure/table/initialize() ..() + // One table per turf. for(var/obj/structure/table/T in loc) if(T != src) @@ -73,8 +74,6 @@ break_to_parts(full_return = 1) return -/obj/structure/table/initialize() - ..() // reset color/alpha, since they're set for nice map previews color = "#ffffff" alpha = 255 @@ -308,29 +307,33 @@ icon_state = "blank" overlays.Cut() + var/image/I + // Base frame shape. Mostly done for glass/diamond tables, where this is visible. - for(var/n in connections) - overlays += n + for(var/i = 1 to 4) + I = image(icon, dir = 1<<(i-1), icon_state = connections[i]) + overlays += I // Standard table image if(material) - for(var/n in connections) - var/image/I = image(icon, "[material.icon_base]_[n]") - I.color = material.icon_colour + for(var/i = 1 to 4) + I = image(icon, "[material.icon_base]_[connections[i]]", dir = 1<<(i-1)) + if(material.icon_colour) I.color = material.icon_colour I.alpha = 255 * material.opacity overlays += I // Reinforcements if(reinforced) - for(var/n in connections) - var/image/I = image(icon, "[reinforced.icon_reinf]_[n]") + for(var/i = 1 to 4) + I = image(icon, "[reinforced.icon_reinf]_[connections[i]]", dir = 1<<(i-1)) I.color = reinforced.icon_colour I.alpha = 255 * reinforced.opacity overlays += I if(carpeted) - for(var/n in connections) - overlays += "carpet_[n]" + for(var/i = 1 to 4) + I = image(icon, "carpet_[connections[i]]", dir = 1<<(i-1)) + overlays += I else overlays.Cut() var/type = 0 @@ -365,13 +368,12 @@ overlays += I if(carpeted) - for(var/n in connections) - overlays += "carpet_flip[type]" + overlays += "carpet_flip[type]" // set propagate if you're updating a table that should update tables around it too, for example if it's a new table or something important has changed (like material). /obj/structure/table/proc/update_connections(propagate=0) if(!material) - connections = list("nw0", "ne0", "sw0", "se0") + connections = list("0", "0", "0", "0") if(propagate) for(var/obj/structure/table/T in oview(src, 1)) @@ -381,7 +383,7 @@ var/list/blocked_dirs = list() for(var/obj/structure/window/W in get_turf(src)) if(W.is_fulltile()) - connections = list("nw0", "ne0", "sw0", "se0") + connections = list("0", "0", "0", "0") return blocked_dirs |= W.dir @@ -424,42 +426,36 @@ connections = dirs_to_corner_states(connection_dirs) #define CORNER_NONE 0 -#define CORNER_EASTWEST 1 +#define CORNER_COUNTERCLOCKWISE 1 #define CORNER_DIAGONAL 2 -#define CORNER_NORTHSOUTH 4 +#define CORNER_CLOCKWISE 4 + +/* + turn() is weird: + turn(icon, angle) turns icon by angle degrees clockwise + turn(matrix, angle) turns matrix by angle degrees clockwise + turn(dir, angle) turns dir by angle degrees counter-clockwise +*/ /proc/dirs_to_corner_states(list/dirs) if(!istype(dirs)) return - var/NE = CORNER_NONE - var/NW = CORNER_NONE - var/SE = CORNER_NONE - var/SW = CORNER_NONE + var/list/ret = list(NORTHWEST, SOUTHEAST, NORTHEAST, SOUTHWEST) - if(NORTH in dirs) - NE |= CORNER_NORTHSOUTH - NW |= CORNER_NORTHSOUTH - if(SOUTH in dirs) - SW |= CORNER_NORTHSOUTH - SE |= CORNER_NORTHSOUTH - if(EAST in dirs) - SE |= CORNER_EASTWEST - NE |= CORNER_EASTWEST - if(WEST in dirs) - NW |= CORNER_EASTWEST - SW |= CORNER_EASTWEST - if(NORTHWEST in dirs) - NW |= CORNER_DIAGONAL - if(NORTHEAST in dirs) - NE |= CORNER_DIAGONAL - if(SOUTHEAST in dirs) - SE |= CORNER_DIAGONAL - if(SOUTHWEST in dirs) - SW |= CORNER_DIAGONAL + for(var/i = 1 to ret.len) + var/dir = ret[i] + . = CORNER_NONE + if(dir in dirs) + . |= CORNER_DIAGONAL + if(turn(dir,45) in dirs) + . |= CORNER_COUNTERCLOCKWISE + if(turn(dir,-45) in dirs) + . |= CORNER_CLOCKWISE + ret[i] = "[.]" - return list("ne[NE]", "se[SE]", "sw[SW]", "nw[NW]") + return ret #undef CORNER_NONE -#undef CORNER_EASTWEST +#undef CORNER_COUNTERCLOCKWISE #undef CORNER_DIAGONAL -#undef CORNER_NORTHSOUTH +#undef CORNER_CLOCKWISE diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 14eb5569590..a8c089e1e40 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -18,7 +18,7 @@ /obj/item/bluespace_crystal/attack_self(mob/user) user.visible_message("[user] crushes [src]!", "You crush [src]!") - PoolOrNew(/obj/effect/effect/sparks, loc) + PoolOrNew(/obj/effect/sparks, loc) playsound(src.loc, "sparks", 50, 1) blink_mob(user) user.unEquip(src) @@ -31,7 +31,7 @@ if(!..()) // not caught in mid-air visible_message("[src] fizzles and disappears upon impact!") var/turf/T = get_turf(hit_atom) - PoolOrNew(/obj/effect/effect/sparks, T) + PoolOrNew(/obj/effect/sparks, T) playsound(src.loc, "sparks", 50, 1) if(isliving(hit_atom)) blink_mob(hit_atom) @@ -43,4 +43,4 @@ name = "artificial bluespace crystal" desc = "An artificially made bluespace crystal, it looks delicate." origin_tech = "bluespace=2" - blink_range = 4 // Not as good as the organic stuff! \ No newline at end of file + blink_range = 4 // Not as good as the organic stuff! diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm new file mode 100644 index 00000000000..8136b06353e --- /dev/null +++ b/code/modules/vehicles/bike.dm @@ -0,0 +1,142 @@ +/obj/vehicle/bike/ + name = "space-bike" + desc = "Space wheelies! Woo! " + icon = 'icons/obj/bike.dmi' + icon_state = "bike_off" + dir = SOUTH + + load_item_visible = 1 + mob_offset_y = 5 + health = 100 + maxhealth = 100 + + fire_dam_coeff = 0.6 + brute_dam_coeff = 0.5 + var/protection_percent = 60 + + var/land_speed = 10 //if 0 it can't go on turf + var/space_speed = 1 + var/bike_icon = "bike" + + var/datum/effect/effect/system/ion_trail_follow/ion + var/kickstand = 1 + +/obj/vehicle/bike/New() + ..() + ion = new /datum/effect/effect/system/ion_trail_follow() + ion.set_up(src) + turn_off() + overlays += image('icons/obj/bike.dmi', "[icon_state]_off_overlay", MOB_LAYER + 1) + icon_state = "[bike_icon]_off" + +/obj/vehicle/bike/verb/toggle() + set name = "Toggle Engine" + set category = "Vehicle" + set src in view(0) + + if(usr.incapacitated()) return + + if(!on) + turn_on() + src.visible_message("\The [src] rumbles to life.", "You hear something rumble deeply.") + else + turn_off() + src.visible_message("\The [src] putters before turning off.", "You hear something putter slowly.") + +/obj/vehicle/bike/verb/kickstand() + set name = "Toggle Kickstand" + set category = "Vehicle" + set src in view(0) + + if(usr.incapacitated()) return + + if(kickstand) + src.visible_message("You put up \the [src]'s kickstand.") + else + if(istype(src.loc,/turf/space)) + usr << " You don't think kickstands work in space..." + return + src.visible_message("You put down \the [src]'s kickstand.") + if(pulledby) + pulledby.stop_pulling() + + kickstand = !kickstand + anchored = (kickstand || on) + +/obj/vehicle/bike/load(var/atom/movable/C) + var/mob/living/M = C + if(!istype(C)) return 0 + if(M.buckled || M.restrained() || !Adjacent(M) || !M.Adjacent(src)) + return 0 + return ..(M) + +/obj/vehicle/bike/MouseDrop_T(var/atom/movable/C, mob/user as mob) + if(!load(C)) + user << " You were unable to load \the [C] onto \the [src]." + return + +/obj/vehicle/bike/attack_hand(var/mob/user as mob) + if(user == load) + unload(load) + user << "You unbuckle yourself from \the [src]" + +/obj/vehicle/bike/relaymove(mob/user, direction) + if(user != load || !on) + return + return Move(get_step(src, direction)) + +/obj/vehicle/bike/Move(var/turf/destination) + if(kickstand) return + + + //these things like space, not turf. Dragging shouldn't weigh you down. + if(istype(destination,/turf/space) || pulledby) + if(!space_speed) + return 0 + move_delay = space_speed + else + if(!land_speed) + return 0 + move_delay = land_speed + return ..() + +/obj/vehicle/bike/turn_on() + ion.start() + anchored = 1 + + update_icon() + + if(pulledby) + pulledby.stop_pulling() + ..() +/obj/vehicle/bike/turn_off() + ion.stop() + anchored = kickstand + + update_icon() + + ..() + +/obj/vehicle/bike/bullet_act(var/obj/item/projectile/Proj) + if(buckled_mob && prob(protection_percent)) + buckled_mob.bullet_act(Proj) + return + ..() + +/obj/vehicle/bike/update_icon() + overlays.Cut() + + if(on) + overlays += image('icons/obj/bike.dmi', "[bike_icon]_on_overlay", MOB_LAYER + 1) + icon_state = "[bike_icon]_on" + else + overlays += image('icons/obj/bike.dmi', "[bike_icon]_off_overlay", MOB_LAYER + 1) + icon_state = "[bike_icon]_off" + + ..() + + +/obj/vehicle/bike/Destroy() + qdel(ion) + + ..() \ No newline at end of file diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index c3bdc7b742d..b44b27582fe 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -93,6 +93,7 @@ if(health < maxhealth) if(open) health = min(maxhealth, health+10) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.visible_message("\red [user] repairs [src]!","\blue You repair [src]!") else user << "Unable to repair with the maintenance panel closed." @@ -100,9 +101,8 @@ user << "[src] does not need a repair." else user << "Unable to repair while [src] is off." - else if(istype(W, /obj/item/weapon/card/emag) && !emagged) - Emag(user) else if(hasvar(W,"force") && hasvar(W,"damtype")) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) switch(W.damtype) if("fire") health -= W.force * fire_dam_coeff @@ -114,24 +114,15 @@ ..() /obj/vehicle/bullet_act(var/obj/item/projectile/Proj) - if (Proj.damage_type == BRUTE || Proj.damage_type == BURN) - health -= Proj.damage + health -= Proj.get_structure_damage() ..() if (prob(20)) - PoolOrNew(/obj/effect/effect/sparks, loc) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) healthcheck() -/obj/vehicle/meteorhit() - explode() - return - -/obj/vehicle/blob_act() - src.health -= rand(20,40)*fire_dam_coeff - healthcheck() - return - /obj/vehicle/ex_act(severity) switch(severity) if(1.0) @@ -194,12 +185,13 @@ set_light(0) update_icon() -/obj/vehicle/proc/Emag(mob/user as mob) - emagged = 1 - - if(locked) - locked = 0 - user << "You bypass [src]'s controls." +/obj/vehicle/emag_act(var/remaining_charges, mob/user as mob) + if(!emagged) + emagged = 1 + if(locked) + locked = 0 + user << "You bypass [src]'s controls." + return 1 /obj/vehicle/proc/explode() src.visible_message("\red [src] blows apart!", 1) diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm index 3cd24061d5b..dad0a309255 100644 --- a/code/modules/virus2/admin.dm +++ b/code/modules/virus2/admin.dm @@ -15,6 +15,20 @@ return 1 +/datum/disease2/disease/get_view_variables_header() + . = list() + for(var/datum/disease2/effectholder/E in effects) + . += "[E.stage]: [E.effect.name]" + return {" + [name()]
    + [list2text(., "
    ")]
    + "} + +/datum/disease2/disease/get_view_variables_options() + return ..() + {" + + "} + /datum/admins/var/datum/virus2_editor/virus2_editor_datum = new /client/proc/virus2_editor() set name = "Virus Editor" @@ -73,10 +87,11 @@ var/f = 1 for(var/k in all_species) var/datum/species/S = all_species[k] - if(!(S.flags & IS_SYNTHETIC)) - if(!f) H += " | " - else f = 0 - H += "[k]" + if(S.virus_immune) + continue + if(!f) H += " | " + else f = 0 + H += "[k]" H += {" Reset
    diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm index ccbbbed9a2c..d6c5189f191 100644 --- a/code/modules/virus2/curer.dm +++ b/code/modules/virus2/curer.dm @@ -1,7 +1,8 @@ /obj/machinery/computer/curer name = "cure research machine" icon = 'icons/obj/computer.dmi' - icon_state = "dna" + icon_keyboard = "med_key" + icon_screen = "dna" circuit = /obj/item/weapon/circuitboard/curefab var/curing var/virusing @@ -18,7 +19,7 @@ return if(istype(I,/obj/item/weapon/virusdish)) if(virusing) - user << "The pathogen materializer is still recharging.." + user << "The pathogen materializer is still recharging.." return var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index a31b4542d5a..81a57dd3008 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -45,7 +45,7 @@ var/list/res = list() for (var/specie in all_species) var/datum/species/S = all_species[specie] - if(!(S.flags & IS_SYNTHETIC) && S.flags & CAN_JOIN) + if(!S.virus_immune) meat += S if(meat.len) var/num = rand(1,meat.len) @@ -69,6 +69,12 @@ if(prob(5)) mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily + // Some species are flat out immune to organic viruses. + var/mob/living/carbon/human/H = mob + if(istype(H) && H.species.virus_immune) + cure(mob) + return + if(mob.radiation > 50) if(prob(1)) majormutate() @@ -264,4 +270,4 @@ proc/virology_letterhead(var/report_name) if(H.effect.type == type) return 0 - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index 4ff37034b71..71621448612 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -1,7 +1,8 @@ /obj/machinery/computer/diseasesplicer name = "disease splicer" icon = 'icons/obj/computer.dmi' - icon_state = "crew" + icon_keyboard = "med_key" + icon_screen = "crew" var/datum/disease2/effectholder/memorybank = null var/list/species_buffer = null diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index f55a2bc2171..79d59b67ae1 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -98,7 +98,7 @@ maxm = 3 badness = 2 activate(var/mob/living/carbon/mob,var/multiplier) - mob.radiation += (2*multiplier) + mob.apply_effect(2*multiplier, IRRADIATE, check_protection = 0) /datum/disease2/effect/deaf name = "Dead Ear Syndrome" @@ -116,19 +116,6 @@ var/mob/living/carbon/human/h = mob h.monkeyize() -/datum/disease2/effect/suicide - name = "Suicidal Syndrome" - stage = 4 - badness = 3 - activate(var/mob/living/carbon/mob,var/multiplier) - mob.suiciding = 1 - //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while - viewers(mob) << "\red [mob.name] is holding \his breath. It looks like \he's trying to commit suicide." - mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss()) - mob.updatehealth() - spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds - mob.suiciding = 0 - /datum/disease2/effect/killertoxins name = "Toxification Syndrome" stage = 4 diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 3ce52ec3c04..1694c14a30b 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -3,25 +3,26 @@ proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne") if (!istype(M)) return 0 + var/mob/living/carbon/human/H = M + if(istype(H) && H.species.virus_immune) + return 0 + var/protection = M.getarmor(null, "bio") //gets the full body bio armour value, weighted by body part coverage. var/score = round(0.06*protection) //scales 100% protection to 6. switch(vector) if("Airborne") - if(M.internal) - score = 6 //not breathing infected air helps greatly - var/obj/item/I = M.wear_mask - - //masks provide a small bonus and can replace overall bio protection - if(I) - score = max(score, round(0.06*I.armor["bio"])) - if (istype(I, /obj/item/clothing/mask)) - score += 1 //this should be added after + if(M.internal) //not breathing infected air helps greatly + return 0 + var/obj/item/I = M.wear_mask + //masks provide a small bonus and can replace overall bio protection + if(I) + score = max(score, round(0.06*I.armor["bio"])) + if (istype(I, /obj/item/clothing/mask)) + score += 1 //this should be added after if("Contact") - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - + if(istype(H)) //gloves provide a larger bonus if (istype(H.gloves, /obj/item/clothing/gloves)) score += 2 diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index 7508818a6d7..d318ca9f8ad 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -16,7 +16,7 @@ var/mob/living/carbon/C = M if (istype(C,/mob/living/carbon/human/)) var/mob/living/carbon/human/H = C - if(H.species && H.species.flags & NO_BLOOD) + if(H.species.flags & NO_BLOOD) report("Scan aborted: The target does not have blood.", user) return diff --git a/code/modules/wireless/devices.dm b/code/modules/wireless/devices.dm new file mode 100644 index 00000000000..62173f2d6a1 --- /dev/null +++ b/code/modules/wireless/devices.dm @@ -0,0 +1,199 @@ +//------------------------------- +// Buttons +// Sender: intended to be used by buttons, when the button is pressed it will call activate() on all connected /button +// receivers. +// Receiver: does whatever the subtype does. deactivate() by default calls activate(), so you will have to override in +// it in a subtype if you want it to do something. +//------------------------------- +/datum/wifi/sender/button/activate(mob/living/user) + for(var/datum/wifi/receiver/button/B in connected_devices) + B.activate(user) + +/datum/wifi/sender/button/deactivate(mob/living/user) + for(var/datum/wifi/receiver/button/B in connected_devices) + B.deactivate(user) + +/datum/wifi/receiver/button/proc/activate(mob/living/user) + +/datum/wifi/receiver/button/proc/deactivate(mob/living/user) + activate(user) //override this if you want deactivate to actually do something + +//------------------------------- +// Doors +// Sender: sends an open/close request to all connected /door receivers. Utilises spawn_sync to trigger all doors to +// open at approximately the same time. Waits until all doors have finished opening before returning. +// Receiver: will try to open/close the parent door when activate/deactivate is called. +//------------------------------- + +// Sender procs +/datum/wifi/sender/door/activate(var/command) + if(!command) + return + + var/datum/spawn_sync/S = new() + + for(var/datum/wifi/receiver/button/door/D in connected_devices) + S.start_worker(D, command) + S.wait_until_done() + return + +//Receiver procs +/datum/wifi/receiver/button/door/proc/open() + var/obj/machinery/door/D = parent + if(istype(D) && D.can_open()) + D.open() + +/datum/wifi/receiver/button/door/proc/close() + var/obj/machinery/door/D = parent + if(istype(D) && D.can_close()) + D.close() + +/datum/wifi/receiver/button/door/proc/lock() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.lock() + +/datum/wifi/receiver/button/door/proc/unlock() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.unlock() + +/datum/wifi/receiver/button/door/proc/enable_idscan() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.set_idscan(1) + +/datum/wifi/receiver/button/door/proc/disable_idscan() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.set_idscan(0) + +/datum/wifi/receiver/button/door/proc/enable_safeties() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.set_safeties(1) + +/datum/wifi/receiver/button/door/proc/disable_safeties() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.set_safeties(0) + +/datum/wifi/receiver/button/door/proc/electrify() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.electrify(-1) + +/datum/wifi/receiver/button/door/proc/unelectrify() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.electrify(0) + +//------------------------------- +// Emitter +// Activates/deactivates the parent emitter. +//------------------------------- +/datum/wifi/receiver/button/emitter/activate(mob/living/user) + ..() + var/obj/machinery/power/emitter/E = parent + if(istype(E) && !E.active) + E.activate(user) //if the emitter is not active, trigger the activate proc to toggle it + +/datum/wifi/receiver/button/emitter/deactivate(mob/living/user) + var/obj/machinery/power/emitter/E = parent + if(istype(E) && E.active) + E.activate(user) //if the emitter is active, trigger the activate proc to toggle it + +//------------------------------- +// Crematorium +// Triggers cremate() on the parent /crematorium. +//------------------------------- +/datum/wifi/receiver/button/crematorium/activate(mob/living/user) + ..() + var/obj/structure/crematorium/C = parent + if(istype(C)) + C.cremate(user) + +//------------------------------- +// Mounted Flash +// Triggers flash() on the parent /flasher. +//------------------------------- +/datum/wifi/receiver/button/flasher/activate(mob/living/user) + ..() + var/obj/machinery/flasher/F = parent + if(istype(F)) + F.flash() + +//------------------------------- +// Holosign +// Turns the parent /holosign on/off. +//------------------------------- +/datum/wifi/receiver/button/holosign/activate(mob/living/user) + ..() + var/obj/machinery/holosign/H = parent + if(istype(H) && !H.lit) + H.toggle() + +/datum/wifi/receiver/button/holosign/deactivate(mob/living/user) + var/obj/machinery/holosign/H = parent + if(istype(H) && H.lit) + H.toggle() + +//------------------------------- +// Igniter +// Turns the parent /igniter on/off. +//------------------------------- +/datum/wifi/receiver/button/igniter/activate(mob/living/user) + ..() + var/obj/machinery/igniter/I = parent + if(istype(I)) + if(!I.on) + I.ignite() + +/datum/wifi/receiver/button/igniter/deactivate(mob/living/user) + if(istype(parent, /obj/machinery/igniter)) + var/obj/machinery/igniter/I = parent + if(I.on) + I.ignite() + +//------------------------------- +// Sparker +// Triggers the parent /sparker to ignite(). +//------------------------------- +/datum/wifi/receiver/button/sparker/activate(mob/living/user) + ..() + var/obj/machinery/sparker/S = parent + if(istype(S)) + S.ignite() + +//------------------------------- +// Mass Driver +// Sender: carries out a sequence of first opening all connected doors, then activating all connected mass drivers, +// then closes all connected doors. It will wait before continuing the sequence after opening/closing the doors. +// Receiver: Triggers the parent mass dirver to activate. +//------------------------------- +/datum/wifi/sender/mass_driver/activate() + var/datum/spawn_sync/S = new() + + //tell all doors to open + for(var/datum/wifi/receiver/button/door/D in connected_devices) + S.start_worker(D, "open") + S.wait_until_done() + S.reset() + //tell all mass drivers to launch + for(var/datum/wifi/receiver/button/mass_driver/M in connected_devices) + spawn() + M.activate() + sleep(20) + + //tell all doors to close + S.reset() + for(var/datum/wifi/receiver/button/door/D in connected_devices) + S.start_worker(D, "close") + S.wait_until_done() + return + +/datum/wifi/receiver/button/mass_driver/activate(mob/living/user) + ..() + var/obj/machinery/mass_driver/M = parent + if(istype(M)) + M.drive() diff --git a/code/modules/wireless/interfaces.dm b/code/modules/wireless/interfaces.dm new file mode 100644 index 00000000000..a872933c2d2 --- /dev/null +++ b/code/modules/wireless/interfaces.dm @@ -0,0 +1,115 @@ +//------------------------------- +/* + Interfaces + + These are the datums that an object needs to connect via the wireless controller. You will need a /wifi/receiver to + allow other devices to connect to your device and send it instructions. You will need a /wifi/sender to send signals + to other devices with wifi receivers. You can have multiple devices (senders and receivers) if you program your + device to handle them. + + Each wifi interface has one "id". This identifies which devices can connect to each other. Multiple senders can + connect to multiple receivers as long as they have the same id. + + Variants are found in devices.dm + + To add a receiver to an object: + Add the following variables to the object: + var/_wifi_id << variable that can be configured on the map, this is passed to the receiver later + var/datum/wifi/receiver/subtype/wifi_receiver << the receiver (and subtype itself) + + Add or modify the objects initialize() proc to include: + if(_wifi_id) << only creates a wifi receiver if an id is set + wifi_receiver = new(_wifi_id, src) << this needs to be in initialize() as New() is usually too + early, and the receiver will try to connect to the controller + before it is setup. + + Add or modify the objects Destroy() proc to include: + qdel(wifi_receiver) + wifi_receiver = null + + Senders are setup the same way, except with a var/datum/wifi/sender/subtype/wifi_sender variable instead of (or in + addition to) a /wifi/receiver variable. + You will however need to call the /wifi/senders code to pass commands onto any connected receivers. + Example: + obj/machinery/button/attack_hand() + wifi_sender.activate() +*/ +//------------------------------- + + +//------------------------------- +// Wifi +//------------------------------- +/datum/wifi + var/obj/parent + var/list/connected_devices + var/id + +/datum/wifi/New(var/new_id, var/obj/O) + connected_devices = new() + id = new_id + if(istype(O)) + parent = O + +/datum/wifi/Destroy(var/wifi/device) + parent = null + for(var/datum/wifi/D in connected_devices) + D.disconnect_device(src) + disconnect_device(D) + return ..() + +/datum/wifi/proc/connect_device(var/datum/wifi/device) + if(connected_devices) + connected_devices |= device + else + connected_devices = new() + connected_devices |= device + +/datum/wifi/proc/disconnect_device(var/datum/wifi/device) + if(connected_devices) + connected_devices -= device + +//------------------------------- +// Receiver +//------------------------------- +/datum/wifi/receiver/New() + ..() + if(wirelessProcess) + wirelessProcess.add_device(src) + +/datum/wifi/receiver/Destroy() + if(wirelessProcess) + wirelessProcess.remove_device(src) + return ..() + +//------------------------------- +// Sender +//------------------------------- +/datum/wifi/sender/New() + ..() + send_connection_request() + +/datum/wifi/sender/proc/set_target(var/new_target) + id = new_target + +/datum/wifi/sender/proc/send_connection_request() + var/datum/connection_request/C = new(src, id) + wirelessProcess.add_request(C) + +/datum/wifi/sender/proc/activate(mob/living/user) + return + +/datum/wifi/sender/proc/deactivate(mob/living/user) + return + +//------------------------------- +// Connection request +//------------------------------- +/datum/connection_request + var/datum/wifi/sender/source //wifi/sender object creating the request + var/id //id tag of the target device(s) to try to connect to + +/datum/connection_request/New(var/datum/wifi/sender/sender, var/receiver) + if(istype(sender)) + source = sender + id = receiver diff --git a/code/ZAS/_xgm_gas_data.dm b/code/modules/xgm/xgm_gas_data.dm similarity index 83% rename from code/ZAS/_xgm_gas_data.dm rename to code/modules/xgm/xgm_gas_data.dm index fd732f9d7cd..4ee3e1c5011 100644 --- a/code/ZAS/_xgm_gas_data.dm +++ b/code/modules/xgm/xgm_gas_data.dm @@ -1,6 +1,6 @@ -/var/xgm_gas_data/gas_data +/var/datum/xgm_gas_data/gas_data -/xgm_gas_data +/datum/xgm_gas_data //Simple list of all the gas IDs. var/list/gases = list() //The friendly, human-readable name for the gas. @@ -16,7 +16,7 @@ //Flags. var/list/flags = list() -/xgm_gas +/decl/xgm_gas var/id = "" var/name = "Unnamed Gas" var/specific_heat = 20 // J/(mol*K) @@ -29,8 +29,8 @@ /hook/startup/proc/generateGasData() gas_data = new - for(var/p in (typesof(/xgm_gas) - /xgm_gas)) - var/xgm_gas/gas = new p + for(var/p in (typesof(/decl/xgm_gas) - /decl/xgm_gas)) + var/decl/xgm_gas/gas = new p //avoid initial() because of potential New() actions if(gas.id in gas_data.gases) error("Duplicate gas id `[gas.id]` in `[p]`") diff --git a/code/ZAS/_gas_mixture_xgm.dm b/code/modules/xgm/xgm_gas_mixture.dm similarity index 96% rename from code/ZAS/_gas_mixture_xgm.dm rename to code/modules/xgm/xgm_gas_mixture.dm index 406ddfa98d7..18c210a6dc4 100644 --- a/code/ZAS/_gas_mixture_xgm.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -1,5 +1,3 @@ -#define QUANTIZE(variable) (round(variable,0.0001)) - /datum/gas_mixture //Associative list of gas moles. //Gases with 0 moles are not tracked and are pruned by update_values() diff --git a/code/setup.dm b/code/setup.dm.back similarity index 100% rename from code/setup.dm rename to code/setup.dm.back diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 4a4f66d7130..58613f939b1 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -49,6 +49,7 @@ em {font-style: normal;font-weight: bold;} .syndradio {color: #6D3F40;} .centradio {color: #5C5C8A;} .airadio {color: #FF00FF;} +.entradio {color: #339966;} .secradio {color: #A30000;} .engradio {color: #A66300;} @@ -98,6 +99,9 @@ h1.alert, h2.alert {color: #000000;} .interface {color: #330033;} +.good {color: #4f7529; font-weight: bold;} +.bad {color: #ee0000; font-weight: bold;} + BIG IMG.icon {width: 32px; height: 32px;} "} diff --git a/code/unit_tests/_template.dm b/code/unit_tests/_template.dm new file mode 100644 index 00000000000..200940bd77a --- /dev/null +++ b/code/unit_tests/_template.dm @@ -0,0 +1,38 @@ +/* + * + * Unit Test Template + * This file is not used. + * + */ + +datum/unit_test/template + name = "Test Template - Change My name" // If it's a template leave the word "template" in it's name so it's not ran. + + async = 1 // Set if we should continue testing elsewhere and come back and check on the results. + + +datum/unit_test/template/start_test() + // This must return something, if it's null the unit_test runner will think we runtimed. + // If your test requires any kind of delay use async so we can finish tests faster. + // Be sure and have a pass/fail procs in here if it's not using async. + + if(0) + fail("Zero is somehow True, that sucks") + else + pass("Zero is false, yay") + + + return 1 + +datum/unit_test/template/check_result() + // Only Ran if async is set. Use this proc for checking back if the test passed or not. + // Return 0 if we need to come back again and check this. + // Return 1 if the test is complete. + + // + + pass("Winner is you") + + return 1 + +// ============================================================================ diff --git a/code/unit_tests/equipment_tests.dm b/code/unit_tests/equipment_tests.dm new file mode 100644 index 00000000000..cb8cd9b7742 --- /dev/null +++ b/code/unit_tests/equipment_tests.dm @@ -0,0 +1,64 @@ +#define SUCCESS 1 +#define FAILURE 0 + + +datum/unit_test/vision_glasses/ + name = "EQUIPMENT: Vision Template" + var/mob/living/carbon/human/H = null + var/expectation = SEE_INVISIBLE_NOLIGHTING + var/glasses_type = null + async = 1 + +datum/unit_test/vision_glasses/start_test() + spawn(0) + var/list/test = create_test_mob_with_mind(null, /mob/living/carbon/human) + if(isnull(test)) + fail("Check Runtimed in Mob creation") + + if(test["result"] == FAILURE) + fail(test["msg"]) + async = 0 + + return 0 + + H = locate(test["mobref"]) + + var/obj/item/clothing/glasses/G = new glasses_type() + H.glasses = G + + return 1 + + +datum/unit_test/vision_glasses/check_result() + + if(isnull(H) || H.life_tick < 2) + return 0 + + if(isnull(H.glasses)) + fail("Mob doesn't have glasses on") + + H.handle_vision() // Because Life has a client check that bypasses updating vision + + if(H.see_invisible == expectation) + pass("Mob See invisible is [H.see_invisible]") + else + fail("Mob See invisible is [H.see_invisible] / expected [expectation]") + + return 1 + +datum/unit_test/vision_glasses/NVG + name = "EQUIPMENT: NVG see_invis" + glasses_type = /obj/item/clothing/glasses/night + +datum/unit_test/vision_glasses/mesons + name = "EQUIPMENT: Mesons see_invis" + glasses_type = /obj/item/clothing/glasses/meson + +datum/unit_test/vision_glasses/plain + name = "EQUIPMENT: Plain glasses. see_invis" + glasses_type = /obj/item/clothing/glasses/regular + expectation = SEE_INVISIBLE_LIVING + +#undef SUCCESS +#undef FAILURE + diff --git a/code/unit_tests/foundation_tests.dm b/code/unit_tests/foundation_tests.dm new file mode 100644 index 00000000000..1b03b73221e --- /dev/null +++ b/code/unit_tests/foundation_tests.dm @@ -0,0 +1,29 @@ +/* +* Unit tests for built-in BYOND procs, to ensure overrides have not affected functionality. +*/ +datum/unit_test/foundation + name = "FOUNDATION template" + async = 0 + +datum/unit_test/foundation/step_shall_return_true_on_success + name = "FOUNDATION: step() shall return true on success" + +datum/unit_test/foundation/step_shall_return_true_on_success/start_test() + var/mob_step_result = TestStep(/mob) + var/obj_step_result = TestStep(/obj) + + if(mob_step_result && obj_step_result) + pass("step() returned true.") + else + fail("step() did not return true: Mob result: [mob_step_result] - Obj result: [obj_step_result].") + + return 1 + +datum/unit_test/foundation/proc/TestStep(type_to_test) + var/turf/start = locate(20,20,1) + var/atom/movable/T = new type_to_test(start) + + . = step(T, NORTH) + . = . && start.x == T.x + . = . && start.y + 1 == T.y + . = . && start.z == T.z diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm new file mode 100644 index 00000000000..d81d73e6bf3 --- /dev/null +++ b/code/unit_tests/map_tests.dm @@ -0,0 +1,109 @@ +/* + * + * Map Unit Tests. + * Zone checks / APC / Scrubber / Vent. + * + * + */ + +#define FAILURE 0 +#define SUCCESS 1 + + +datum/unit_test/apc_area_test + name = "MAP: Area Test APC / Scrubbers / Vents Z level 1" + +datum/unit_test/apc_area_test/start_test() + var/list/bad_areas = list() + var/area_test_count = 0 + var/list/exempt_areas = typesof(/area/space, \ + /area/syndicate_station, \ + /area/skipjack_station, \ + /area/solar, \ + /area/shuttle, \ + /area/holodeck, \ + /area/supply/station \ + ) + + var/list/exempt_from_atmos = typesof( /area/maintenance, \ + /area/storage, \ + /area/engineering/atmos/storage, \ + /area/rnd/test_area, \ + /area/construction, \ + /area/server + ) + + var/list/exempt_from_apc = typesof( /area/construction, \ + /area/medical/genetics + ) + + for(var/area/A in world) + if(A.z == 1 && !(A.type in exempt_areas)) + area_test_count++ + var/area_good = 1 + var/bad_msg = "[ascii_red]--------------- [A.name]([A.type])" + + + if(isnull(A.apc) && !(A.type in exempt_from_apc)) + log_unit_test("[bad_msg] lacks an APC.[ascii_reset]") + area_good = 0 + + if(!A.air_scrub_info.len && !(A.type in exempt_from_atmos)) + log_unit_test("[bad_msg] lacks an Air scrubber.[ascii_reset]") + area_good = 0 + + if(!A.air_vent_info.len && !(A.type in exempt_from_atmos)) + log_unit_test("[bad_msg] lacks an Air vent.[ascii_reset]") + area_good = 0 + + if(!area_good) + bad_areas.Add(A) + + if(bad_areas.len) + fail("\[[bad_areas.len]/[area_test_count]\]Some areas lacked APCs, Air Scrubbers, or Air vents.") + else + pass("All \[[area_test_count]\] areas contained APCs, Air scrubbers, and Air vents.") + + return 1 + +//======================================================================================= + +datum/unit_test/wire_test + name = "MAP: Cable Test Z level 1" + +datum/unit_test/wire_test/start_test() + var/wire_test_count = 0 + var/bad_tests = 0 + var/turf/T = null + var/obj/structure/cable/C = null + var/list/cable_turfs = list() + var/list/dirs_checked = list() + + for(C in world) + T = null + + T = get_turf(C) + if(T && T.z == 1) + cable_turfs |= get_turf(C) + + for(T in cable_turfs) + var/bad_msg = "[ascii_red]--------------- [T.name] \[[T.x] / [T.y] / [T.z]\]" + dirs_checked.Cut() + for(C in T) + wire_test_count++ + var/combined_dir = "[C.d1]-[C.d2]" + if(combined_dir in dirs_checked) + bad_tests++ + log_unit_test("[bad_msg] Contains multiple wires with same direction on top of each other.") + dirs_checked.Add(combined_dir) + + if(bad_tests) + fail("\[[bad_tests] / [wire_test_count]\] Some turfs had overlapping wires going the same direction.") + else + pass("All \[[wire_test_count]\] wires had no overlapping cables going the same direction.") + + return 1 + + +#undef SUCCESS +#undef FAILURE diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm new file mode 100644 index 00000000000..28a50c31383 --- /dev/null +++ b/code/unit_tests/mob_tests.dm @@ -0,0 +1,516 @@ + +/* + * + * Mob Unit Tests. + * + * Human suffocation in Space. + * Mob damage Template + * + */ + +#define SUCCESS 1 +#define FAILURE 0 + +// +// Tests Life() and mob breathing in space. +// + + + +datum/unit_test/human_breath + name = "MOB: Human Suffocates in Space" + var/starting_oxyloss = null + var/ending_oxyloss = null + var/mob/living/carbon/human/H + async = 1 + + +datum/unit_test/human_breath/start_test() + var/turf/T = locate(20,20,1) //TODO: Find better way. + + if(!istype(T, /turf/space)) //If the above isn't a space turf then we force it to find one will most likely pick 1,1,1 + T = locate(/turf/space) + + H = new(T) + + starting_oxyloss = damage_check(H, OXY) + + return 1 + +datum/unit_test/human_breath/check_result() + + if(H.life_tick < 10) // Finish Condition + return 0 // Return 0 to try again later. + + ending_oxyloss = damage_check(H, OXY) + + if(starting_oxyloss < ending_oxyloss) + pass("Oxyloss = [ending_oxyloss]") + else + fail("Mob is not taking oxygen damage. Damange is [ending_oxyloss]") + + return 1 // return 1 to show we're done and don't want to recheck the result. + +// ============================================================================ + +//#define BRUTE "brute" +//#define BURN "fire" +//#define TOX "tox" +//#define OXY "oxy" +//#define CLONE "clone" +//#define HALLOSS "halloss" + + +proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human) + var/list/test_result = list("result" = FAILURE, "msg" = "", "mobref" = null) + + if(isnull(mobloc)) + mobloc = pick(tdome1) + if(!mobloc) + test_result["msg"] = "Unable to find a location to create test mob" + return test_result + + var/mob/living/carbon/human/H = new mobtype(mobloc) + + H.mind_initialize("TestKey[rand(0,10000)]") + + test_result["result"] = SUCCESS + test_result["msg"] = "Mob created" + test_result["mobref"] = "\ref[H]" + + return test_result + +//Generic Check +// TODO: Need to make sure I didn't just recreate the wheel here. + +proc/damage_check(var/mob/living/M, var/damage_type) + var/loss = null + + switch(damage_type) + if(BRUTE) + loss = M.getBruteLoss() + if(BURN) + loss = M.getFireLoss() + if(TOX) + loss = M.getToxLoss() + if(OXY) + loss = M.getOxyLoss() + if(CLONE) + loss = M.getCloneLoss() + if(HALLOSS) + loss = M.getHalLoss() + + if(!loss && istype(M, /mob/living/carbon/human)) // Revert IPC's when? + var/mob/living/carbon/human/H = M // IPC's have robot limbs which don't report damage to getXXXLoss() + if(istype(H.species, /datum/species/machine)) // So we have ot hard code this check or create a different one for them. + return 100 - H.health // TODO: Find better way to do this then hardcoding this formula + + return loss + +// ============================================================================================================== + +// +//DAMAGE EXPECTATIONS +// used with expectected_vunerability + +#define STANDARD 0 // Will take standard damage (damage_ratio of 1) +#define ARMORED 1 // Will take less damage than applied +#define EXTRA_VULNERABLE 2 // Will take more dmage than applied +#define IMMUNE 3 // Will take no damage + +//============================================================================================================== + + +datum/unit_test/mob_damage + name = "MOB: Template for mob damage" + var/mob/living/carbon/human/testmob = null + var/damagetype = BRUTE + var/mob_type = /mob/living/carbon/human + var/expected_vulnerability = STANDARD + var/check_health = 0 + var/damage_location = "chest" + +datum/unit_test/mob_damage/start_test() + var/list/test = create_test_mob_with_mind(null, mob_type) + var/damage_amount = 5 // Do not raise, if damage >= 10 there is a % chance to reduce damage by half in /obj/item/organ/external/take_damage() + // Which makes checks impossible. + + if(isnull(test)) + fail("Check Runtimed in Mob creation") + + if(test["result"] == FAILURE) + fail(test["msg"]) + return 0 + + var/mob/living/carbon/human/H = locate(test["mobref"]) + + if(isnull(H)) + fail("Test unable to set test mob from reference") + return 0 + + if(H.stat) + + fail("Test needs to be re-written, mob has a stat = [H.stat]") + return 0 + + if(H.sleeping) + fail("Test needs to be re-written, mob is sleeping for some unknown reason") + return 0 + + // Damage the mob + + var/initial_health = H.health + + H.apply_damage(damage_amount, damagetype, damage_location) + + H.updatehealth() // Just in case, though at this time apply_damage does this for us. + // We operate with the assumption that someone might mess with that proc one day. + + var/ending_damage = damage_check(H, damagetype) + + var/ending_health = H.health + + // Now test this stuff. + + var/failure = 0 + + var/damage_ratio = STANDARD + + if (ending_damage == 0) + damage_ratio = IMMUNE + + else if (ending_damage < damage_amount) + damage_ratio = ARMORED + + else if (ending_damage > damage_amount) + damage_ratio = EXTRA_VULNERABLE + + if(damage_ratio != expected_vulnerability) + failure = 1 + + // Now generate the message for this test. + + var/expected_msg = null + + switch(expected_vulnerability) + if(STANDARD) + expected_msg = "to take standard damage" + if(ARMORED) + expected_msg = "To take less damage" + if(EXTRA_VULNERABLE) + expected_msg = "To take extra damage" + if(IMMUNE) + expected_msg = "To take no damage" + + + var/msg = "Damage taken: [ending_damage] out of [damage_amount] || expected: [expected_msg] \[Overall Health:[ending_health] (Initial: [initial_health]\]" + + if(failure) + fail(msg) + else + pass(msg) + + return 1 + +// ================================================================= +// Human damage check. +// ================================================================= + +datum/unit_test/mob_damage/brute + name = "MOB: Human Brute damage check" + damagetype = BRUTE + +datum/unit_test/mob_damage/fire + name = "MOB: Human Fire damage check" + damagetype = BURN + +datum/unit_test/mob_damage/tox + name = "MOB: Human Toxin damage check" + damagetype = TOX + +datum/unit_test/mob_damage/oxy + name = "MOB: Human Oxygen damage check" + damagetype = OXY + +datum/unit_test/mob_damage/clone + name = "MOB: Human Clone damage check" + damagetype = CLONE + +datum/unit_test/mob_damage/halloss + name = "MOB: Human Halloss damage check" + damagetype = HALLOSS + +// ================================================================= +// Unathi +// ================================================================= + +datum/unit_test/mob_damage/unathi + name = "MOB: Unathi damage check template" + mob_type = /mob/living/carbon/human/unathi + +datum/unit_test/mob_damage/unathi/brute + name = "MOB: Unathi Brute Damage Check" + damagetype = BRUTE + expected_vulnerability = ARMORED + +datum/unit_test/mob_damage/unathi/fire + name = "MOB: Unathi Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/unathi/tox + name = "MOB: Unathi Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/unathi/oxy + name = "MOB: Unathi Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/unathi/clone + name = "MOB: Unathi Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/unathi/halloss + name = "MOB: Unathi Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// SpessKahjit aka Tajaran +// ================================================================= + +datum/unit_test/mob_damage/tajaran + name = "MOB: Tajaran damage check template" + mob_type = /mob/living/carbon/human/tajaran + +datum/unit_test/mob_damage/tajaran/brute + name = "MOB: Tajaran Brute Damage Check" + damagetype = BRUTE + expected_vulnerability = EXTRA_VULNERABLE + +datum/unit_test/mob_damage/tajaran/fire + name = "MOB: Tajaran Fire Damage Check" + damagetype = BURN + expected_vulnerability = EXTRA_VULNERABLE + +datum/unit_test/mob_damage/tajaran/tox + name = "MOB: Tajaran Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/tajaran/oxy + name = "MOB: Tajaran Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/tajaran/clone + name = "MOB: Tajaran Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/tajaran/halloss + name = "MOB: Tajaran Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// Resomi +// ================================================================= + +datum/unit_test/mob_damage/resomi + name = "MOB: Resomi damage check template" + mob_type = /mob/living/carbon/human/resomi + +datum/unit_test/mob_damage/resomi/brute + name = "MOB: Resomi Brute Damage Check" + damagetype = BRUTE + expected_vulnerability = EXTRA_VULNERABLE + +datum/unit_test/mob_damage/resomi/fire + name = "MOB: Resomi Fire Damage Check" + damagetype = BURN + expected_vulnerability = EXTRA_VULNERABLE + +datum/unit_test/mob_damage/resomi/tox + name = "MOB: Resomi Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/resomi/oxy + name = "MOB: Resomi Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/resomi/clone + name = "MOB: Resomi Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/resomi/halloss + name = "MOB: Resomi Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// Skrell +// ================================================================= + +datum/unit_test/mob_damage/skrell + name = "MOB: Skrell damage check template" + mob_type = /mob/living/carbon/human/skrell + +datum/unit_test/mob_damage/skrell/brute + name = "MOB: Skrell Brute Damage Check" + damagetype = BRUTE + +datum/unit_test/mob_damage/skrell/fire + name = "MOB: Skrell Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/skrell/tox + name = "MOB: Skrell Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/skrell/oxy + name = "MOB: Skrell Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/skrell/clone + name = "MOB: Skrell Clone Damage Check" + damagetype = CLONE + +datum/unit_test/mob_damage/skrell/halloss + name = "MOB: Skrell Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// Vox +// ================================================================= + +datum/unit_test/mob_damage/vox + name = "MOB: Vox damage check template" + mob_type = /mob/living/carbon/human/vox + +datum/unit_test/mob_damage/vox/brute + name = "MOB: Vox Brute Damage Check" + damagetype = BRUTE + +datum/unit_test/mob_damage/vox/fire + name = "MOB: Vox Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/vox/tox + name = "MOB: Vox Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/vox/oxy + name = "MOB: Vox Oxygen Damage Check" + damagetype = OXY + +datum/unit_test/mob_damage/vox/clone + name = "MOB: Vox Clone Damage Check" + damagetype = CLONE + expected_vulnerability = IMMUNE + + +datum/unit_test/mob_damage/vox/halloss + name = "MOB: Vox Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// Diona +// ================================================================= + +datum/unit_test/mob_damage/diona + name = "MOB: Diona damage check template" + mob_type = /mob/living/carbon/human/diona + +datum/unit_test/mob_damage/diona/brute + name = "MOB: Diona Brute Damage Check" + damagetype = BRUTE + +datum/unit_test/mob_damage/diona/fire + name = "MOB: Diona Fire Damage Check" + damagetype = BURN + +datum/unit_test/mob_damage/diona/tox + name = "MOB: Diona Toxins Damage Check" + damagetype = TOX + +datum/unit_test/mob_damage/diona/oxy + name = "MOB: Diona Oxygen Damage Check" + damagetype = OXY + expected_vulnerability = IMMUNE + +datum/unit_test/mob_damage/diona/clone + name = "MOB: Diona Clone Damage Check" + damagetype = CLONE + expected_vulnerability = IMMUNE + +datum/unit_test/mob_damage/diona/halloss + name = "MOB: Diona Halloss Damage Check" + damagetype = HALLOSS + +// ================================================================= +// SPECIAL WHITTLE SNOWFLAKES aka IPC +// ================================================================= + +datum/unit_test/mob_damage/machine + name = "MOB: IPC damage check template" + mob_type = /mob/living/carbon/human/machine + +datum/unit_test/mob_damage/machine/brute + name = "MOB: IPC Brute Damage Check" + damagetype = BRUTE + expected_vulnerability = EXTRA_VULNERABLE + +datum/unit_test/mob_damage/machine/fire + name = "MOB: IPC Fire Damage Check" + damagetype = BURN + expected_vulnerability = EXTRA_VULNERABLE + +datum/unit_test/mob_damage/machine/tox + name = "MOB: IPC Toxins Damage Check" + damagetype = TOX + expected_vulnerability = IMMUNE + +datum/unit_test/mob_damage/machine/oxy + name = "MOB: IPC Oxygen Damage Check" + damagetype = OXY + expected_vulnerability = IMMUNE + +datum/unit_test/mob_damage/machine/clone + name = "MOB: IPC Clone Damage Check" + damagetype = CLONE + expected_vulnerability = IMMUNE + +datum/unit_test/mob_damage/machine/halloss + name = "MOB: IPC Halloss Damage Check" + damagetype = HALLOSS + + +// ============================================================================== + + +datum/unit_test/robot_module_icons + name = "MOB: Robot module icon check" + var/icon_file = 'icons/mob/screen1_robot.dmi' + +datum/unit_test/robot_module_icons/start_test() + var/failed = 0 + if(!isicon(icon_file)) + fail("[icon_file] is not a valid icon file.") + return 1 + + var/list/valid_states = icon_states(icon_file) + + if(!valid_states.len) + return 1 + + for(var/i=1, i<=robot_modules.len, i++) + var/bad_msg = "[ascii_red]--------------- [robot_modules[i]]" + if(!(lowertext(robot_modules[i]) in valid_states)) + log_unit_test("[bad_msg] does not contain a valid icon state in [icon_file][ascii_reset]") + failed=1 + + if(failed) + fail("Some icon states did not exist") + else + pass("All modules had valid icon states") + + return 1 + +#undef VULNERABLE +#undef IMMUNE +#undef SUCCESS +#undef FAILURE diff --git a/code/unit_tests/observation_tests.dm b/code/unit_tests/observation_tests.dm new file mode 100644 index 00000000000..2a49dedec91 --- /dev/null +++ b/code/unit_tests/observation_tests.dm @@ -0,0 +1,108 @@ +/proc/is_listening_to_movement(var/atom/movable/listening_to, var/listener) + return moved_event.is_listening(listening_to, listener) + +datum/unit_test/observation + name = "OBSERVATION template" + async = 0 + +datum/unit_test/observation/moved_observer_shall_register_on_follow + name = "OBSERVATION: Moved - Observer Shall Register on Follow" + +datum/unit_test/observation/moved_observer_shall_register_on_follow/start_test() + var/turf/T = locate(20,20,1) + var/mob/living/carbon/human/H = new(T) + var/mob/dead/observer/O = new(T) + + O.ManualFollow(H) + if(is_listening_to_movement(H, O)) + pass("The observer is now following the mob.") + else + fail("The observer is not following the mob.") + + qdel(H) + qdel(O) + return 1 + +datum/unit_test/observation/moved_observer_shall_unregister_on_nofollow + name = "OBSERVATION: Moved - Observer Shall Unregister on NoFollow" + +datum/unit_test/observation/moved_observer_shall_unregister_on_nofollow/start_test() + var/turf/T = locate(20,20,1) + var/mob/living/carbon/human/H = new(T) + var/mob/dead/observer/O = new(T) + + O.ManualFollow(H) + O.stop_following() + if(!is_listening_to_movement(H, O)) + pass("The observer is no longer following the mob.") + else + fail("The observer is still following the mob.") + + qdel(H) + qdel(O) + return 1 + +datum/unit_test/observation/moved_shall_not_register_on_enter_without_listeners + name = "OBSERVATION: Moved - Shall Not Register on Enter Without Listeners" + +datum/unit_test/observation/moved_shall_not_register_on_enter_without_listeners/start_test() + var/turf/T = locate(20,20,1) + var/mob/living/carbon/human/H = new(T) + var/obj/structure/closet/C = new(T) + + H.forceMove(C) + if(!is_listening_to_movement(C, H)) + pass("The mob did not register to the closet's moved event.") + else + fail("The mob has registered to the closet's moved event.") + + qdel(C) + qdel(H) + return 1 + +datum/unit_test/observation/moved_shall_registers_recursively_on_new_listener + name = "OBSERVATION: Moved - Shall Register Recursively on New Listener" + +datum/unit_test/observation/moved_shall_registers_recursively_on_new_listener/start_test() + var/turf/T = locate(20,20,1) + var/mob/living/carbon/human/H = new(T) + var/obj/structure/closet/C = new(T) + var/mob/dead/observer/O = new(T) + + H.forceMove(C) + O.ManualFollow(H) + var/listening_to_closet = is_listening_to_movement(C, H) + var/listening_to_human = is_listening_to_movement(H, O) + if(listening_to_closet && listening_to_human) + pass("Recursive moved registration succesful.") + else + fail("Recursive moved registration failed. Human listening to closet: [listening_to_closet] - Observer listening to human: [listening_to_human]") + + qdel(C) + qdel(H) + qdel(O) + return 1 + +datum/unit_test/observation/moved_shall_registers_recursively_with_existing_listener + name = "OBSERVATION: Moved - Shall Register Recursively with Existing Listener" + +datum/unit_test/observation/moved_shall_registers_recursively_with_existing_listener/start_test() + var/turf/T = locate(20,20,1) + var/mob/living/carbon/human/H = new(T) + var/obj/structure/closet/C = new(T) + var/mob/dead/observer/O = new(T) + + O.ManualFollow(H) + H.forceMove(C) + var/listening_to_closet = is_listening_to_movement(C, H) + var/listening_to_human = is_listening_to_movement(H, O) + if(listening_to_closet && listening_to_human) + pass("Recursive moved registration succesful.") + else + fail("Recursive moved registration failed. Human listening to closet: [listening_to_closet] - Observer listening to human: [listening_to_human]") + + qdel(C) + qdel(H) + qdel(O) + + return 1 diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm new file mode 100644 index 00000000000..dac62a552eb --- /dev/null +++ b/code/unit_tests/unit_test.dm @@ -0,0 +1,159 @@ +/* Unit Tests originally designed by Ccomp5950 + * + * Tests are created to prevent changes that would create bugs or change expected behaviour. + * For the most part I think any test can be created that doesn't require a client in a mob or require a game mode other then extended + * + * The easiest way to make effective tests is to create a "template" if you intend to run the same test over and over and make your actual + * tests be a "child object" of those templates. Be sure and name your templates with the word "template" somewhere in var/name. + * + * The goal is to have all sorts of tests that run and to run them as quickly as possible. + * + * Tests that require time to run we instead just check back on their results later instead of waiting around in a sleep(1) for each test. + * This allows us to finish unit testing quicker since we can start other tests while we're waiting on that one to finish. + * + * An example of that is listed in mob_tests.dm with the human_breath test. We spawn the mob in space and set the async flag to 1 so that we run the check later. + * After 10 life ticks for that mob we check it's oxyloss but while that is going on we've already ran other tests. + * + * If your test requires a significant amount of time...cheat on the timers. Either speed up the process/life runs or do as we did in the timers for the shuttle + * transfers in zas_tests.dm we move a shuttle but instead of waiting 3 minutes we set the travel time to a very low number. + * + * At the same time, Unit tests are intended to reflect standard usage so avoid changing to much about how stuff is processed. + * + * + * WRITE UNIT TEST TEMPLATES AS GENERIC AS POSSIBLE (makes for easy reusability) + * + */ + + +var/all_unit_tests_passed = 1 +var/failed_unit_tests = 0 +var/total_unit_tests = 0 + +// For console out put in Linux/Bash makes the output green or red. +// Should probably only be used for unit tests/Travis since some special folks use winders to host servers. +var/ascii_esc = ascii2text(27) +var/ascii_red = "[ascii_esc]\[31m" +var/ascii_green = "[ascii_esc]\[32m" +var/ascii_reset = "[ascii_esc]\[0m" + + +// We list these here so we can remove them from the for loop running this. +// Templates aren't intended to be ran but just serve as a way to create child objects of it with inheritable tests for quick test creation. + +datum/unit_test + var/name = "template - should not be ran." + var/disabled = 0 // If we want to keep a unit test in the codebase but not run it for some reason. + var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. + var/reported = 0 // If it's reported a success or failure. Any tests that have not are assumed to be failures. + var/why_disabled = "No reason set." // If we disable a unit test we will display why so it reminds us to check back on it later. + + +datum/unit_test/proc/fail(var/message) + all_unit_tests_passed = 0 + failed_unit_tests++ + reported = 1 + log_unit_test("[ascii_red]!!! FAILURE !!! \[[name]\]: [message][ascii_reset]") + +datum/unit_test/proc/pass(var/message) + reported = 1 + log_unit_test("[ascii_green]*** SUCCESS *** \[[name]\]: [message][ascii_reset]") + +datum/unit_test/proc/start_test() + fail("No test proc.") + +datum/unit_test/proc/check_result() + fail("No check results proc") + return 1 + + +proc/load_unit_test_changes() +/* + //This takes about 60 seconds to run on Travis and is only used for the ZAS vacume check on The Asteroid. + if(config.generate_asteroid != 1) + log_unit_test("Overiding Configuration option for Asteroid Generation to ENABLED") + config.generate_asteroid = 1 // The default map requires it, the example config doesn't have this enabled. + */ + + + + +proc/initialize_unit_tests() + log_unit_test("Initializing Unit Testing") + + // + //Start the Round. + // + + if(!ticker) + crash_with("No Ticker") + world.Del() + + var/said_msg = 0 + while(ticker.pregame_timeleft && ticker.pregame_timeleft > 160) // Make sure the initial startup is complete. + if(ticker.pregame_timeleft < 175 && !said_msg) + said_msg = 1 + log_unit_test("Pregame Count down has started, giving it 20 seconds to finish.") + sleep(1) + + world.save_mode("extended") + + sleep(1) + + ticker.current_state = GAME_STATE_SETTING_UP + + log_unit_test("Round has been started. Waiting 10 seconds to start tests.") + sleep(100) + + // + // Run Tests + // + + var/list/test_datums = typesof(/datum/unit_test) + + var/list/async_test = list() + var/list/started_tests = list() + + log_unit_test("Testing Started.") + + for (var/test in test_datums) + var/datum/unit_test/d = new test() + + if(d.disabled) + d.pass("[ascii_red]Check Disabled: [d.why_disabled]") + continue + + if(findtext(d.name, "template")) + continue + + if(isnull(d.start_test())) // Start the test. + d.fail("Test Runtimed") + if(d.async) // If it's async then we'll need to check back on it later. + async_test.Add(d) + total_unit_tests++ + + + + // + // Check the async tests to see if they are finished. + // + + while(async_test.len) + for(var/datum/unit_test/test in async_test) + if(test.check_result()) + async_test.Remove(test) + sleep(1) + + // + // Make sure all Unit Tests reported a result + // + + for(var/datum/unit_test/test in started_tests) + if(!test.reported) + test.fail("Test failed to report a result.") + + if(all_unit_tests_passed) + log_unit_test("[ascii_green]**** All Unit Tests Passed \[[total_unit_tests]\] ****[ascii_reset]") + world.Del() + else + log_unit_test("[ascii_red]**** \[[failed_unit_tests]\\[total_unit_tests]\] Unit Tests Failed ****[ascii_reset]") + world.Del() diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm new file mode 100644 index 00000000000..d1efd522cc5 --- /dev/null +++ b/code/unit_tests/zas_tests.dm @@ -0,0 +1,226 @@ +/* + * + * Zas Unit Tests. + * Shuttle Pressurized. + * + * + */ + +#define UT_NORMAL 1 // Standard one atmosphere 20celsius +#define UT_VACUUM 2 // Vacume on simulated turfs +#define UT_NORMAL_COLD 3 // Cold but standard atmosphere. + +#define FAILURE 0 +#define SUCCESS 1 + +// +// Generic check for an area. +// + +datum/unit_test/zas_area_test + name = "ZAS: Area Test Template" + var/area_path = null // Put the area you are testing here. + var/expectation = UT_NORMAL // See defines above. + +datum/unit_test/zas_area_test/start_test() + var/list/test = test_air_in_area(area_path, expectation) + + if(isnull(test)) + fail("Check Runtimed") + + if(test["result"] == SUCCESS) + pass(test["msg"]) + else + fail(test["msg"]) + return 1 + +// ================================================================================================== + +// +// The primary helper proc. +// +proc/test_air_in_area(var/test_area, var/expectation = UT_NORMAL) + var/test_result = list("result" = FAILURE, "msg" = "") + + var/area/A = locate(test_area) + + if(!istype(A, test_area)) + test_result["msg"] = "Unable to get [test_area]" + return test_result + + var/list/GM_checked = list() + + for(var/turf/simulated/T in A) + + if(!istype(T) || isnull(T.zone) || istype(T, /turf/simulated/floor/airless)) + continue + if(T.zone.air in GM_checked) + continue + + var/t_msg = "Turf: [T] | Location: [T.x] // [T.y] // [T.z]" + + var/datum/gas_mixture/GM = T.return_air() + var/pressure = GM.return_pressure() + var/temp = GM.temperature + + switch(expectation) + + if(UT_VACUUM) + if(pressure > 10) + test_result["msg"] = "Pressure out of bounds: [pressure] | [t_msg]" + return test_result + + + if(UT_NORMAL || UT_NORMAL_COLD) + if(abs(pressure - ONE_ATMOSPHERE) > 10) + test_result["msg"] = "Pressure out of bounds: [pressure] | [t_msg]" + return test_result + + if(expectation == UT_NORMAL) + + if(abs(temp - T20C) > 10) + test_result["msg"] = "Temperature out of bounds: [temp] | [t_msg]" + return test_result + + if(expectation == UT_NORMAL_COLD) + + if(temp > 120) + test_result["msg"] = "Temperature out of bounds: [temp] | [t_msg]" + return test_result + + GM_checked.Add(GM) + + if(GM_checked.len) + test_result["result"] = SUCCESS + test_result["msg"] = "Checked [GM_checked.len] zones" + else + test_result["msg"] = "No zones checked." + + return test_result + + +// ================================================================================================== + +datum/unit_test/zas_area_test/supply_centcomm + name = "ZAS: Supply Shuttle (CentComm)" + area_path = /area/supply/dock + +datum/unit_test/zas_area_test/emergency_shuttle + name = "ZAS: Emergency Shuttle" + area_path = /area/shuttle/escape/centcom + +datum/unit_test/zas_area_test/ai_chamber + name = "ZAS: AI Chamber" + area_path = /area/turret_protected/ai + +datum/unit_test/zas_area_test/arrival_maint + name = "ZAS: Arrival Maintenance" + area_path = /area/maintenance/arrivals + +datum/unit_test/zas_area_test/mining_shuttle_at_station + name = "ZAS: Mining Shuttle (Station)" + area_path = /area/shuttle/mining/station + +datum/unit_test/zas_area_test/ + name = "ZAS: Cargo Maintenance" + area_path = /area/maintenance/cargo + +datum/unit_test/zas_area_test/eng_shuttle + name = "ZAS: Construction Site Shuttle (Station)" + area_path = /area/shuttle/constructionsite/station + +datum/unit_test/zas_area_test/incinerator + name = "ZAS: Incinerator" + area_path = /area/maintenance/incinerator + disabled = 1 + why_disabled = "Scrubber pulls air, this area cannot be tested." + +datum/unit_test/zas_area_test/virology + name = "ZAS: Virology" + area_path = /area/medical/virology + +datum/unit_test/zas_area_test/xenobio + name = "ZAS: Xenobiology" + area_path = /area/rnd/xenobiology + +datum/unit_test/zas_area_test/research_maint_starboard + name = "ZAS: Research Starboard Maintenance" + area_path = /area/maintenance/research_starboard + +datum/unit_test/zas_area_test/west_hall_mining_outpost + name = "ZAS: Mining outpost West Hallway" + area_path = /area/outpost/mining_main/west_hall + +/* +datum/unit_test/zas_area_test/mining_area + name = "ZAS: Mining Area (Vacuum)" + area_path = /area/mine/explored + expectation = UT_VACUUM + disabled = 1 + why_disabled = "Asteroid Generation disabled" + */ +datum/unit_test/zas_area_test/ + name = "ZAS: Cargo Bay" + area_path = /area/quartermaster/storage + + +// ================================================================================================== + + +// Here we move a shuttle then test it's area once the shuttle has arrived. + +datum/unit_test/zas_supply_shuttle_moved + name = "ZAS: Supply Shuttle (When Moved)" + async=1 // We're moving the shuttle using built in procs. + + var/datum/shuttle/ferry/supply/Shuttle = null + + var/testtime = 0 //Used as a timer. + +datum/unit_test/zas_supply_shuttle_moved/start_test() + + if(!shuttle_controller || !shuttle_controller.shuttles.len) + fail("Shuttle Controller not setup at time of test.") + + Shuttle = shuttle_controller.shuttles["Supply"] + supply_controller.movetime = 5 // Speed up the shuttle movement. + + if(isnull(Shuttle)) + fail("Unable to locate the supply shuttle") + + // Initiate the Move. + Shuttle.short_jump(Shuttle.area_offsite, Shuttle.area_station) + + return 1 + +datum/unit_test/zas_supply_shuttle_moved/check_result() + if(Shuttle.moving_status == SHUTTLE_IDLE && !Shuttle.at_station()) + fail("Shuttle Did not Move") + return 1 + + if(!Shuttle.at_station()) + return 0 + + if(!testtime) + testtime = world.time+40 // Wait another 2 ticks then proceed. + + if(world.time < testtime) + return 0 + + + var/list/test = test_air_in_area(/area/supply/station) + if(isnull(test)) + fail("Check Runtimed") + return 1 + + if(test["result"] == SUCCESS) + pass(test["msg"]) + else + fail(test["msg"]) + return 1 + +#undef UT_NORMAL +#undef UT_VACUUM +#undef UT_NORMAL_COLD +#undef SUCCESS +#undef FAILURE diff --git a/code/world.dm b/code/world.dm index 06469e9faa0..f01e5f4a64f 100644 --- a/code/world.dm +++ b/code/world.dm @@ -20,8 +20,10 @@ var/global/datum/global_init/init = new () makeDatumRefLists() load_configuration() - qdel(src) + initialize_chemical_reagents() + initialize_chemical_reactions() + qdel(src) //we're done /var/game_id = null /proc/generate_gameid() @@ -32,9 +34,14 @@ var/global/datum/global_init/init = new () var/list/c = list("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0") var/l = c.len - var/t = world.realtime - while(t != 0) - game_id += c[(t % l) + 1] + var/t = world.timeofday + for(var/_ = 1 to 4) + game_id = "[c[(t % l) + 1]][game_id]" + t = round(t / l) + game_id = "-[game_id]" + t = round(world.realtime / (10 * 60 * 60 * 24)) + for(var/_ = 1 to 3) + game_id = "[c[(t % l) + 1]][game_id]" t = round(t / l) /world @@ -75,17 +82,35 @@ var/global/datum/global_init/init = new () . = ..() +#ifndef UNIT_TEST + sleep_offline = 1 +#else + log_unit_test("Unit Tests Enabled. This will destroy the world when testing is complete.") + load_unit_test_changes() +#endif + // Set up roundstart seed list. plant_controller = new() // This is kinda important. Set up details of what the hell things are made of. populate_material_list() - //Create the asteroid Z-level. if(config.generate_asteroid) - new /datum/random_map(null,13,32,5,217,223) + // These values determine the specific area that the map is applied to. + // If you do not use the official Baycode moonbase map, you will need to change them. + //Create the mining Z-level. + new /datum/random_map/automata/cave_system(null,1,1,5,255,255) + //new /datum/random_map/noise/volcanism(null,1,1,5,255,255) // Not done yet! Pretty, though. + // Create the mining ore distribution map. + new /datum/random_map/noise/ore(null, 1, 1, 5, 64, 64) + // Update all turfs to ensure everything looks good post-generation. Yes, + // it's brute-forcey, but frankly the alternative is a mine turf rewrite. + for(var/turf/simulated/mineral/M in world) // Ugh. + M.updateMineralOverlays() + for(var/turf/simulated/floor/asteroid/M in world) // Uuuuuugh. + M.updateMineralOverlays() // Create autolathe recipes, as above. populate_lathe_recipes() @@ -99,6 +124,11 @@ var/global/datum/global_init/init = new () processScheduler.deferSetupFor(/datum/controller/process/ticker) processScheduler.setup() master_controller.setup() +#ifdef UNIT_TEST + initialize_unit_tests() +#endif + + spawn(3000) //so we aren't adding to the round-start lag if(config.ToRban) @@ -358,13 +388,8 @@ var/inerror = 0 else if (n > 0) features += "~[n] player" - /* - is there a reason for this? the byond site shows 'hosted by X' when there is a proper host already. - if (host) - features += "hosted by [host]" - */ - if (!host && config && config.hostedby) + if (config && config.hostedby) features += "hosted by [config.hostedby]" if (features) diff --git a/config/example/config.txt b/config/example/config.txt index 425f6b9a0e7..dab0413e199 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -25,6 +25,10 @@ JOBS_HAVE_MINIMAL_ACCESS ## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. #USE_AGE_RESTRICTION_FOR_JOBS +## Unhash this entry to have certain antag roles require your account to be at least a certain number of days old for round start and auto-spawn selection. +## Non-automatic antagonist recruitment, such as being converted to cultism is not affected. Has the same database requirements and notes as USE_AGE_RESTRICTION_FOR_JOBS. +#USE_AGE_RESTRICTION_FOR_ANTAGS + ## Unhash this to use recursive explosions, keep it hashed to use circle explosions. Recursive explosions react to walls, airlocks and blast doors, making them look a lot cooler than the boring old circular explosions. They require more CPU and are (as of january 2013) experimental #USE_RECURSIVE_EXPLOSIONS @@ -351,7 +355,10 @@ EVENT_CUSTOM_START_MAJOR 80;100 ## Uncomment to disable respawning by default. #DISABLE_RESPAWN -## Strength of ambient star light. Set to 0 or less to turn off. A value of 1 is unlikely to have a noticeable effect in most lightning systems. +## Respawn delay in minutes before one may respawn as a crew member. +#RESPAWN_DELAY 30 + +## Strength of ambient star light. Set to 0 or less to turn off. A value of 1 is unlikely to have a noticeable effect in most lighting systems. STARLIGHT 0 ## Defines which races are allowed to join as ERT, in singular form. If unset, defaults to only human. Casing matters, separate using ; @@ -407,6 +414,13 @@ STARLIGHT 0 ## Uncomment to enable simple Skype/Discord style markup over OOC, LOOC, and say. #ALLOW_CHAT_MARKUP +## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , # and - +# DEFAULT_LANGUAGE_PREFIXES , # - + +## A ; separated list of lobby screens to randomly pick from. The listed screens must exist as icon states in '/icons/misc/title.dmi'. +## Defaults to 'title' if left unset. +# LOBBY_SCREENS title + ## Uncomment to enable the antag contest! #ANTAG_CONTEST_ENABLED diff --git a/html/changelog.html b/html/changelog.html index 106dc47c087..4a5912a659d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1260,6 +1260,137 @@
  • Adjusted the Bay12 paralyze player function to work as our wind function used to work. It also now gives warnings to people nearby if someone was winded.
  • Made tasers to actually fire projectiles again. And not lasers. Tasers are not lasers, sillys.
  • Handcuffing does not require you to have the person in level 2 grab, as it does in vanilla bay.
  • +

    06 February 2016

    +

    PsiOmegaDelta updated:

    +
      +
    • Should again be possible to resist out of chairs, beds, and welded lockers.
    • +
    + +

    03 February 2016

    +

    PsiOmegaDelta updated:

    +
      +
    • Antagonist and special role preferences has been overhauled. Please update these specific character preferences as they have been reset.
    • +
    + +

    01 February 2016

    +

    PsiOmegaDelta updated:

    +
      +
    • ED-209s, hostile mobs, and mecha weapons should again be able to fire without issue.
    • +
    • Agent ids can now be assigned an owner even after having been dropped on the floor.
    • +
    • Monkey cubes can now be expanded in sinks again.
    • +
    + +

    29 January 2016

    +

    Karolis2011 updated:

    +
      +
    • Improved modular computer performance
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • We now support tg's online changelog auto-creation. See https://tgstation13.org/wiki/Guide_to_Changelogs#Online_auto-creation.
    • +
    • Can now click held mobs, such as Pun Pun, to view their inventory.
    • +
    + +

    25 January 2016

    +

    Atlantis updated:

    +
      +
    • Setup Supermatter admin button now uses map markers and supports all coolant types.
    • +
    + +

    20 January 2016

    +

    Atlantis updated:

    +
      +
    • Construction robot module removed
    • +
    • Engineering robot module now contains most tools of construction robot, primarily plasteel. RCD is not included by default.
    • +
    • Engineering Robot RCD upgrade is now buildable. This upgrade unlocks robot's RCD. It is fairly expensive, requiring small amount of gold and silver, as well as phoron and steel to build.
    • +
    • Floodlight upgrade added. This upgrade doubles robot's light intensity (it will be more or less same as actual floodlight), at the cost of higher power usage.
    • +
    • You may now install matter bin into a cyborg in order to boost it's matter synth's maximal capacity. Better matter bin adds more capacity
    • +
    • Default capacity of matter synths for engineering module tweaked a little, since prices of reinforced walls, etc. increased recently. Steel changed from 40 to 60 sheets default, plasteel from 10 (Construction default) to 20.
    • +
    + +

    16 January 2016

    +

    Atlantiscze updated:

    +
      +
    • SMES units now try to balance their inputs and outputs. For outputs this means two SMESes powering the same grid will share the load by percentage. For inputs, all SMESes inputting from one power network will split the available power by percentage.
    • +
    • Some minor SMES configuration changes have been made: Atmospherics SMES now starts configured to prevent power outages when people forget about it, engine SMESes are now configured to input/output at full rate. These are only defaults and may be changed ingame as usual.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Uplink crystals can now be converted into physical form to allow transfer between uplink devices.
    • +
    • Each mercenary now spawn with their own private uplink, with each indivual uplink having the same number of telecrystals as the normal traitor uplink.
    • +
    + +

    13 January 2016

    +

    Datraen updated:

    +
      +
    • Objects can now be yanked out of synthetics.
    • +
    +

    Techhead updated:

    +
      +
    • Added a new random event: Shipping Error - A random crate is mistakenly shipped to the station.
    • +
    + +

    08 January 2016

    +

    Chinsky updated:

    +
      +
    • Can pick up monkeys / undress resomi now properly. HELP intent for scooping, NON-HELP for undressing.
    • +
    +

    RavingManiac updated:

    +
      +
    • Storage in backpacks, boxes and other containers is now capacity-based. Some containers like belts remain slot-based.
    • +
    + +

    01 January 2016

    +

    Atlantis updated:

    +
      +
    • Removed old computer3 system, most noticeable due to removal of old laptops.
    • +
    • Adds brand new modular computer system that replaces computer3. These computers may run programs from hard drive, and one device is not limited to one program.
    • +
    • Modular computers can be assembled manually from components printed at RnD (Consoles mainly), or purchased (from old laptop vending machines).
    • +
    • Adds NTNet, networking used by modular computers, including an administration console, NTNet relays, and antag programs.
    • +
    • Adds small set of programs modular computers can run. More programs will be added in the future.
    • +
    • Various small things added, such as, data crystals (USB flash drives), NTNRC (messaging, IRC/forum style), file sending, etc.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Resomi, and any other humanoid mobs, can now bump doors open despite their size.
    • +
    +

    TheWelp updated:

    +
      +
    • Microwaves can now be unanchored with a crowbar.
    • +
    + +

    20 December 2015

    +

    PsiOmegaDelta updated:

    +
      +
    • Can now use the Antag Uplink to buy a door hacking device with endless uses and which leaves doors unharmed, but instead needs some time to do its work.
    • +
    +

    Zuhayr updated:

    +
      +
    • Aiming has been rewritten, keep an eye out for weird behavior.
    • +
    + +

    13 December 2015

    +

    Atlantis updated:

    +
      +
    • Added Inflatables Dispenser(ID), an item that allows rapid deployment, transport and removal of inflatables.
    • +
    • Engineering, Construction and Crisis modules are now outfitted with ID.
    • +
    • Three boxes in engineering have been replaced by three IDs.
    • +
    • w_classes of inflatables readjusted. Boxes and IDs can be carried in backpack now. Individual inflatables are small enough to fit in pocket.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Adds a system to allow objects to implement custom multitool interactions in a modular manner.
    • +
    • The AI can now toggle multitool mode on/off, using the new 'Toggle Multitool Mode' verb.
    • +
    • Cloning vats can now be connected to a cloning console by using a multitool.
    • +
    • Station alert console circuits can now be altered using a multitool, changing which alarm types are displayed.
    • +
    • Can now select the color of a cable coil using a multitool.
    • +
    +

    TheWelp updated:

    +
      +
    • Added boardgame item for use with table-top board games.
    • +
    • Added Actors Guild, an alternate spawn that allows players to control actors.
    • +
    • Added differing card decks, including a Tarot deck and two trading card games.
    • +
    • Remade /TG/Station's Orion Trail arcade machine with bay-specific modifications.

    06 December 2015

    @@ -1267,13 +1398,83 @@
    • Welding a broken camera will use the correct icon.
    • Camera assemblies remember their tag and network from previous usage.
    • +
    • Mobs on help intent will not push others that aren't.
    • +
    +

    Loganbacca updated:

    +
      +
    • Added a backend (wireless) system for communication between machinery and other devices.
    • +
    +

    Neerti updated:

    +
      +
    • The AI can now toggle whether its hologram will move towards the center of its view using the 'Toggle Hologram Movement' verb.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Helmet cameras are no longer enabled by clicking the helmet, instead there is a 'Toggle Helmet Camera' verb.
    • +
    +

    Raptor1628 updated:

    +
      +
    • Armory layout changed, weapons returned to static amounts.
    • +
    • New security armor and helmet sprites added.
    • +
    +

    Zuhayr updated:

    +
      +
    • Backend change: allowed accessories to be placed on any clothing item with the appropriate variables set.
    • +
    • Drones can now pull a variety of things (such as scrubbers). This came with a pulling refactor so please report any strangeness with pulling in general.
    • +
    • Drones (and any mob that can be picked up) can be bashed against airlocks and such to use their internal access, so long as the person using them does not have an ID card equipped.
    • +
    • Rewrote fireaxe cabinets. Click with a multitool to unlock or loc, click with a hand to open or close, smash with anything that does damage, and drag onto your icon to remove the fireaxe.

    22 November 2015

    +

    PsiOmegaDelta updated:

    +
      +
    • Engineering alarm consoles now display camera alerts.
    • +
    • Adds a hacking tool that for all intents and purposes acts and works like a multitool until a screwdriver is applied.
    • +
    • Gives full control of airlocks after 20-40 seconds of hacking.
    • +
    • The last 6-8 hacked airlocks are always accessed instantly.
    • +

    neersighted updated:

    • Laptop Vendors now accept ID Containers (PDA, Wallet, etc).
    • Personal Lockers now accept ID Containers (PDA, Wallet, etc).
    • +
    • Add /tg/-like attack overlays.
    • +
    + +

    19 November 2015

    +

    PsiOmegaDelta updated:

    +
      +
    • The round start and auto-antag spawners can now check if players have played long enough to be eligable for selection.
    • +
    + +

    16 November 2015

    +

    PsiOmegaDelta updated:

    +
      +
    • Added new verb, 'Character Setup' under the Preferences tab, to allow modifying your character settings at any time.
    • +
    + +

    10 November 2015

    +

    Atlantis updated:

    +
      +
    • Expanded gridcheck random event. Affected devices now show error UI and may be restarted manually before the event ends. All Z-levels are now affected equally.
    • +
    +

    Datraen updated:

    +
      +
    • Changes standard and specific plant traits, more diverse plants.
    • +
    +

    Sligneris updated:

    +
      +
    • Modified the wording of NT Default's laws.
    • +
    + +

    02 November 2015

    +

    Hubblenaut updated:

    +
      +
    • Adds tape for atmospherics.
    • +
    • Tape graphics and algorithm changes. Looks a lot more appealing now.
    • +
    • Starting and ending tape on the same turf will connect it to all surrounding walls/windows.
    • +
    • Lifting a part of the tape will lift an entire tape section.
    • +
    • Mobs on help intent do stop for tape.
    • +
    • Crumpled tape does not affect tape breaking behavior anymore.

    27 October 2015

    @@ -1282,6 +1483,14 @@
  • When affected by pepperspray, eye protection now prevents blindness and face protection now prevents stun, instead of face protection doing both.
  • +

    21 October 2015

    +

    Hubblenaut updated:

    +
      +
    • Bruise packs are now applied per wound, not per limb.
    • +
    • Bruise packs now use a delay depending on wound severity for applying.
    • +
    • Removed instant healing ability from advanced bruise packs and ointment.
    • +
    +

    14 October 2015

    Hubblenaut updated:

      @@ -1290,10 +1499,36 @@
    • Material stacks now properly merge upon creation.
    • Messages for adding to existing stack appear again.
    +

    PsiOmegaDelta updated:

    +
      +
    • Blobs can now spawn anywhere in maintenance, rather than picking location from a pre-determined list.
    • +

    TheWelp updated:

    • Removed higher Secret player requirements.
    +

    Zuhayr updated:

    +
      +
    • Removed facehuggers, alien embryos, and embryo removal surgery.
    • +
    • Xenomorph Queens (or infested surgeons...) can now add a hive node to a victim in order to slave them to the hive.
    • +
    • Xenomorph brute/burn mods were tweaked to buff them significantly.
    • +
    • Alien larvae now hatch from eggs when ghosts click on them.
    • +
    • Alien larvae now gain progression towards adulthood from being inside a human with blood, which they drink.
    • +
    • Alien weeds now use the vine system.
    • +
    + +

    11 October 2015

    +

    HarpyEagle updated:

    +
      +
    • Fabricated power cells start uncharged.
    • +
    +

    Hubblenaut updated:

    +
      +
    • Light replacers can be refilled by clicking on a storage item.
    • +
    • Light replacers now hold up to 32 light bulbs.
    • +
    • Light replacers can be obtained through janitorial supply crates.
    • +
    • A sheet of glass fills the light replacer by 16 bulbs.
    • +

    10 October 2015

    HarpyEagle updated:

    @@ -1303,30 +1538,151 @@
  • Merc bombs are now appropriately explosive again. Same goes for bombs made by toxins.
  • +

    26 September 2015

    +

    PsiOmegaDelta updated:

    +
      +
    • Meteor events now select a map edge to arrive from, with a probability for each individual wave to come from either neighboring edge. Meteors will never arrive from opposite the starting edge.
    • +
    +

    11 September 2015

    HarpyEagle updated:

    • Made flares brighter.
    • +
    • Coffee is now poisonous to tajaran, much like how animal protein is poisonous to skrell.
    -

    05 September 2015

    +

    08 September 2015

    +

    Soadreqm updated:

    +
      +
    • Increased changeling starting genetic points to 25.
    • +

    Zuhayr updated:

    • Auto-traitor should now be fixed.
    • The Secret game mode should now be fixed.
    +

    07 September 2015

    +

    GinjaNinja32 updated:

    +
      +
    • Added an auto-hiss system for those who would prefer the game do their sss or rrr for them. Activate via Toggle Auto-Hiss in the OOC tab.
    • +
    • Auto-hiss system in 'basic' mode will extend 's' for Unathi and 'r' for Tajara. 'Full' mode adds 'x' to 'ks' for Unathi, and is identical to 'basic' mode for Tajara.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Changed the language prefix keys to the following: , # -
    • +
    • Language prefix keys can be changed in the Character Setup. Changes are currently not global, but per character.
    • +
    + +

    05 September 2015

    +

    Chinsky updated:

    +
      +
    • Made capguns into proper guns code-wise. It means you can now take people hostage with them, stick in your mouth, and all other things you can do with real guns but probably shouldn't.
    • +
    • Russian roulette! Fun for whole sec team! Unload some shells from revolver, spin the cylinder(verb) and you're good to go!
    • +
    +

    HarpyEagle updated:

    +
      +
    • Shields no longer block attacks from directly behind the player.
    • +
    • Riot shields no longer stop bullets or beams (except for beanbags and rubber bullets), however they are now more effective at blocking melee attacks and thrown objects.
    • +
    • Energy shields block melee attacks as effectively as riot shields do. Their ability to block projectiles is largely unchanged.
    • +
    • Melee weapons now only block melee attacks.
    • +
    • Two handed weapons have a small chance of blocking melee attacks when wielded in two hands.
    • +
    • Sound and visual effects when blocking attacks with an energy shield or energy sword.
    • +
    • Fixed dead or unconscious people blocking stuff with shields.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Cargo now sorts under its own department on station manifests.
    • +
    • Manual radio frequency changes can no longer go outside the standard frequency span.
    • +
    • Users with sufficient access can instead select pre-defined channels outside this span, such as department channels, when using intercoms.
    • +
    + +

    02 September 2015

    +

    Atlantis updated:

    +
      +
    • Converted phoron glass to borosilicate glass, adjusted heat resistances accordingly, got rid of copypaste fire code. Fire resistance is now handled by variables so completely fireproof windows are possible with varedit.
    • +
    • Windows take fire damage when heat exceeds 100C regular windows, 750C reinforced regular, 2000C borosilicate and 4000C reinforced borosilicate. For comparsions, reinforced walls begin taking damage around 6000.
    • +
    +

    Hubblenaut updated:

    +
      +
    • Adds glass bottles for Cola, Space Up and Space Mountain Wind to Booze-O-Mat.
    • +
    • Some bar drink recipes have been amended to easily sum to 30 units for drinking glasses.
    • +
    • Vendors now have a product receptor for accepting goods. Opening the maintenance painel is no longer required.
    • +
    • Wrenching a vending machine is no longer a silent action.
    • +
    • Stepup: Item placement on 4x4 grids seemed to work great. Now we'll try 8x8.
    • +
    +

    Kelenius updated:

    +
      +
    • Mechfab can now be upgraded using RPED, and now uses NanoUI.
    • +
    +

    Matthew951 updated:

    +
      +
    • Added Vincent Volaju's hair.
    • +
    • Added Vincent Volaju's beard.
    • +
    +

    Zuhayr updated:

    +
      +
    • Added the ability for AIs in hardsuits to control suit modules and movement with a dead or unconcious wearer.
    • +
    • Added ballistic supply drop pods.
    • +
    • Added diona gestalt random map template.
    • +
    • Swapped the singularity beacon out for a hacked supply beacon.
    • +
    +

    24 August 2015

    HarpyEagle updated:

    • Girders are now reinforced by using a screwdriver on the girder before applying the material sheets. Use a screwdriver again instead to cancel reinforcing.
    • Mechanical traps no longer spawn in the janitor's locker.
    • Mechanical traps can now be printed with a hacked autolathe.
    • +
    • Adds armour penetration mechanic for projectiles and melee weapons.
    • +
    • Laser carbines, LWAP, and shotgun now have a small amount of armour penetration, ballistic rifles (not SMGs) have moderate amounts, laser cannon has high armour penetration, and the PTR mostly ignores body armour.
    • +
    • Shotgun slugs and Z8/STS damage has been lowered slightly to accomodate for their higher penetration. In general ballistics deal less damage but have higher penetration than comparable laser weapons. Notable exception: X-Ray lasers have had their damage lowered slightly but gain very high armour penetration.
    • +
    • Energy swords now have very high armour penetration. Ninja blades do less damage but ignore armour completely.
    • +
    +

    Kelenius updated:

    +
      +
    • Click cooldowns have been removed on pretty much everything that isn't an attack.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Adds the option to set the icon size to 48x48, found under the Icons menu, along with 32x32, 64x64, and stretch to fit.
    • +
    • Active AI cores now provides coverage on the AI camera network. Does not utilize actual cameras, thus will not show up on security consoles.
    • +
    • The Dinnerware vending machine now offer both utensil knives and spoons without first having to hack them.
    • +
    • Synths now have id cards with access levels which is checked when operating most station equipment.
    • +
    • Station synthetics still have full station access but can no longer interact with syndicate equipment, and syndicate borgs now start with only syndicate access.
    • +
    • Syndicate borgs can copy the access from other cards by utilizing their own id card module, similar to how syndicate ids work.
    • +
    • When examined up close id cards now offer a more detailed view.
    • +
    • Agent ids now offer much greater customization, allowing changing name, age, DNA, toggling of AI tracking termination (using the electronic warfware option), and more.
    • +
    • As AI tracking can now be enabled/disabled at will AI players should not feel the need to hesitate before informing relevant crew members when camera tracking is explicitly terminated.
    • +
    • Uplink menu now more organized and with new categories.
    • +
    • Now possible to cause falsified ion storm announcements.
    • +
    • Now possible to cause falsified radiation storm announcements, with expected maintenance access changes.
    • +
    • Now possible for mercenaries to create falsified Central Command Update messages.
    • +
    • Now possible for mercenaries to create falsified crew arrival messages and records.
    • +
    +

    RavingManiac updated:

    +
      +
    • Sound environments tweaked to feel more claustrophobic
    • +
    • Being drugged, hallucinating, dizzy, or in low-pressure or vacuum will alter sounds you hear
    • +
    • Sound environment in holodeck will change to reflect the loaded program
    • +
    +

    Vivalas updated:

    +
      +
    • A new uplink item has been added! A briefcase full 'o thalla can now be bought by traitors for bribes and such!

    Zuhayr updated:

    • Pariahs are now a subspecies of Vox with less atmos/cold protection, a useless brain, and lower health.
    • Leap now only gives a passive grab and has a shorter range. It also stuns Pariahs longer than it does their target.
    • +
    • Rewrote tiling. White floors, dark floors and freezer floors now have associated tiles.
    • +
    • Changed how decals work in the mapper. floor_decal is now used instead of an icon in floors.dmi.
    • +
    • The floor painter has been rewritten to use decals. Click it in-hand to set direction and decal.
    • +
    • Floor lights are now built from the autholathe, secured with a screwdriver, activated by clicking them with an empty hand, and repaired with a welding torch.
    • +
    • Unathi now have minor slowdown and 20% brute resist.
    • +
    • Tajarans now have lower bonus speed and a flat 15% malus to brute and burn.
    • +
    • Vox can now eat monkeys and small animals.
    • +
    • Tajarans can now eat small animals.
    • +
    • Unarmed attack damage has been lowered across the board.

    17 August 2015

    @@ -1335,6 +1691,59 @@
  • Station time and duration now available in the Status tab.
  • +

    16 August 2015

    +

    HarpyEagle updated:

    +
      +
    • The unathi breacher is now only wearable by unathi.
    • +
    + +

    15 August 2015

    +

    Kelenius updated:

    +
      +
    • Bees have been updated and are totally worth checking out (beekeeping crate at cargo).
    • +
    • Sleeper consoles removed. All interaction is now done by clicking on the sleeper itself.
    • +
    • To put people into sleeper, you now have to click-drag people to it. Grabs no longer work. To exit the sleeper, move.
    • +
    • Sleeper now uses a NanoUI.
    • +
    + +

    14 August 2015

    +

    HarpyEagle updated:

    +
      +
    • Renames many guns to follow a consistent naming style. Updated and changed gun description text to be more lore-friendly.
    • +
    • Throwing a booze bottle at something nearby while on harm intent causes it to smash, splashing it's contents over whatever it hits.
    • +
    • Rags can now be wrung out over a container or the floor, emptying it's contents into the container or splashing them on the floor.
    • +
    • Rags can now be soaked using the large water and fuel tanks instead of just beakers.
    • +
    • Rags soaked in welding fuel can be lit on fire.
    • +
    • Rags can now be stuffed into booze bottles. When the bottle smashes, the stuffed rag is dropped onto the ground.
    • +
    • Fixed eggs having a ridiculously large chemical volume.
    • +
    • T-Ray scanner effects are now only visible to the person holding the scanner.
    • +
    • Traitors can now purchase the C-20r and the STS-35 for telecrystals.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • The amount you start with in your station account is now affected by species, rank, and NT's stance towards you.
    • +
    +

    TheWelp updated:

    +
      +
    • Bookcases are now movable/buildable/destroyable.
    • +
    • Paper can now be crumpled by using in-hand while on hurt intent.
    • +
    • Library Computer External Archive is now sortable.
    • +
    +

    Zuhayr updated:

    +
      +
    • Click a hat on a drone with help intent to equip it. Drag the drone onto yourself with grab intent to remove it.
    • +
    + +

    13 August 2015

    +

    GinjaNinja32 updated:

    +
      +
    • Changed language selection to allow multiple language selections, changed humans/unathi/tajarans/skrell to not automatically gain their racial language, instead adding it to the selectable languages for that species. Old slots will warn when loaded that the languages may not be what you expect.
    • +
    +

    Orelbon updated:

    +
      +
    • Changed the HoP's suit to more bibrant colors and hopefully you will like it.
    • +
    +

    11 August 2015

    PsiOmegaDelta updated:

      @@ -1436,6 +1845,12 @@
    • Ingesting diseased blood may contract the disease.
    +

    22 June 2015

    +

    PsiOmegaDelta updated:

    +
      +
    • The traitor uplink no longer displays all items in a long list, instead has categories which when accessed shows the relevant items.
    • +
    +

    19 June 2015

    HarpyEagle updated:

      @@ -1448,11 +1863,52 @@
    • Prevents knifing bots or silicons.
    +

    16 June 2015

    +

    Chinsky updated:

    +
      +
    • Updated penlights to be more of use in diagnostics, they now show following conditions:
    • +
    • Eye damage
    • +
    • Blurry eyes (overall slower reaction)
    • +
    • Brain damage (one eye reacts slower)
    • +
    • Opiates use (pinpoint pupils)
    • +
    • Drugs use (dilated pupils)
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Observers can now follow both the AI and its eye upon speech.
    • +
    • Observers can now follow both observers and their body, if they ever had one, upon speech.
    • +
    • Observers can now follow hivemind speakers if the speaker is not using an alias or antagHUD is enabled.
    • +
    • Turret controls now glow, with the color depending on the current mode.
    • +
    +

    Techhead updated:

    +
      +
    • Converted Request Console interface into NanoUI.
    • +
    + +

    09 June 2015

    +

    PsiOmegaDelta updated:

    +
      +
    • Ports /tg/'s meteor event. Meteors now appear to be more accurate, come in a greater variety, and may drop ores on their final destruction.
    • +
    + +

    08 June 2015

    +

    PsiOmegaDelta updated:

    +
      +
    • The AI chassis now glows, with the color depending on the currently selected display.
    • +
    +

    05 June 2015

    PsiOmegaDelta updated:

    • Split stacks no longer lose their coloring.
    • Can no longer merge cables of different colors.
    • +
    • Blobs and simple mobs now attack all external organs instead of a subset. The overall damage remains the same but the number of fractures caused will, in general, be fewer.
    • +
    • Spider nurses now have a chance of injecting their victims with spider eggs which eventually hatch. If the limb is removed from the host, the host dies, or the spiderling has matured sufficiently it will crawl out into freedom. Medical scanners will pick upp eggs and spiderlings as foreign bodies.
    • +
    +

    Yoshax updated:

    +
      +
    • Makes hyposprays start empty instead of filled with Tricord.
    • +
    • Makes the special wizard projectile staffs, Animate, Change, Focus and any future ones only usable by wizards. Also makes it so only wizards can use spellbooks and teleportation scrolls.

    04 June 2015

    @@ -1463,6 +1919,12 @@
  • Synths can state these laws if desired, however this is strongly discouraged unless subverted/malfunctioning.
  • Astral projecting mobs, such as wizards or cultists, may no longer respawn as something else while their body lives.
  • +

    Techhead updated:

    +
      +
    • Prison break event has been expanded to include Virology or Xenobiology
    • +
    • Prison break event will warn Enginering and the AI beforehand so they can take preventive measures.
    • +
    • Disabling area power will now prevent doors from opening during the event
    • +

    02 June 2015

    Techhead updated:

    @@ -1480,6 +1942,10 @@
  • Fixes Engineer ERT gloves not being insulated.
  • IV stands are no longer bullet shields. They also allow mice, drones, pAIs et al to pass though.
  • +

    Kelenius updated:

    +
      +
    • AI now hears LOOC both around its eye and its core, and speaks in LOOC around its eye. Keep in mind that you won't hear and won't be heard if there is a wall between your eye and the target.
    • +

    PsiOmegaDelta updated:

    • You can now review the server revision date and hash by using the 'Show Server Revision' verb in the OOC category.
    • @@ -1490,6 +1956,59 @@
      • The inactive check process now respects client holder status and can be configured how long clients may remain inactive before being kicked.
      +

      Zuhayr updated:

      +
        +
      • Unfolded pAIs can now be scooped up and worn as hats.
      • +
      • Scoop-up behavior is now standardized to selecting help intent and dragging their icon onto yours.
      • +
      + +

      26 May 2015

      +

      Atlantis updated:

      +
        +
      • NanoUI for Robotics Control Console
      • +
      • NanoUI for Supermatter Crystal - AI/Robot only, purely informational
      • +
      +

      Chinsky updated:

      +
        +
      • Meat limbs now can be attached. Use limb on missing area, then hemostat to finalize it.
      • +
      • Limbs from other races can be now attached. They'll cause rejection, but it can be kept at bay with spaceacilline to some point. Species special attack is carried over too, i.e. you can clawn people if you sew a cathand to yourself.
      • +
      • Limbs that are left in open will rot in ~7 minutes. Use freezers or cryobags to stop it. You can still attach them, but you wish you couldn't.
      • +
      +

      PsiOmegaDelta updated:

      +
        +
      • Both the pulse taker and target must now remain still for the duration of the check or it will fail.
      • +
      +

      RavingManiac updated:

      +
        +
      • Tape recorders now record hearable emotes and action messages (e.g. gunshots).
      • +
      • You can now see actions from inside mechs and closets.
      • +
      +

      Techhead updated:

      +
        +
      • Removed gaseous reagents from the chemistry system and replaced with real-world organic chemistry precursors.
      • +
      • Hydrogen has been replaced with hydrazine, a highly toxic, flammable liquid.
      • +
      • Oxygen has been replaced with acetone, a mildly toxic liquid. Ethanol's ink-sovlent capabilities have been copied to it.
      • +
      • Chlorine has been replaced with hydrochloric acid. It is a stronger acid than sulphuric but less toxic.
      • +
      • Nitrogen has been replaced with ammonia. Ammonia now acts as a Dexalin-equivalent for Vox.
      • +
      • Flourine has also been replaced with hydrazine in its one recipe. Flourosurficant has been renamed azosurficant.
      • +
      • Being splashed with liquid Phoron will burn eyes and contaminate clothes like being exposed to Phoron gas.
      • +
      +

      Zuhayr updated:

      +
        +
      • Added a ghost requisition system for posibrains and living plants.
      • +
      • Added attack_ghost() to hydro trays and posibrains to allow ghosts to enter them.
      • +
      • Prosthetic limbs are now only repairable with welders/cable coils if they have suffered below 30 combined damage.
      • +
      • Surgery steps that cause no pain and have no failure wounding have been added: screwdriver for 'incision', crowbar to open, multitool to 'decouple' a prosthetic organ. Hemostat is still used to take an organ out.
      • +
      • Using a welder or a cable coil as a surgical tool after opening a maintenance hatch will repair damage beyond the 30 damage cap. In other words, severe damage to robolimbs requires expert repair from someone else.
      • +
      • Eye and brain surgery were removed; they predate the current organ system and are redundant.
      • +
      • IPC are now simply full prosthetic bodies using a specific manufacturer (Morpheus Cyberkinetics).
      • +
      • IPC can 'recharge' in a cyborg station to regain nutriment. They no longer interface with APCs.
      • +
      • NO_BLOOD flag now bypasses ingested and blood reagent processing.
      • +
      • NO_SCAN now bypasses mutagen reagent effects.
      • +
      • Cyborg analyzers now show damage to prosthetic limbs and organs on humans.
      • +
      • Prosthetic EMP damage was reduced.
      • +
      • Several organ files were split up/moved around.
      • +

      22 May 2015

      Ccomp5950 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 6bfc401e327..2ae0b9e5b5c 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1541,10 +1541,69 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. a final sheet. - rscadd: Various things can be built with various sheet types. Experiment! Just keep in mind that uranium is now radioactive and phoron is now flammable. +2015-05-26: + Atlantis: + - rscadd: NanoUI for Robotics Control Console + - rscadd: NanoUI for Supermatter Crystal - AI/Robot only, purely informational + Chinsky: + - rscadd: Meat limbs now can be attached. Use limb on missing area, then hemostat + to finalize it. + - rscadd: Limbs from other races can be now attached. They'll cause rejection, but + it can be kept at bay with spaceacilline to some point. Species special attack + is carried over too, i.e. you can clawn people if you sew a cathand to yourself. + - rscadd: Limbs that are left in open will rot in ~7 minutes. Use freezers or cryobags + to stop it. You can still attach them, but you wish you couldn't. + PsiOmegaDelta: + - tweak: Both the pulse taker and target must now remain still for the duration + of the check or it will fail. + RavingManiac: + - rscadd: Tape recorders now record hearable emotes and action messages (e.g. gunshots). + - bugfix: You can now see actions from inside mechs and closets. + Techhead: + - rscadd: Removed gaseous reagents from the chemistry system and replaced with real-world + organic chemistry precursors. + - rscadd: Hydrogen has been replaced with hydrazine, a highly toxic, flammable liquid. + - rscadd: Oxygen has been replaced with acetone, a mildly toxic liquid. Ethanol's + ink-sovlent capabilities have been copied to it. + - rscadd: Chlorine has been replaced with hydrochloric acid. It is a stronger acid + than sulphuric but less toxic. + - tweak: Nitrogen has been replaced with ammonia. Ammonia now acts as a Dexalin-equivalent + for Vox. + - tweak: Flourine has also been replaced with hydrazine in its one recipe. Flourosurficant + has been renamed azosurficant. + - tweak: Being splashed with liquid Phoron will burn eyes and contaminate clothes + like being exposed to Phoron gas. + Zuhayr: + - rscadd: Added a ghost requisition system for posibrains and living plants. + - rscadd: Added attack_ghost() to hydro trays and posibrains to allow ghosts to + enter them. + - rscadd: Prosthetic limbs are now only repairable with welders/cable coils if they + have suffered below 30 combined damage. + - rscadd: 'Surgery steps that cause no pain and have no failure wounding have been + added: screwdriver for ''incision'', crowbar to open, multitool to ''decouple'' + a prosthetic organ. Hemostat is still used to take an organ out.' + - rscadd: Using a welder or a cable coil as a surgical tool after opening a maintenance + hatch will repair damage beyond the 30 damage cap. In other words, severe damage + to robolimbs requires expert repair from someone else. + - rscdel: Eye and brain surgery were removed; they predate the current organ system + and are redundant. + - rscadd: IPC are now simply full prosthetic bodies using a specific manufacturer + (Morpheus Cyberkinetics). + - rscadd: IPC can 'recharge' in a cyborg station to regain nutriment. They no longer + interface with APCs. + - rscadd: NO_BLOOD flag now bypasses ingested and blood reagent processing. + - rscadd: NO_SCAN now bypasses mutagen reagent effects. + - rscadd: Cyborg analyzers now show damage to prosthetic limbs and organs on humans. + - tweak: Prosthetic EMP damage was reduced. + - tweak: Several organ files were split up/moved around. 2015-05-27: PsiOmegaDelta: - tweak: The inactive check process now respects client holder status and can be configured how long clients may remain inactive before being kicked. + Zuhayr: + - rscadd: Unfolded pAIs can now be scooped up and worn as hats. + - tweak: Scoop-up behavior is now standardized to selecting help intent and dragging + their icon onto yours. 2015-05-30: Atlantis: - rscadd: Malfunction Overhaul - Whole gamemode was completely reworked from scratch. @@ -1557,6 +1616,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Fixes Engineer ERT gloves not being insulated. - tweak: IV stands are no longer bullet shields. They also allow mice, drones, pAIs et al to pass though. + Kelenius: + - tweak: AI now hears LOOC both around its eye and its core, and speaks in LOOC + around its eye. Keep in mind that you won't hear and won't be heard if there + is a wall between your eye and the target. PsiOmegaDelta: - rscadd: You can now review the server revision date and hash by using the 'Show Server Revision' verb in the OOC category. @@ -1572,10 +1635,53 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. unless subverted/malfunctioning. - bugfix: Astral projecting mobs, such as wizards or cultists, may no longer respawn as something else while their body lives. + Techhead: + - rscadd: Prison break event has been expanded to include Virology or Xenobiology + - rscadd: Prison break event will warn Enginering and the AI beforehand so they + can take preventive measures. + - bugfix: Disabling area power will now prevent doors from opening during the event 2015-06-05: PsiOmegaDelta: - bugfix: Split stacks no longer lose their coloring. - tweak: Can no longer merge cables of different colors. + - tweak: Blobs and simple mobs now attack all external organs instead of a subset. + The overall damage remains the same but the number of fractures caused will, + in general, be fewer. + - rscadd: Spider nurses now have a chance of injecting their victims with spider + eggs which eventually hatch. If the limb is removed from the host, the host + dies, or the spiderling has matured sufficiently it will crawl out into freedom. + Medical scanners will pick upp eggs and spiderlings as foreign bodies. + Yoshax: + - tweak: Makes hyposprays start empty instead of filled with Tricord. + - tweak: Makes the special wizard projectile staffs, Animate, Change, Focus and + any future ones only usable by wizards. Also makes it so only wizards can use + spellbooks and teleportation scrolls. +2015-06-08: + PsiOmegaDelta: + - rscadd: The AI chassis now glows, with the color depending on the currently selected + display. +2015-06-09: + PsiOmegaDelta: + - rscadd: Ports /tg/'s meteor event. Meteors now appear to be more accurate, come + in a greater variety, and may drop ores on their final destruction. +2015-06-16: + Chinsky: + - rscadd: 'Updated penlights to be more of use in diagnostics, they now show following + conditions:' + - rscadd: Eye damage + - rscadd: Blurry eyes (overall slower reaction) + - rscadd: Brain damage (one eye reacts slower) + - rscadd: Opiates use (pinpoint pupils) + - rscadd: Drugs use (dilated pupils) + PsiOmegaDelta: + - rscadd: Observers can now follow both the AI and its eye upon speech. + - rscadd: Observers can now follow both observers and their body, if they ever had + one, upon speech. + - rscadd: Observers can now follow hivemind speakers if the speaker is not using + an alias or antagHUD is enabled. + - rscadd: Turret controls now glow, with the color depending on the current mode. + Techhead: + - rscadd: Converted Request Console interface into NanoUI. 2015-06-19: HarpyEagle: - bugfix: Prevents being on fire from merely warming mobs up slightly in some cases. @@ -1591,6 +1697,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Knifing switches on harm intent, in case you just wanted to beat on the victim for some reason. - bugfix: Prevents knifing bots or silicons. +2015-06-22: + PsiOmegaDelta: + - tweak: The traitor uplink no longer displays all items in a long list, instead + has categories which when accessed shows the relevant items. 2015-06-24: HarpyEagle: - bugfix: Fixed Tajaran name generation producing names without a space between @@ -1689,6 +1799,53 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Crew monitors now update every 5th second instead of every other. Reduces lag and gives antags a larger window of opportunity to disable suit sensors if they have to harm someone. +2015-08-13: + GinjaNinja32: + - rscadd: Changed language selection to allow multiple language selections, changed + humans/unathi/tajarans/skrell to not automatically gain their racial language, + instead adding it to the selectable languages for that species. Old slots will + warn when loaded that the languages may not be what you expect. + Orelbon: + - rscadd: Changed the HoP's suit to more bibrant colors and hopefully you will like + it. +2015-08-14: + HarpyEagle: + - spellcheck: Renames many guns to follow a consistent naming style. Updated and + changed gun description text to be more lore-friendly. + - rscadd: Throwing a booze bottle at something nearby while on harm intent causes + it to smash, splashing it's contents over whatever it hits. + - rscadd: Rags can now be wrung out over a container or the floor, emptying it's + contents into the container or splashing them on the floor. + - rscadd: Rags can now be soaked using the large water and fuel tanks instead of + just beakers. + - rscadd: Rags soaked in welding fuel can be lit on fire. + - rscadd: Rags can now be stuffed into booze bottles. When the bottle smashes, the + stuffed rag is dropped onto the ground. + - bugfix: Fixed eggs having a ridiculously large chemical volume. + - rscadd: T-Ray scanner effects are now only visible to the person holding the scanner. + - rscadd: Traitors can now purchase the C-20r and the STS-35 for telecrystals. + PsiOmegaDelta: + - tweak: The amount you start with in your station account is now affected by species, + rank, and NT's stance towards you. + TheWelp: + - rscadd: Bookcases are now movable/buildable/destroyable. + - rscadd: Paper can now be crumpled by using in-hand while on hurt intent. + - rscadd: Library Computer External Archive is now sortable. + Zuhayr: + - rscadd: Click a hat on a drone with help intent to equip it. Drag the drone onto + yourself with grab intent to remove it. +2015-08-15: + Kelenius: + - rscadd: Bees have been updated and are totally worth checking out (beekeeping + crate at cargo). + - rscdel: Sleeper consoles removed. All interaction is now done by clicking on the + sleeper itself. + - tweak: To put people into sleeper, you now have to click-drag people to it. Grabs + no longer work. To exit the sleeper, move. + - tweak: Sleeper now uses a NanoUI. +2015-08-16: + HarpyEagle: + - tweak: The unathi breacher is now only wearable by unathi. 2015-08-17: PsiOmegaDelta: - rscadd: Station time and duration now available in the Status tab. @@ -1698,18 +1855,156 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. applying the material sheets. Use a screwdriver again instead to cancel reinforcing. - bugfix: Mechanical traps no longer spawn in the janitor's locker. - rscadd: Mechanical traps can now be printed with a hacked autolathe. + - rscadd: Adds armour penetration mechanic for projectiles and melee weapons. + - rscadd: Laser carbines, LWAP, and shotgun now have a small amount of armour penetration, + ballistic rifles (not SMGs) have moderate amounts, laser cannon has high armour + penetration, and the PTR mostly ignores body armour. + - tweak: 'Shotgun slugs and Z8/STS damage has been lowered slightly to accomodate + for their higher penetration. In general ballistics deal less damage but have + higher penetration than comparable laser weapons. Notable exception: X-Ray lasers + have had their damage lowered slightly but gain very high armour penetration.' + - rscadd: Energy swords now have very high armour penetration. Ninja blades do less + damage but ignore armour completely. + Kelenius: + - experiment: Click cooldowns have been removed on pretty much everything that isn't + an attack. + PsiOmegaDelta: + - rscadd: Adds the option to set the icon size to 48x48, found under the Icons menu, + along with 32x32, 64x64, and stretch to fit. + - tweak: Active AI cores now provides coverage on the AI camera network. Does not + utilize actual cameras, thus will not show up on security consoles. + - rscadd: The Dinnerware vending machine now offer both utensil knives and spoons + without first having to hack them. + - rscadd: Synths now have id cards with access levels which is checked when operating + most station equipment. + - rscadd: Station synthetics still have full station access but can no longer interact + with syndicate equipment, and syndicate borgs now start with only syndicate + access. + - rscadd: Syndicate borgs can copy the access from other cards by utilizing their + own id card module, similar to how syndicate ids work. + - rscadd: When examined up close id cards now offer a more detailed view. + - rscadd: Agent ids now offer much greater customization, allowing changing name, + age, DNA, toggling of AI tracking termination (using the electronic warfware + option), and more. + - rscadd: As AI tracking can now be enabled/disabled at will AI players should not + feel the need to hesitate before informing relevant crew members when camera + tracking is explicitly terminated. + - rscadd: Uplink menu now more organized and with new categories. + - rscadd: Now possible to cause falsified ion storm announcements. + - rscadd: Now possible to cause falsified radiation storm announcements, with expected + maintenance access changes. + - rscadd: Now possible for mercenaries to create falsified Central Command Update + messages. + - rscadd: Now possible for mercenaries to create falsified crew arrival messages + and records. + RavingManiac: + - tweak: Sound environments tweaked to feel more claustrophobic + - rscadd: Being drugged, hallucinating, dizzy, or in low-pressure or vacuum will + alter sounds you hear + - rscadd: Sound environment in holodeck will change to reflect the loaded program + Vivalas: + - rscadd: A new uplink item has been added! A briefcase full 'o thalla can now be + bought by traitors for bribes and such! Zuhayr: - rscadd: Pariahs are now a subspecies of Vox with less atmos/cold protection, a useless brain, and lower health. - rscadd: Leap now only gives a passive grab and has a shorter range. It also stuns Pariahs longer than it does their target. + - tweak: Rewrote tiling. White floors, dark floors and freezer floors now have associated + tiles. + - tweak: Changed how decals work in the mapper. floor_decal is now used instead + of an icon in floors.dmi. + - tweak: The floor painter has been rewritten to use decals. Click it in-hand to + set direction and decal. + - tweak: Floor lights are now built from the autholathe, secured with a screwdriver, + activated by clicking them with an empty hand, and repaired with a welding torch. + - rscadd: Unathi now have minor slowdown and 20% brute resist. + - rscadd: Tajarans now have lower bonus speed and a flat 15% malus to brute and + burn. + - rscadd: Vox can now eat monkeys and small animals. + - rscadd: Tajarans can now eat small animals. + - rscadd: Unarmed attack damage has been lowered across the board. +2015-09-02: + Atlantis: + - rscadd: Converted phoron glass to borosilicate glass, adjusted heat resistances + accordingly, got rid of copypaste fire code. Fire resistance is now handled + by variables so completely fireproof windows are possible with varedit. + - rscadd: Windows take fire damage when heat exceeds 100C regular windows, 750C + reinforced regular, 2000C borosilicate and 4000C reinforced borosilicate. For + comparsions, reinforced walls begin taking damage around 6000. + Hubblenaut: + - rscadd: Adds glass bottles for Cola, Space Up and Space Mountain Wind to Booze-O-Mat. + - tweak: Some bar drink recipes have been amended to easily sum to 30 units for + drinking glasses. + - tweak: Vendors now have a product receptor for accepting goods. Opening the maintenance + painel is no longer required. + - tweak: Wrenching a vending machine is no longer a silent action. + - tweak: 'Stepup: Item placement on 4x4 grids seemed to work great. Now we''ll try + 8x8.' + Kelenius: + - tweak: Mechfab can now be upgraded using RPED, and now uses NanoUI. + Matthew951: + - rscadd: Added Vincent Volaju's hair. + - rscadd: Added Vincent Volaju's beard. + Zuhayr: + - rscadd: Added the ability for AIs in hardsuits to control suit modules and movement + with a dead or unconcious wearer. + - rscadd: Added ballistic supply drop pods. + - rscadd: Added diona gestalt random map template. + - tweak: Swapped the singularity beacon out for a hacked supply beacon. 2015-09-05: + Chinsky: + - rscadd: Made capguns into proper guns code-wise. It means you can now take people + hostage with them, stick in your mouth, and all other things you can do with + real guns but probably shouldn't. + - rscadd: Russian roulette! Fun for whole sec team! Unload some shells from revolver, + spin the cylinder(verb) and you're good to go! + HarpyEagle: + - rscadd: Shields no longer block attacks from directly behind the player. + - rscadd: Riot shields no longer stop bullets or beams (except for beanbags and + rubber bullets), however they are now more effective at blocking melee attacks + and thrown objects. + - rscadd: Energy shields block melee attacks as effectively as riot shields do. + Their ability to block projectiles is largely unchanged. + - tweak: Melee weapons now only block melee attacks. + - experiment: Two handed weapons have a small chance of blocking melee attacks when + wielded in two hands. + - rscadd: Sound and visual effects when blocking attacks with an energy shield or + energy sword. + - bugfix: Fixed dead or unconscious people blocking stuff with shields. + PsiOmegaDelta: + - tweak: Cargo now sorts under its own department on station manifests. + - rscdel: Manual radio frequency changes can no longer go outside the standard frequency + span. + - rscadd: Users with sufficient access can instead select pre-defined channels outside + this span, such as department channels, when using intercoms. +2015-09-07: + GinjaNinja32: + - rscadd: Added an auto-hiss system for those who would prefer the game do their + sss or rrr for them. Activate via Toggle Auto-Hiss in the OOC tab. + - rscadd: Auto-hiss system in 'basic' mode will extend 's' for Unathi and 'r' for + Tajara. 'Full' mode adds 'x' to 'ks' for Unathi, and is identical to 'basic' + mode for Tajara. + PsiOmegaDelta: + - tweak: 'Changed the language prefix keys to the following: , # -' + - rscadd: Language prefix keys can be changed in the Character Setup. Changes are + currently not global, but per character. +2015-09-08: + Soadreqm: + - tweak: Increased changeling starting genetic points to 25. Zuhayr: - bugfix: Auto-traitor should now be fixed. - bugfix: The Secret game mode should now be fixed. 2015-09-11: HarpyEagle: - tweak: Made flares brighter. + - rscadd: Coffee is now poisonous to tajaran, much like how animal protein is poisonous + to skrell. +2015-09-26: + PsiOmegaDelta: + - tweak: Meteor events now select a map edge to arrive from, with a probability + for each individual wave to come from either neighboring edge. Meteors will + never arrive from opposite the starting edge. 2015-10-10: HarpyEagle: - tweak: Rubber bullets and beanbags now are now resisted by melee armour. @@ -1717,26 +2012,226 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. than they were supposed to. - bugfix: Merc bombs are now appropriately explosive again. Same goes for bombs made by toxins. +2015-10-11: + HarpyEagle: + - tweak: Fabricated power cells start uncharged. + Hubblenaut: + - rscadd: Light replacers can be refilled by clicking on a storage item. + - tweak: Light replacers now hold up to 32 light bulbs. + - tweak: Light replacers can be obtained through janitorial supply crates. + - tweak: A sheet of glass fills the light replacer by 16 bulbs. 2015-10-14: Hubblenaut: - bugfix: Airlock backup power test light properly offline when backup power down. - bugfix: Empty flavor texts no longer draw an empty line on examination. - bugfix: Material stacks now properly merge upon creation. - bugfix: Messages for adding to existing stack appear again. + PsiOmegaDelta: + - tweak: Blobs can now spawn anywhere in maintenance, rather than picking location + from a pre-determined list. TheWelp: - rscdel: Removed higher Secret player requirements. + Zuhayr: + - rscdel: Removed facehuggers, alien embryos, and embryo removal surgery. + - rscadd: Xenomorph Queens (or infested surgeons...) can now add a hive node to + a victim in order to slave them to the hive. + - tweak: Xenomorph brute/burn mods were tweaked to buff them significantly. + - tweak: Alien larvae now hatch from eggs when ghosts click on them. + - tweak: Alien larvae now gain progression towards adulthood from being inside a + human with blood, which they drink. + - tweak: Alien weeds now use the vine system. +2015-10-21: + Hubblenaut: + - tweak: Bruise packs are now applied per wound, not per limb. + - tweak: Bruise packs now use a delay depending on wound severity for applying. + - rscdel: Removed instant healing ability from advanced bruise packs and ointment. 2015-10-27: HarpyEagle: - bugfix: When affected by pepperspray, eye protection now prevents blindness and face protection now prevents stun, instead of face protection doing both. +2015-11-02: + Hubblenaut: + - rscadd: Adds tape for atmospherics. + - tweak: Tape graphics and algorithm changes. Looks a lot more appealing now. + - tweak: Starting and ending tape on the same turf will connect it to all surrounding + walls/windows. + - tweak: Lifting a part of the tape will lift an entire tape section. + - tweak: Mobs on help intent do stop for tape. + - bugfix: Crumpled tape does not affect tape breaking behavior anymore. +2015-11-10: + Atlantis: + - rscadd: Expanded gridcheck random event. Affected devices now show error UI and + may be restarted manually before the event ends. All Z-levels are now affected + equally. + Datraen: + - tweak: Changes standard and specific plant traits, more diverse plants. + Sligneris: + - tweak: Modified the wording of NT Default's laws. +2015-11-16: + PsiOmegaDelta: + - rscadd: Added new verb, 'Character Setup' under the Preferences tab, to allow + modifying your character settings at any time. +2015-11-19: + PsiOmegaDelta: + - tweak: The round start and auto-antag spawners can now check if players have played + long enough to be eligable for selection. 2015-11-22: + PsiOmegaDelta: + - tweak: Engineering alarm consoles now display camera alerts. + - rscadd: Adds a hacking tool that for all intents and purposes acts and works like + a multitool until a screwdriver is applied. + - rscadd: Gives full control of airlocks after 20-40 seconds of hacking. + - rscadd: The last 6-8 hacked airlocks are always accessed instantly. neersighted: - bugfix: Laptop Vendors now accept ID Containers (PDA, Wallet, etc). - bugfix: Personal Lockers now accept ID Containers (PDA, Wallet, etc). + - experiment: Add /tg/-like attack overlays. 2015-12-06: Hubblenaut: - bugfix: Welding a broken camera will use the correct icon. - tweak: Camera assemblies remember their tag and network from previous usage. + - tweak: Mobs on help intent will not push others that aren't. + Loganbacca: + - rscadd: Added a backend (wireless) system for communication between machinery + and other devices. + Neerti: + - rscadd: The AI can now toggle whether its hologram will move towards the center + of its view using the 'Toggle Hologram Movement' verb. + PsiOmegaDelta: + - tweak: Helmet cameras are no longer enabled by clicking the helmet, instead there + is a 'Toggle Helmet Camera' verb. + Raptor1628: + - tweak: Armory layout changed, weapons returned to static amounts. + - rscadd: New security armor and helmet sprites added. + Zuhayr: + - tweak: 'Backend change: allowed accessories to be placed on any clothing item + with the appropriate variables set.' + - rscadd: Drones can now pull a variety of things (such as scrubbers). This came + with a pulling refactor so please report any strangeness with pulling in general. + - rscadd: Drones (and any mob that can be picked up) can be bashed against airlocks + and such to use their internal access, so long as the person using them does + not have an ID card equipped. + - tweak: Rewrote fireaxe cabinets. Click with a multitool to unlock or loc, click + with a hand to open or close, smash with anything that does damage, and drag + onto your icon to remove the fireaxe. +2015-12-13: + Atlantis: + - rscadd: Added Inflatables Dispenser(ID), an item that allows rapid deployment, + transport and removal of inflatables. + - rscadd: Engineering, Construction and Crisis modules are now outfitted with ID. + - rscadd: Three boxes in engineering have been replaced by three IDs. + - tweak: w_classes of inflatables readjusted. Boxes and IDs can be carried in backpack + now. Individual inflatables are small enough to fit in pocket. + PsiOmegaDelta: + - experiment: Adds a system to allow objects to implement custom multitool interactions + in a modular manner. + - rscadd: The AI can now toggle multitool mode on/off, using the new 'Toggle Multitool + Mode' verb. + - rscadd: Cloning vats can now be connected to a cloning console by using a multitool. + - rscadd: Station alert console circuits can now be altered using a multitool, changing + which alarm types are displayed. + - rscadd: Can now select the color of a cable coil using a multitool. + TheWelp: + - rscadd: Added boardgame item for use with table-top board games. + - rscadd: Added Actors Guild, an alternate spawn that allows players to control + actors. + - rscadd: Added differing card decks, including a Tarot deck and two trading card + games. + - rscadd: Remade /TG/Station's Orion Trail arcade machine with bay-specific modifications. +2015-12-20: + PsiOmegaDelta: + - rscadd: Can now use the Antag Uplink to buy a door hacking device with endless + uses and which leaves doors unharmed, but instead needs some time to do its + work. + Zuhayr: + - tweak: Aiming has been rewritten, keep an eye out for weird behavior. +2016-01-01: + Atlantis: + - rscdel: Removed old computer3 system, most noticeable due to removal of old laptops. + - rscadd: Adds brand new modular computer system that replaces computer3. These + computers may run programs from hard drive, and one device is not limited to + one program. + - rscadd: Modular computers can be assembled manually from components printed at + RnD (Consoles mainly), or purchased (from old laptop vending machines). + - rscadd: Adds NTNet, networking used by modular computers, including an administration + console, NTNet relays, and antag programs. + - rscadd: Adds small set of programs modular computers can run. More programs will + be added in the future. + - rscadd: Various small things added, such as, data crystals (USB flash drives), + NTNRC (messaging, IRC/forum style), file sending, etc. + PsiOmegaDelta: + - tweak: Resomi, and any other humanoid mobs, can now bump doors open despite their + size. + TheWelp: + - rscadd: Microwaves can now be unanchored with a crowbar. +2016-01-08: + Chinsky: + - bugfix: Can pick up monkeys / undress resomi now properly. HELP intent for scooping, + NON-HELP for undressing. + RavingManiac: + - rscadd: Storage in backpacks, boxes and other containers is now capacity-based. + Some containers like belts remain slot-based. +2016-01-13: + Datraen: + - bugfix: Objects can now be yanked out of synthetics. + Techhead: + - rscadd: 'Added a new random event: Shipping Error - A random crate is mistakenly + shipped to the station.' +2016-01-16: + Atlantiscze: + - rscadd: SMES units now try to balance their inputs and outputs. For outputs this + means two SMESes powering the same grid will share the load by percentage. For + inputs, all SMESes inputting from one power network will split the available + power by percentage. + - tweak: 'Some minor SMES configuration changes have been made: Atmospherics SMES + now starts configured to prevent power outages when people forget about it, + engine SMESes are now configured to input/output at full rate. These are only + defaults and may be changed ingame as usual.' + PsiOmegaDelta: + - rscadd: Uplink crystals can now be converted into physical form to allow transfer + between uplink devices. + - rscadd: Each mercenary now spawn with their own private uplink, with each indivual + uplink having the same number of telecrystals as the normal traitor uplink. +2016-01-20: + Atlantis: + - rscdel: Construction robot module removed + - rscadd: Engineering robot module now contains most tools of construction robot, + primarily plasteel. RCD is not included by default. + - rscadd: Engineering Robot RCD upgrade is now buildable. This upgrade unlocks robot's + RCD. It is fairly expensive, requiring small amount of gold and silver, as well + as phoron and steel to build. + - rscadd: Floodlight upgrade added. This upgrade doubles robot's light intensity + (it will be more or less same as actual floodlight), at the cost of higher power + usage. + - rscadd: You may now install matter bin into a cyborg in order to boost it's matter + synth's maximal capacity. Better matter bin adds more capacity + - tweak: Default capacity of matter synths for engineering module tweaked a little, + since prices of reinforced walls, etc. increased recently. Steel changed from + 40 to 60 sheets default, plasteel from 10 (Construction default) to 20. +2016-01-25: + Atlantis: + - tweak: Setup Supermatter admin button now uses map markers and supports all coolant + types. +2016-01-29: + Karolis2011: + - tweak: Improved modular computer performance + PsiOmegaDelta: + - experiment: We now support tg's online changelog auto-creation. See https://tgstation13.org/wiki/Guide_to_Changelogs#Online_auto-creation. + - rscadd: Can now click held mobs, such as Pun Pun, to view their inventory. +2016-02-01: + PsiOmegaDelta: + - bugfix: ED-209s, hostile mobs, and mecha weapons should again be able to fire + without issue. + - bugfix: Agent ids can now be assigned an owner even after having been dropped + on the floor. + - bugfix: Monkey cubes can now be expanded in sinks again. +2016-02-03: + PsiOmegaDelta: + - tweak: Antagonist and special role preferences has been overhauled. Please update + these specific character preferences as they have been reset. +2016-02-06: + PsiOmegaDelta: + - bugfix: Should again be possible to resist out of chairs, beds, and welded lockers. 2016-02-01: Lady of Ravens: - rscadd: Ported Aurora's stungloves and modified force gloves. diff --git a/icons/NTOS/battery_icons/batt_100.gif b/icons/NTOS/status_icons/batt_100.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_100.gif rename to icons/NTOS/status_icons/batt_100.gif diff --git a/icons/NTOS/battery_icons/batt_20.gif b/icons/NTOS/status_icons/batt_20.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_20.gif rename to icons/NTOS/status_icons/batt_20.gif diff --git a/icons/NTOS/battery_icons/batt_40.gif b/icons/NTOS/status_icons/batt_40.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_40.gif rename to icons/NTOS/status_icons/batt_40.gif diff --git a/icons/NTOS/battery_icons/batt_5.gif b/icons/NTOS/status_icons/batt_5.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_5.gif rename to icons/NTOS/status_icons/batt_5.gif diff --git a/icons/NTOS/battery_icons/batt_60.gif b/icons/NTOS/status_icons/batt_60.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_60.gif rename to icons/NTOS/status_icons/batt_60.gif diff --git a/icons/NTOS/battery_icons/batt_80.gif b/icons/NTOS/status_icons/batt_80.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_80.gif rename to icons/NTOS/status_icons/batt_80.gif diff --git a/icons/NTOS/battery_icons/batt_none.gif b/icons/NTOS/status_icons/batt_none.gif similarity index 100% rename from icons/NTOS/battery_icons/batt_none.gif rename to icons/NTOS/status_icons/batt_none.gif diff --git a/icons/NTOS/status_icons/charging.gif b/icons/NTOS/status_icons/charging.gif new file mode 100644 index 00000000000..0c66c9d17b5 Binary files /dev/null and b/icons/NTOS/status_icons/charging.gif differ diff --git a/icons/NTOS/status_icons/sig_high.gif b/icons/NTOS/status_icons/sig_high.gif new file mode 100644 index 00000000000..2cb9c504115 Binary files /dev/null and b/icons/NTOS/status_icons/sig_high.gif differ diff --git a/icons/NTOS/status_icons/sig_low.gif b/icons/NTOS/status_icons/sig_low.gif new file mode 100644 index 00000000000..3a8c59747c6 Binary files /dev/null and b/icons/NTOS/status_icons/sig_low.gif differ diff --git a/icons/NTOS/status_icons/sig_none.gif b/icons/NTOS/status_icons/sig_none.gif new file mode 100644 index 00000000000..e43f72feda1 Binary files /dev/null and b/icons/NTOS/status_icons/sig_none.gif differ diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index 3aa781d8d22..e1966e9bb5a 100644 Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi index 99588092d08..8c231b9b68a 100644 Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ diff --git a/icons/misc/fullscreen_halloween.dmi b/icons/misc/fullscreen_halloween.dmi deleted file mode 100644 index 1e4dc6c81ed..00000000000 Binary files a/icons/misc/fullscreen_halloween.dmi and /dev/null differ diff --git a/icons/misc/fullscreen_original.dmi b/icons/misc/fullscreen_original.dmi deleted file mode 100644 index 7d8ced9e49e..00000000000 Binary files a/icons/misc/fullscreen_original.dmi and /dev/null differ diff --git a/icons/misc/title.dmi b/icons/misc/title.dmi new file mode 100644 index 00000000000..e48b1418345 Binary files /dev/null and b/icons/misc/title.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi new file mode 100644 index 00000000000..400db51debe Binary files /dev/null and b/icons/mob/actions.dmi differ diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi index 1425245e198..171abcf1c01 100644 Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ diff --git a/icons/mob/head.dmi.orig b/icons/mob/head.dmi.orig new file mode 100644 index 00000000000..1ac40803aae Binary files /dev/null and b/icons/mob/head.dmi.orig differ diff --git a/icons/mob/holder_complex.dmi b/icons/mob/holder_complex.dmi new file mode 100644 index 00000000000..0c0235da028 Binary files /dev/null and b/icons/mob/holder_complex.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/ipc.dmi b/icons/mob/human_races/cyberlimbs/ipc.dmi new file mode 100644 index 00000000000..b0ae6739177 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/ipc.dmi differ diff --git a/icons/mob/human_races/masks/blood_resomi.dmi b/icons/mob/human_races/masks/blood_resomi.dmi new file mode 100644 index 00000000000..104eb8f94dd Binary files /dev/null and b/icons/mob/human_races/masks/blood_resomi.dmi differ diff --git a/icons/mob/human_races/masks/dam_mask_resomi.dmi b/icons/mob/human_races/masks/dam_mask_resomi.dmi new file mode 100644 index 00000000000..c3166d5945d Binary files /dev/null and b/icons/mob/human_races/masks/dam_mask_resomi.dmi differ diff --git a/icons/mob/human_races/masks/dam_resomi.dmi b/icons/mob/human_races/masks/dam_resomi.dmi new file mode 100644 index 00000000000..2241c3943c9 Binary files /dev/null and b/icons/mob/human_races/masks/dam_resomi.dmi differ diff --git a/icons/mob/human_races/masks/dam_template.dmi b/icons/mob/human_races/masks/dam_template.dmi new file mode 100644 index 00000000000..31986efb86e Binary files /dev/null and b/icons/mob/human_races/masks/dam_template.dmi differ diff --git a/icons/mob/human_races/monkeys/r_monkey.dmi b/icons/mob/human_races/monkeys/r_monkey.dmi index c405a94978d..362b7c20f54 100644 Binary files a/icons/mob/human_races/monkeys/r_monkey.dmi and b/icons/mob/human_races/monkeys/r_monkey.dmi differ diff --git a/icons/mob/human_races/r_resomi.dmi b/icons/mob/human_races/r_resomi.dmi new file mode 100644 index 00000000000..e370ec6b1c7 Binary files /dev/null and b/icons/mob/human_races/r_resomi.dmi differ diff --git a/icons/mob/human_races/subspecies/r_gravworlder.dmi b/icons/mob/human_races/subspecies/r_gravworlder.dmi new file mode 100644 index 00000000000..d63cc5526c2 Binary files /dev/null and b/icons/mob/human_races/subspecies/r_gravworlder.dmi differ diff --git a/icons/mob/human_races/subspecies/r_spacer.dmi b/icons/mob/human_races/subspecies/r_spacer.dmi new file mode 100644 index 00000000000..ceb27d29043 Binary files /dev/null and b/icons/mob/human_races/subspecies/r_spacer.dmi differ diff --git a/icons/mob/human_races/subspecies/r_upliftedchimp.dmi b/icons/mob/human_races/subspecies/r_upliftedchimp.dmi new file mode 100644 index 00000000000..eb26c817ccb Binary files /dev/null and b/icons/mob/human_races/subspecies/r_upliftedchimp.dmi differ diff --git a/icons/mob/human_races/subspecies/r_vatgrown.dmi b/icons/mob/human_races/subspecies/r_vatgrown.dmi new file mode 100644 index 00000000000..8cb165b1277 Binary files /dev/null and b/icons/mob/human_races/subspecies/r_vatgrown.dmi differ diff --git a/icons/mob/items/lefthand_backpacks.dmi b/icons/mob/items/lefthand_backpacks.dmi index ce83679ff68..5e1083f8712 100644 Binary files a/icons/mob/items/lefthand_backpacks.dmi and b/icons/mob/items/lefthand_backpacks.dmi differ diff --git a/icons/mob/items/lefthand_hats.dmi b/icons/mob/items/lefthand_hats.dmi new file mode 100644 index 00000000000..2cae6e7e967 Binary files /dev/null and b/icons/mob/items/lefthand_hats.dmi differ diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi new file mode 100644 index 00000000000..c82a46664da Binary files /dev/null and b/icons/mob/items/lefthand_holder.dmi differ diff --git a/icons/mob/items/lefthand_uniforms.dmi b/icons/mob/items/lefthand_uniforms.dmi index a7cb65c90ca..149d44fd8bc 100644 Binary files a/icons/mob/items/lefthand_uniforms.dmi and b/icons/mob/items/lefthand_uniforms.dmi differ diff --git a/icons/mob/items/righthand_backpacks.dmi b/icons/mob/items/righthand_backpacks.dmi index e4b31f04901..0ce40b49417 100644 Binary files a/icons/mob/items/righthand_backpacks.dmi and b/icons/mob/items/righthand_backpacks.dmi differ diff --git a/icons/mob/items/righthand_hats.dmi b/icons/mob/items/righthand_hats.dmi new file mode 100644 index 00000000000..ffaa950b557 Binary files /dev/null and b/icons/mob/items/righthand_hats.dmi differ diff --git a/icons/mob/items/righthand_holder.dmi b/icons/mob/items/righthand_holder.dmi new file mode 100644 index 00000000000..7843f51a280 Binary files /dev/null and b/icons/mob/items/righthand_holder.dmi differ diff --git a/icons/mob/items/righthand_uniforms.dmi b/icons/mob/items/righthand_uniforms.dmi index 2160f1c5e44..c014bdc35e6 100644 Binary files a/icons/mob/items/righthand_uniforms.dmi and b/icons/mob/items/righthand_uniforms.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 2b2bdfae95f..7db64d5b43b 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi index a26a8dda22f..923939d323e 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 4a37afdc3ef..82293225688 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/screen/midnight.dmi b/icons/mob/screen/midnight.dmi new file mode 100644 index 00000000000..ac5d15582b3 Binary files /dev/null and b/icons/mob/screen/midnight.dmi differ diff --git a/icons/mob/screen/old-noborder.dmi b/icons/mob/screen/old-noborder.dmi new file mode 100644 index 00000000000..9c7e68fc1c3 Binary files /dev/null and b/icons/mob/screen/old-noborder.dmi differ diff --git a/icons/mob/screen/old.dmi b/icons/mob/screen/old.dmi new file mode 100644 index 00000000000..07276f7559f Binary files /dev/null and b/icons/mob/screen/old.dmi differ diff --git a/icons/mob/screen/orange.dmi b/icons/mob/screen/orange.dmi new file mode 100644 index 00000000000..323124f4d60 Binary files /dev/null and b/icons/mob/screen/orange.dmi differ diff --git a/icons/mob/screen/white.dmi b/icons/mob/screen/white.dmi new file mode 100644 index 00000000000..6604dd8543f Binary files /dev/null and b/icons/mob/screen/white.dmi differ diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 3e9624536f6..cfc3e586785 100644 Binary files a/icons/mob/screen1.dmi and b/icons/mob/screen1.dmi differ diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi index 63f627ced46..04518a76145 100644 Binary files a/icons/mob/screen1_robot.dmi and b/icons/mob/screen1_robot.dmi differ diff --git a/icons/mob/species/resomi/back.dmi b/icons/mob/species/resomi/back.dmi new file mode 100644 index 00000000000..66455ffb3c7 Binary files /dev/null and b/icons/mob/species/resomi/back.dmi differ diff --git a/icons/mob/species/resomi/belt.dmi b/icons/mob/species/resomi/belt.dmi new file mode 100644 index 00000000000..19a4a78cd92 Binary files /dev/null and b/icons/mob/species/resomi/belt.dmi differ diff --git a/icons/mob/species/resomi/ears.dmi b/icons/mob/species/resomi/ears.dmi new file mode 100644 index 00000000000..5ebdd8a5eef Binary files /dev/null and b/icons/mob/species/resomi/ears.dmi differ diff --git a/icons/mob/species/resomi/eyes.dmi b/icons/mob/species/resomi/eyes.dmi new file mode 100644 index 00000000000..17a41de7473 Binary files /dev/null and b/icons/mob/species/resomi/eyes.dmi differ diff --git a/icons/mob/species/resomi/gloves.dmi b/icons/mob/species/resomi/gloves.dmi new file mode 100644 index 00000000000..7ff6c97e692 Binary files /dev/null and b/icons/mob/species/resomi/gloves.dmi differ diff --git a/icons/mob/species/resomi/handcuffs.dmi b/icons/mob/species/resomi/handcuffs.dmi new file mode 100644 index 00000000000..12b35d4e9ce Binary files /dev/null and b/icons/mob/species/resomi/handcuffs.dmi differ diff --git a/icons/mob/species/resomi/head.dmi b/icons/mob/species/resomi/head.dmi new file mode 100644 index 00000000000..54ebad32d40 Binary files /dev/null and b/icons/mob/species/resomi/head.dmi differ diff --git a/icons/mob/species/resomi/id.dmi b/icons/mob/species/resomi/id.dmi new file mode 100644 index 00000000000..fb4d5b6e583 Binary files /dev/null and b/icons/mob/species/resomi/id.dmi differ diff --git a/icons/mob/species/resomi/masks.dmi b/icons/mob/species/resomi/masks.dmi new file mode 100644 index 00000000000..8742285ed32 Binary files /dev/null and b/icons/mob/species/resomi/masks.dmi differ diff --git a/icons/mob/species/resomi/shoes.dmi b/icons/mob/species/resomi/shoes.dmi new file mode 100644 index 00000000000..f901a71cb85 Binary files /dev/null and b/icons/mob/species/resomi/shoes.dmi differ diff --git a/icons/mob/species/resomi/suit.dmi b/icons/mob/species/resomi/suit.dmi new file mode 100644 index 00000000000..2f1ff6cb718 Binary files /dev/null and b/icons/mob/species/resomi/suit.dmi differ diff --git a/icons/mob/species/resomi/uniform.dmi b/icons/mob/species/resomi/uniform.dmi new file mode 100644 index 00000000000..b60322d498f Binary files /dev/null and b/icons/mob/species/resomi/uniform.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi index e3b02e5c6a3..50c85feba4e 100644 Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index 69376d1955e..515595633f3 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi index 1a524c7621c..14fb5342312 100644 Binary files a/icons/obj/Cryogenic2.dmi and b/icons/obj/Cryogenic2.dmi differ diff --git a/icons/obj/beekeeping.dmi b/icons/obj/beekeeping.dmi new file mode 100644 index 00000000000..0b09bf47516 Binary files /dev/null and b/icons/obj/beekeeping.dmi differ diff --git a/icons/obj/bike.dmi b/icons/obj/bike.dmi new file mode 100644 index 00000000000..69aa0ccb4ef Binary files /dev/null and b/icons/obj/bike.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index a442296cda5..4fe6331610d 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index 3da8e52c6ba..74bb7a7beb5 100644 Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index f0e3ee940e7..26073227936 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/species/resomi/uniform.dmi b/icons/obj/clothing/species/resomi/uniform.dmi new file mode 100644 index 00000000000..817b3863cf0 Binary files /dev/null and b/icons/obj/clothing/species/resomi/uniform.dmi differ diff --git a/icons/obj/computer3.dmi b/icons/obj/computer3.dmi deleted file mode 100644 index 1fb6ce267ef..00000000000 Binary files a/icons/obj/computer3.dmi and /dev/null differ diff --git a/icons/obj/cryogenics.dmi b/icons/obj/cryogenics.dmi index 9b33a5ba8b3..ae4681657c1 100644 Binary files a/icons/obj/cryogenics.dmi and b/icons/obj/cryogenics.dmi differ diff --git a/icons/obj/cryogenics_split.dmi b/icons/obj/cryogenics_split.dmi new file mode 100644 index 00000000000..a25513a1435 Binary files /dev/null and b/icons/obj/cryogenics_split.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 7792bbbe012..8e8066fcd54 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/diona.dmi b/icons/obj/diona.dmi new file mode 100644 index 00000000000..a1a96b5b382 Binary files /dev/null and b/icons/obj/diona.dmi differ diff --git a/icons/obj/doors/Door2x1glass.dmi b/icons/obj/doors/Door2x1glass.dmi index fe4a9723539..b05a7a931a2 100644 Binary files a/icons/obj/doors/Door2x1glass.dmi and b/icons/obj/doors/Door2x1glass.dmi differ diff --git a/icons/obj/doors/door_assembly2x1.dmi b/icons/obj/doors/door_assembly2x1.dmi index a8d69b6f6a2..f6e5657d748 100644 Binary files a/icons/obj/doors/door_assembly2x1.dmi and b/icons/obj/doors/door_assembly2x1.dmi differ diff --git a/icons/obj/furniture.dmi b/icons/obj/furniture.dmi index 1e69557f840..852c69bc3aa 100644 Binary files a/icons/obj/furniture.dmi and b/icons/obj/furniture.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 1735fd8b3f0..60d7b4b4d2d 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 5c164a603f4..c38aad8025a 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/machines/floor_light.dmi b/icons/obj/machines/floor_light.dmi new file mode 100644 index 00000000000..c2386492806 Binary files /dev/null and b/icons/obj/machines/floor_light.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index 68dbded2127..f85b00bcfd5 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/machines/turret_control.dmi b/icons/obj/machines/turret_control.dmi index b7c81cd923e..69cd4ccbb71 100644 Binary files a/icons/obj/machines/turret_control.dmi and b/icons/obj/machines/turret_control.dmi differ diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi index 123a5bdf86e..b9a83d510ef 100644 Binary files a/icons/obj/meteor.dmi and b/icons/obj/meteor.dmi differ diff --git a/icons/obj/modular_components.dmi b/icons/obj/modular_components.dmi new file mode 100644 index 00000000000..3594a12c17f Binary files /dev/null and b/icons/obj/modular_components.dmi differ diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi new file mode 100644 index 00000000000..a157462f57a Binary files /dev/null and b/icons/obj/modular_console.dmi differ diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi new file mode 100644 index 00000000000..b3e0cb53648 Binary files /dev/null and b/icons/obj/modular_laptop.dmi differ diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi new file mode 100644 index 00000000000..1872315f49f Binary files /dev/null and b/icons/obj/modular_tablet.dmi differ diff --git a/icons/obj/monitors.dmi b/icons/obj/monitors.dmi index a817a42648c..7614a580d09 100644 Binary files a/icons/obj/monitors.dmi and b/icons/obj/monitors.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 9fca4e27b00..c56498f2f33 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/pieces.dmi b/icons/obj/pieces.dmi new file mode 100644 index 00000000000..de3a197b8ca Binary files /dev/null and b/icons/obj/pieces.dmi differ diff --git a/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi index 47b5b3e745a..a5fa632cb3a 100644 Binary files a/icons/obj/playing_cards.dmi and b/icons/obj/playing_cards.dmi differ diff --git a/icons/obj/podwindows.dmi b/icons/obj/podwindows.dmi index 7f6e79c9035..75bd1d9805c 100644 Binary files a/icons/obj/podwindows.dmi and b/icons/obj/podwindows.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 099070a4fc1..1627817be76 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/power_cond_white.dmi b/icons/obj/power_cond_white.dmi index 0e5a96a121a..8d17183bfa4 100644 Binary files a/icons/obj/power_cond_white.dmi and b/icons/obj/power_cond_white.dmi differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index 1f4eab42ff7..17b17759ee9 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/icons/obj/recycling.dmi b/icons/obj/recycling.dmi index 8661194c0d9..024db3109af 100644 Binary files a/icons/obj/recycling.dmi and b/icons/obj/recycling.dmi differ diff --git a/icons/obj/rig_modules.dmi b/icons/obj/rig_modules.dmi index 73384911516..d6c96415b8c 100644 Binary files a/icons/obj/rig_modules.dmi and b/icons/obj/rig_modules.dmi differ diff --git a/icons/obj/rollerbed.dmi b/icons/obj/rollerbed.dmi index b7e45127362..96cef3b01fa 100644 Binary files a/icons/obj/rollerbed.dmi and b/icons/obj/rollerbed.dmi differ diff --git a/icons/obj/smoothlattice.dmi b/icons/obj/smoothlattice.dmi index f140a27f007..30f83a380d7 100644 Binary files a/icons/obj/smoothlattice.dmi and b/icons/obj/smoothlattice.dmi differ diff --git a/icons/obj/stairs.dmi b/icons/obj/stairs.dmi new file mode 100644 index 00000000000..d29408d8808 Binary files /dev/null and b/icons/obj/stairs.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi old mode 100755 new mode 100644 index 2813c5d7f8b..dbe8997dbf4 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/supplybeacon.dmi b/icons/obj/supplybeacon.dmi new file mode 100644 index 00000000000..9734d854587 Binary files /dev/null and b/icons/obj/supplybeacon.dmi differ diff --git a/icons/obj/tables.dmi b/icons/obj/tables.dmi index 99b21bcfcbc..3f8ac59ad7d 100644 Binary files a/icons/obj/tables.dmi and b/icons/obj/tables.dmi differ diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 9f39eb1bee5..c1b956645b5 100644 Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 3b52b958b36..9ed2b5db09a 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 2b0a66d9ac5..38ed502aed7 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi index 4ec3da1adc2..a0719c2955b 100644 Binary files a/icons/obj/xenoarchaeology.dmi and b/icons/obj/xenoarchaeology.dmi differ diff --git a/icons/turf/flooring/asteroid.dmi b/icons/turf/flooring/asteroid.dmi new file mode 100644 index 00000000000..b064d7f377e Binary files /dev/null and b/icons/turf/flooring/asteroid.dmi differ diff --git a/icons/turf/flooring/carpet.dmi b/icons/turf/flooring/carpet.dmi new file mode 100644 index 00000000000..5f1405ce486 Binary files /dev/null and b/icons/turf/flooring/carpet.dmi differ diff --git a/icons/turf/flooring/circuit.dmi b/icons/turf/flooring/circuit.dmi new file mode 100644 index 00000000000..ed3ec42dd03 Binary files /dev/null and b/icons/turf/flooring/circuit.dmi differ diff --git a/icons/turf/flooring/cult.dmi b/icons/turf/flooring/cult.dmi new file mode 100644 index 00000000000..df77cf22f3a Binary files /dev/null and b/icons/turf/flooring/cult.dmi differ diff --git a/icons/turf/flooring/decals.dmi b/icons/turf/flooring/decals.dmi new file mode 100644 index 00000000000..c5b2a54b0b4 Binary files /dev/null and b/icons/turf/flooring/decals.dmi differ diff --git a/icons/turf/flooring/grass.dmi b/icons/turf/flooring/grass.dmi new file mode 100644 index 00000000000..89cf79920c4 Binary files /dev/null and b/icons/turf/flooring/grass.dmi differ diff --git a/icons/turf/flooring/lava.dmi b/icons/turf/flooring/lava.dmi new file mode 100644 index 00000000000..f509ea2ede7 Binary files /dev/null and b/icons/turf/flooring/lava.dmi differ diff --git a/icons/turf/flooring/linoleum.dmi b/icons/turf/flooring/linoleum.dmi new file mode 100644 index 00000000000..f4dfa17bfe4 Binary files /dev/null and b/icons/turf/flooring/linoleum.dmi differ diff --git a/icons/turf/flooring/misc.dmi b/icons/turf/flooring/misc.dmi new file mode 100644 index 00000000000..240ba5fc3b4 Binary files /dev/null and b/icons/turf/flooring/misc.dmi differ diff --git a/icons/turf/flooring/plating.dmi b/icons/turf/flooring/plating.dmi new file mode 100644 index 00000000000..ca7394380a1 Binary files /dev/null and b/icons/turf/flooring/plating.dmi differ diff --git a/icons/turf/flooring/tiles.dmi b/icons/turf/flooring/tiles.dmi new file mode 100644 index 00000000000..7d160b70708 Binary files /dev/null and b/icons/turf/flooring/tiles.dmi differ diff --git a/icons/turf/flooring/wood.dmi b/icons/turf/flooring/wood.dmi new file mode 100644 index 00000000000..78ca4805e8f Binary files /dev/null and b/icons/turf/flooring/wood.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index ecc8646cd84..d66ddc0b5cf 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/shuttle.dmi b/icons/turf/shuttle.dmi index 430ca0b1fc2..7d847188b4b 100644 Binary files a/icons/turf/shuttle.dmi and b/icons/turf/shuttle.dmi differ diff --git a/icons/turf/structures.dmi b/icons/turf/structures.dmi new file mode 100644 index 00000000000..36da6f2e028 Binary files /dev/null and b/icons/turf/structures.dmi differ diff --git a/icons/turf/wall_masks.dmi b/icons/turf/wall_masks.dmi index 0094e605b82..bd6e1abe6d4 100644 Binary files a/icons/turf/wall_masks.dmi and b/icons/turf/wall_masks.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index 259333e27be..24ff726d2f4 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/install-byond.sh b/install-byond.sh index cca44342c60..3b0170c16b0 100644 --- a/install-byond.sh +++ b/install-byond.sh @@ -1,14 +1,15 @@ #!/bin/sh set -e -if [ -d "$HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin" ]; +if [ -f "$HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/DreamMaker" ]; then echo "Using cached directory." else echo "Setting up BYOND." mkdir -p "$HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}" cd "$HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}" + echo "Installing DreamMaker to $PWD" curl "http://www.byond.com/download/build/${BYOND_MAJOR}/${BYOND_MAJOR}.${BYOND_MINOR}_byond_linux.zip" -o byond.zip - unzip byond.zip + unzip -o byond.zip cd byond make here fi diff --git a/interface/interface.dm b/interface/interface.dm index f0f36d353f7..125b52fd482 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -8,7 +8,7 @@ return src << link(config.wikiurl) else - src << "\red The wiki URL is not set in the server configuration." + src << "The wiki URL is not set in the server configuration." return /client/verb/forum() @@ -20,7 +20,7 @@ return src << link(config.forumurl) else - src << "\red The forum URL is not set in the server configuration." + src << "The forum URL is not set in the server configuration." return /client/verb/reportbug() diff --git a/interface/skin.dmf b/interface/skin.dmf index 3f2d2854dee..685a96689d9 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -381,6 +381,10 @@ macro "macro" name = "CTRL+G" command = "a-intent right" is-disabled = false + elem + name = "CTRL+SHIFT+G" + command = ".configure graphics-hwmode on" + is-disabled = false elem name = "CTRL+Q" command = ".northwest" @@ -1004,7 +1008,7 @@ menu "menu" is-disabled = false saved-params = "is-checked" elem "icon64" - name = "&64x64 (2x)" + name = "&64x64" command = ".winset \"mapwindow.map.icon-size=64\"" category = "&Icons" is-checked = false @@ -1012,6 +1016,15 @@ menu "menu" group = "size" is-disabled = false saved-params = "is-checked" + elem "icon48" + name = "&48x48" + command = ".winset \"mapwindow.map.icon-size=48\"" + category = "&Icons" + is-checked = false + can-check = true + group = "size" + is-disabled = false + saved-params = "is-checked" elem "icon32" name = "&32x32" command = ".winset \"mapwindow.map.icon-size=32\"" @@ -1365,6 +1378,8 @@ window "chemdispenser" keep-aspect = false align = center text-wrap = false + allow-html = false + letterbox = true elem "eject" type = BUTTON pos = 264,4 @@ -1531,6 +1546,8 @@ window "chemdispenser" keep-aspect = false align = center text-wrap = false + allow-html = false + letterbox = true elem "child1" type = CHILD pos = 0,40 @@ -1652,6 +1669,8 @@ window "chemdispenser_reagents" keep-aspect = false align = center text-wrap = false + allow-html = false + letterbox = true window "mainwindow" elem "mainwindow" @@ -2395,3 +2414,152 @@ window "infowindow" prefix-color = none suffix-color = none +window "text_editor" + elem "text_editor" + type = MAIN + pos = 281,0 + size = 360x488 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = false + is-disabled = false + is-transparent = false + is-default = false + border = sunken + drop-zone = false + right-click = false + saved-params = "pos;size;is-minimized;is-maximized" + on-size = "" + title = "Text Editor" + titlebar = true + statusbar = true + can-close = true + can-minimize = false + can-resize = false + is-pane = false + is-minimized = false + is-maximized = false + can-scroll = none + icon = "" + image = "" + image-mode = stretch + keep-aspect = false + transparent-color = none + alpha = 255 + macro = "" + menu = "" + on-close = "" + elem "exit" + type = BUTTON + pos = 248,456 + size = 104x24 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Exit without saving" + image = "" + command = "" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton + elem "save" + type = BUTTON + pos = 128,456 + size = 104x24 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Save" + image = "" + command = "" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton + elem "saveexit" + type = BUTTON + pos = 8,456 + size = 104x24 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Save + Exit" + image = "" + command = "" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton + elem "textedit" + type = INPUT + pos = 0,0 + size = 360x448 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = #ffffff + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = line + drop-zone = false + right-click = false + saved-params = "" + on-size = "" + command = "" + multi-line = true + is-password = false + no-command = false + diff --git a/maps/RandomZLevels/Academy.dmm b/maps/RandomZLevels/Academy.dmm index 7de78aa9f36..2c92b27b948 100644 --- a/maps/RandomZLevels/Academy.dmm +++ b/maps/RandomZLevels/Academy.dmm @@ -79,9 +79,9 @@ "bA" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/academy/classrooms) "bB" = (/obj/machinery/door_control{id = "AcademyAuto"; pixel_y = 24},/turf/simulated/floor,/area/awaymission/academy/classrooms) "bC" = (/turf/simulated/wall,/area/awaymission/academy/classrooms) -"bD" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/academy/classrooms) -"bE" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/academy/classrooms) -"bF" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swallc1"},/area/awaymission/academy/classrooms) +"bD" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swall"; dir = 6},/area/awaymission/academy/classrooms) +"bE" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4; dir = 2},/area/awaymission/academy/classrooms) +"bF" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swall"; dir = 10},/area/awaymission/academy/classrooms) "bG" = (/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/awaymission/academy/headmaster) "bH" = (/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/awaymission/academy/headmaster) "bI" = (/turf/simulated/floor{icon_state = "chapel"},/area/awaymission/academy/headmaster) @@ -96,7 +96,7 @@ "bR" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/academy/headmaster) "bS" = (/obj/machinery/autolathe,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor,/area/awaymission/academy/classrooms) "bT" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/awaymission/academy/classrooms) -"bU" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/academy/classrooms) +"bU" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1; dir = 2},/area/awaymission/academy/classrooms) "bV" = (/obj/effect/decal/cleanable/ash,/turf/simulated/floor/engine,/area/awaymission/academy/classrooms) "bW" = (/obj/structure/target_stake,/turf/simulated/floor/engine,/area/awaymission/academy/classrooms) "bX" = (/turf/simulated/floor/engine,/area/awaymission/academy/classrooms) @@ -118,7 +118,7 @@ "cn" = (/obj/structure/stool,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/academy/headmaster) "co" = (/obj/structure/table/standard,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/pen/red,/turf/simulated/floor,/area/awaymission/academy/classrooms) "cp" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/awaymission/academy/classrooms) -"cq" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/academy/classrooms) +"cq" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall"; dir = 1},/area/awaymission/academy/classrooms) "cr" = (/obj/structure/stool/bed/chair,/turf/simulated/floor,/area/awaymission/academy/headmaster) "cs" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/awaymission/academy/headmaster) "ct" = (/obj/machinery/door/window{dir = 8},/turf/simulated/floor/plating,/area/awaymission/academy/headmaster) diff --git a/maps/RandomZLevels/blackmarketpackers.dmm b/maps/RandomZLevels/blackmarketpackers.dmm index 293a212f96d..fd6949b25e0 100644 --- a/maps/RandomZLevels/blackmarketpackers.dmm +++ b/maps/RandomZLevels/blackmarketpackers.dmm @@ -2,32 +2,32 @@ "ab" = (/turf/simulated/mineral/random/high_chance,/area/awaymission) "ac" = (/turf/simulated/floor/plating/airless/asteroid,/area/awaymission) "ad" = (/obj/item/weapon/circular_saw,/obj/structure/lattice,/turf/space,/area) -"ae" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship3) -"af" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship3) -"ag" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship3) -"ah" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/BMPship3) +"ae" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall"; dir = 4},/area/awaymission/BMPship3) +"af" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4},/area/awaymission/BMPship3) +"ag" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall_t"; dir = 1},/area/awaymission/BMPship3) +"ah" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s"; dir = 2; dir = 2},/area/awaymission/BMPship3) "ai" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship3) "aj" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/engine,/area/awaymission/BMPship3) "ak" = (/turf/simulated/floor/engine,/area/awaymission/BMPship3) -"al" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship3) +"al" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1; dir = 2},/area/awaymission/BMPship3) "am" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship3) -"an" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship3) +"an" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_c"; dir = 1; dir = 2},/area/awaymission/BMPship3) "ao" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship3) "ap" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/BMPship3) "aq" = (/turf/simulated/floor/plating,/area/awaymission/BMPship3) "ar" = (/obj/structure/lattice,/turf/space,/area) "as" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship3) "at" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship3) -"au" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship3) -"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/awaymission/BMPship1) -"aw" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship1) -"ax" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship1) -"ay" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship1) -"az" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/BMPship1) +"au" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall_t"; dir = 8},/area/awaymission/BMPship3) +"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s"; dir = 14; dir = 2},/area/awaymission/BMPship1) +"aw" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4},/area/awaymission/BMPship1) +"ax" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall_t"; dir = 1},/area/awaymission/BMPship1) +"ay" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall_t"; dir = 2},/area/awaymission/BMPship1) +"az" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall"; dir = 8},/area/awaymission/BMPship1) "aA" = (/obj/machinery/door/airlock/silver{locked = 1},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship1) -"aB" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship1) -"aC" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/BMPship1) -"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/BMPship1) +"aB" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall"; dir = 4},/area/awaymission/BMPship1) +"aC" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4; dir = 2},/area/awaymission/BMPship1) +"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s"; dir = 2; dir = 2},/area/awaymission/BMPship1) "aE" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship1) "aF" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) "aG" = (/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) @@ -38,19 +38,19 @@ "aL" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) "aM" = (/obj/machinery/optable,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) "aN" = (/obj/machinery/computer/operating,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) -"aO" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship1) +"aO" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1},/area/awaymission/BMPship1) "aP" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship1) "aQ" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/appendix,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship1) "aR" = (/obj/structure/closet/crate/freezer,/obj/item/brain,/obj/item/weapon/reagent_containers/food/snacks/appendix,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship1) "aS" = (/obj/structure/table/standard,/obj/item/weapon/packageWrap,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship1) "aT" = (/obj/structure/table/standard,/obj/item/weapon/storage/box,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship1) "aU" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship1) -"aV" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship1) +"aV" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_c"; dir = 1; dir = 2},/area/awaymission/BMPship1) "aW" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/awaymission/BMPship1) "aX" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship1) "aY" = (/obj/effect/gibspawner/generic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) "aZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) -"ba" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship1) +"ba" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall"; dir = 1},/area/awaymission/BMPship1) "bb" = (/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship1) "bc" = (/turf/simulated/floor/plating,/area/awaymission/BMPship1) "bd" = (/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship1) @@ -62,12 +62,12 @@ "bj" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship3) "bk" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash/c500,/obj/item/weapon/spacecash/c100,/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor/wood,/area/awaymission/BMPship3) "bl" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/turf/simulated/floor/wood,/area/awaymission/BMPship3) -"bm" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship3) +"bm" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1},/area/awaymission/BMPship3) "bn" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship3) "bo" = (/obj/structure/rack,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship3) "bp" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship3) "bq" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/awaymission/BMPship3) -"br" = (/obj/structure/sign/vacuum,/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship3) +"br" = (/obj/structure/sign/vacuum,/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall"; dir = 1},/area/awaymission/BMPship3) "bs" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship1) "bt" = (/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship1) "bu" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/item/clothing/glasses/regular/hipster,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) @@ -84,7 +84,7 @@ "bF" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/awaymission/BMPship3) "bG" = (/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship3) "bH" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/BMPship3) -"bI" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship1) +"bI" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall"; dir = 2},/area/awaymission/BMPship1) "bJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship1) "bK" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/BMPship1) "bL" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/BMPship1) @@ -94,8 +94,8 @@ "bP" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship3) "bQ" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship3) "bR" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship3) -"bS" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship3) -"bT" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"},/area/awaymission/BMPship1) +"bS" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall"; dir = 2},/area/awaymission/BMPship3) +"bT" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall_t"; dir = 4},/area/awaymission/BMPship1) "bU" = (/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) "bV" = (/obj/machinery/door_control{id = "packerMed"; pixel_y = -24},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) "bW" = (/obj/machinery/sleeper,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) @@ -105,14 +105,14 @@ "ca" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship1) "cb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship1) "cc" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship1) -"cd" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/BMPship3) -"ce" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/BMPship3) +"cd" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swall"; dir = 6},/area/awaymission/BMPship3) +"ce" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall"; dir = 8},/area/awaymission/BMPship3) "cf" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor{tag = "icon-carpetside (NORTH)"; icon_state = "carpetside"; dir = 1},/area/awaymission/BMPship3) -"cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship3) +"cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall"; dir = 1},/area/awaymission/BMPship3) "ch" = (/obj/machinery/door/airlock/silver,/turf/simulated/floor{tag = "icon-carpetside (NORTH)"; icon_state = "carpetside"; dir = 1},/area/awaymission/BMPship3) -"ci" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/BMPship2) -"cj" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship2) -"ck" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship2) +"ci" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swall"; dir = 6},/area/awaymission/BMPship2) +"cj" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4},/area/awaymission/BMPship2) +"ck" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall_t"; dir = 2},/area/awaymission/BMPship2) "cl" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/BMPship1) "cm" = (/obj/machinery/door/poddoor/shutters{id = "packerMed"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship1) "cn" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/BMPship1) @@ -125,11 +125,11 @@ "cu" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship1) "cv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship1) "cw" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship1) -"cx" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/awaymission/BMPship3) -"cy" = (/turf/simulated/floor{tag = "icon-carpet"; icon_state = "carpet"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship3) +"cx" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s"; dir = 14; dir = 2},/area/awaymission/BMPship3) +"cy" = (/turf/simulated/floor{tag = "icon-carpet"; icon_state = "carpet"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_c"; dir = 8; dir = 2},/area/awaymission/BMPship3) "cz" = (/turf/simulated/floor{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship3) "cA" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 1; locked = 0; req_access = ""},/turf/simulated/floor{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship3) -"cB" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship2) +"cB" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1; dir = 2},/area/awaymission/BMPship2) "cC" = (/obj/structure/table/standard,/obj/item/weapon/screwdriver,/obj/item/weapon/screwdriver,/obj/item/weapon/paper{info = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"; name = "scribbled note"},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) "cD" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) "cE" = (/obj/machinery/hydroponics,/turf/simulated/floor{tag = "icon-green (WEST)"; icon_state = "green"; dir = 8},/area/awaymission/BMPship2) @@ -138,7 +138,7 @@ "cH" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/awaymission/BMPship2) "cI" = (/obj/machinery/hydroponics,/turf/simulated/floor{tag = "icon-green (EAST)"; icon_state = "green"; dir = 4},/area/awaymission/BMPship2) "cJ" = (/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) -"cK" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship2) +"cK" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1},/area/awaymission/BMPship2) "cL" = (/obj/structure/table/standard,/obj/item/weapon/butch,/obj/item/weapon/reagent_containers/food/drinks/beer,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor{tag = "icon-barber"; icon_state = "barber"},/area/awaymission/BMPship2) "cM" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{tag = "icon-barber"; icon_state = "barber"},/area/awaymission/BMPship2) "cN" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor{tag = "icon-barber"; icon_state = "barber"},/area/awaymission/BMPship2) @@ -147,7 +147,7 @@ "cQ" = (/obj/structure/table/standard,/obj/item/weapon/kitchenknife,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) "cR" = (/obj/structure/table/standard,/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) "cS" = (/obj/structure/table/standard,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) -"cT" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship1) +"cT" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall_t"; dir = 8},/area/awaymission/BMPship1) "cU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor/shutters{id = "packerCargo"},/turf/simulated/floor/plating,/area/awaymission/BMPship1) "cV" = (/turf/simulated/floor{tag = "icon-carpet15-13 (EAST)"; icon_state = "carpet15-13"; dir = 4},/area/awaymission/BMPship3) "cW" = (/turf/simulated/floor{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship3) @@ -155,11 +155,11 @@ "cY" = (/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) "cZ" = (/turf/simulated/floor,/area/awaymission/BMPship2) "da" = (/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor,/area/awaymission/BMPship2) -"db" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship2) +"db" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall"; dir = 1},/area/awaymission/BMPship2) "dc" = (/turf/simulated/floor{tag = "icon-barber"; icon_state = "barber"},/area/awaymission/BMPship2) "dd" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{tag = "icon-barber"; icon_state = "barber"},/area/awaymission/BMPship2) "de" = (/obj/structure/stool,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) -"df" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship1) +"df" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1; dir = 2},/area/awaymission/BMPship1) "dg" = (/obj/structure/kitchenspike,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/BMPship1) "dh" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/BMPship1) "di" = (/obj/machinery/door/airlock/silver,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/BMPship1) @@ -169,7 +169,7 @@ "dm" = (/turf/simulated/floor{icon_state = "hydrofloor"},/area/awaymission/BMPship1) "dn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/awaymission/BMPship1) "do" = (/turf/simulated/floor,/area/awaymission/BMPship1) -"dp" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swallc3"},/area/awaymission/BMPship1) +"dp" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swall"; dir = 5},/area/awaymission/BMPship1) "dq" = (/turf/simulated/floor{tag = "icon-carpet15-14 (EAST)"; icon_state = "carpet15-14"; dir = 4},/area/awaymission/BMPship3) "dr" = (/turf/simulated/floor{tag = "icon-carpet15-11 (EAST)"; icon_state = "carpet15-11"; dir = 4},/area/awaymission/BMPship3) "ds" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{tag = "icon-carpet15-11 (EAST)"; icon_state = "carpet15-11"; dir = 4},/area/awaymission/BMPship3) @@ -198,7 +198,7 @@ "dP" = (/turf/simulated/floor{tag = "icon-green"; icon_state = "green"},/area/awaymission/BMPship2) "dQ" = (/obj/machinery/seed_extractor,/obj/item/seeds/walkingmushroommycelium,/turf/simulated/floor{tag = "icon-green"; icon_state = "green"},/area/awaymission/BMPship2) "dR" = (/obj/machinery/hydroponics,/turf/simulated/floor{tag = "icon-green (SOUTHEAST)"; icon_state = "green"; dir = 6},/area/awaymission/BMPship2) -"dS" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship2) +"dS" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall"; dir = 2},/area/awaymission/BMPship2) "dT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) "dU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) "dV" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) @@ -276,7 +276,7 @@ "fp" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility/full,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/awaymission/BMPship1) "fq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship1) "fr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/awaymission/BMPship1) -"fs" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/awaymission/BMPship1) +"fs" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s"; dir = 8; dir = 2},/area/awaymission/BMPship1) "ft" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship3) "fu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{tag = "icon-carpet15-13 (EAST)"; icon_state = "carpet15-13"; dir = 4},/area/awaymission/BMPship3) "fv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship3) @@ -317,10 +317,10 @@ "ge" = (/obj/structure/mopbucket,/turf/simulated/shuttle/plating,/area/awaymission/BMPship1) "gf" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/kitchenknife,/turf/simulated/shuttle/plating,/area/awaymission/BMPship1) "gg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/cell/high,/turf/simulated/floor,/area/awaymission/BMPship1) -"gh" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/awaymission/BMPship3) +"gh" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s"; dir = 1; dir = 2},/area/awaymission/BMPship3) "gi" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor{tag = "icon-carpetside"; icon_state = "carpetside"},/area/awaymission/BMPship3) "gj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor{tag = "icon-carpetside"; icon_state = "carpetside"},/area/awaymission/BMPship3) -"gk" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/awaymission/BMPship2) +"gk" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall_t"; dir = 4; dir = 2},/area/awaymission/BMPship2) "gl" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship2) "gm" = (/obj/structure/kitchenspike,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) "gn" = (/turf/simulated/floor{tag = "icon-loadingareadirty1 (EAST)"; icon_state = "loadingareadirty1"; dir = 4},/area/awaymission/BMPship2) @@ -333,7 +333,7 @@ "gu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/awaymission/BMPship1) "gv" = (/obj/item/stack/cable_coil,/turf/simulated/floor,/area/awaymission/BMPship1) "gw" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/awaymission/BMPship1) -"gx" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area) +"gx" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s"; dir = 1; dir = 2},/area) "gy" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship3) "gz" = (/obj/structure/lattice,/turf/space,/area/awaymission/BMPship3) "gA" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship3) @@ -360,8 +360,8 @@ "gV" = (/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/BMPship1) "gW" = (/obj/structure/reagent_dispensers,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/BMPship1) "gX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/shuttle/plating,/area/awaymission/BMPship1) -"gY" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/BMPship1) -"gZ" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2; tag = "icon-swall_f10"},/area/awaymission/BMPship3) +"gY" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swall"; dir = 6},/area/awaymission/BMPship1) +"gZ" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_c"; dir = 2; layer = 2; tag = "icon-swall_f10"},/area/awaymission/BMPship3) "ha" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship3) "hb" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship3) "hc" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/BMPship2) @@ -372,13 +372,13 @@ "hh" = (/obj/machinery/door/unpowered/shuttle,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/awaymission/BMPship1) "hi" = (/turf/simulated/mineral/random,/area/awaymission) "hj" = (/obj/item/device/multitool,/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/awaymission) -"hk" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swallc3"},/area/awaymission/BMPship3) -"hl" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swallc1"},/area/awaymission/BMPship3) +"hk" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swall"; dir = 5},/area/awaymission/BMPship3) +"hl" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swall"; dir = 10},/area/awaymission/BMPship3) "hm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/silver,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship3) -"hn" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swallc3"},/area/awaymission/BMPship2) +"hn" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swall"; dir = 5},/area/awaymission/BMPship2) "ho" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship2) "hp" = (/turf/simulated/mineral/random,/area/awaymission/BMPship2) -"hq" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship2) +"hq" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall"; dir = 4},/area/awaymission/BMPship2) "hr" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/BMPship2) "hs" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/awaymission/BMPship1) "ht" = (/obj/structure/stool,/turf/simulated/floor,/area/awaymission/BMPship1) @@ -393,7 +393,7 @@ "hC" = (/obj/structure/rack,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship3) "hD" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaymission/BMPship3) "hE" = (/turf/simulated/shuttle/wall,/area/awaymission) -"hF" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission) +"hF" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall"; dir = 1},/area/awaymission) "hG" = (/turf/simulated/floor/plating/airless,/area/awaymission) "hH" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission) "hI" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission) @@ -428,7 +428,7 @@ "il" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/awaymission/BMPship1) "im" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor,/area/awaymission/BMPship1) "in" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area) -"io" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship3) +"io" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall_t"; dir = 2},/area/awaymission/BMPship3) "ip" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship3) "iq" = (/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission) "ir" = (/obj/effect/decal/remains/human,/turf/simulated/floor,/area/awaymission/BMPship1) @@ -441,15 +441,15 @@ "iy" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c200,/turf/simulated/floor,/area/awaymission/BMPship1) "iz" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c10,/turf/simulated/floor,/area/awaymission/BMPship1) "iA" = (/obj/structure/sink{dir = 2},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship1) -"iB" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship1) +"iB" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_c"; dir = 4; dir = 2},/area/awaymission/BMPship1) "iC" = (/obj/item/clothing/gloves/fyellow,/turf/simulated/floor/plating/airless/asteroid,/area/awaymission) -"iD" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission) -"iE" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission) +"iD" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall"; dir = 4},/area/awaymission) +"iE" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4},/area/awaymission) "iF" = (/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plating,/area/awaymission/BMPship3) "iG" = (/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/BMPship3) -"iH" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/awaymission/BMPship3) +"iH" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s"; dir = 8; dir = 2},/area/awaymission/BMPship3) "iI" = (/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor/plating,/area/awaymission/BMPship3) -"iJ" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship3) +"iJ" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_c"; dir = 4; dir = 2},/area/awaymission/BMPship3) "iK" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship3) "iL" = (/turf/simulated/mineral/diamond,/area/awaymission) "iM" = (/turf/simulated/mineral/clown,/area/awaymission) diff --git a/maps/RandomZLevels/jungle.dmm b/maps/RandomZLevels/jungle.dmm index c275df74092..d66f5a5f026 100644 --- a/maps/RandomZLevels/jungle.dmm +++ b/maps/RandomZLevels/jungle.dmm @@ -180,13 +180,13 @@ "dx" = (/obj/item/weapon/shard,/turf/unsimulated/jungle/path,/area/jungle/crash_ship_source) "dy" = (/obj/effect/landmark/loot_spawn/low,/turf/unsimulated/jungle/path,/area/jungle/crash_ship_source) "dz" = (/obj/item/weapon/shard{icon_state = "small"},/turf/unsimulated/jungle/path,/area/jungle/crash_ship_source) -"dA" = (/turf/unsimulated/jungle/path,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/jungle/crash_ship_source) +"dA" = (/turf/unsimulated/jungle/path,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_c"; dir = 4; dir = 2},/area/jungle/crash_ship_source) "dB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor,/area/jungle/crash_ship_source) "dC" = (/obj/structure/grille,/turf/unsimulated/floor,/area/jungle/crash_ship_source) "dD" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/unsimulated/floor,/area/jungle/crash_ship_source) "dE" = (/obj/structure/grille,/obj/structure/window/reinforced,/turf/unsimulated/floor,/area/jungle/crash_ship_source) -"dF" = (/turf/unsimulated/jungle/path,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2; tag = "icon-swall_f10"},/area/jungle/crash_ship_source) -"dG" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/jungle/crash_ship_source) +"dF" = (/turf/unsimulated/jungle/path,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_c"; dir = 2; layer = 2; tag = "icon-swall_f10"},/area/jungle/crash_ship_source) +"dG" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1; dir = 2},/area/jungle/crash_ship_source) "dH" = (/obj/effect/landmark/loot_spawn/low,/turf/unsimulated/floor,/area/jungle/crash_ship_source) "dI" = (/turf/unsimulated/floor,/area/jungle/crash_ship_source) "dJ" = (/obj/item/weapon/hatchet,/turf/unsimulated/floor,/area/jungle/crash_ship_source) @@ -200,10 +200,10 @@ "dR" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/emergency,/turf/unsimulated/floor,/area/jungle/crash_ship_source) "dS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor,/area/jungle/crash_ship_source) "dT" = (/obj/item/weapon/storage/firstaid/regular,/turf/unsimulated/jungle/path,/area/jungle/crash_ship_source) -"dU" = (/turf/unsimulated/jungle/path,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/jungle/crash_ship_source) +"dU" = (/turf/unsimulated/jungle/path,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_c"; dir = 1; dir = 2},/area/jungle/crash_ship_source) "dV" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical,/turf/unsimulated/floor,/area/jungle/crash_ship_source) -"dW" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/jungle/crash_ship_source) -"dX" = (/turf/unsimulated/jungle/path,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/jungle/crash_ship_source) +"dW" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4; dir = 2},/area/jungle/crash_ship_source) +"dX" = (/turf/unsimulated/jungle/path,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_c"; dir = 8; dir = 2},/area/jungle/crash_ship_source) "dY" = (/turf/unsimulated/jungle,/area/jungle/crash_ship_clean) "dZ" = (/turf/unsimulated/jungle/clear,/area/jungle/crash_ship_three) "ea" = (/turf/unsimulated/jungle/clear,/area/jungle/crash_ship_four) diff --git a/maps/RandomZLevels/spacebattle.dmm b/maps/RandomZLevels/spacebattle.dmm index a1c638286a7..c7abee95155 100644 --- a/maps/RandomZLevels/spacebattle.dmm +++ b/maps/RandomZLevels/spacebattle.dmm @@ -17,7 +17,7 @@ "aq" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "ar" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "as" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/empgrenade,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) -"at" = (/obj/structure/table/reinforced,/obj/item/ammo_magazine/a12mm,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) +"at" = (/obj/structure/table/reinforced,/obj/item/ammo_magazine/a10mm,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "au" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2) "av" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate3) "aw" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/turf/space,/area/awaymission/spacebattle/syndicate3) @@ -96,11 +96,11 @@ "bR" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "bS" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/cruiser) "bT" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/cruiser) -"bU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/awaymission/spacebattle/cruiser) -"bV" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/spacebattle/cruiser) -"bW" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/spacebattle/cruiser) -"bX" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/spacebattle/cruiser) -"bY" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/spacebattle/cruiser) +"bU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s"; dir = 14; dir = 2},/area/awaymission/spacebattle/cruiser) +"bV" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4; dir = 2},/area/awaymission/spacebattle/cruiser) +"bW" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall_t"; dir = 1},/area/awaymission/spacebattle/cruiser) +"bX" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4},/area/awaymission/spacebattle/cruiser) +"bY" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s"; dir = 2; dir = 2},/area/awaymission/spacebattle/cruiser) "bZ" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/space,/area/awaymission/spacebattle/cruiser) "ca" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{tag = "icon-engine"; icon_state = "engine"},/area/awaymission/spacebattle/cruiser) "cb" = (/obj/machinery/power/monitor,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) @@ -108,7 +108,7 @@ "cd" = (/obj/machinery/computer/pod{id = "spacebattlepod"; name = "Hull Door Control"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/cruiser) "ce" = (/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cf" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/spacebattle/cruiser) +"cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1},/area/awaymission/spacebattle/cruiser) "ch" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/awaymission/spacebattle/cruiser) "ci" = (/obj/structure/table/reinforced,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cj" = (/turf/simulated/floor{tag = "icon-damaged5"; icon_state = "damaged5"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/cruiser) @@ -122,13 +122,13 @@ "cr" = (/turf/simulated/floor{tag = "icon-damaged1"; icon_state = "damaged1"},/area/awaymission/spacebattle/cruiser) "cs" = (/obj/effect/landmark/corpse/engineer{mobname = "Rosen Miller"; name = "Rosen Miller"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "ct" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cu" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/spacebattle/cruiser) -"cv" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swallc1"},/area/awaymission/spacebattle/cruiser) -"cw" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/spacebattle/cruiser) +"cu" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall_t"; dir = 8},/area/awaymission/spacebattle/cruiser) +"cv" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swall"; dir = 10},/area/awaymission/spacebattle/cruiser) +"cw" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swall"; dir = 6},/area/awaymission/spacebattle/cruiser) "cx" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cy" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{tag = "icon-damaged2"; icon_state = "damaged2"},/area/awaymission/spacebattle/cruiser) -"cz" = (/obj/item/stack/sheet/metal,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cA" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"cy" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor{tag = "icon-damaged2"; icon_state = "damaged2"},/area/awaymission/spacebattle/cruiser) +"cz" = (/obj/item/stack/sheet/metal,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"cA" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cB" = (/obj/structure/closet/cabinet,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cC" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cD" = (/obj/machinery/vending/cigarette,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) @@ -141,13 +141,13 @@ "cK" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/awaymission/spacebattle/cruiser) "cL" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "cM" = (/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) -"cN" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cO" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"cN" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) +"cO" = (/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cP" = (/turf/simulated/floor{tag = "icon-damaged2"; icon_state = "damaged2"},/area/awaymission/spacebattle/cruiser) "cQ" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cR" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/awaymission/spacebattle/cruiser) "cS" = (/obj/item/stack/sheet/metal,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) -"cT" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swallc3"},/area/awaymission/spacebattle/cruiser) +"cT" = (/turf/simulated/shuttle/wall{tag = "icon-swallc3"; icon_state = "swall"; dir = 5},/area/awaymission/spacebattle/cruiser) "cU" = (/obj/effect/landmark/corpse/engineer{mobname = "Bill Sanchez"; name = "Bill Sanchez"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "cV" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/awaymission/spacebattle/cruiser) "cW" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/fries,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/awaymission/spacebattle/cruiser) @@ -170,15 +170,15 @@ "dn" = (/obj/structure/closet/toolcloset,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "do" = (/obj/effect/landmark/corpse/doctor{mobname = "Daniel Kalla"; name = "Daniel Kalla"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "dp" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/spacebattle/cruiser) -"dq" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area/awaymission/spacebattle/cruiser) -"dr" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/awaymission/spacebattle/cruiser) +"dq" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall_t"; dir = 8; dir = 2},/area/awaymission/spacebattle/cruiser) +"dr" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall_t"; dir = 4; dir = 2},/area/awaymission/spacebattle/cruiser) "ds" = (/turf/simulated/floor{tag = "icon-damaged4"; icon_state = "damaged4"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/cruiser) "dt" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "spacebattlepod2"; name = "Front Hull Door"; opacity = 1; tag = "icon-pdoor0"},/turf/simulated/shuttle/plating,/area/awaymission/spacebattle/cruiser) "du" = (/turf/simulated/floor{tag = "icon-damaged1"; icon_state = "damaged1"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/cruiser) -"dv" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/awaymission/spacebattle/cruiser) -"dw" = (/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/spacebattle/cruiser) +"dv" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s"; dir = 1; dir = 2},/area/awaymission/spacebattle/cruiser) +"dw" = (/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4},/area/awaymission/spacebattle/cruiser) "dx" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/spacebattle/cruiser) -"dy" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"},/area/awaymission/spacebattle/cruiser) +"dy" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall_t"; dir = 4},/area/awaymission/spacebattle/cruiser) "dz" = (/obj/effect/landmark/corpse/chef{mobname = "Nathaniel Waters"; name = "Nathaniel Waters"},/obj/item/weapon/butch,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/spacebattle/cruiser) "dA" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/spacebattle/cruiser) "dB" = (/obj/structure/rack,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/awaymission/spacebattle/cruiser) @@ -236,15 +236,15 @@ "eB" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Davis Hume"; name = "Davis Hume"},/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "eC" = (/obj/item/ammo_casing/shotgun,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "eD" = (/turf/simulated/floor{icon_state = "red"; dir = 4},/area/awaymission/spacebattle/cruiser) -"eE" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/spacebattle/cruiser) +"eE" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1; dir = 2},/area/awaymission/spacebattle/cruiser) "eF" = (/obj/structure/table/reinforced,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) "eG" = (/obj/structure/table/reinforced,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) "eH" = (/obj/structure/table/reinforced,/turf/simulated/floor{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser) "eI" = (/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/awaymission/spacebattle/cruiser) "eJ" = (/mob/living/simple_animal/hostile/syndicate/melee/space,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "eK" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Peter West"; name = "Peter West"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) -"eL" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/awaymission/spacebattle/cruiser) -"eM" = (/turf/simulated/shuttle/wall{tag = "icon-swallc4"; icon_state = "swallc4"},/area/awaymission/spacebattle/cruiser) +"eL" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall_t"; dir = 2; dir = 2},/area/awaymission/spacebattle/cruiser) +"eM" = (/turf/simulated/shuttle/wall{tag = "icon-swallc4"; icon_state = "swall"; dir = 9},/area/awaymission/spacebattle/cruiser) "eN" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate4) "eO" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate4) "eP" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/utensil/spoon,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/spacebattle/cruiser) @@ -272,14 +272,14 @@ "fl" = (/obj/machinery/door/poddoor{id = "spacebattlestorage"; name = "Secure Storage"},/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "fm" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/awaymission/spacebattle/cruiser) "fn" = (/obj/machinery/computer/security/telescreen,/turf/simulated/shuttle/wall,/area/awaymission/spacebattle/cruiser) -"fo" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/awaymission/spacebattle/cruiser) +"fo" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s"; dir = 8; dir = 2},/area/awaymission/spacebattle/cruiser) "fp" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate4) "fq" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/material,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "fr" = (/obj/structure/closet/crate,/obj/item/weapon/light/tube,/obj/item/weapon/light/tube,/obj/item/weapon/light/tube,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "fs" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"ft" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fu" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fv" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Walter Strider"; name = "Walter Strider"},/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"ft" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fu" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fv" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Walter Strider"; name = "Walter Strider"},/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) "fw" = (/obj/item/ammo_casing/shotgun,/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/awaymission/spacebattle/cruiser) "fx" = (/obj/item/ammo_casing/a357,/obj/item/ammo_casing/a357,/obj/item/weapon/gun/projectile/mateba,/obj/effect/landmark/corpse/commander{mobname = "Aaron Bowden"; name = "Aaron Bowden"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "fy" = (/obj/structure/stool/bed/chair{dir = 4},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) @@ -298,11 +298,11 @@ "fL" = (/obj/structure/artilleryplaceholder{tag = "icon-12"; icon_state = "12"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "fM" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/firstaid/o2,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "fN" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fO" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fP" = (/obj/item/ammo_casing/shotgun,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fO" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fP" = (/obj/item/ammo_casing/shotgun,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) "fQ" = (/obj/item/ammo_casing/shotgun,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fR" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) -"fS" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/awaymission/spacebattle/cruiser) +"fR" = (/obj/effect/landmark/corpse/syndicatesoldier,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/effect/decal/cleanable/blood,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/awaymission/spacebattle/cruiser) +"fS" = (/obj/item/ammo_casing/a10mm,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/awaymission/spacebattle/cruiser) "fT" = (/obj/machinery/computer/communications,/turf/simulated/floor{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser) "fU" = (/obj/structure/artilleryplaceholder{tag = "icon-13"; icon_state = "13"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) "fV" = (/obj/structure/artilleryplaceholder{tag = "icon-14"; icon_state = "14"},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser) @@ -345,7 +345,7 @@ "gG" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate4) "gH" = (/obj/structure/closet/crate/secure/weapon,/obj/item/weapon/gun/energy/laser,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) "gI" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c10,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser) -"gJ" = (/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/spacebattle/cruiser) +"gJ" = (/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1},/area/awaymission/spacebattle/cruiser) "gK" = (/obj/effect/landmark/corpse/doctor{mobname = "Adam Smith"; name = "Adam Smith"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission/spacebattle/cruiser) "gL" = (/obj/machinery/optable,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "gM" = (/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) @@ -399,7 +399,7 @@ "hI" = (/obj/structure/table/woodentable,/obj/item/device/violin,/turf/simulated/floor/wood,/area/awaymission/spacebattle/cruiser) "hJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser) "hK" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate7) -"hL" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/awaymission/spacebattle/cruiser) +"hL" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall_t"; dir = 1; dir = 2},/area/awaymission/spacebattle/cruiser) "hM" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "hN" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/turf/simulated/floor/wood,/area/awaymission/spacebattle/cruiser) "hO" = (/obj/structure/closet/secure_closet/captains,/turf/simulated/floor/wood,/area/awaymission/spacebattle/cruiser) @@ -418,9 +418,9 @@ "ib" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) "ic" = (/obj/structure/toilet,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) "id" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) -"ie" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"},/area/awaymission/spacebattle/cruiser) +"ie" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s"; dir = 8},/area/awaymission/spacebattle/cruiser) "if" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) -"ig" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/spacebattle/cruiser) +"ig" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall"; dir = 1},/area/awaymission/spacebattle/cruiser) "ih" = (/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "ii" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/o2,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "ij" = (/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) @@ -428,7 +428,7 @@ "il" = (/mob/living/simple_animal/hostile/syndicate/ranged/space,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) "im" = (/obj/effect/landmark/corpse/doctor{mobname = "Herbert West"; name = "Herbert West"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "in" = (/obj/effect/landmark/corpse/engineer{mobname = "Carth Robinson"; name = "Carth Robinson"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) -"io" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) +"io" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser) "ip" = (/obj/machinery/sleeper,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "iq" = (/obj/machinery/sleep_console,/turf/simulated/floor{icon_state = "white"},/area/awaymission/spacebattle/cruiser) "ir" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate7) diff --git a/maps/RandomZLevels/stationCollision.dm b/maps/RandomZLevels/stationCollision.dm index 3bc32eab3b0..5ca937bc612 100644 --- a/maps/RandomZLevels/stationCollision.dm +++ b/maps/RandomZLevels/stationCollision.dm @@ -19,22 +19,22 @@ * Areas */ //Gateroom gets its own APC specifically for the gate - /area/awaymission/gateroom +/area/awaymission/gateroom //Library, medbay, storage room - /area/awaymission/southblock +/area/awaymission/southblock //Arrivals, security, hydroponics, shuttles (since they dont move, they dont need specific areas) - /area/awaymission/arrivalblock +/area/awaymission/arrivalblock //Crew quarters, cafeteria, chapel - /area/awaymission/midblock +/area/awaymission/midblock //engineering, bridge (not really north but it doesnt really need its own APC) - /area/awaymission/northblock +/area/awaymission/northblock //That massive research room - /area/awaymission/research +/area/awaymission/research //Syndicate shuttle /area/awaymission/syndishuttle @@ -202,4 +202,4 @@ var/sc_safecode5 = "[rand(0,9)]" return /obj/machinery/singularity/narsie/sc_Narsie/ex_act() - return \ No newline at end of file + return diff --git a/maps/RandomZLevels/stationCollision.dmm b/maps/RandomZLevels/stationCollision.dmm index a95cf0e32bd..c1e5655d216 100644 --- a/maps/RandomZLevels/stationCollision.dmm +++ b/maps/RandomZLevels/stationCollision.dmm @@ -298,12 +298,12 @@ "fL" = (/turf/simulated/wall/cult,/area/awaymission/midblock) "fM" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock) "fN" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock) -"fO" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/awaymission/arrivalblock) -"fP" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/awaymission/arrivalblock) +"fO" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s"; dir = 14; dir = 2},/area/awaymission/arrivalblock) +"fP" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall_t"; dir = 1; dir = 2},/area/awaymission/arrivalblock) "fQ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock) "fR" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock) "fS" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock) -"fT" = (/turf/space,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2; tag = "icon-swall_f10"},/area/awaymission/arrivalblock) +"fT" = (/turf/space,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_c"; dir = 2; layer = 2; tag = "icon-swall_f10"},/area/awaymission/arrivalblock) "fU" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = -3; pixel_y = 5},/obj/item/weapon/paper{pixel_x = 3},/obj/item/weapon/pen{pixel_x = 10; pixel_y = 10},/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/northblock) "fV" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/northblock) "fW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/midblock) @@ -312,8 +312,8 @@ "fZ" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/awaymission/midblock) "ga" = (/turf/simulated/floor{icon_state = "dark"},/area/awaymission/midblock) "gb" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock) -"gc" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/arrivalblock) -"gd" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"; dir = 2},/area/awaymission/arrivalblock) +"gc" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1; dir = 2},/area/awaymission/arrivalblock) +"gd" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall"; dir = 1; dir = 2},/area/awaymission/arrivalblock) "ge" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/arrivalblock) "gf" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/arrivalblock) "gg" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor{icon_state = "grimy"},/area/awaymission/northblock) @@ -390,7 +390,7 @@ "hz" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/suit/space/syndicate,/obj/item/weapon/paper/sc_safehint_paper_prison,/obj/item/weapon/gun/projectile/shotgun/pump/sc_pump,/turf/simulated/floor,/area/awaymission/arrivalblock) "hA" = (/obj/structure/window/reinforced,/turf/simulated/floor,/area/awaymission/arrivalblock) "hB" = (/obj/machinery/door/window/southleft{name = "Windoor"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/awaymission/arrivalblock) -"hC" = (/obj/item/ammo_casing/a12mm{pixel_x = 2; pixel_y = 5},/obj/item/ammo_casing/a12mm{pixel_x = -4; pixel_y = -5},/obj/item/ammo_casing/a12mm,/turf/simulated/floor/airless,/area/awaymission/midblock) +"hC" = (/obj/item/ammo_casing/a10mm{pixel_x = 2; pixel_y = 5},/obj/item/ammo_casing/a10mm{pixel_x = -4; pixel_y = -5},/obj/item/ammo_casing/a10mm,/turf/simulated/floor/airless,/area/awaymission/midblock) "hD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/midblock) "hE" = (/obj/structure/sink/kitchen{pixel_y = 32},/turf/simulated/floor,/area/awaymission/midblock) "hF" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = 4; pixel_y = 4},/turf/simulated/floor,/area/awaymission/midblock) @@ -409,12 +409,12 @@ "hS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) "hT" = (/obj/effect/decal/remains/human,/obj/item/weapon/butch,/obj/item/weapon/kitchenknife,/obj/item/clothing/head/chefhat,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) "hU" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"hV" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a12mm,/obj/item/weapon/paper/sc_safehint_paper_caf,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) +"hV" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a10mm,/obj/item/weapon/paper/sc_safehint_paper_caf,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) "hW" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "dark"},/area/awaymission/midblock) "hX" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock) "hY" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock) "hZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/arrivalblock) -"ia" = (/obj/effect/decal/cleanable/blood/splatter,/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"ia" = (/obj/effect/decal/cleanable/blood/splatter,/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "ib" = (/obj/machinery/power/apc{cell_type = 7500; dir = 8; name = "Arrivals Block APC"; pixel_x = -28},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/awaymission/arrivalblock) "ic" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/awaymission/arrivalblock) "id" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/awaymission/arrivalblock) @@ -423,13 +423,13 @@ "ig" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/midblock) "ih" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/awaymission/midblock) "ii" = (/obj/machinery/microwave{pixel_x = -2; pixel_y = 7},/obj/structure/table/standard,/turf/simulated/floor,/area/awaymission/midblock) -"ij" = (/obj/structure/stool,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/midblock) -"ik" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"il" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a12mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) -"im" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"in" = (/obj/structure/table/standard,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/midblock) -"io" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"ip" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"ij" = (/obj/structure/stool,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/midblock) +"ik" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) +"il" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a10mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) +"im" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/ammo_casing/a10mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) +"in" = (/obj/structure/table/standard,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/midblock) +"io" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) +"ip" = (/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "iq" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/awaymission/arrivalblock) "ir" = (/turf/simulated/floor{icon_state = "red"; dir = 10},/area/awaymission/arrivalblock) "is" = (/turf/simulated/floor{icon_state = "red"},/area/awaymission/arrivalblock) @@ -440,14 +440,14 @@ "ix" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/machinery/light,/turf/simulated/floor,/area/awaymission/midblock) "iy" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor,/area/awaymission/midblock) "iz" = (/obj/machinery/door/window/eastright{name = "Windoor"},/turf/simulated/floor,/area/awaymission/midblock) -"iA" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/midblock) -"iB" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) -"iC" = (/obj/item/ammo_casing/a12mm,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) -"iD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a12mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) -"iE" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/midblock) +"iA" = (/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/midblock) +"iB" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) +"iC" = (/obj/item/ammo_casing/a10mm,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/midblock) +"iD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/a10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/c20r/sc_c20r,/turf/simulated/floor,/area/awaymission/midblock) +"iE" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/midblock) "iF" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/awaymission/midblock) "iG" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard{icon_state = "medium"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/awaymission/arrivalblock) -"iH" = (/obj/effect/decal/remains/human,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"iH" = (/obj/effect/decal/remains/human,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "iI" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/arrivalblock) "iJ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/arrivalblock) "iK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/arrivalblock) @@ -464,8 +464,8 @@ "iV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/airless,/area/awaymission/southblock) "iW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "iX" = (/turf/simulated/floor/airless,/area/awaymission/southblock) -"iY" = (/obj/item/ammo_casing/a12mm,/turf/simulated/floor/airless,/area/awaymission/southblock) -"iZ" = (/obj/item/ammo_casing/a12mm{pixel_x = -4; pixel_y = 3},/turf/simulated/floor/airless,/area/awaymission/southblock) +"iY" = (/obj/item/ammo_casing/a10mm,/turf/simulated/floor/airless,/area/awaymission/southblock) +"iZ" = (/obj/item/ammo_casing/a10mm{pixel_x = -4; pixel_y = 3},/turf/simulated/floor/airless,/area/awaymission/southblock) "ja" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless,/area/awaymission/southblock) "jb" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/airless,/area/awaymission/southblock) "jc" = (/turf/simulated/wall,/area/awaymission/southblock) @@ -479,7 +479,7 @@ "jk" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/awaymission/southblock) "jl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) -"jn" = (/obj/item/ammo_casing/a12mm{pixel_y = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) +"jn" = (/obj/item/ammo_casing/a10mm{pixel_y = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jp" = (/obj/structure/sign/redcross{pixel_y = -32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) "jq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/airless,/area/awaymission/southblock) @@ -495,10 +495,10 @@ "jA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) "jB" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) "jC" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) -"jD" = (/obj/item/ammo_casing/a12mm,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"jD" = (/obj/item/ammo_casing/a10mm,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "jE" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/arrivalblock) "jF" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/turf/simulated/floor,/area/awaymission/arrivalblock) -"jG" = (/obj/machinery/light{dir = 1},/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"jG" = (/obj/machinery/light{dir = 1},/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "jH" = (/obj/structure/sign/vacuum{pixel_y = 32},/turf/simulated/floor,/area/awaymission/arrivalblock) "jI" = (/obj/structure/closet/toolcloset,/turf/simulated/floor,/area/awaymission/southblock) "jJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/awaymission/southblock) @@ -519,7 +519,7 @@ "jY" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/southblock) "jZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) "ka" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/arrivalblock) -"kb" = (/obj/effect/decal/cleanable/blood/splatter,/obj/item/ammo_casing/a12mm,/turf/simulated/floor,/area/awaymission/arrivalblock) +"kb" = (/obj/effect/decal/cleanable/blood/splatter,/obj/item/ammo_casing/a10mm,/turf/simulated/floor,/area/awaymission/arrivalblock) "kc" = (/obj/structure/sign/pods{pixel_y = -32},/turf/simulated/floor,/area/awaymission/arrivalblock) "kd" = (/obj/structure/sign/vacuum{pixel_y = -32},/turf/simulated/floor,/area/awaymission/arrivalblock) "ke" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor,/area/awaymission/southblock) @@ -553,7 +553,7 @@ "kG" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l"; icon_state = "propulsion_l"},/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l"; icon_state = "propulsion_l"},/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock) "kH" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (NORTH)"; icon_state = "propulsion_l"; dir = 1},/obj/structure/window/reinforced,/turf/space,/area/awaymission/arrivalblock) "kI" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/obj/structure/window/reinforced,/turf/space,/area/awaymission/arrivalblock) -"kJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/arrivalblock) +"kJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s"; dir = 2; dir = 2},/area/awaymission/arrivalblock) "kK" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor,/area/awaymission/arrivalblock) "kL" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor,/area/awaymission/arrivalblock) "kM" = (/obj/structure/sink/kitchen{pixel_y = 32},/turf/simulated/floor,/area/awaymission/arrivalblock) @@ -595,10 +595,10 @@ "lw" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) "lx" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) "ly" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock) -"lz" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/awaymission/arrivalblock) -"lA" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/arrivalblock) +"lz" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s"; dir = 1; dir = 2},/area/awaymission/arrivalblock) +"lA" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4; dir = 2},/area/awaymission/arrivalblock) "lB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock) -"lC" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/awaymission/arrivalblock) +"lC" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s"; dir = 8; dir = 2},/area/awaymission/arrivalblock) "lD" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor,/area/awaymission/arrivalblock) "lE" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor,/area/awaymission/arrivalblock) "lF" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor,/area/awaymission/arrivalblock) diff --git a/maps/RandomZLevels/wildwest.dm b/maps/RandomZLevels/wildwest.dm index d2935b69f6f..b3ae83b9d7b 100644 --- a/maps/RandomZLevels/wildwest.dm +++ b/maps/RandomZLevels/wildwest.dm @@ -48,16 +48,16 @@ user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart." if (!(LASER in user.mutations)) user.mutations.Add(LASER) - user << "\blue You feel pressure building behind your eyes." + user << "You feel pressure building behind your eyes." if (!(COLD_RESISTANCE in user.mutations)) user.mutations.Add(COLD_RESISTANCE) - user << "\blue Your body feels warm." + user << "Your body feels warm." if (!(XRAY in user.mutations)) user.mutations.Add(XRAY) user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) user.see_in_dark = 8 user.see_invisible = SEE_INVISIBLE_LEVEL_TWO - user << "\blue The walls suddenly disappear." + user << "The walls suddenly disappear." user.dna.mutantrace = "shadow" user.update_mutantrace() if("Wealth") @@ -171,4 +171,4 @@ C << "You have regenerated." C.visible_message("[usr] appears to wake from the dead, having healed all wounds.") C.update_canmove() - return 1 \ No newline at end of file + return 1 diff --git a/maps/RandomZLevels/wildwest.dmm b/maps/RandomZLevels/wildwest.dmm index eacd902064b..491d7f64fe9 100644 --- a/maps/RandomZLevels/wildwest.dmm +++ b/maps/RandomZLevels/wildwest.dmm @@ -50,11 +50,11 @@ "aX" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines) "aY" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "aZ" = (/obj/effect/mine/dnascramble,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) -"ba" = (/obj/effect/mine/dnascramble,/obj/item/ammo_magazine/a12mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) +"ba" = (/obj/effect/mine/dnascramble,/obj/item/ammo_magazine/a10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "bb" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaymission/wwrefine) "bc" = (/turf/simulated/floor/plating,/area/awaymission/wwrefine) "bd" = (/obj/machinery/door/airlock/sandstone,/turf/simulated/floor/plating,/area/awaymission/wwrefine) -"be" = (/obj/item/ammo_magazine/a12mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) +"be" = (/obj/item/ammo_magazine/a10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "bf" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "bg" = (/turf/simulated/wall/mineral/sandstone,/area) "bh" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/wwrefine) @@ -68,7 +68,7 @@ "bp" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/wood,/area/awaymission/wwmines) "bq" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating,/area/awaymission/wwrefine) "br" = (/obj/structure/lattice,/turf/space,/area) -"bs" = (/obj/effect/mine/dnascramble,/obj/item/ammo_magazine/a12mm,/turf/simulated/floor/wood,/area/awaymission/wwmines) +"bs" = (/obj/effect/mine/dnascramble,/obj/item/ammo_magazine/a10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines) "bt" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaymission/wwrefine) "bu" = (/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines) "bv" = (/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area) @@ -112,7 +112,7 @@ "ch" = (/obj/structure/table/woodentable,/obj/item/weapon/gun/projectile,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines) "ci" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/turf/simulated/floor/wood,/area/awaymission/wwmines) "cj" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/awaymission/wwmines) -"ck" = (/obj/item/ammo_magazine/a12mm,/turf/simulated/floor/carpet,/area/awaymission/wwmines) +"ck" = (/obj/item/ammo_magazine/a10mm,/turf/simulated/floor/carpet,/area/awaymission/wwmines) "cl" = (/obj/structure/stool,/turf/simulated/floor/wood,/area/awaymission/wwmines) "cm" = (/obj/structure/bookcase{tag = "icon-book-5"; icon_state = "book-5"},/turf/simulated/floor/wood,/area/awaymission/wwgov) "cn" = (/turf/simulated/floor/wood,/area/awaymission/wwgov) @@ -129,7 +129,7 @@ "cy" = (/obj/structure/stool/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/awaymission/wwgov) "cz" = (/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) "cA" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/awaymission/wwmines) -"cB" = (/obj/effect/mine/plasma,/obj/item/ammo_magazine/a12mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) +"cB" = (/obj/effect/mine/plasma,/obj/item/ammo_magazine/a10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "cC" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/wood,/area/awaymission/wwgov) "cD" = (/obj/structure/table/woodentable,/obj/item/clothing/gloves/yellow,/obj/item/device/multitool,/turf/simulated/floor/wood,/area/awaymission/wwgov) "cE" = (/obj/structure/stool/bed/chair/wood/normal{dir = 4},/turf/simulated/floor/wood,/area/awaymission/wwgov) @@ -175,7 +175,7 @@ "ds" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,/turf/simulated/floor{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov) "dt" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "du" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/wood,/area/awaymission/wwmines) -"dv" = (/obj/effect/mine/plasma,/obj/item/ammo_magazine/a12mm,/turf/simulated/floor/wood,/area/awaymission/wwmines) +"dv" = (/obj/effect/mine/plasma,/obj/item/ammo_magazine/a10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines) "dw" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "dx" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand4"; icon_state = "ironsand4"},/area/awaymission/wwgov) "dy" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwmines) @@ -344,19 +344,19 @@ "gF" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/awaymission/wwgov) "gG" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/grille,/turf/simulated/floor,/area/awaymission/wwrefine) "gH" = (/obj/effect/decal/cleanable/blood,/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/awaymission/wwmines) -"gI" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"},/area/awaymission/wwrefine) -"gJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/wwrefine) -"gK" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/wwrefine) +"gI" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s"; dir = 14},/area/awaymission/wwrefine) +"gJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4},/area/awaymission/wwrefine) +"gK" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall"; dir = 8},/area/awaymission/wwrefine) "gL" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine) -"gM" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/wwrefine) -"gN" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"},/area/awaymission/wwrefine) -"gO" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/wwrefine) +"gM" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall"; dir = 4},/area/awaymission/wwrefine) +"gN" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s"; dir = 2},/area/awaymission/wwrefine) +"gO" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1},/area/awaymission/wwrefine) "gP" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine) "gQ" = (/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine) -"gR" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"},/area/awaymission/wwrefine) -"gS" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swallc1"},/area/awaymission/wwrefine) -"gT" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/wwrefine) -"gU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"},/area/awaymission/wwrefine) +"gR" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s"; dir = 1},/area/awaymission/wwrefine) +"gS" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swall"; dir = 10},/area/awaymission/wwrefine) +"gT" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swall"; dir = 6},/area/awaymission/wwrefine) +"gU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s"; dir = 8},/area/awaymission/wwrefine) "gV" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines) "gW" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/syndicate/black/orange,/obj/item/clothing/head/helmet/space/syndicate/black/orange,/obj/item/clothing/mask/gas/syndicate,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine) "gX" = (/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{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine) diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 85e74d425aa..cd0d108f281 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -4,111 +4,111 @@ "aad" = (/turf/space,/area/syndicate_station/northeast) "aae" = (/turf/space,/area/syndicate_station/northwest) "aaf" = (/obj/structure/lattice,/turf/space,/area/space) -"aag" = (/obj/effect/landmark{name = "carpspawn"},/turf/simulated/floor/airless{icon_state = "circuit"},/area/space) +"aag" = (/obj/effect/landmark{name = "carpspawn"},/turf/simulated/floor/airless,/area/space) "aah" = (/turf/simulated/wall,/area/space) -"aai" = (/turf/simulated/floor/airless{icon_state = "floorgrime"},/area/space) -"aaj" = (/turf/simulated/floor/airless{icon_state = "circuit"},/area/space) -"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) +"aai" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/airless,/area/space) +"aaj" = (/obj/structure/girder/displaced,/turf/simulated/floor/airless,/area/space) +"aak" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/airless,/area/space) +"aal" = (/obj/random/loot,/turf/simulated/floor/airless,/area/space) "aam" = (/obj/structure/grille,/turf/space,/area/space) "aan" = (/obj/structure/grille/broken,/turf/space,/area/space) -"aao" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/space) +"aao" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless,/area/solar/fore) "aap" = (/turf/simulated/floor/airless,/area/space) "aaq" = (/obj/structure/grille/broken,/obj/structure/lattice,/turf/space,/area/space) -"aar" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/airless{icon_state = "circuit"},/area/space) -"aas" = (/obj/random/loot,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/space) +"aar" = (/obj/machinery/power/solar{id = "auxsolarnorth"; name = "Fore Solar Array"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/airless{icon = 'icons/turf/floors.dmi'; icon_state = "solarpanel"},/area/solar/fore) +"aas" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "auxsolarnorth"; name = "Fore Solar Array"},/turf/simulated/floor/airless{icon = 'icons/turf/floors.dmi'; icon_state = "solarpanel"},/area/solar/fore) "aat" = (/turf/simulated/wall/r_wall,/area/space) "aau" = (/turf/space,/area/skipjack_station/northwest_solars) -"aav" = (/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) -"aaw" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/fore) -"aax" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "auxsolarnorth"; name = "Fore Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/fore) +"aav" = (/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/airless,/area/solar/fore) +"aaw" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/security/range) +"aax" = (/turf/simulated/floor/tiled,/area/security/range) "aay" = (/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/space) "aaz" = (/turf/simulated/wall,/area/security/range) -"aaA" = (/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/target_stake,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/range) "aaB" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/space) "aaC" = (/obj/machinery/camera/network/security{c_tag = "Armory Exterior"; dir = 4},/turf/space,/area/space) -"aaD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/range) -"aaE" = (/obj/structure/target_stake,/turf/simulated/floor{icon_state = "delivery"},/area/security/range) -"aaF" = (/turf/simulated/floor,/area/security/range) -"aaG" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/security/range) +"aaD" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/security/range) +"aaE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/security/range) +"aaF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/range) +"aaG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/security/range) "aaH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor,/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/range) "aaI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/range) "aaJ" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space) "aaK" = (/obj/item/stack/cable_coil/random,/turf/space,/area/space) "aaL" = (/obj/structure/sign/electricshock{pixel_y = -32},/turf/space,/area/space) -"aaM" = (/turf/simulated/floor/plating/airless,/area/space) -"aaN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/security/range) -"aaO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/range) -"aaP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/security/range) -"aaQ" = (/obj/machinery/door/window/northleft{dir = 4; name = "Range Access"; req_access = list(63)},/obj/machinery/alarm{pixel_y = 22},/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 = "warning"},/area/security/range) -"aaR" = (/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 = "warning"},/area/security/range) -"aaS" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/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/security/range) -"aaT" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/table/reinforced,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/clothing/ears/earmuffs,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/security/range) +"aaM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/security/range) +"aaN" = (/obj/machinery/door/window/northleft{dir = 4; name = "Range Access"; req_access = list(63)},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/security/range) +"aaO" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/table/reinforced,/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/clothing/ears/earmuffs,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/security/range) +"aaP" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/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/tiled,/area/security/range) +"aaQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/range) +"aaR" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/tiled,/area/security/range) +"aaS" = (/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (NORTH)"; icon_state = "loadingarea"; dir = 1},/turf/simulated/floor/tiled,/area/security/range) +"aaT" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/turf/simulated/floor/tiled,/area/security/range) "aaU" = (/turf/simulated/wall/r_wall,/area/security/tactical) -"aaV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/range) -"aaW" = (/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/security/range) -"aaX" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/security/range) -"aaY" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/turf/simulated/floor,/area/security/range) +"aaV" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/blanks{pixel_x = 2; pixel_y = -2},/obj/item/weapon/storage/box/blanks,/turf/simulated/floor/tiled,/area/security/range) +"aaW" = (/obj/structure/table/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/range) +"aaX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/range) +"aaY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/maintenance/foresolar) "aaZ" = (/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/security/range) -"aba" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/blanks{pixel_x = 2; pixel_y = -2},/obj/item/weapon/storage/box/blanks,/turf/simulated/floor,/area/security/range) -"abb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/range) -"abc" = (/obj/structure/table/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/range) +"aba" = (/obj/structure/closet/wardrobe/tactical,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/tactical) +"abb" = (/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"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/tactical) +"abc" = (/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled,/area/security/range) "abd" = (/turf/simulated/wall,/area/maintenance/security_starboard) -"abe" = (/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/foresolar) +"abe" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/security/range) "abf" = (/turf/simulated/wall/r_wall,/area/maintenance/foresolar) "abg" = (/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/maintenance/security_port) "abh" = (/turf/simulated/wall,/area/maintenance/security_port) -"abi" = (/obj/structure/closet/wardrobe/tactical,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/tactical) -"abj" = (/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) +"abi" = (/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/tiled,/area/security/range) +"abj" = (/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/solar/fore) "abk" = (/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) -"abl" = (/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/security/range) -"abm" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/turf/simulated/floor,/area/security/range) -"abn" = (/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) +"abl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/airless,/area/maintenance/foresolar) +"abm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/maintenance/foresolar) +"abn" = (/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,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/foresolar) "abo" = (/obj/structure/closet/crate,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "abp" = (/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) -"abq" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/fore) -"abr" = (/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/foresolar) -"abs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/maintenance/foresolar) -"abt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/foresolar) -"abu" = (/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/foresolar) +"abq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/maintenance/foresolar) +"abr" = (/obj/effect/decal/cleanable/ash,/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) +"abs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/tactical) +"abt" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/tactical) +"abu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/tactical) "abv" = (/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/foresolar) "abw" = (/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) "abx" = (/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) -"aby" = (/obj/effect/decal/cleanable/ash,/obj/structure/closet/emcloset,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/security_port) -"abz" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) -"abA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) -"abB" = (/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) -"abC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical) -"abD" = (/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) +"aby" = (/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/tiled{icon_state = "dark"},/area/security/tactical) +"abz" = (/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/tiled{icon_state = "dark"},/area/security/tactical) +"abA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/security/range) +"abB" = (/obj/machinery/camera/network/security{c_tag = "Security - Medical Station"; dir = 1},/turf/simulated/floor/tiled,/area/security/range) +"abC" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/security/range) +"abD" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/security/range) "abE" = (/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) -"abF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/security/range) -"abG" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/security/range) -"abH" = (/obj/machinery/camera/network/security{c_tag = "Security - Medical Station"; dir = 1},/turf/simulated/floor,/area/security/range) -"abI" = (/obj/machinery/light,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/security/range) -"abJ" = (/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) -"abK" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/security/range) -"abL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/security/range) -"abM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/security/range) +"abF" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/security/range) +"abG" = (/obj/item/device/radio/intercom{broadcasting = 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/tiled,/area/security/range) +"abH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/security/range) +"abI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/security/range) +"abJ" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/fore) +"abK" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/solar/fore) +"abL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/solar/fore) +"abM" = (/turf/simulated/floor/airless,/area/solar/fore) "abN" = (/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) "abO" = (/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) "abP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"abQ" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/fore) -"abR" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/fore) -"abS" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/fore) -"abT" = (/turf/simulated/floor/plating/airless,/area/solar/fore) -"abU" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/fore) -"abV" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/fore) +"abQ" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/fore) +"abR" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/solar/fore) +"abS" = (/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(11,13)},/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/manifold/visible,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/foresolar) +"abT" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) +"abU" = (/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/tiled{icon_state = "dark"},/area/security/tactical) +"abV" = (/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/tiled,/area/security/main) "abW" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/foresolar) "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_inner"; locked = 1; name = "Engineering External Access"; req_access = list(11,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) -"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(11,13)},/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/manifold/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/foresolar) +"abZ" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/fore) "aca" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 200},/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"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/foresolar) "acc" = (/obj/machinery/door/airlock/engineering{name = "Fore Solar Access"; req_access = list(11)},/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/foresolar) -"acd" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/security_port) +"acd" = (/obj/machinery/power/solar_control{id = "auxsolarnorth"; name = "Fore Solar Control"; track = 0},/obj/structure/cable/yellow,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/foresolar) "ace" = (/turf/simulated/wall/r_wall,/area/security/armoury) "acf" = (/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/tactical) -"acg" = (/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) +"acg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/maintenance/foresolar) "ach" = (/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) "aci" = (/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},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/main) "acj" = (/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/security/main) @@ -118,142 +118,142 @@ "acn" = (/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) "aco" = (/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) "acp" = (/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) -"acq" = (/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) +"acq" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_port) "acr" = (/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) "acs" = (/turf/simulated/wall,/area/security/main) "act" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "acu" = (/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) -"acv" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/fore) -"acw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/foresolar) -"acx" = (/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) +"acv" = (/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,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"acw" = (/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,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"acx" = (/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,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/weapon/storage/box/practiceshells,/obj/item/weapon/storage/box/practiceshells,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) "acy" = (/turf/simulated/floor/plating,/area/maintenance/foresolar) "acz" = (/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) -"acA" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/security_port) -"acB" = (/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) -"acC" = (/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) -"acD" = (/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) -"acE" = (/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,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/weapon/storage/box/practiceshells,/obj/item/weapon/storage/box/practiceshells,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) -"acF" = (/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) -"acG" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) -"acH" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/security/main) -"acI" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor,/area/security/main) -"acJ" = (/obj/structure/disposalpipe/segment,/obj/structure/table/standard,/obj/machinery/recharger,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/security/main) -"acK" = (/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) -"acL" = (/obj/structure/table/standard,/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 = "blue"},/area/security/main) -"acM" = (/obj/structure/table/standard,/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 = "blue"},/area/security/main) +"acA" = (/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,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"acB" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"acC" = (/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/tiled{icon_state = "dark"},/area/security/armoury) +"acD" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/security/main) +"acE" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"acF" = (/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/tiled,/area/security/main) +"acG" = (/obj/structure/disposalpipe/segment,/obj/structure/table/standard,/obj/machinery/recharger,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/security/main) +"acH" = (/obj/structure/table/standard,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/security/main) +"acI" = (/obj/structure/table/standard,/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"},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/main) +"acJ" = (/obj/machinery/computer/secure_data,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"acK" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled,/area/security/main) +"acL" = (/obj/machinery/computer/security,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"acM" = (/turf/simulated/floor/tiled,/area/security/main) "acN" = (/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) -"acO" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"acP" = (/obj/machinery/computer/security,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"acQ" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor,/area/security/main) -"acR" = (/obj/machinery/computer/station_alert/security,/turf/simulated/floor,/area/security/main) -"acS" = (/turf/simulated/floor,/area/security/main) -"acT" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) -"acU" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/security/main) -"acV" = (/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) -"acW" = (/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) +"acO" = (/obj/machinery/computer/station_alert/security,/turf/simulated/floor/tiled,/area/security/main) +"acP" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/security/main) +"acQ" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/main) +"acR" = (/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/airless,/area/solar/fore) +"acS" = (/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/airless,/area/maintenance/foresolar) +"acT" = (/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,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"acU" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"acV" = (/obj/machinery/door/blast/regular{id = "Armoury"; name = "Emergency Access"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"acW" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) "acX" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_port) -"acY" = (/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) -"acZ" = (/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) -"ada" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) -"adb" = (/obj/machinery/door/blast/regular{id = "Armoury"; name = "Emergency Access"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/security/armoury) -"adc" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/security/main) -"add" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/security/main) -"ade" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/main) -"adf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) -"adg" = (/obj/structure/table/standard,/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 = "blue"},/area/security/main) -"adh" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"adi" = (/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) -"adj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/snack,/turf/simulated/floor,/area/security/main) +"acY" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"acZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/main) +"ada" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/security/main) +"adb" = (/obj/structure/table/standard,/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/main) +"adc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/main) +"add" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"ade" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/security/main) +"adf" = (/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/tiled,/area/security/main) +"adg" = (/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},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adh" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adj" = (/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},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) "adk" = (/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) "adl" = (/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) "adm" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adn" = (/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) "ado" = (/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) -"adp" = (/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) -"adq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) -"adr" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) -"ads" = (/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) -"adt" = (/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) -"adu" = (/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) -"adv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) -"adw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) -"adx" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/main) -"ady" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"adp" = (/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,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adr" = (/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},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"ads" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adt" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"adu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"adv" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/tiled,/area/security/main) +"adw" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"adx" = (/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,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"ady" = (/obj/machinery/button/remote/blast_door{id = "Armoury"; name = "Armoury Access"; pixel_x = -1; pixel_y = -28; req_access = list(3)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) "adz" = (/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) -"adA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"adB" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/main) -"adC" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"adA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/security/main) +"adB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"adC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/main) "adD" = (/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) "adE" = (/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adF" = (/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) "adG" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adH" = (/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) "adI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_port) -"adJ" = (/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) -"adK" = (/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) -"adL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/main) -"adM" = (/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) -"adN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) -"adO" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/main) -"adP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"adQ" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/main) -"adR" = (/obj/structure/table/standard,/obj/item/weapon/folder/blue,/turf/simulated/floor,/area/security/main) -"adS" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Security Cadet"},/turf/simulated/floor,/area/security/main) -"adT" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_x = 30; pixel_y = 0},/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"adJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"adK" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(1)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/main) +"adL" = (/obj/structure/table/standard,/obj/item/weapon/folder/blue,/turf/simulated/floor/tiled,/area/security/main) +"adM" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/tiled,/area/security/main) +"adN" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; pixel_x = 30; pixel_y = 0},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"adO" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark/start{name = "Security Cadet"},/turf/simulated/floor/tiled,/area/security/main) +"adP" = (/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},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adQ" = (/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},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adR" = (/obj/machinery/light,/obj/machinery/flasher/portable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adS" = (/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"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) +"adT" = (/obj/machinery/light,/obj/machinery/flasher/portable,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/armoury) "adU" = (/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) "adV" = (/obj/structure/closet/toolcloset,/obj/item/clothing/head/hardhat/dblue,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adW" = (/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) -"adY" = (/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) -"adZ" = (/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) -"aea" = (/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) -"aeb" = (/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) -"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,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/security/armoury) -"aed" = (/obj/machinery/light,/obj/machinery/flasher/portable,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/armoury) -"aee" = (/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) -"aef" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/main) -"aeg" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"adY" = (/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/tiled{icon_state = "dark"},/area/security/armoury) +"adZ" = (/obj/machinery/button/remote/blast_door{id = "Armoury"; name = "Emergency Access"; pixel_x = -28; pixel_y = 4; req_access = list(3)},/turf/simulated/floor/tiled,/area/security/main) +"aea" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/security/main) +"aeb" = (/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"aec" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"aed" = (/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"},/obj/effect/landmark/start{name = "Security Cadet"},/turf/simulated/floor/tiled,/area/security/main) +"aee" = (/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/airless,/area/solar/fore) +"aef" = (/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/tiled,/area/security/warden) +"aeg" = (/obj/structure/window/reinforced,/obj/structure/table/standard,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/tiled,/area/security/main) "aeh" = (/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) -"aei" = (/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"},/obj/effect/landmark/start{name = "Security Cadet"},/turf/simulated/floor,/area/security/main) -"aej" = (/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 = "bluecorner"},/area/security/main) +"aei" = (/obj/machinery/light{dir = 8},/obj/structure/window/reinforced,/obj/structure/table/standard,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/simulated/floor/tiled,/area/security/main) +"aej" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/security/main) "aek" = (/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) -"ael" = (/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) +"ael" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced,/obj/structure/table/standard,/obj/item/weapon/packageWrap,/obj/item/weapon/storage/box,/turf/simulated/floor/tiled,/area/security/main) "aem" = (/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/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_port) -"aen" = (/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) -"aeo" = (/obj/structure/window/reinforced,/obj/structure/table/standard,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"aep" = (/obj/machinery/light{dir = 8},/obj/structure/window/reinforced,/obj/structure/table/standard,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"aeq" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"aer" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced,/obj/structure/table/standard,/obj/item/weapon/packageWrap,/obj/item/weapon/storage/box,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"aes" = (/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) -"aet" = (/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 = "bluecorner"},/area/security/main) -"aeu" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(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,/area/security/main) -"aev" = (/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 = "bluecorner"},/area/security/main) -"aew" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/main) -"aex" = (/obj/structure/table/standard,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/folder/blue,/turf/simulated/floor,/area/security/main) -"aey" = (/obj/structure/table/standard,/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) -"aez" = (/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) -"aeA" = (/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{icon_state = "bluecorner"},/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},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"aeo" = (/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/tiled,/area/security/main) +"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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"aeq" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/glass_security{name = "Briefing Room"; req_access = list(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/tiled,/area/security/main) +"aer" = (/obj/structure/table/standard,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/folder/blue,/turf/simulated/floor/tiled,/area/security/main) +"aes" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/tiled,/area/security/main) +"aet" = (/obj/structure/table/standard,/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/tiled,/area/security/main) +"aeu" = (/obj/item/device/radio/intercom{broadcasting = 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},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"aev" = (/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/tiled,/area/security/main) +"aew" = (/obj/machinery/deployable/barrier,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/obj/machinery/camera/network/security{c_tag = "Armoury"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"aex" = (/obj/machinery/deployable/barrier,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"aey" = (/obj/structure/closet/l3closet/security,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"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,/turf/simulated/floor/tiled,/area/security/warden) +"aeA" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/bombclosetsecurity,/obj/machinery/firealarm{pixel_y = 27},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) "aeB" = (/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) "aeC" = (/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) "aeD" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port) "aeE" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/maintenance/security_port) "aeF" = (/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/syringe/ld50_syringe/choral,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/security_port) "aeG" = (/turf/simulated/wall/r_wall,/area/security/warden) -"aeH" = (/obj/machinery/deployable/barrier,/turf/simulated/floor{icon_state = "delivery"},/area/security/warden) -"aeI" = (/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) -"aeJ" = (/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) -"aeK" = (/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) -"aeL" = (/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) +"aeH" = (/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) +"aeI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/security/main) +"aeJ" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) +"aeK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"aeL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/main) "aeM" = (/turf/simulated/wall,/area/security/warden) -"aeN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor,/area/security/main) -"aeO" = (/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/main) -"aeP" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/main) +"aeN" = (/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/tiled,/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/tiled,/area/security/main) +"aeP" = (/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/tiled,/area/security/main) "aeQ" = (/obj/structure/grille,/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/main) -"aeR" = (/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 = "bluecorner"},/area/security/main) -"aeS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/main) -"aeT" = (/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) -"aeU" = (/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) -"aeV" = (/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 = "bluecorner"},/area/security/main) +"aeR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/warden) +"aeS" = (/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/tiled,/area/security/warden) +"aeT" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/crate{name = "security mag lock crate"},/obj/item/device/magnetic_lock/security,/obj/item/device/magnetic_lock/security,/turf/simulated/floor/tiled,/area/security/warden) +"aeU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/main) +"aeV" = (/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/tiled,/area/security/main) "aeW" = (/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) "aeX" = (/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) "aeY" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_starboard) @@ -262,43 +262,43 @@ "afb" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/security_port) "afc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_port) "afd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/barricade,/turf/simulated/floor/plating,/area/maintenance/security_port) -"afe" = (/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) -"aff" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/warden) -"afg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/crate{name = "security mag lock crate"},/obj/item/device/magnetic_lock/security,/obj/item/device/magnetic_lock/security,/turf/simulated/floor,/area/security/warden) -"afh" = (/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) -"afi" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/main) -"afj" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/main) -"afk" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Security"; sortType = "Security"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/main) -"afl" = (/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/storage/box/donut,/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"afe" = (/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/main) +"aff" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Security"; sortType = "Security"},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/main) +"afg" = (/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/storage/box/donut,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"afh" = (/obj/machinery/photocopier,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"afi" = (/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/tiled,/area/security/main) +"afj" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled,/area/security/main) +"afk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/main) +"afl" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/shuttle/escape_pod3/station) "afm" = (/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) -"afn" = (/obj/machinery/photocopier,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"afo" = (/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) -"afp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/main) -"afq" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor,/area/security/main) +"afn" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/escape_pod3/station) +"afo" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/security/warden) +"afp" = (/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/tiled,/area/security/warden) +"afq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/warden) "afr" = (/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) "afs" = (/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aft" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afu" = (/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) -"afv" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod3/station) -"afw" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod3/station) +"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/tiled,/area/security/warden) +"afw" = (/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/tiled,/area/security/warden) "afx" = (/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/remains/robot,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port) "afy" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/camera/xray/security{c_tag = "Security Escape Pod"; dir = 8},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afz" = (/obj/structure/table/rack,/obj/effect/decal/cleanable/dirt,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_port) -"afA" = (/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/security/warden) -"afB" = (/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/security/warden) -"afC" = (/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) -"afD" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/warden) -"afE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/warden) -"afF" = (/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) -"afG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 9; icon_state = "bluefull"},/area/security/main) -"afH" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/security/main) -"afI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 9; icon_state = "bluefull"},/area/security/main) -"afJ" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) -"afK" = (/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 = "blue"; dir = 8},/area/security/main) -"afL" = (/obj/machinery/vending/cola,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"afM" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"afN" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/main) -"afO" = (/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) +"afA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/blue{dir = 5},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/main) +"afB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/main) +"afC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/blue{dir = 5},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/main) +"afD" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"afE" = (/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/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/security/main) +"afF" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"afG" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"afH" = (/obj/machinery/door/window/eastright{dir = 1; name = "Security Delivery"; req_access = list(1)},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/main) +"afI" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/security/main) +"afJ" = (/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},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"afK" = (/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},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"afL" = (/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(2)},/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"afM" = (/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(2)},/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"afN" = (/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/main) +"afO" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1475; listening = 0; name = "Station Intercom (Security)"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/main) "afP" = (/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) "afQ" = (/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) "afR" = (/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) @@ -321,192 +321,192 @@ "agi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/security_port) "agj" = (/obj/effect/decal/cleanable/spiderling_remains,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/security_port) "agk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/security_port) -"agl" = (/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) -"agm" = (/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) -"agn" = (/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) -"ago" = (/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(2)},/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) -"agp" = (/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(2)},/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/warden) -"agq" = (/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) -"agr" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/main) -"ags" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/main) -"agt" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/main) -"agu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/main) +"agl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/main) +"agm" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/main) +"agn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/standard,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"ago" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/main) +"agp" = (/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/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"agq" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/shuttle/escape_pod3/station) +"agr" = (/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/tiled{icon_state = "dark"},/area/security/warden) +"ags" = (/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/main) +"agt" = (/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,/turf/simulated/floor/tiled,/area/security/main) +"agu" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) "agv" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_port) "agw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/crew_quarters/heads/hos) "agx" = (/turf/simulated/wall,/area/crew_quarters/heads/hos) "agy" = (/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) "agz" = (/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) -"agA" = (/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) +"agA" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) "agB" = (/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) "agC" = (/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) "agD" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/hos) "agE" = (/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) "agF" = (/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) "agG" = (/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) -"agH" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod3/station) -"agI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/standard,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"agH" = (/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) +"agI" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) "agJ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/security_port) "agK" = (/obj/item/trash/candy,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/security_port) "agL" = (/turf/simulated/wall/r_wall,/area/security/brig) "agM" = (/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/supply,/turf/simulated/floor/plating,/area/security/brig) "agN" = (/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) "agO" = (/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) -"agP" = (/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) +"agP" = (/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/carpet,/area/crew_quarters/heads/hos) "agQ" = (/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) "agR" = (/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) -"agS" = (/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,/turf/simulated/floor,/area/security/main) -"agT" = (/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) -"agU" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"agS" = (/obj/machinery/photocopier,/obj/machinery/keycard_auth{pixel_x = 30},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"agT" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) +"agU" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) "agV" = (/obj/structure/disposalpipe/sortjunction{dir = 1; name = "HoS Office"; sortType = "HoS Office"},/turf/simulated/wall,/area/crew_quarters/heads/hos) -"agW" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"agX" = (/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"agY" = (/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) -"agZ" = (/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/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) -"aha" = (/obj/machinery/photocopier,/obj/machinery/keycard_auth{pixel_x = 30},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) +"agW" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) +"agX" = (/obj/structure/table/standard,/obj/item/device/camera,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"agY" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"agZ" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"aha" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "ahb" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/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) "ahc" = (/obj/structure/table/rack,/obj/effect/decal/cleanable/cobweb,/obj/random/loot,/obj/random/glowstick,/turf/simulated/floor/plating,/area/maintenance/security_port) "ahd" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_port) "ahe" = (/turf/simulated/wall,/area/security/brig) -"ahf" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"ahg" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"ahh" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"ahi" = (/obj/structure/table/standard,/obj/item/device/camera,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/security/brig) -"ahj" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) -"ahk" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) -"ahl" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) -"ahm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) -"ahn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/brig) +"ahf" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"ahg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig) +"ahh" = (/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/tiled{icon_state = "dark"},/area/security/warden) +"ahi" = (/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/tiled{icon_state = "dark"},/area/security/warden) +"ahj" = (/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ahk" = (/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/tiled{icon_state = "dark"},/area/security/warden) +"ahl" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/item/weapon/stamp/denied{pixel_x = 5},/obj/item/weapon/stamp,/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ahm" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/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"},/obj/structure/table/steel_reinforced,/obj/item/weapon/folder/blue,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ahn" = (/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/security/main) "aho" = (/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) -"ahp" = (/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) -"ahq" = (/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) -"ahr" = (/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) -"ahs" = (/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/obj/structure/table/steel_reinforced,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aht" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/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"},/obj/structure/table/steel_reinforced,/obj/item/weapon/folder/blue,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ahu" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/item/weapon/stamp/denied{pixel_x = 5},/obj/item/weapon/stamp,/obj/structure/table/steel_reinforced,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ahv" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/security/main) -"ahw" = (/obj/structure/flora/pottedplant/random,/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"ahp" = (/obj/structure/flora/pottedplant/random,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"ahq" = (/obj/structure/table/woodentable,/obj/item/device/megaphone,/obj/item/device/radio/off,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ahr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) +"ahs" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aht" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) +"ahu" = (/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,/area/crew_quarters/heads/hos) +"ahv" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security"},/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/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ahw" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) "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/item/device/megaphone,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"ahz" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"ahA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) -"ahB" = (/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) -"ahC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/heads/hos) -"ahD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"ahE" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security"},/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{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ahy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/airless,/area/maintenance/research_starboard) +"ahz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless,/area/maintenance/research_starboard) +"ahA" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/turf/simulated/floor/airless,/area/maintenance/research_starboard) +"ahB" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/airless,/area/maintenance/research_starboard) +"ahC" = (/obj/structure/table/standard,/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/tiled,/area/security/brig) +"ahD" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/security/brig) +"ahE" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) "ahF" = (/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) -"ahG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/research_starboard) +"ahG" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) "ahH" = (/turf/space,/area/skipjack_station/northeast_solars) "ahI" = (/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) "ahJ" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port) "ahK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_port) -"ahL" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor,/area/security/brig) -"ahM" = (/obj/structure/table/standard,/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) +"ahL" = (/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/tiled{icon_state = "dark"},/area/security/brig) +"ahM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) "ahN" = (/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) -"ahO" = (/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"ahP" = (/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) -"ahQ" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"ahR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"ahS" = (/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/turf/simulated/floor,/area/security/brig) -"ahT" = (/turf/simulated/floor,/area/security/brig) -"ahU" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) -"ahV" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor,/area/security/brig) -"ahW" = (/obj/structure/bed/chair,/turf/simulated/floor,/area/security/brig) -"ahX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/brig) -"ahY" = (/obj/item/device/eftpos{eftpos_name = "Brig EFTPOS scanner"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Warden's Desk"; req_access = list(3)},/obj/structure/table/steel_reinforced,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ahZ" = (/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aia" = (/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) -"aib" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aic" = (/obj/item/weapon/hand_labeler,/obj/machinery/door/window/brigdoor{dir = 4; name = "Warden's Desk"; req_access = list(3)},/obj/structure/table/steel_reinforced,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aid" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/security/main) -"aie" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"ahO" = (/turf/simulated/floor/tiled,/area/security/brig) +"ahP" = (/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/turf/simulated/floor/tiled,/area/security/brig) +"ahQ" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/security/brig) +"ahR" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled,/area/security/brig) +"ahS" = (/obj/item/device/eftpos{eftpos_name = "Brig EFTPOS scanner"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Warden's Desk"; req_access = list(3)},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ahT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig) +"ahU" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ahV" = (/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/tiled{icon_state = "dark"},/area/security/warden) +"ahW" = (/obj/item/weapon/hand_labeler,/obj/machinery/door/window/brigdoor{dir = 4; name = "Warden's Desk"; req_access = list(3)},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ahX" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ahY" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"ahZ" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask{pixel_x = -4; pixel_y = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aia" = (/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,/area/crew_quarters/heads/hos) +"aib" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aic" = (/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,/area/crew_quarters/heads/hos) +"aid" = (/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,/area/crew_quarters/heads/hos) +"aie" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/tranqcabinet{pixel_x = 32},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) "aif" = (/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) -"aig" = (/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) -"aih" = (/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) -"aii" = (/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) -"aij" = (/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) -"aik" = (/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) -"ail" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"aim" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/tranqcabinet{pixel_x = 32},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aig" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aih" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/airless,/area/maintenance/research_starboard) +"aii" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/airless,/area/maintenance/research_starboard) +"aij" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; icon_state = "map_on"; tag = "icon-map_on (EAST)"; target_pressure = 15000},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/airless,/area/maintenance/research_starboard) +"aik" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/airless,/area/maintenance/research_starboard) +"ail" = (/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/tiled,/area/security/brig) +"aim" = (/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/tiled,/area/security/brig) "ain" = (/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) "aio" = (/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_port) "aip" = (/obj/structure/table/steel,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_port) "aiq" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_port) -"air" = (/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) -"ais" = (/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) +"air" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) +"ais" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) "ait" = (/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) -"aiu" = (/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) -"aiv" = (/obj/structure/table/standard,/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) -"aiw" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"aix" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"aiy" = (/obj/structure/table/standard,/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) -"aiz" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor,/area/security/brig) -"aiA" = (/obj/structure/table/standard,/turf/simulated/floor,/area/security/brig) -"aiB" = (/obj/machinery/computer/secure_data,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aiC" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aiD" = (/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{icon_state = "dark"},/area/security/warden) -"aiE" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/recharger{pixel_y = 0},/obj/structure/table/steel_reinforced,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aiF" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/main) -"aiG" = (/obj/machinery/vending/security,/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"aiu" = (/obj/structure/table/standard,/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/tiled{icon_state = "dark"},/area/security/brig) +"aiv" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) +"aiw" = (/obj/structure/table/standard,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/machinery/camera/network/security{c_tag = "Security - Processing"; dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"aix" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"aiy" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/security/brig) +"aiz" = (/obj/machinery/computer/secure_data,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"aiA" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"aiB" = (/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/tiled{icon_state = "dark"},/area/security/warden) +"aiC" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/recharger{pixel_y = 0},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"aiD" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/tiled,/area/security/main) +"aiE" = (/obj/machinery/vending/security,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"aiF" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/flashlight/heavy,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aiG" = (/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)},/obj/machinery/button/remote/blast_door{id = "Prison Gate"; name = "Foyer Lockdown"; pixel_x = 32; pixel_y = 32},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) "aiH" = (/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) -"aiI" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/flashlight/heavy,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"aiJ" = (/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) -"aiK" = (/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/blue,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aiI" = (/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/blue,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aiJ" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/brig) +"aiK" = (/obj/item/device/radio/intercom{frequency = 1449; pixel_x = 0; pixel_y = -27},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "aiL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/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/plating,/area/maintenance/security_starboard) "aiM" = (/obj/effect/decal/cleanable/dirt,/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,/area/maintenance/security_starboard) "aiN" = (/turf/simulated/floor/plating,/area/maintenance/security_port) "aiO" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/security_port) -"aiP" = (/obj/item/device/radio/intercom{frequency = 1449; pixel_x = 0; pixel_y = -27},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) -"aiQ" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) +"aiP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) +"aiQ" = (/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/tiled{icon_state = "dark"},/area/security/brig) "aiR" = (/obj/structure/window/reinforced/tinted,/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,/turf/simulated/floor/plating,/area/security/brig) -"aiS" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"aiT" = (/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) -"aiU" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/brig) -"aiV" = (/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) -"aiW" = (/obj/structure/table/standard,/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) -"aiX" = (/obj/structure/table/standard,/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) -"aiY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/evidence,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) -"aiZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) -"aja" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/brig) -"ajb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) -"ajc" = (/obj/machinery/computer/secure_data,/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/security/brig) -"ajd" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/security{pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"aje" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ajf" = (/obj/machinery/computer/prisoner,/turf/simulated/floor{icon_state = "dark"},/area/security/warden) -"ajg" = (/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) -"ajh" = (/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) -"aji" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"ajj" = (/obj/structure/table/standard,/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 = "bluecorner"},/area/security/main) -"ajk" = (/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 = "bluecorner"},/area/security/main) -"ajl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/main) -"ajm" = (/obj/structure/table/standard,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo/cord,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) -"ajn" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "bluecorner"},/area/security/main) +"aiS" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) +"aiT" = (/obj/structure/table/standard,/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/tiled{icon_state = "dark"},/area/security/brig) +"aiU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/brig) +"aiV" = (/obj/structure/table/standard,/obj/item/device/radio/intercom{broadcasting = 1; 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/tiled,/area/security/brig) +"aiW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"aiX" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/evidence,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"aiY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) +"aiZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/security/brig) +"aja" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/security{pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ajb" = (/obj/machinery/computer/secure_data,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/brig) +"ajc" = (/obj/machinery/computer/prisoner,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ajd" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"aje" = (/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/weapon/wrench,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/warden) +"ajf" = (/obj/structure/closet/secure_closet/warden,/obj/item/device/megaphone,/obj/item/device/radio/intercom{broadcasting = 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/tiled{icon_state = "dark"},/area/security/warden) +"ajg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"ajh" = (/obj/structure/table/standard,/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"aji" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"ajj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"ajk" = (/obj/structure/table/standard,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo/cord,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"ajl" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/security/main) +"ajm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/newscaster/security_unit{pixel_x = -30},/obj/machinery/camera/network/security{c_tag = "Security - HoS' Office"; dir = 1},/obj/machinery/papershredder,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ajn" = (/obj/machinery/computer/security,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) "ajo" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall,/area/crew_quarters/heads/hos) -"ajp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/flora/pottedplant/random,/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) -"ajq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -29},/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"ajr" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"ajs" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"ajt" = (/obj/structure/filingcabinet,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) -"aju" = (/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) +"ajp" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -29},/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ajq" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/modular_computer/console/preset/command,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ajr" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ajs" = (/obj/structure/closet/secure_closet/hos,/obj/item/device/radio/intercom{pixel_x = 27},/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"ajt" = (/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "dark"},/area/crew_quarters/heads/hos) +"aju" = (/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/tiled,/area/security/brig) "ajv" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/security_port) "ajw" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/security_port) "ajx" = (/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) -"ajy" = (/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) -"ajz" = (/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) -"ajA" = (/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) +"ajy" = (/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/tiled,/area/security/brig) +"ajz" = (/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/tiled,/area/security/brig) +"ajA" = (/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/tiled,/area/security/brig) "ajB" = (/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) "ajC" = (/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) -"ajD" = (/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) +"ajD" = (/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/tiled,/area/security/brig) "ajE" = (/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},/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) -"ajF" = (/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) +"ajF" = (/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/tiled{icon_state = "dark"},/area/security/warden) "ajG" = (/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) "ajH" = (/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) "ajI" = (/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) -"ajJ" = (/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) +"ajJ" = (/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/tiled,/area/security/main) "ajK" = (/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) "ajL" = (/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) "ajM" = (/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) -"ajN" = (/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{dir = 9; icon_state = "bluefull"},/area/security/main) -"ajO" = (/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{dir = 9; icon_state = "bluefull"},/area/security/main) +"ajN" = (/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/tiled,/area/security/main) +"ajO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/security/brig) "ajP" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/crew_quarters/heads/hos) "ajQ" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "ajR" = (/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) @@ -514,420 +514,420 @@ "ajT" = (/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) "ajU" = (/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) "ajV" = (/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) -"ajW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/security/brig) -"ajX" = (/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{dir = 1; icon_state = "blue"},/area/security/brig) -"ajY" = (/obj/machinery/alarm{pixel_y = 22},/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 = "blue"},/area/security/brig) -"ajZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor,/area/security/brig) -"aka" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/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 = "blue"},/area/security/brig) -"akb" = (/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 = "blue"},/area/security/brig) -"akc" = (/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{dir = 1; icon_state = "blue"},/area/security/brig) -"akd" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor,/area/security/brig) -"ake" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/brig) -"akf" = (/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{dir = 1; icon_state = "blue"},/area/security/brig) -"akg" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 28},/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 = "blue"},/area/security/brig) -"akh" = (/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 = "blue"},/area/security/brig) -"aki" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) -"akj" = (/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 = "blue"},/area/security/brig) -"akk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/security/brig) -"akl" = (/obj/machinery/light{dir = 1},/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 = "blue"},/area/security/brig) -"akm" = (/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/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) -"akn" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/brig) -"ako" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/brig) -"akp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/brig) -"akq" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/brig) -"akr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) -"aks" = (/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) -"akt" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/security/brig) -"aku" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/brig) -"akv" = (/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) -"akw" = (/obj/structure/disposalpipe/segment,/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"akx" = (/obj/structure/noticeboard{pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"aky" = (/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) -"akz" = (/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) -"akA" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/flora/pottedplant/random,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"akB" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/computer/security/wooden_tv,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) +"ajW" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"ajX" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"ajY" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"ajZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig) +"aka" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akb" = (/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/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akd" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig) +"ake" = (/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},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akf" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"akh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"aki" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig) +"akj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akk" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akl" = (/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akm" = (/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/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"akn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"ako" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akp" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"akq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/brig) +"akr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/brig) +"aks" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/security/brig) +"akt" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"aku" = (/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/lino,/area/security/detectives_office) +"akv" = (/obj/structure/noticeboard{pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/papershredder,/turf/simulated/floor/lino,/area/security/detectives_office) +"akw" = (/obj/structure/disposalpipe/segment,/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/lino,/area/security/detectives_office) +"akx" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/lino,/area/security/detectives_office) +"aky" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera/network/security{c_tag = "Security - Forensic Office Fore"; dir = 2},/turf/simulated/floor/lino,/area/security/detectives_office) +"akz" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/flora/pottedplant/random,/turf/simulated/floor/lino,/area/security/detectives_office) +"akA" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/computer/security/wooden_tv,/turf/simulated/floor/lino,/area/security/detectives_office) +"akB" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/auxstarboard) "akC" = (/turf/simulated/wall,/area/security/detectives_office) "akD" = (/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/security_starboard) "akE" = (/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) "akF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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) -"akG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/research_starboard) +"akG" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/security/brig) "akH" = (/turf/space,/area/shuttle/syndicate_elite/station) -"akI" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"akJ" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/security/brig) -"akK" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/security/brig) -"akL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) -"akM" = (/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/supply,/turf/simulated/floor,/area/security/brig) -"akN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) -"akO" = (/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) -"akP" = (/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) -"akQ" = (/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) -"akR" = (/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) -"akS" = (/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) -"akT" = (/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) -"akU" = (/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) -"akV" = (/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) -"akW" = (/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) -"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/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/brig) -"akY" = (/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) -"akZ" = (/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) -"ala" = (/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/security/brig) -"alb" = (/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/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/brig) -"alc" = (/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/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/brig) -"ald" = (/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/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) -"ale" = (/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) -"alf" = (/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) -"alg" = (/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) -"alh" = (/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) -"ali" = (/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) -"alj" = (/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) +"akI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/brig) +"akJ" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/brig) +"akK" = (/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/supply,/turf/simulated/floor/tiled,/area/security/brig) +"akL" = (/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/tiled,/area/security/brig) +"akM" = (/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/tiled,/area/security/brig) +"akN" = (/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/tiled,/area/security/brig) +"akO" = (/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/tiled,/area/security/brig) +"akP" = (/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/tiled,/area/security/brig) +"akQ" = (/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/tiled,/area/security/brig) +"akR" = (/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/tiled,/area/security/brig) +"akS" = (/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/tiled,/area/security/brig) +"akT" = (/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/tiled,/area/security/brig) +"akU" = (/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/tiled,/area/security/brig) +"akV" = (/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/tiled,/area/security/brig) +"akW" = (/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/tiled,/area/security/brig) +"akX" = (/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/tiled,/area/security/brig) +"akY" = (/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/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/brig) +"akZ" = (/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/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"ala" = (/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/tiled,/area/security/brig) +"alb" = (/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/manifold4w/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/brig) +"alc" = (/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/tiled,/area/security/brig) +"ald" = (/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/tiled,/area/security/brig) +"ale" = (/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/tiled,/area/security/brig) +"alf" = (/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/lino,/area/security/detectives_office) +"alg" = (/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/tiled,/area/security/detectives_office) +"alh" = (/obj/structure/closet/secure_closet/detective,/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/turf/simulated/floor/lino,/area/security/detectives_office) +"ali" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/security_starboard) +"alj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "alk" = (/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) "all" = (/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) "alm" = (/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},/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet,/area/security/detectives_office) "aln" = (/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) "alo" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Detective"},/turf/simulated/floor/carpet,/area/security/detectives_office) -"alp" = (/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) -"alq" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/research_starboard) +"alp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/auxstarboard) +"alq" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/security/brig) "alr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "als" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"alt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"alu" = (/obj/machinery/atmospherics/pipe/tank/nitrous_oxide{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/security/brig) -"alv" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/security/brig) +"alt" = (/obj/machinery/atmospherics/pipe/tank/nitrous_oxide{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/plating,/area/security/brig) +"alu" = (/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,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/security/brig) +"alv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/brig) "alw" = (/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) "alx" = (/obj/machinery/computer/area_atmos/area,/turf/simulated/floor/plating,/area/security/brig) -"aly" = (/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 = "blue"; dir = 8},/area/security/brig) -"alz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) -"alA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig) -"alB" = (/obj/structure/closet/secure_closet/brig,/turf/simulated/floor,/area/security/brig) +"aly" = (/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/tiled,/area/security/brig) +"alz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig) +"alA" = (/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/tiled,/area/security/brig) +"alB" = (/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"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) "alC" = (/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) -"alD" = (/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) +"alD" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/secure_data,/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/security/brig) "alE" = (/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) -"alF" = (/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{dir = 4; icon_state = "blue"},/area/security/prison) +"alF" = (/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; req_access = list(63)},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) "alG" = (/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) -"alH" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/secure_data,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/security/brig) -"alI" = (/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; req_access = list(63)},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/brig) -"alJ" = (/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{dir = 1; icon_state = "blue"},/area/security/brig) -"alK" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security,/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/security/brig) +"alH" = (/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"},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) +"alI" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/security,/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/security/brig) +"alJ" = (/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/tiled/red,/area/security/brig) +"alK" = (/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/tiled/red,/area/security/brig) "alL" = (/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) "alM" = (/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) -"alN" = (/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{dir = 9; icon_state = "bluefull"},/area/security/brig) +"alN" = (/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/lino,/area/security/detectives_office) "alO" = (/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) -"alP" = (/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{dir = 9; icon_state = "bluefull"},/area/security/brig) +"alP" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/filingcabinet/chestdrawer,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/lino,/area/security/detectives_office) "alQ" = (/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) "alR" = (/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) "alS" = (/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) -"alT" = (/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) +"alT" = (/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/solar/auxstarboard) "alU" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet,/area/security/detectives_office) "alV" = (/turf/simulated/floor/carpet,/area/security/detectives_office) "alW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/carpet,/area/security/detectives_office) "alX" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/detectives_office) "alY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/detectives_office) -"alZ" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/filingcabinet/chestdrawer,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) +"alZ" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/auxport) "ama" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "amb" = (/turf/simulated/wall,/area/maintenance/substation/security) "amc" = (/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) -"amd" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"ame" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) +"amd" = (/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/tiled,/area/security/brig) +"ame" = (/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/tiled,/area/security/brig) "amf" = (/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(2,12,24)},/turf/simulated/floor/plating,/area/security/brig) "amg" = (/turf/simulated/floor/plating,/area/security/brig) "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" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plating,/area/security/brig) -"amj" = (/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) -"amk" = (/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) -"aml" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/brig) -"amm" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/brig) -"amn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/security/prison) -"amo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"amp" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/security/prison) +"amj" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) +"amk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"aml" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/prison) +"amm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/security/prison) +"amn" = (/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/tiled,/area/security/prison) +"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/steel_reinforced,/turf/simulated/floor/tiled,/area/security/brig) +"amp" = (/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"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) "amq" = (/turf/simulated/wall,/area/security/prison) -"amr" = (/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) -"ams" = (/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{dir = 4; icon_state = "blue"},/area/security/prison) -"amt" = (/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/steel_reinforced,/turf/simulated/floor,/area/security/brig) -"amu" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/button/remote/airlock{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)},/obj/machinery/button/remote/airlock{id = "prisonentry"; name = "Entry Doors"; pixel_x = -6; pixel_y = 24; req_access = list(2)},/turf/simulated/floor,/area/security/brig) -"amv" = (/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) -"amw" = (/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) -"amx" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/door/window/eastleft{req_access = list(63)},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/security/lobby) -"amy" = (/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/security/lobby) -"amz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/lobby) -"amA" = (/turf/simulated/floor,/area/security/lobby) -"amB" = (/obj/item/device/radio/intercom{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/security/lobby) +"amr" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/button/remote/airlock{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)},/obj/machinery/button/remote/airlock{id = "prisonentry"; name = "Entry Doors"; pixel_x = -6; pixel_y = 24; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/brig) +"ams" = (/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/tiled,/area/security/brig) +"amt" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/door/window/eastleft{req_access = list(63)},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled,/area/security/lobby) +"amu" = (/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/tiled,/area/security/brig) +"amv" = (/turf/simulated/floor/tiled,/area/security/lobby) +"amw" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/lobby) +"amx" = (/obj/item/device/radio/intercom{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/security/lobby) +"amy" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/turf/simulated/floor/tiled/dark,/area/lawoffice) +"amz" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/lawoffice) +"amA" = (/obj/structure/closet/lawcloset,/obj/item/clothing/glasses/sunglasses/big,/turf/simulated/floor/tiled/dark,/area/lawoffice) +"amB" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/tiled/dark,/area/lawoffice) "amC" = (/turf/simulated/wall,/area/lawoffice) -"amD" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"amE" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"amF" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"amG" = (/obj/structure/closet/lawcloset,/obj/item/clothing/glasses/sunglasses/big,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"amH" = (/obj/item/weapon/storage/secure/safe{pixel_x = -20},/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) +"amD" = (/obj/item/weapon/storage/secure/safe{pixel_x = -20},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/lino,/area/security/detectives_office) +"amE" = (/obj/item/weapon/storage/secure/safe{pixel_x = 30; pixel_y = 5},/turf/simulated/floor/lino,/area/security/detectives_office) +"amF" = (/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon = 'icons/turf/floors.dmi'; icon_state = "solarpanel"},/area/solar/auxstarboard) +"amG" = (/turf/simulated/floor/airless,/area/solar/auxstarboard) +"amH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/auxport) "amI" = (/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) "amJ" = (/obj/structure/table/woodentable,/obj/item/weapon/material/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) "amK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office) -"amL" = (/obj/item/weapon/storage/secure/safe{pixel_x = 30; pixel_y = 5},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) +"amL" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/plating,/area/security/brig) "amM" = (/obj/structure/closet,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_port) "amN" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"amO" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/security_starboard) -"amP" = (/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/auxstarboard) -"amQ" = (/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"amR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) -"amS" = (/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) -"amT" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/security/brig) +"amO" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/camera/network/security{c_tag = "Security - Brig Toxin Control"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/security/brig) +"amP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/security/brig) +"amQ" = (/obj/structure/flora/pottedplant/random,/turf/simulated/floor/tiled,/area/security/brig) +"amR" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/camera/network/security{c_tag = "Security - Prison Processing"; dir = 1},/turf/simulated/floor/tiled,/area/security/brig) +"amS" = (/obj/machinery/flasher{id = "Cell 3"; pixel_x = -28; pixel_y = 0},/obj/structure/bed/padded,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/prison) +"amT" = (/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},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/prison) "amU" = (/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) "amV" = (/obj/effect/decal/cleanable/generic,/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plating,/area/security/brig) -"amW" = (/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 = "blue"; dir = 8},/area/security/brig) -"amX" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/camera/network/security{c_tag = "Security - Prison Processing"; dir = 1},/turf/simulated/floor,/area/security/brig) -"amY" = (/obj/structure/flora/pottedplant/random,/turf/simulated/floor,/area/security/brig) -"amZ" = (/obj/machinery/flasher{id = "Cell 3"; pixel_x = -28; pixel_y = 0},/obj/structure/bed/padded,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/prison) -"ana" = (/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{dir = 0; icon_state = "blue"},/area/security/prison) -"anb" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/prison) -"anc" = (/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) -"and" = (/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{dir = 4; icon_state = "blue"},/area/security/prison) -"ane" = (/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/steel_reinforced,/turf/simulated/floor,/area/security/brig) -"anf" = (/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; req_access = list(2)},/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) -"ang" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; layer = 3.4; name = "Brig Monitor"; network = list("Prison"); pixel_x = 3; pixel_y = -33},/obj/machinery/computer/station_alert/security,/turf/simulated/floor,/area/security/brig) -"anh" = (/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) -"ani" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; layer = 3.4; name = "Brig Monitor"; network = list("Prison"); pixel_x = -3; pixel_y = -33},/turf/simulated/floor,/area/security/brig) -"anj" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig) -"ank" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/door/window/eastright{req_access = list(63)},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/security/lobby) -"anl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/security/lobby) +"amW" = (/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/security/prison) +"amX" = (/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/tiled,/area/security/prison) +"amY" = (/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/steel_reinforced,/turf/simulated/floor/tiled,/area/security/brig) +"amZ" = (/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"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) +"ana" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; layer = 3.4; name = "Brig Monitor"; network = list("Prison"); pixel_x = 3; pixel_y = -33},/obj/machinery/computer/station_alert/security,/turf/simulated/floor/tiled,/area/security/brig) +"anb" = (/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; req_access = list(2)},/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/tiled,/area/security/brig) +"anc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/security/telescreen{desc = "Big Brother is watching."; layer = 3.4; name = "Brig Monitor"; network = list("Prison"); pixel_x = -3; pixel_y = -33},/turf/simulated/floor/tiled,/area/security/brig) +"and" = (/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/tiled,/area/security/brig) +"ane" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/door/window/eastright{req_access = list(63)},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled,/area/security/lobby) +"anf" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"ang" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/lobby) +"anh" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/dark,/area/lawoffice) +"ani" = (/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},/obj/item/weapon/pen/red,/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/turf/simulated/floor/tiled/dark,/area/lawoffice) +"anj" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/lawoffice) +"ank" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/lawoffice) +"anl" = (/obj/machinery/computer/security/wooden_tv,/turf/simulated/floor/lino,/area/security/detectives_office) "anm" = (/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) -"ann" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/research_starboard) -"ano" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Internal Affairs Agent"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"anp" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"anq" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"anr" = (/obj/machinery/computer/security/wooden_tv,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) +"ann" = (/obj/item/device/radio/intercom{pixel_x = 29; pixel_y = -1},/turf/simulated/floor/lino,/area/security/detectives_office) +"ano" = (/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/airless,/area/solar/auxstarboard) +"anp" = (/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/airless,/area/solar/auxstarboard) +"anq" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/solar/auxstarboard) +"anr" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/auxstarboard) "ans" = (/obj/structure/disposalpipe/segment,/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Detective"},/turf/simulated/floor/carpet,/area/security/detectives_office) -"ant" = (/obj/item/device/radio/intercom{pixel_x = 29; pixel_y = -1},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"anu" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/security_starboard) +"ant" = (/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/airless,/area/solar/auxstarboard) +"anu" = (/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/airless,/area/solar/auxstarboard) "anv" = (/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/security) "anw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "anx" = (/turf/simulated/floor/plating,/area/space) "any" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/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},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/maintenance/substation/security) -"anz" = (/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) -"anA" = (/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) -"anB" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"anC" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) -"anD" = (/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) -"anE" = (/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) -"anF" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/auxport) +"anz" = (/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/solar/auxport) +"anA" = (/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,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/security/brig) +"anB" = (/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/tiled,/area/security/brig) +"anC" = (/obj/machinery/door/blast/regular{dir = 1; id = "Cell 3"; name = "Cell Door"},/turf/simulated/floor/tiled,/area/security/prison) +"anD" = (/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/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"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) +"anE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/security/lobby) +"anF" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/lobby) "anG" = (/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) -"anH" = (/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,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/security/brig) -"anI" = (/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) +"anH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/lawoffice) +"anI" = (/obj/item/weapon/material/ashtray/plastic{pixel_x = 4; pixel_y = 6},/obj/machinery/computer/secure_data,/turf/simulated/floor/tiled/dark,/area/lawoffice) "anJ" = (/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/prison) -"anK" = (/obj/machinery/door/blast/regular{dir = 1; id = "Cell 3"; name = "Cell Door"},/turf/simulated/floor,/area/security/prison) +"anK" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{anchored = 0; department = "Internal Affairs"},/obj/machinery/requests_console{department = "Tech storage"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/lawoffice) "anL" = (/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{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) -"anM" = (/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/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{dir = 4; icon_state = "blue"},/area/security/prison) +"anM" = (/obj/structure/flora/pottedplant/random,/obj/machinery/light{dir = 8},/turf/simulated/floor/lino,/area/security/detectives_office) "anN" = (/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{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/prison) "anO" = (/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 = "brigobs"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) "anP" = (/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 = "brigobs"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/security/prison) "anQ" = (/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 = "brigobs"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/security/prison) "anR" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/security/prison) "anS" = (/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/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/lobby) -"anT" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/security/lobby) -"anU" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/security/lobby) -"anV" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/research_starboard) -"anW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) +"anT" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/lino,/area/security/detectives_office) +"anU" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/secure_closet/detective,/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/turf/simulated/floor/lino,/area/security/detectives_office) +"anV" = (/obj/structure/table/woodentable,/obj/item/device/camera{name = "detectives camera"; desc = "A one use - polaroid camera. 30 photos left."; pixel_x = 0; pixel_y = 0; pictures_left = 30},/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30; pixel_x = 2; pixel_y = 3},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/lino,/area/security/detectives_office) +"anW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/lino,/area/security/detectives_office) "anX" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "anY" = (/turf/simulated/wall/r_wall,/area/security/detectives_office) -"anZ" = (/obj/structure/flora/pottedplant/random,/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"aoa" = (/obj/structure/disposalpipe/segment,/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) -"aob" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"aoc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"aod" = (/obj/structure/table/woodentable,/obj/item/device/camera{name = "detectives camera"; desc = "A one use - polaroid camera. 30 photos left."; pixel_x = 0; pixel_y = 0; pictures_left = 30},/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30; pixel_x = 2; pixel_y = 3},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) -"aoe" = (/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) -"aof" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office) +"anZ" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/lino,/area/security/detectives_office) +"aoa" = (/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/lino,/area/security/detectives_office) +"aob" = (/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon = 'icons/turf/floors.dmi'; icon_state = "solarpanel"},/area/solar/auxstarboard) +"aoc" = (/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon = 'icons/turf/floors.dmi'; icon_state = "solarpanel"},/area/solar/auxport) +"aod" = (/turf/simulated/floor/airless,/area/solar/auxport) +"aoe" = (/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,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/security/brig) +"aof" = (/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/tiled,/area/security/brig) "aog" = (/obj/machinery/power/sensor{name = "Powernet Sensor - Security Subgrid"; name_tag = "Security Subgrid"},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/substation/security) "aoh" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Security"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/maintenance/substation/security) "aoi" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/substation/security) "aoj" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Security Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/security) "aok" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"aol" = (/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) -"aom" = (/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/auxport) -"aon" = (/turf/simulated/floor/plating/airless,/area/solar/auxport) +"aol" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera/network/prison{c_tag = "Security - Brig Cell 2"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) +"aom" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/security/prison) +"aon" = (/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/tiled,/area/security/prison) "aoo" = (/turf/simulated/wall,/area/maintenance/evahallway) "aop" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aoq" = (/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/evahallway) "aor" = (/obj/structure/closet,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aos" = (/obj/structure/table/standard,/obj/item/weapon/pen,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/security/brig) "aot" = (/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) -"aou" = (/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,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/security/brig) -"aov" = (/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) +"aou" = (/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/tiled,/area/security/prison) +"aov" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/prison) "aow" = (/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) -"aox" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/security/prison) -"aoy" = (/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{dir = 4; icon_state = "blue"},/area/security/prison) +"aox" = (/turf/simulated/floor/tiled,/area/security/prison) +"aoy" = (/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/tiled,/area/security/prison) "aoz" = (/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) -"aoA" = (/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) -"aoB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/prison) -"aoC" = (/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) -"aoD" = (/turf/simulated/floor,/area/security/prison) -"aoE" = (/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/prison) -"aoF" = (/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) -"aoG" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/security/prison) -"aoH" = (/obj/structure/window/reinforced,/obj/machinery/door/window/westright,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/security/prison) -"aoI" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/prison) +"aoA" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) +"aoB" = (/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/tiled,/area/security/prison) +"aoC" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/prison) +"aoD" = (/obj/structure/window/reinforced,/obj/machinery/door/window/westright,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/security/prison) +"aoE" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table/standard,/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/tiled,/area/security/lobby) +"aoF" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/lobby) +"aoG" = (/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/tiled,/area/security/lobby) +"aoH" = (/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/tiled,/area/security/lobby) +"aoI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/dark,/area/lawoffice) "aoJ" = (/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) -"aoK" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table/standard,/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) -"aoL" = (/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) -"aoM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/lobby) -"aoN" = (/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{dir = 4; icon_state = "bluecorner"},/area/security/lobby) -"aoO" = (/obj/machinery/light{dir = 8},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/obj/structure/table/rack{dir = 8; layer = 2.9},/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 = "cult"; dir = 2},/area/lawoffice) -"aoP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"aoQ" = (/obj/machinery/photocopier,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"aoR" = (/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) -"aoS" = (/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) -"aoT" = (/obj/structure/window/basic{dir = 1},/obj/machinery/photocopier,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aoU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/window/northleft{name = "Forensics Area"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/security/detectives_office) -"aoV" = (/obj/structure/window/basic{dir = 1},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aoW" = (/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) -"aoX" = (/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) +"aoK" = (/obj/machinery/light{dir = 8},/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/obj/structure/table/rack{dir = 8; layer = 2.9},/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/tiled/dark,/area/lawoffice) +"aoL" = (/obj/machinery/photocopier,/turf/simulated/floor/tiled/dark,/area/lawoffice) +"aoM" = (/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/tiled{icon_state = "white"},/area/security/detectives_office) +"aoN" = (/obj/structure/window/basic{dir = 1},/obj/machinery/photocopier,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aoO" = (/obj/structure/window/basic{dir = 1},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aoP" = (/obj/structure/window/basic{dir = 1},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aoQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/window/northleft{name = "Forensics Area"},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aoR" = (/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/tiled{icon_state = "white"},/area/security/detectives_office) +"aoS" = (/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/tiled{icon_state = "white"},/area/security/detectives_office) +"aoT" = (/turf/simulated/floor/airless,/area/maintenance/dormitory) +"aoU" = (/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/airless,/area/maintenance/dormitory) +"aoV" = (/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/airless,/area/solar/auxport) +"aoW" = (/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/airless,/area/solar/auxport) +"aoX" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/solar/auxport) "aoY" = (/obj/machinery/door/airlock/engineering{name = "Security Substation"; req_one_access = list(11,24)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/substation/security) "aoZ" = (/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/security) "apa" = (/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/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "apb" = (/turf/simulated/wall,/area/maintenance/dormitory) -"apc" = (/turf/simulated/floor/plating/airless,/area/maintenance/dormitory) -"apd" = (/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) -"ape" = (/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) -"apf" = (/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) -"apg" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/auxport) -"aph" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/auxport) -"api" = (/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) -"apj" = (/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) +"apc" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/auxport) +"apd" = (/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/airless,/area/solar/auxport) +"ape" = (/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/airless,/area/solar/auxport) +"apf" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled,/area/security/brig) +"apg" = (/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/tiled,/area/security/brig) +"aph" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"api" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"apj" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) "apk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/evahallway) "apl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/evahallway) "apm" = (/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) -"apn" = (/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) -"apo" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor,/area/security/brig) -"app" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/security/brig) -"apq" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/security/brig) -"apr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"aps" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/security/prison) -"apt" = (/obj/machinery/door/blast/regular{id = "Cell 2"; name = "Cell Door"},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/security/prison) -"apu" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/security/prison) -"apv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/security/prison) -"apw" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor,/area/security/prison) -"apx" = (/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) -"apy" = (/obj/machinery/flasher{id = "permflash"; name = "Floor mounted flash"; pixel_x = 0},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/prison) -"apz" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"apA" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/security/prison) +"apn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"apo" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"app" = (/obj/machinery/door/blast/regular{id = "Cell 2"; name = "Cell Door"},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"apq" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"apr" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/tiled,/area/security/prison) +"aps" = (/obj/machinery/flasher{id = "permflash"; name = "Floor mounted flash"; pixel_x = 0},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/prison) +"apt" = (/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/tiled,/area/security/prison) +"apu" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/security/prison) +"apv" = (/obj/machinery/light{dir = 8},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/security/lobby) +"apw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/security/lobby) +"apx" = (/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/tiled,/area/lawoffice) +"apy" = (/turf/simulated/floor/tiled/dark,/area/lawoffice) +"apz" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/papershredder,/turf/simulated/floor/tiled/dark,/area/lawoffice) +"apA" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) "apB" = (/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) -"apC" = (/obj/machinery/light{dir = 8},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/security/lobby) -"apD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/lobby) -"apE" = (/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) -"apF" = (/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"apG" = (/obj/machinery/newscaster{pixel_x = 30},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"apH" = (/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"apI" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"apJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"apK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"apL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) +"apC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"apD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"apE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"apF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"apG" = (/obj/machinery/papershredder,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"apH" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/swabs,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"apI" = (/obj/machinery/requests_console{pixel_x = 0; pixel_y = 30},/obj/structure/table/glass,/obj/item/device/flashlight/heavy,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"apJ" = (/obj/machinery/dnaforensics,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"apK" = (/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon = 'icons/turf/floors.dmi'; icon_state = "solarpanel"},/area/solar/auxport) +"apL" = (/obj/item/device/radio/intercom{pixel_x = 30},/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/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) "apM" = (/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},/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/security_starboard) "apN" = (/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) "apO" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "apP" = (/obj/machinery/door/airlock/maintenance{name = "Dormitory\\Security Maintenance"; req_access = list(12)},/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/security_starboard) -"apQ" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/swabs,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"apR" = (/obj/machinery/requests_console{pixel_x = 0; pixel_y = 30},/obj/structure/table/glass,/obj/item/device/flashlight/heavy,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"apS" = (/obj/machinery/dnaforensics,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) +"apQ" = (/obj/structure/bed/padded,/obj/machinery/flasher{id = "Cell 2"; pass_flags = 0; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) +"apR" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) +"apS" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/generic,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/prison) "apT" = (/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) -"apU" = (/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) +"apU" = (/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"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) "apV" = (/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) "apW" = (/obj/structure/bed/padded,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/brig) "apX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/plating,/area/security/brig) -"apY" = (/obj/item/device/radio/intercom{pixel_x = 30},/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/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/brig) -"apZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/security/prison) -"aqa" = (/obj/structure/bed/padded,/obj/machinery/flasher{id = "Cell 2"; pass_flags = 0; pixel_x = 0; pixel_y = -26},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/security/prison) +"apY" = (/obj/structure/bed/chair,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"apZ" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; use_power = 1},/obj/structure/bed/chair,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"aqa" = (/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/tiled,/area/security/prison) "aqb" = (/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"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison) -"aqc" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/generic,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/prison) -"aqd" = (/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"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/security/prison) -"aqe" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; use_power = 1},/obj/structure/bed/chair,/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/security/prison) -"aqf" = (/obj/structure/bed/chair,/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/security/prison) -"aqg" = (/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) -"aqh" = (/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 = "floorgrime"},/area/security/prison) -"aqi" = (/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/security/prison) -"aqj" = (/obj/effect/decal/cleanable/dirt,/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/security/prison) -"aqk" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/prison) -"aql" = (/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/prison) +"aqc" = (/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/tiled,/area/security/prison) +"aqd" = (/obj/effect/decal/cleanable/dirt,/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/tiled,/area/security/prison) +"aqe" = (/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/tiled,/area/security/prison) +"aqf" = (/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/tiled,/area/security/prison) +"aqg" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"aqh" = (/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/tiled,/area/security/lobby) +"aqi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/security/lobby) +"aqj" = (/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/tiled,/area/security/lobby) +"aqk" = (/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/tiled,/area/lawoffice) +"aql" = (/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/tiled,/area/security/lobby) "aqm" = (/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{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/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/security/prison) -"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 = "bluecorner"},/area/security/lobby) -"aqo" = (/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) -"aqp" = (/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) -"aqq" = (/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{dir = 4; icon_state = "bluecorner"},/area/security/lobby) -"aqr" = (/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) -"aqs" = (/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) -"aqt" = (/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) -"aqu" = (/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) -"aqv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/machinery/meter,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/research_starboard) -"aqw" = (/obj/machinery/computer/med_data,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aqx" = (/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) -"aqy" = (/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) -"aqz" = (/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) -"aqA" = (/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) -"aqB" = (/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/security/detectives_office) +"aqn" = (/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/tiled/dark,/area/lawoffice) +"aqo" = (/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/tiled/dark,/area/lawoffice) +"aqp" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/reinforced,/obj/item/weapon/material/ashtray/plastic{pixel_x = 4; pixel_y = 6},/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor/tiled/dark,/area/lawoffice) +"aqq" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/dark,/area/lawoffice) +"aqr" = (/obj/machinery/computer/med_data,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aqs" = (/obj/structure/disposalpipe/segment,/obj/structure/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aqt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aqu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aqv" = (/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/tiled{icon_state = "white"},/area/security/detectives_office) +"aqw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"aqx" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dorm_pump"},/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/plating,/area/maintenance/dormitory) +"aqy" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "dorm_sensor"; pixel_x = 25; pixel_y = -8},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/maintenance/dormitory) +"aqz" = (/obj/item/device/radio/intercom{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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/security/brig) +"aqA" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/librarycomp{pixel_y = 0},/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/security/prison) +"aqB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/prison) "aqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access = list(4)},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/security/detectives_office) "aqD" = (/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) "aqE" = (/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{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/dormitory) -"aqF" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aqG" = (/obj/structure/table/glass,/obj/item/weapon/storage/briefcase/crimekit,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aqH" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dorm_pump"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/dormitory) +"aqF" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/security/prison) +"aqG" = (/obj/structure/table/standard,/obj/item/weapon/dice,/turf/simulated/floor/tiled,/area/security/prison) +"aqH" = (/obj/structure/table/standard,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/tiled,/area/security/prison) "aqI" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) -"aqJ" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "dorm_sensor"; pixel_x = 25; pixel_y = -8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/dormitory) +"aqJ" = (/obj/structure/table/standard,/obj/item/weapon/material/ashtray/plastic,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/prison) "aqK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aqL" = (/obj/structure/closet,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aqM" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aqN" = (/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 = "blue"; dir = 8},/area/security/brig) -"aqO" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/librarycomp{pixel_y = 0},/obj/structure/table/standard,/turf/simulated/floor,/area/security/prison) -"aqP" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/security/prison) -"aqQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/prison) -"aqR" = (/obj/structure/table/standard,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/turf/simulated/floor,/area/security/prison) -"aqS" = (/obj/structure/table/standard,/obj/item/weapon/dice,/turf/simulated/floor,/area/security/prison) -"aqT" = (/obj/structure/table/standard,/obj/item/weapon/material/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) -"aqU" = (/obj/structure/reagent_dispensers/water_cooler,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/security/prison) -"aqV" = (/obj/structure/table/standard,/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/security/prison) -"aqW" = (/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) -"aqX" = (/obj/structure/table/standard,/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) +"aqN" = (/obj/structure/table/standard,/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"aqO" = (/obj/structure/reagent_dispensers/water_cooler,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/security/prison) +"aqP" = (/obj/structure/table/standard,/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/tiled,/area/security/prison) +"aqQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"aqR" = (/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/tiled,/area/security/lobby) +"aqS" = (/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/tiled,/area/security/lobby) +"aqT" = (/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/tiled,/area/security/lobby) +"aqU" = (/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/tiled,/area/security/lobby) +"aqV" = (/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/tiled,/area/security/lobby) +"aqW" = (/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/tiled,/area/security/lobby) +"aqX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/lawoffice) "aqY" = (/obj/structure/grille,/obj/structure/window/reinforced,/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/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/security/prison) -"aqZ" = (/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 = "bluecorner"},/area/security/lobby) -"ara" = (/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 = "bluecorner"},/area/security/lobby) -"arb" = (/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 = "bluecorner"},/area/security/lobby) -"arc" = (/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) -"ard" = (/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) -"are" = (/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{dir = 4; icon_state = "bluecorner"},/area/security/lobby) +"aqZ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/dark,/area/lawoffice) +"ara" = (/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/tiled/dark,/area/lawoffice) +"arb" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"arc" = (/obj/structure/closet{name = "Evidence Closet"},/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"ard" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = -30},/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"are" = (/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,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) "arf" = (/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/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "lawyer_blast"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/lawoffice) -"arg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"arh" = (/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) -"ari" = (/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) -"arj" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"ark" = (/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) -"arl" = (/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) -"arm" = (/obj/machinery/light,/obj/item/device/mass_spectrometer,/obj/item/device/reagent_scanner,/obj/machinery/camera/network/security{c_tag = "Security - Forensic Office Aft"; dir = 1},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"arn" = (/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,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"aro" = (/obj/item/weapon/folder/blue,/obj/item/weapon/pen/blue{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red,/obj/structure/table/glass,/obj/item/weapon/folder/blue,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"arp" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"arq" = (/obj/structure/table/glass,/obj/machinery/microscope,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) -"arr" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/slides,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office) +"arg" = (/obj/machinery/light,/obj/item/device/mass_spectrometer,/obj/item/device/reagent_scanner,/obj/machinery/camera/network/security{c_tag = "Security - Forensic Office Aft"; dir = 1},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"arh" = (/obj/machinery/computer/security,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"ari" = (/obj/item/weapon/folder/blue,/obj/item/weapon/pen/blue{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red,/obj/structure/table/glass,/obj/item/weapon/folder/blue,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"arj" = (/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"ark" = (/obj/structure/table/glass,/obj/item/weapon/storage/briefcase/crimekit,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"arl" = (/obj/structure/table/glass,/obj/machinery/microscope,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"arm" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/slides,/turf/simulated/floor/tiled{icon_state = "white"},/area/security/detectives_office) +"arn" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "dorm_pump"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/dormitory) +"aro" = (/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"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/plating,/area/maintenance/dormitory) +"arp" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/security/brig) +"arq" = (/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/tiled,/area/security/brig) +"arr" = (/obj/machinery/camera/network/prison{c_tag = "Security - Brig Cell 1"},/obj/structure/closet/secure_closet/brig{id = "Cell 1"; name = "Cell 1 Locker"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) "ars" = (/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},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/maintenance/dormitory) -"art" = (/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) +"art" = (/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/tiled,/area/security/prison) "aru" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/dormitory) -"arv" = (/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) +"arv" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/prison) "arw" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/evahallway) "arx" = (/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) -"ary" = (/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 = "blue"; dir = 8},/area/security/brig) -"arz" = (/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) -"arA" = (/obj/machinery/camera/network/prison{c_tag = "Security - Brig Cell 1"},/obj/structure/closet/secure_closet/brig{id = "Cell 1"; name = "Cell 1 Locker"},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/security/prison) -"arB" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/prison) -"arC" = (/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) -"arD" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor,/area/security/prison) -"arE" = (/obj/structure/table/standard,/obj/item/weapon/deck,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"arF" = (/obj/structure/table/standard,/obj/item/weapon/newspaper,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/prison) -"arG" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/security/prison) -"arH" = (/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) +"ary" = (/obj/structure/table/standard,/obj/item/weapon/deck,/turf/simulated/floor/tiled,/area/security/prison) +"arz" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/tiled,/area/security/prison) +"arA" = (/obj/structure/table/standard,/obj/item/weapon/newspaper,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/prison) +"arB" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) +"arC" = (/obj/machinery/door/airlock{name = "Visitation Area"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/prison) +"arD" = (/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/tiled,/area/security/lobby) +"arE" = (/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/tiled,/area/hallway/primary/fore) +"arF" = (/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/tiled,/area/hallway/primary/fore) +"arG" = (/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/tiled,/area/hallway/primary/fore) +"arH" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/lawoffice) "arI" = (/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) "arJ" = (/turf/simulated/wall/r_wall,/area/security/lobby) "arK" = (/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) -"arL" = (/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) +"arL" = (/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/tiled/dark,/area/lawoffice) "arM" = (/turf/simulated/wall/r_wall,/area/hallway/primary/fore) -"arN" = (/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) -"arO" = (/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) -"arP" = (/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) +"arN" = (/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/tiled/dark,/area/lawoffice) +"arO" = (/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/airless,/area/space) +"arP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/brig) "arQ" = (/turf/simulated/wall,/area/hallway/primary/fore) -"arR" = (/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) -"arS" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"arT" = (/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) +"arR" = (/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/tiled,/area/security/brig) +"arS" = (/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/tiled,/area/security/brig) +"arT" = (/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/tiled,/area/security/brig) "arU" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/security/detectives_office) "arV" = (/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,/area/maintenance/dormitory) "arW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/dormitory) @@ -935,29 +935,29 @@ "arY" = (/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{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/dormitory) "arZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) "asa" = (/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) -"asb" = (/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) +"asb" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) "asc" = (/obj/structure/bed/chair{dir = 8},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/evahallway) "asd" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/brig) -"ase" = (/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) -"asf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/security/brig) -"asg" = (/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) -"ash" = (/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) -"asi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"asj" = (/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/security/prison) -"ask" = (/obj/machinery/door/blast/regular{id = "Cell 1"; name = "Cell Door"},/turf/simulated/floor,/area/security/prison) -"asl" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/prison) -"asm" = (/obj/effect/decal/cleanable/dirt,/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/security/prison) -"asn" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/security/prison) -"aso" = (/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) -"asp" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor,/area/security/prison) -"asq" = (/obj/machinery/flasher{id = "IAflash"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/prison) -"asr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) +"ase" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/security/prison) +"asf" = (/obj/machinery/door/blast/regular{id = "Cell 1"; name = "Cell Door"},/turf/simulated/floor/tiled,/area/security/prison) +"asg" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/prison) +"ash" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) +"asi" = (/obj/effect/decal/cleanable/dirt,/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) +"asj" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/prison) +"ask" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/tiled,/area/security/prison) +"asl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/prison) +"asm" = (/obj/machinery/flasher{id = "IAflash"; pixel_x = -30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/prison) +"asn" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"aso" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/prison) +"asp" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"asq" = (/obj/structure/sign/electricshock{pixel_x = -32},/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/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"asr" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) "ass" = (/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) -"ast" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/security/prison) -"asu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/prison) -"asv" = (/obj/structure/sign/electricshock{pixel_x = -32},/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,/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/fore) -"asw" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/fore) -"asx" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/fore) +"ast" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/dormitory) +"asu" = (/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,/area/maintenance/dormitory) +"asv" = (/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/manifold4w/visible,/turf/simulated/floor/plating,/area/maintenance/dormitory) +"asw" = (/obj/structure/table/standard,/obj/item/device/radio/intercom{broadcasting = 1; 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},/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/tiled,/area/security/brig) +"asx" = (/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"},/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "asy" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/dormitory) "asz" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/dormitory) "asA" = (/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) @@ -966,33 +966,33 @@ "asD" = (/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) "asE" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/dormitory) "asF" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/dormitory) -"asG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Lab Assistant"},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/lab) -"asH" = (/obj/effect/landmark/start{name = "Lab Assistant"},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) -"asI" = (/obj/machinery/telepad,/turf/simulated/floor/engine,/area/rnd/misc_lab) -"asJ" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/clothing/shoes/magboots,/obj/item/device/suit_cooling_unit,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"asK" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/dormitory) -"asL" = (/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/manifold4w/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/dormitory) -"asM" = (/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) +"asG" = (/obj/structure/bed/padded,/obj/machinery/flasher{id = "Cell 1"; pixel_x = 0; pixel_y = -28},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) +"asH" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/prison) +"asI" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/security/prison) +"asJ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/security/prison) +"asK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/prison) +"asL" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/turf/simulated/floor/tiled,/area/security/prison) +"asM" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/security/prison) "asN" = (/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) "asO" = (/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) "asP" = (/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) "asQ" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"asR" = (/obj/structure/table/standard,/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 = "blue"; dir = 10},/area/security/brig) -"asS" = (/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 = "blue"; dir = 6},/area/security/brig) -"asT" = (/obj/structure/bed/padded,/obj/machinery/flasher{id = "Cell 1"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/security/prison) -"asU" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/prison) -"asV" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/security/prison) -"asW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/prison) -"asX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/prison) -"asY" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/turf/simulated/floor,/area/security/prison) -"asZ" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"ata" = (/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) -"atb" = (/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/machinery/door/window/brigdoor{name = "Visitation Window"; req_access = list(2)},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/security/prison) -"atc" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/security/prison) -"atd" = (/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) -"ate" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/fore) -"atf" = (/obj/structure/disposalpipe/segment,/mob/living/bot/secbot/beepsky,/turf/simulated/floor,/area/hallway/primary/fore) -"atg" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/fore) +"asR" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) +"asS" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/security/prison) +"asT" = (/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/machinery/door/window/brigdoor{name = "Visitation Window"; req_access = list(2)},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled,/area/security/prison) +"asU" = (/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/tiled,/area/security/prison) +"asV" = (/obj/structure/disposalpipe/segment,/mob/living/bot/secbot/beepsky,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"asW" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"asX" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"asY" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/escape_pod1/station) +"asZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/escape_pod1/station) +"ata" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/escape_pod2/station) +"atb" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/escape_pod2/station) +"atc" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/arrivals) +"atd" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"ate" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"atf" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA"; location = "Security"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"atg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/directions/evac{pixel_x = -30; pixel_y = -4},/obj/structure/sign/directions/medical{pixel_x = -30; pixel_y = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) "ath" = (/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) "ati" = (/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) "atj" = (/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) @@ -1014,87 +1014,87 @@ "atz" = (/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) "atA" = (/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) "atB" = (/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) -"atC" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod1/station) +"atC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) "atD" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/station) -"atE" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod1/station) -"atF" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod2/station) +"atE" = (/obj/structure/cryofeed{tag = "icon-cryo_rear (EAST)"; icon_state = "cryo_rear"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"atF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) "atG" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod2/station) -"atH" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod2/station) +"atH" = (/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Crew Quarters"; pixel_y = 30},/obj/machinery/cryopod{tag = "icon-body_scanner_0 (EAST)"; icon_state = "body_scanner_0"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) "atI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/arrivals) -"atJ" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/arrivals) +"atJ" = (/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/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) "atK" = (/obj/structure/table/rack{dir = 1},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/dormitory) "atL" = (/obj/item/weapon/cigbutt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"atM" = (/obj/machinery/washing_machine,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/security/prison) -"atN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"atO" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/security/prison) +"atM" = (/obj/machinery/computer/cryopod{density = 0; pixel_y = 32},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Cryo Storage"},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"atN" = (/obj/structure/cryofeed,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"atO" = (/obj/machinery/cryopod,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) "atP" = (/turf/simulated/wall/r_wall,/area/security/prison) -"atQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/directions/evac{pixel_x = -30; pixel_y = -4},/obj/structure/sign/directions/medical{pixel_x = -30; pixel_y = 4},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/fore) -"atR" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA"; location = "Security"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/fore) -"atS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/fore) +"atQ" = (/turf/simulated/floor/reinforced{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) +"atR" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight"; icon_state = "swall_straight"},/area/shuttle/escape_pod1/station) +"atS" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight"; icon_state = "swall_straight"},/area/shuttle/escape_pod2/station) "atT" = (/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/maintenance/dormitory) "atU" = (/turf/simulated/wall/r_wall,/area/crew_quarters/sleep) "atV" = (/obj/machinery/door/airlock/maintenance,/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/crew_quarters/sleep) "atW" = (/turf/simulated/wall,/area/crew_quarters/sleep) "atX" = (/turf/simulated/wall/r_wall,/area/crew_quarters/sleep/cryo) -"atY" = (/obj/structure/cryofeed/right,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"atZ" = (/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) -"aua" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"aub" = (/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) -"auc" = (/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) -"aud" = (/obj/machinery/cryopod,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"aue" = (/obj/structure/cryofeed,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"atY" = (/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,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/arrivals) +"atZ" = (/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/security/prison) +"aua" = (/turf/simulated/floor/tiled/freezer,/area/security/prison) +"aub" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/tiled,/area/security/prison) +"auc" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/freezer,/area/security/prison) +"aud" = (/obj/structure/urinal{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/freezer,/area/security/prison) +"aue" = (/obj/machinery/door/airlock{name = "Brig Restroom"},/turf/simulated/floor/tiled,/area/security/prison) "auf" = (/turf/simulated/wall/r_wall,/area/crew_quarters/fitness) "aug" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/fitness) -"auh" = (/turf/simulated/floor/engine{name = "Holodeck Projector Floor"},/area/holodeck/alphadeck) +"auh" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled,/area/security/prison) "aui" = (/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) "auj" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry/fore) -"auk" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station) +"auk" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/obj/machinery/camera/network/prison{c_tag = "Security - Brig Bedroom"; dir = 6},/turf/simulated/floor/tiled,/area/security/prison) "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_1"; pixel_x = -25; pixel_y = 0; tag_door = "escape_pod_1_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) -"aum" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod2/station) +"aum" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/tiled,/area/security/prison) "aun" = (/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) -"auo" = (/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) +"auo" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/tiled,/area/security/prison) "aup" = (/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) "auq" = (/turf/simulated/floor/plating,/area/maintenance/evahallway) "aur" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aus" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aut" = (/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "bar"},/area/security/prison) -"auu" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor,/area/security/prison) -"auv" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) -"auw" = (/obj/structure/urinal{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) -"aux" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) -"auy" = (/obj/machinery/door/airlock{name = "Brig Restroom"},/turf/simulated/floor,/area/security/prison) -"auz" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor,/area/security/prison) +"aut" = (/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/tiled,/area/security/prison) +"auu" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/random/tech_supply,/obj/item/clothing/head/flatcap,/turf/simulated/floor/tiled,/area/security/prison) +"auv" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"auw" = (/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,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"aux" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"auy" = (/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,/area/crew_quarters/sleep/bedrooms) +"auz" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/reagent_dispensers/watertank,/obj/effect/floor_decal/corner/grey/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "auA" = (/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) -"auB" = (/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) -"auC" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/obj/machinery/camera/network/prison{c_tag = "Security - Brig Bedroom"; dir = 6},/turf/simulated/floor,/area/security/prison) -"auD" = (/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) -"auE" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/generic,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"auF" = (/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) -"auG" = (/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{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/fore) -"auH" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/fore) -"auI" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/fore) +"auB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/grey/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"auC" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"auD" = (/obj/machinery/cryopod{tag = "icon-body_scanner_0 (EAST)"; icon_state = "body_scanner_0"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"auE" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"auF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"auG" = (/obj/machinery/cryopod,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"auH" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; name = "Fitness Room"; sortType = "Fitness Room"},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"auI" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) "auJ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"auK" = (/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) +"auK" = (/turf/simulated/floor/tiled,/area/crew_quarters/fitness) "auL" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"auM" = (/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) -"auN" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{icon_state = "neutral"; dir = 5},/area/crew_quarters/sleep) -"auO" = (/obj/machinery/cryopod/right,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"auP" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"auQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"auR" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"auS" = (/obj/machinery/cryopod,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"auT" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; name = "Fitness Room"; sortType = "Fitness Room"},/turf/simulated/floor{icon_state = "neutral"; dir = 9},/area/crew_quarters/fitness) -"auU" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) +"auM" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"auN" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"auO" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/auxstarboard) +"auP" = (/obj/structure/toilet{dir = 1},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/security/prison) +"auQ" = (/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/tiled/freezer,/area/security/prison) +"auR" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 30},/turf/simulated/floor/tiled/freezer,/area/security/prison) +"auS" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/freezer,/area/security/prison) +"auT" = (/obj/structure/table/standard,/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/tiled,/area/security/prison) +"auU" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/security/prison) "auV" = (/obj/structure/window/basic{dir = 8},/turf/simulated/floor/beach/water{tag = "icon-seadeep"; icon_state = "seadeep"},/area/crew_quarters/fitness) "auW" = (/turf/simulated/floor/beach/water{tag = "icon-seadeep"; icon_state = "seadeep"},/area/crew_quarters/fitness) "auX" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/beach/water{tag = "icon-seadeep"; icon_state = "seadeep"},/area/crew_quarters/fitness) "auY" = (/obj/structure/window/basic{dir = 4},/turf/simulated/floor/beach/water{tag = "icon-seadeep"; icon_state = "seadeep"},/area/crew_quarters/fitness) -"auZ" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness) -"ava" = (/turf/simulated/floor{icon_state = "neutral"; dir = 5},/area/crew_quarters/fitness) -"avb" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/crew_quarters/fitness) +"auZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"ava" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/security/prison) +"avb" = (/obj/machinery/door/airlock/glass{name = "Brig Dormitories"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) "avc" = (/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) "avd" = (/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) -"ave" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard) +"ave" = (/obj/machinery/cryopod,/turf/simulated/floor/tiled,/area/security/prison) "avf" = (/turf/simulated/wall,/area/hallway/secondary/entry/fore) "avg" = (/obj/structure/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/light/small/emergency{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) "avh" = (/obj/structure/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/light/small/emergency{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) @@ -1105,35 +1105,35 @@ "avm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/arrivals) "avn" = (/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) "avo" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"avp" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/security/prison) -"avq" = (/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) -"avr" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) -"avs" = (/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) -"avt" = (/obj/structure/table/standard,/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) -"avu" = (/obj/item/weapon/stool,/turf/simulated/floor,/area/security/prison) -"avv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/security/prison) -"avw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/prison) -"avx" = (/obj/machinery/door/airlock/glass{name = "Brig Dormitories"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/prison) -"avy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"avz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/security/prison) -"avA" = (/obj/machinery/cryopod,/turf/simulated/floor,/area/security/prison) -"avB" = (/obj/structure/cryofeed,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"avC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/fore) -"avD" = (/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/fore) +"avp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/security/prison) +"avq" = (/obj/structure/cryofeed,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) +"avr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"avs" = (/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"avt" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/sleep/bedrooms) +"avu" = (/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"avv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"avw" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/cryopod{tag = "icon-body_scanner_0 (EAST)"; icon_state = "body_scanner_0"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"avx" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"avy" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"avz" = (/obj/machinery/cryopod,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"avA" = (/obj/structure/disposalpipe/segment,/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/tiled,/area/crew_quarters/fitness) +"avB" = (/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"avC" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"avD" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) "avE" = (/obj/structure/bed/padded,/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) -"avF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) +"avF" = (/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,/area/maintenance/arrivals) "avG" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"avH" = (/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) -"avI" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/sleep) -"avJ" = (/obj/machinery/cryopod/right,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"avK" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"avL" = (/obj/effect/landmark{name = "JoinLateCryo"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"avM" = (/obj/machinery/cryopod,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo) -"avN" = (/obj/structure/disposalpipe/segment,/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{icon_state = "neutral"; dir = 8},/area/crew_quarters/fitness) -"avO" = (/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/crew_quarters/fitness) -"avP" = (/turf/simulated/floor{icon_state = "escapecorner"; dir = 8},/area/crew_quarters/fitness) -"avQ" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) -"avR" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/crew_quarters/fitness) +"avH" = (/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/arrivals) +"avI" = (/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 = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/arrivals) +"avJ" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/auxport) +"avK" = (/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/airless,/area/maintenance/evahallway) +"avL" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/plating,/area/maintenance/evahallway) +"avM" = (/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/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/maintenance/evahallway) +"avN" = (/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"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) +"avO" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower/security,/turf/simulated/floor/tiled/freezer,/area/security/prison) +"avP" = (/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/tiled/freezer,/area/security/prison) +"avQ" = (/obj/machinery/light/small,/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor/tiled/freezer,/area/security/prison) +"avR" = (/obj/structure/table/standard,/obj/machinery/light{dir = 8},/obj/machinery/microwave,/turf/simulated/floor/tiled,/area/security/prison) "avS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness) "avT" = (/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) "avU" = (/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) @@ -1142,86 +1142,86 @@ "avX" = (/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) "avY" = (/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) "avZ" = (/turf/simulated/floor/plating,/area/maintenance/arrivals) -"awa" = (/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/arrivals) -"awb" = (/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) -"awc" = (/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 = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/arrivals) +"awa" = (/obj/structure/table/standard,/obj/item/weapon/material/minihoe,/obj/item/device/analyzer/plant_analyzer,/obj/item/clothing/head/greenbandana,/turf/simulated/floor/tiled,/area/security/prison) +"awb" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/tiled,/area/security/prison) +"awc" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor/tiled,/area/security/prison) "awd" = (/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/evahallway) "awe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/arrivals) "awf" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/arrivals) "awg" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/arrivals) -"awh" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) -"awi" = (/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) +"awh" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/security/prison) +"awi" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/turf/simulated/floor/tiled,/area/security/prison) "awj" = (/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) -"awk" = (/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) -"awl" = (/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/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/evahallway) +"awk" = (/obj/machinery/light,/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/tiled,/area/security/prison) +"awl" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/clothing/head/soft/orange,/obj/item/clothing/shoes/sandal,/turf/simulated/floor/tiled,/area/security/prison) "awm" = (/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)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"awn" = (/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"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/evahallway) +"awn" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/tiled,/area/security/prison) "awo" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) "awp" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"awq" = (/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) -"awr" = (/obj/machinery/light/small,/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison) -"aws" = (/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) -"awt" = (/obj/structure/table/standard,/obj/machinery/light{dir = 8},/obj/machinery/microwave,/turf/simulated/floor,/area/security/prison) -"awu" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets{pixel_x = -3; pixel_y = -3},/turf/simulated/floor,/area/security/prison) -"awv" = (/obj/structure/table/standard,/obj/item/weapon/material/minihoe,/obj/item/device/analyzer/plant_analyzer,/obj/item/clothing/head/greenbandana,/turf/simulated/floor,/area/security/prison) -"aww" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor,/area/security/prison) -"awx" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor,/area/security/prison) -"awy" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/turf/simulated/floor,/area/security/prison) -"awz" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/clothing/head/soft/orange,/obj/item/clothing/shoes/sandal,/turf/simulated/floor,/area/security/prison) -"awA" = (/obj/machinery/light,/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor,/area/security/prison) -"awB" = (/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) -"awC" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor,/area/security/prison) -"awD" = (/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) -"awE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/fore) -"awF" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/fore) +"awq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/security/prison) +"awr" = (/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/tiled,/area/security/prison) +"aws" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"awt" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"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,/area/crew_quarters/sleep/bedrooms) +"awv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aww" = (/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,/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"awx" = (/obj/machinery/door/airlock/glass{name = "Cryogenic Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"awy" = (/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/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"awz" = (/obj/machinery/door/airlock/glass{name = "Cryogenic Storage"},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/sleep/cryo) +"awA" = (/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/tiled,/area/crew_quarters/fitness) +"awB" = (/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"awC" = (/obj/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"awD" = (/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(11,13)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/auxstarboard) +"awE" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/auxport) +"awF" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/airless,/area/maintenance/evahallway) "awG" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"awH" = (/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) +"awH" = (/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/evahallway) "awI" = (/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/bedrooms) "awJ" = (/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) -"awK" = (/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) -"awL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/crew_quarters/sleep) -"awM" = (/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) -"awN" = (/obj/machinery/door/airlock/glass{name = "Cryogenic Storage"},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/crew_quarters/sleep/cryo) -"awO" = (/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) -"awP" = (/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) -"awQ" = (/turf/simulated/floor{dir = 6; icon_state = "whitehall"},/area/crew_quarters/fitness) -"awR" = (/turf/simulated/floor{dir = 10; icon_state = "whitehall"},/area/crew_quarters/fitness) -"awS" = (/turf/simulated/floor,/area/crew_quarters/fitness) +"awK" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/maintenance/evahallway) +"awL" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood/oil,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) +"awM" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/security/prison) +"awN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"awO" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"awP" = (/turf/simulated/floor/carpet,/area/crew_quarters/sleep/bedrooms) +"awQ" = (/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"awR" = (/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/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"awS" = (/obj/machinery/atm{pixel_y = 28},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "awT" = (/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/fitness) -"awU" = (/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(11,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) +"awU" = (/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"},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "awV" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "awW" = (/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "awX" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "awY" = (/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/arrivals) -"awZ" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport) -"axa" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating/airless,/area/maintenance/evahallway) -"axb" = (/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/evahallway) -"axc" = (/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) +"awZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axa" = (/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axc" = (/obj/machinery/newscaster{pixel_y = 32},/obj/effect/floor_decal/corner/grey/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "axd" = (/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) -"axe" = (/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) +"axe" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "axf" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/binary/pump/on{dir = 1; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"axg" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/security/prison) -"axh" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/fore) -"axi" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/fore) +"axg" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"axh" = (/obj/structure/window/basic{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/fitness) +"axi" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/fitness) "axj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"axk" = (/turf/simulated/floor/carpet{tag = "icon-carpet1-0"; icon_state = "carpet1-0"},/area/crew_quarters/sleep/bedrooms) +"axk" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/fitness) "axl" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = 10},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"axm" = (/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 = "neutral"; dir = 8},/area/crew_quarters/sleep) -"axn" = (/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/crew_quarters/sleep) -"axo" = (/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) -"axp" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) -"axq" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) -"axr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) -"axs" = (/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) -"axt" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/sleep) -"axu" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor{icon_state = "neutral"; dir = 5},/area/crew_quarters/sleep) +"axm" = (/obj/machinery/door/airlock/glass{name = "Holodeck"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"axn" = (/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,/area/maintenance/evahallway) +"axo" = (/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/tiled,/area/hallway/primary/fore) +"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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"axq" = (/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},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"axr" = (/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axs" = (/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/firealarm{dir = 8; pixel_x = -24; pixel_y = 6},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axt" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axu" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "axv" = (/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/crew_quarters/fitness) -"axw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/fitness) -"axx" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/fitness) -"axy" = (/obj/structure/window/basic{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/fitness) -"axz" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/fitness) -"axA" = (/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/crew_quarters/fitness) -"axB" = (/obj/machinery/door/airlock/glass{name = "Holodeck"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor,/area/crew_quarters/fitness) +"axw" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/threedglasses,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axy" = (/obj/structure/table/woodentable,/obj/random/coin,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"axz" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Fitness"},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"axA" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"axB" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) "axC" = (/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) "axD" = (/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(11,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) "axE" = (/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) @@ -1233,7 +1233,7 @@ "axK" = (/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) "axL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/evahallway) "axM" = (/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) -"axN" = (/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) +"axN" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) "axO" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/maintenance/evahallway) "axP" = (/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) "axQ" = (/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) @@ -1243,37 +1243,37 @@ "axU" = (/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) "axV" = (/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) "axW" = (/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) -"axX" = (/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) -"axY" = (/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) -"axZ" = (/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) +"axX" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"axY" = (/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"axZ" = (/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) "aya" = (/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/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/dormitory) "ayb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "ayc" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "ayd" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"aye" = (/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/firealarm{dir = 8; pixel_x = -24; pixel_y = 6},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) -"ayf" = (/turf/simulated/floor,/area/crew_quarters/sleep) -"ayg" = (/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/sleep) -"ayh" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/threedglasses,/turf/simulated/floor,/area/crew_quarters/sleep) -"ayi" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/sleep) +"aye" = (/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"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"ayf" = (/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/tiled,/area/hallway/secondary/entry/fore) +"ayg" = (/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"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"ayh" = (/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"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"ayi" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) "ayj" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"ayk" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/sleep) -"ayl" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Fitness"},/turf/simulated/floor,/area/crew_quarters/fitness) -"aym" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/fitness) -"ayn" = (/turf/simulated/floor{dir = 4; icon_state = "escapecorner"},/area/crew_quarters/fitness) -"ayo" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/crew_quarters/fitness) -"ayp" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/crew_quarters/fitness) -"ayq" = (/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/crew_quarters/fitness) +"ayk" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"ayl" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue/diagonal,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aym" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"ayn" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Fore"; dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"ayo" = (/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/tiled,/area/crew_quarters/sleep) +"ayp" = (/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},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"ayq" = (/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/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "ayr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "ays" = (/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) "ayt" = (/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) -"ayu" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/fore) -"ayv" = (/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) -"ayw" = (/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) -"ayx" = (/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) -"ayy" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry/fore) -"ayz" = (/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) -"ayA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "arrival"},/area/hallway/secondary/entry/fore) -"ayB" = (/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) +"ayu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"ayv" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/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/tiled,/area/crew_quarters/sleep) +"ayw" = (/obj/structure/table/woodentable,/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/tiled,/area/crew_quarters/sleep) +"ayx" = (/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 = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"ayy" = (/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/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"ayz" = (/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"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"ayA" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Fitness"},/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/tiled,/area/crew_quarters/fitness) +"ayB" = (/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/tiled,/area/crew_quarters/fitness) "ayC" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/plating,/area/maintenance/arrivals) "ayD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "ayE" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; 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) @@ -1290,29 +1290,29 @@ "ayP" = (/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) "ayQ" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva) "ayR" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "E.V.A. Maintenance"; req_access = list(12,18)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) -"ayS" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Fore"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) -"ayT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/fore) -"ayU" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) +"ayS" = (/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/tiled,/area/crew_quarters/fitness) +"ayT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"ayU" = (/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/tiled,/area/crew_quarters/fitness) "ayV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/dormitory) "ayW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "ayX" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"ayY" = (/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) -"ayZ" = (/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) -"aza" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/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) -"azb" = (/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/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/sleep) -"azc" = (/obj/structure/table/woodentable,/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) -"azd" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/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/crew_quarters/sleep) -"aze" = (/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 = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/sleep) -"azf" = (/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 = "neutral"; dir = 4},/area/crew_quarters/sleep) -"azg" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Fitness"},/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) -"azh" = (/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"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/crew_quarters/fitness) -"azi" = (/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) -"azj" = (/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) -"azk" = (/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) -"azl" = (/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) -"azm" = (/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) -"azn" = (/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) -"azo" = (/obj/machinery/hologram/holopad,/obj/machinery/light,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/crew_quarters/fitness) +"ayY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"ayZ" = (/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/tiled,/area/crew_quarters/fitness) +"aza" = (/obj/machinery/hologram/holopad,/obj/machinery/light,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"azb" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azc" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azd" = (/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aze" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azf" = (/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azi" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azl" = (/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"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"azm" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"azn" = (/obj/machinery/door/airlock/glass_medical{name = "Medical Voidsuits"; req_one_access = list(5)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"azo" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) "azp" = (/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) "azq" = (/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) "azr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) @@ -1320,17 +1320,17 @@ "azt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "azu" = (/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) "azv" = (/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) -"azw" = (/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) -"azx" = (/turf/simulated/floor,/area/hallway/secondary/entry/fore) -"azy" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) -"azz" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry/fore) -"azA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/fore) -"azB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/fore) -"azC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/hallway/secondary/entry/fore) -"azD" = (/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) -"azE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) -"azF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry/fore) -"azG" = (/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) +"azw" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"azx" = (/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"azy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"azz" = (/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/tiled,/area/ai_monitored/storage/eva) +"azA" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"azB" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Security Voidsuits"; req_access = list(2)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"azC" = (/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/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"azD" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"azE" = (/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/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"azF" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -27},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"azG" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/grey,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "azH" = (/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) "azI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "azJ" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) @@ -1346,43 +1346,43 @@ "azT" = (/turf/simulated/wall/r_wall,/area/gateway) "azU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/evahallway) "azV" = (/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"azW" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"azX" = (/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"azY" = (/obj/machinery/door/airlock/glass_medical{name = "Medical Voidsuits"; req_one_access = list(5)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"azZ" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aAa" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aAb" = (/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) -"aAc" = (/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) -"aAd" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aAe" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aAf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Security Voidsuits"; req_access = list(2)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aAg" = (/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) -"aAh" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) +"azW" = (/obj/effect/floor_decal/corner/grey/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"azX" = (/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"azY" = (/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/tiled,/area/crew_quarters/fitness) +"azZ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aAa" = (/obj/structure/closet/lasertag/blue,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aAb" = (/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/tiled,/area/crew_quarters/fitness) +"aAc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Holodeck Control"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aAd" = (/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,/area/maintenance/auxsolarstarboard) +"aAe" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"aAf" = (/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(11,13)},/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"},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) +"aAg" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aAh" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) "aAi" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"aAj" = (/turf/simulated/floor/carpet{tag = "icon-carpet2-0"; icon_state = "carpet2-0"},/area/crew_quarters/sleep/bedrooms) -"aAk" = (/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,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) -"aAl" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/sleep) -"aAm" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -27},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) -"aAn" = (/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) -"aAo" = (/turf/simulated/floor{icon_state = "neutral"; dir = 6},/area/crew_quarters/sleep) -"aAp" = (/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) -"aAq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness) -"aAr" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/crew_quarters/fitness) -"aAs" = (/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) -"aAt" = (/obj/structure/closet/lasertag/blue,/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness) -"aAu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass{name = "Holodeck Control"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor,/area/crew_quarters/fitness) +"aAj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aAk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aAl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aAm" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aAn" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aAo" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aAp" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aAq" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aAr" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aAs" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/medical,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/medical,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aAt" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aAu" = (/obj/structure/table/reinforced,/obj/item/clothing/head/welding,/obj/item/weapon/storage/belt/utility,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) "aAv" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard) -"aAw" = (/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) -"aAx" = (/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(11,13)},/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"},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarstarboard) -"aAy" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/auxsolarstarboard) +"aAw" = (/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/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aAx" = (/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"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aAy" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) "aAz" = (/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) "aAA" = (/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) -"aAB" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/fore) -"aAC" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/entry/fore) -"aAD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/fore) -"aAE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) -"aAF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry/fore) -"aAG" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{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) +"aAB" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"aAC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/sleep/bedrooms) +"aAD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aAE" = (/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},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aAF" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/undies_wardrobe,/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aAG" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/flora/pottedplant/random,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "aAH" = (/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) "aAI" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport) "aAJ" = (/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) @@ -1390,40 +1390,40 @@ "aAL" = (/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/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aAM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aAN" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aAO" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aAP" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/gateway) -"aAQ" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/gateway) -"aAR" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/gateway) -"aAS" = (/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aAT" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/medical,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/medical,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) +"aAO" = (/obj/structure/closet/wardrobe/pjs,/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aAP" = (/obj/structure/closet/secure_closet/personal,/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aAQ" = (/obj/structure/closet/wardrobe/pjs,/obj/effect/floor_decal/corner/grey/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aAR" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/crew_quarters/toilet) +"aAS" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aAT" = (/obj/machinery/light,/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) "aAU" = (/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 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) -"aAV" = (/obj/structure/table/reinforced,/obj/item/clothing/head/welding,/obj/item/weapon/storage/belt/utility,/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) -"aAW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/ai_monitored/storage/eva) -"aAX" = (/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"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aAY" = (/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{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aAZ" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/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) +"aAV" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/flora/pottedplant/random,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aAW" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/athletic_mixed,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aAX" = (/obj/structure/closet/lasertag/red,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aAY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aAZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) "aBa" = (/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) -"aBb" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) -"aBc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) +"aBb" = (/obj/structure/table/standard,/obj/item/weapon/paper{desc = ""; info = "Brusies sustained in the holodeck can be healed simply by sleeping."; name = "Holodeck Disclaimer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aBc" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) "aBd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) "aBe" = (/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) -"aBf" = (/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) -"aBg" = (/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) -"aBh" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/flora/pottedplant/random,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) -"aBi" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/undies_wardrobe,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) -"aBj" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) -"aBk" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/sleep) -"aBl" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{icon_state = "neutral"; dir = 6},/area/crew_quarters/sleep) +"aBf" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aBg" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aBh" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals North"; dir = 1},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/fore) +"aBi" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aBj" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/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/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aBk" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/arrivals) +"aBl" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) "aBm" = (/turf/simulated/wall,/area/crew_quarters/toilet) -"aBn" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aBo" = (/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) -"aBp" = (/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) -"aBq" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/athletic_mixed,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) -"aBr" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/flora/pottedplant/random,/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) -"aBs" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "neutral"},/area/crew_quarters/fitness) -"aBt" = (/obj/structure/closet/lasertag/red,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "neutral"; dir = 6},/area/crew_quarters/fitness) -"aBu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/crew_quarters/fitness) -"aBv" = (/obj/structure/table/standard,/obj/item/weapon/paper{desc = ""; info = "Brusies sustained in the holodeck can be healed simply by sleeping."; name = "Holodeck Disclaimer"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness) +"aBn" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aBo" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aBp" = (/obj/machinery/gateway/centerstation,/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aBq" = (/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/tiled,/area/ai_monitored/storage/eva) +"aBr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aBs" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aBt" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/machinery/camera/network/security{c_tag = "EVA Northeast"; dir = 8},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aBu" = (/obj/machinery/suit_cycler/security,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aBv" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) "aBw" = (/obj/structure/grille,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/crew_quarters/fitness) "aBx" = (/obj/item/weapon/stool{pixel_y = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "aBy" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/binary/pump/on{dir = 1; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) @@ -1431,50 +1431,50 @@ "aBA" = (/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) "aBB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/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},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "aBC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) -"aBD" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/fore) -"aBE" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) -"aBF" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals North"; dir = 1},/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/fore) -"aBG" = (/obj/machinery/vending/coffee,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry/fore) +"aBD" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aBE" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aBF" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aBG" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/crew_quarters/fitness) "aBH" = (/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) "aBI" = (/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) "aBJ" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry/port) -"aBK" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aBL" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/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) +"aBK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/HolodeckControl/Exodus,/turf/simulated/floor/tiled,/area/crew_quarters/fitness) +"aBL" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aBM" = (/turf/simulated/wall,/area/hallway/secondary/entry/port) -"aBN" = (/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) +"aBN" = (/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"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aBO" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aBP" = (/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) "aBQ" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/binary/pump/on{dir = 1; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aBR" = (/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) -"aBS" = (/obj/structure/table/woodentable,/obj/random/coin,/turf/simulated/floor,/area/crew_quarters/sleep) +"aBS" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/arrivals) "aBT" = (/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) "aBU" = (/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/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aBV" = (/obj/effect/decal/cleanable/dirt,/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,/area/maintenance/evahallway) "aBW" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aBX" = (/turf/simulated/wall/r_wall,/area/security/nuke_storage) -"aBY" = (/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aBZ" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/gateway) -"aCa" = (/obj/machinery/gateway/centerstation,/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aCb" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/gateway) +"aBY" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/hidden/cyan,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/arrivals) +"aBZ" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aCa" = (/obj/structure/closet/secure_closet/freezer/money,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aCb" = (/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/tiled{icon_state = "dark"},/area/security/nuke_storage) "aCc" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aCd" = (/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) -"aCe" = (/turf/simulated/floor,/area/ai_monitored/storage/eva) -"aCf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aCg" = (/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) -"aCh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/machinery/camera/network/security{c_tag = "EVA Northeast"; dir = 8},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/rods{amount = 50},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aCd" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aCe" = (/obj/machinery/computer/secure_data/detective_computer,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aCf" = (/obj/machinery/gateway{dir = 10},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aCg" = (/obj/machinery/gateway{dir = 6},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aCh" = (/obj/machinery/gateway,/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) "aCi" = (/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) -"aCj" = (/obj/machinery/suit_cycler/security,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aCk" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) +"aCj" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/head/helmet/space/void/engineering,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aCk" = (/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,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) "aCl" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aCm" = (/obj/structure/bed/padded,/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) -"aCn" = (/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms) +"aCn" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) "aCo" = (/obj/structure/bed/padded,/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) -"aCp" = (/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) -"aCq" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aCr" = (/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) +"aCp" = (/obj/structure/table/reinforced,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aCq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aCr" = (/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/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) "aCs" = (/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) -"aCt" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/crew_quarters/fitness) -"aCu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/HolodeckControl/Exodus,/turf/simulated/floor,/area/crew_quarters/fitness) +"aCt" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aCu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) "aCv" = (/obj/structure/grille,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/crew_quarters/fitness) "aCw" = (/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) "aCx" = (/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"},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) @@ -1482,41 +1482,41 @@ "aCz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore) "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/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) +"aCC" = (/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Bedroom Aft"; dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/sleep/bedrooms) +"aCD" = (/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},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) "aCE" = (/turf/simulated/wall,/area/security/checkpoint2) -"aCF" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; icon_state = "map_on"; tag = "icon-map_on (EAST)"; target_pressure = 15000},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/research_starboard) -"aCG" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/arrivals) +"aCF" = (/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/tiled/freezer,/area/crew_quarters/toilet) +"aCG" = (/obj/structure/urinal{pixel_y = 32},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) "aCH" = (/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) "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"},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aCJ" = (/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) "aCK" = (/turf/simulated/wall,/area/storage/primary) "aCL" = (/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) "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) -"aCP" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "vault"},/area/security/nuke_storage) -"aCQ" = (/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{icon_state = "vault"; dir = 10},/area/security/nuke_storage) -"aCR" = (/obj/machinery/computer/secure_data/detective_computer,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/nuke_storage) -"aCS" = (/obj/machinery/gateway{dir = 10},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/gateway) -"aCT" = (/obj/machinery/gateway,/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/gateway) -"aCU" = (/obj/machinery/gateway{dir = 6},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/gateway) -"aCV" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/head/helmet/space/void/engineering,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aCW" = (/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,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aCX" = (/obj/structure/table/reinforced,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aCY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva) -"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/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aCN" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aCO" = (/obj/structure/urinal{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aCP" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aCQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/plating,/area/maintenance/bar) +"aCR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/bar) +"aCS" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/bar) +"aCT" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/maintenance/bar) +"aCU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (WEST)"; icon_state = "swall_straight"; dir = 8},/area/shuttle/arrival/station) +"aCV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/arrival/station) +"aCW" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/arrival/station) +"aCX" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (NORTH)"; icon_state = "swall_t"; dir = 1},/area/shuttle/arrival/station) +"aCY" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aCZ" = (/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},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aDa" = (/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/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aDb" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light{dir = 1},/obj/item/device/flashlight/flare,/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aDc" = (/obj/machinery/modular_computer/console/preset/command,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) "aDd" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms) -"aDe" = (/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) -"aDf" = (/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) -"aDg" = (/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) -"aDh" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aDi" = (/obj/structure/urinal{pixel_y = 32},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aDj" = (/obj/structure/urinal{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aDk" = (/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) +"aDe" = (/obj/machinery/computer/security,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aDf" = (/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,/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aDg" = (/obj/machinery/computer/secure_data,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aDh" = (/obj/machinery/vending/assist,/turf/simulated/floor/tiled,/area/storage/primary) +"aDi" = (/obj/structure/table/standard,/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/tiled,/area/storage/primary) +"aDj" = (/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/tiled,/area/storage/primary) +"aDk" = (/obj/structure/table/standard,/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/tiled,/area/storage/primary) "aDl" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aDm" = (/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/packageWrap,/obj/machinery/camera/network/civilian_east{c_tag = "Bar Backroom"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aDn" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/beanbags,/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) @@ -1536,61 +1536,61 @@ "aDB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/library) "aDC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/library) "aDD" = (/turf/space,/area/syndicate_station/arrivals_dock) -"aDE" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/arrival/station) -"aDF" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station) +"aDE" = (/obj/structure/table/standard,/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/tiled,/area/storage/primary) +"aDF" = (/obj/structure/table/standard,/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/tiled,/area/storage/primary) "aDG" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aDH" = (/obj/structure/window/shuttle{icon_state = "window4"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station) "aDI" = (/obj/structure/window/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station) -"aDJ" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/arrival/station) -"aDK" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/arrival/station) -"aDL" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aDM" = (/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) -"aDN" = (/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 = "blue"},/area/security/checkpoint2) -"aDO" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light{dir = 1},/obj/item/device/flashlight/flare,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/security/checkpoint2) -"aDP" = (/obj/machinery/computer/card,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/checkpoint2) -"aDQ" = (/obj/machinery/computer/security,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/checkpoint2) -"aDR" = (/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{dir = 5; icon_state = "blue"},/area/security/checkpoint2) -"aDS" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/security/checkpoint2) -"aDT" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/research_starboard) +"aDJ" = (/obj/structure/table/standard,/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/tiled,/area/storage/primary) +"aDK" = (/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/tiled,/area/storage/primary) +"aDL" = (/obj/structure/table/standard,/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/tiled,/area/storage/primary) +"aDM" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/storage/primary) +"aDN" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aDO" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aDP" = (/obj/machinery/nuclearbomb{r_code = "LOLNO"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aDQ" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aDR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aDS" = (/obj/structure/window/reinforced,/obj/machinery/light_switch{pixel_x = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aDT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) "aDU" = (/obj/machinery/door/airlock/engineering{icon_state = "door_closed"; locked = 0; name = "Fore Port Solar Access"; req_access = list(11)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "aDV" = (/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) -"aDW" = (/obj/machinery/vending/assist,/turf/simulated/floor,/area/storage/primary) -"aDX" = (/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) -"aDY" = (/obj/structure/table/standard,/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) -"aDZ" = (/obj/structure/table/standard,/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) -"aEa" = (/obj/structure/table/standard,/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) -"aEb" = (/obj/structure/table/standard,/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) -"aEc" = (/obj/structure/table/standard,/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) -"aEd" = (/obj/structure/table/standard,/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) -"aEe" = (/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/storage/primary) -"aEf" = (/obj/machinery/vending/tool,/turf/simulated/floor,/area/storage/primary) -"aEg" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/security/nuke_storage) -"aEh" = (/turf/simulated/floor{icon_state = "vault"; dir = 6},/area/security/nuke_storage) -"aEi" = (/obj/machinery/nuclearbomb{r_code = "LOLNO"},/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"; dir = 8},/area/security/nuke_storage) -"aEj" = (/turf/simulated/floor{icon_state = "vault"; dir = 10},/area/security/nuke_storage) -"aEk" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/security/nuke_storage) -"aEl" = (/obj/structure/window/reinforced,/obj/machinery/light_switch{pixel_x = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aEm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aEn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aEo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/gateway) -"aEp" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/gateway) +"aDW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aDX" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/gateway) +"aDY" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Voidsuits"; req_one_access = list(11,24)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aDZ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aEa" = (/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/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aEb" = (/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"},/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aEc" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/clothing/shoes/magboots,/obj/item/device/suit_cooling_unit,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aEd" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aEe" = (/obj/machinery/door/firedoor/border_only,/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/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aEf" = (/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/tiled/freezer,/area/crew_quarters/toilet) +"aEg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aEh" = (/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/tiled/freezer,/area/crew_quarters/toilet) +"aEi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aEj" = (/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/tiled/freezer,/area/crew_quarters/toilet) +"aEk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aEl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/bar) +"aEm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/bar) +"aEn" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; icon_state = "map_on"; tag = "icon-map_on (EAST)"; target_pressure = 15000},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/bar) +"aEo" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/maintenance/bar) +"aEp" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/library) "aEq" = (/obj/effect/decal/cleanable/generic,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aEr" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Voidsuits"; req_one_access = list(11,24)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aEs" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aEt" = (/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) -"aEu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aEv" = (/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"},/obj/structure/table/reinforced,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aEr" = (/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},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/library) +"aEs" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/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"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/library) +"aEt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/tiled{icon_state = "dark"},/area/maintenance/library) +"aEu" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (EAST)"; icon_state = "swall_t"; dir = 4},/area/shuttle/arrival/station) +"aEv" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (WEST)"; icon_state = "swall_t"; dir = 8},/area/shuttle/arrival/station) "aEw" = (/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) -"aEx" = (/obj/machinery/sleep_console,/obj/effect/landmark/start{name = "Nursing Intern"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"aEx" = (/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/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aEy" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/civilian_east) -"aEz" = (/obj/machinery/door/firedoor/border_only,/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,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep) -"aEA" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/sleep) -"aEB" = (/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) -"aEC" = (/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) -"aED" = (/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) -"aEE" = (/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) -"aEF" = (/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) -"aEG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) +"aEz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aEA" = (/obj/structure/closet/wardrobe/red,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aEB" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aEC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aED" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aEE" = (/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},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/arrivals) +"aEF" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/arrivals) +"aEG" = (/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/tiled,/area/storage/primary) "aEH" = (/obj/item/weapon/storage/secure/safe{pixel_x = -20; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aEI" = (/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) "aEJ" = (/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) @@ -1599,17 +1599,17 @@ "aEM" = (/obj/effect/decal/cleanable/dirt,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/bar) "aEN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/library) "aEO" = (/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/library) -"aEP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/library) -"aEQ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/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"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/library) -"aER" = (/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) +"aEP" = (/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/tiled,/area/storage/primary) +"aEQ" = (/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/tiled,/area/storage/primary) +"aER" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/tiled,/area/storage/primary) "aES" = (/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/plating,/area/maintenance/library) "aET" = (/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) "aEU" = (/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{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/library) "aEV" = (/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) "aEW" = (/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) "aEX" = (/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) -"aEY" = (/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) -"aEZ" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/arrival/station) +"aEY" = (/obj/effect/landmark/start{name = "Assistant"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/storage/primary) +"aEZ" = (/obj/machinery/lapvend,/turf/simulated/floor/tiled,/area/storage/primary) "aFa" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aFb" = (/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aFc" = (/obj/machinery/computer/arcade,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) @@ -1618,53 +1618,53 @@ "aFf" = (/obj/structure/closet/wardrobe/mixed,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aFg" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aFh" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) -"aFi" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/arrival/station) +"aFi" = (/obj/structure/closet/crate,/obj/item/stack/material/gold,/obj/item/weapon/storage/belt/champion,/obj/machinery/camera/network/command{c_tag = "Vault"; dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) "aFj" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area/shuttle/arrival/station) "aFk" = (/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/port) -"aFl" = (/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) -"aFm" = (/obj/structure/closet/wardrobe/red,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/security/checkpoint2) -"aFn" = (/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) -"aFo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/checkpoint2) -"aFp" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/checkpoint2) -"aFq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/security/checkpoint2) +"aFl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aFm" = (/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/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aFn" = (/turf/simulated/floor/tiled,/area/gateway) +"aFo" = (/obj/machinery/vending/coffee,/obj/machinery/camera/network/civilian_west{c_tag = "Gateway Arrival Area"; dir = 4},/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor/tiled,/area/gateway) +"aFp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/gateway) +"aFq" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/structure/closet/wardrobe/xenos,/turf/simulated/floor/tiled,/area/gateway) "aFr" = (/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) "aFs" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aFt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aFu" = (/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/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/arrivals) -"aFv" = (/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},/obj/item/weapon/pen/red,/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"aFw" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/arrivals) -"aFx" = (/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) +"aFv" = (/obj/item/device/radio/intercom{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},/obj/item/device/flashlight/heavy,/obj/item/device/flashlight/heavy,/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aFw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(18)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aFx" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) "aFy" = (/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) -"aFz" = (/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) -"aFA" = (/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) -"aFB" = (/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary) -"aFC" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary) -"aFD" = (/obj/effect/landmark/start{name = "Assistant"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/storage/primary) -"aFE" = (/obj/machinery/lapvend,/turf/simulated/floor,/area/storage/primary) -"aFF" = (/obj/structure/closet/crate,/obj/item/stack/material/gold,/obj/item/weapon/storage/belt/champion,/obj/machinery/camera/network/command{c_tag = "Vault"; dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/security/nuke_storage) -"aFG" = (/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) -"aFH" = (/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) -"aFI" = (/obj/machinery/vending/coffee,/obj/machinery/camera/network/civilian_west{c_tag = "Gateway Arrival Area"; dir = 4},/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor,/area/gateway) -"aFJ" = (/turf/simulated/floor,/area/gateway) -"aFK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/gateway) -"aFL" = (/obj/structure/sign/biohazard{pixel_x = 32},/obj/structure/closet/wardrobe/xenos,/turf/simulated/floor,/area/gateway) +"aFz" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"aFA" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"aFB" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"aFC" = (/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"},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aFD" = (/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},/obj/effect/floor_decal/corner/grey{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aFE" = (/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/tiled/freezer,/area/crew_quarters/toilet) +"aFF" = (/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/tiled,/area/crew_quarters/sleep) +"aFG" = (/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/tiled/freezer,/area/crew_quarters/toilet) +"aFH" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{tag = "icon-swall_c (WEST)"; icon_state = "swall_c"; dir = 8},/area/shuttle/arrival/station) +"aFI" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight"; icon_state = "swall_straight"},/area/shuttle/arrival/station) +"aFJ" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/shuttle/arrival/station) +"aFK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aFL" = (/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},/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) "aFM" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aFN" = (/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},/obj/item/device/flashlight/heavy,/obj/item/device/flashlight/heavy,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aFO" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) -"aFP" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(18)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aFQ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aFR" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) -"aFS" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/fore) -"aFT" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) +"aFN" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aFO" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills{icon_state = "medlaptop"},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aFP" = (/obj/item/weapon/crowbar,/obj/item/device/flash,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aFQ" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled/dark,/area/security/checkpoint2) +"aFR" = (/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled,/area/storage/primary) +"aFS" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled,/area/storage/primary) +"aFT" = (/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) "aFU" = (/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) "aFV" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Civilian East Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) "aFW" = (/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) "aFX" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - Civilian East Subgrid"; name_tag = "Civilian East Subgrid"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east) -"aFY" = (/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) -"aFZ" = (/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) -"aGa" = (/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) -"aGb" = (/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) -"aGc" = (/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) +"aFY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aFZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aGa" = (/obj/structure/safe,/obj/item/clothing/under/color/yellow,/obj/item/key,/obj/item/toy/katana,/turf/simulated/floor/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aGb" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/gateway) +"aGc" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/gateway) "aGd" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/crew_quarters/toilet) "aGe" = (/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) "aGf" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -1683,58 +1683,58 @@ "aGs" = (/turf/simulated/wall,/area/chapel/office) "aGt" = (/turf/simulated/wall,/area/chapel/main) "aGu" = (/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) -"aGv" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station) +"aGv" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/gateway) "aGw" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) -"aGx" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/arrival/station) +"aGx" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/wardrobe/black,/turf/simulated/floor/tiled,/area/gateway) "aGy" = (/obj/structure/bed/chair{dir = 8},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) -"aGz" = (/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) +"aGz" = (/obj/machinery/suit_cycler/medical,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) "aGA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/arrival/station) "aGB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) -"aGC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/checkpoint2) -"aGD" = (/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 = "blue"; dir = 10},/area/security/checkpoint2) -"aGE" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/checkpoint2) -"aGF" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/checkpoint2) -"aGG" = (/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 = "blue"; dir = 6},/area/security/checkpoint2) -"aGH" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/security/checkpoint2) +"aGC" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aGD" = (/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/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aGE" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aGF" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"aGG" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/fore) +"aGH" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/fore) "aGI" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aGJ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/arrivals) "aGK" = (/turf/simulated/wall,/area/maintenance/substation/civilian_west) "aGL" = (/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) "aGM" = (/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) -"aGN" = (/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) -"aGO" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) -"aGP" = (/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/security/nuke_storage) -"aGQ" = (/mob/living/simple_animal/mouse/brown/Tom,/turf/simulated/floor{icon_state = "vault"; dir = 6},/area/security/nuke_storage) -"aGR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"},/area/security/nuke_storage) -"aGS" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 10},/area/security/nuke_storage) -"aGT" = (/obj/structure/safe,/obj/item/clothing/under/color/yellow,/obj/item/key,/obj/item/toy/katana,/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/security/nuke_storage) -"aGU" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/vending/cola,/turf/simulated/floor,/area/gateway) -"aGV" = (/obj/item/weapon/stool,/turf/simulated/floor,/area/gateway) -"aGW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/gateway) -"aGX" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/closet/wardrobe/black,/turf/simulated/floor,/area/gateway) +"aGN" = (/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},/obj/effect/floor_decal/corner/grey/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aGO" = (/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"},/obj/effect/floor_decal/corner/grey/full,/turf/simulated/floor/tiled,/area/crew_quarters/sleep) +"aGP" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aGQ" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aGR" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aGS" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aGT" = (/obj/machinery/light/small{dir = 8},/obj/machinery/recharge_station,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aGU" = (/obj/structure/closet/wardrobe/chaplain_black,/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/carpet,/area/chapel/office) +"aGV" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera/network/civilian_east{c_tag = "Chapel Office"},/turf/simulated/floor/carpet,/area/chapel/office) +"aGW" = (/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/carpet,/area/chapel/office) +"aGX" = (/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/tiled{icon_state = "dark"},/area/chapel/office) "aGY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aGZ" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aHa" = (/obj/machinery/suit_cycler/medical,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aHb" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/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) -"aHc" = (/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 = "dark"},/area/ai_monitored/storage/eva) +"aHa" = (/obj/machinery/button/remote/blast_door{id = "chapel"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor/lino,/area/chapel/office) +"aHb" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aHc" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{name = "Coffin Storage"; req_access = list(22)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) "aHd" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/grille,/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/ai_monitored/storage/eva) -"aHe" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aHf" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore) -"aHg" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/fore) -"aHh" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore) +"aHe" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aHf" = (/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/tiled{icon_state = "dark"},/area/chapel/main) +"aHg" = (/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/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (EAST)"; icon_state = "warningcee"; dir = 4},/turf/simulated/floor/plating,/area/chapel/main) +"aHh" = (/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},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (WEST)"; icon_state = "warningcee"; dir = 8},/turf/simulated/floor/plating,/area/chapel/main) "aHi" = (/obj/item/weapon/cigbutt,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/dormitory) "aHj" = (/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) "aHk" = (/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) "aHl" = (/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) "aHm" = (/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) "aHn" = (/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) -"aHo" = (/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) -"aHp" = (/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) -"aHq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aHr" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aHs" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aHt" = (/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) -"aHu" = (/obj/machinery/light/small{dir = 8},/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) +"aHo" = (/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"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aHp" = (/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/tiled,/area/hallway/secondary/entry/starboard) +"aHq" = (/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)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/starboard) +"aHr" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled,/area/storage/primary) +"aHs" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/storage/primary) +"aHt" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/storage/primary) +"aHu" = (/obj/effect/landmark/start{name = "Assistant"},/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor/tiled,/area/storage/primary) "aHv" = (/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) "aHw" = (/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) "aHx" = (/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) @@ -1758,82 +1758,82 @@ "aHP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/wood,/area/library) "aHQ" = (/turf/simulated/wall,/area/library) "aHR" = (/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) -"aHS" = (/obj/structure/closet/wardrobe/chaplain_black,/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aHT" = (/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) -"aHU" = (/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) -"aHV" = (/obj/machinery/button/remote/blast_door{id = "chapel"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aHW" = (/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) -"aHX" = (/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) -"aHY" = (/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aHZ" = (/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) -"aIa" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aIb" = (/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) -"aIc" = (/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{icon_state = "warnplate"; dir = 4},/area/chapel/main) +"aHS" = (/obj/effect/landmark/start{name = "Assistant"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/storage/primary) +"aHT" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) +"aHU" = (/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/airlock/vault/bolted,/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/security/nuke_storage) +"aHV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/gateway) +"aHW" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/table/standard,/obj/item/weapon/deck,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/gateway) +"aHX" = (/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/tiled,/area/gateway) +"aHY" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aHZ" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A. Cycler Access"; req_one_access = list(18)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aIa" = (/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/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aIb" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/head/helmet/space/skrell/black,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/skrell/black,/obj/item/clothing/head/helmet/space/skrell/white,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/skrell/white,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aIc" = (/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/tiled,/area/hallway/primary/central_one) "aId" = (/obj/machinery/door/blast/regular{id = "chapelgun"; name = "Chapel Launcher Door"},/turf/simulated/floor/plating,/area/chapel/main) "aIe" = (/turf/space,/area/shuttle/escape/station) "aIf" = (/obj/effect/landmark{name = "Marauder Entry"},/turf/space,/area/space) "aIg" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station) "aIh" = (/obj/effect/landmark{name = "Observer-Start"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aIi" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) -"aIj" = (/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) +"aIj" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aIk" = (/turf/simulated/wall,/area/hallway/secondary/entry/starboard) -"aIl" = (/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) +"aIl" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aIm" = (/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) -"aIn" = (/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) +"aIn" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Dormitory"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aIo" = (/obj/structure/sign/double/map/left,/turf/simulated/wall,/area/hallway/secondary/entry/starboard) "aIp" = (/obj/structure/sign/double/map/right,/turf/simulated/wall,/area/hallway/secondary/entry/starboard) "aIq" = (/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) "aIr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west) "aIs" = (/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) "aIt" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/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/substation/civilian_west) -"aIu" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/storage/primary) -"aIv" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/storage/primary) -"aIw" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/storage/primary) -"aIx" = (/obj/effect/landmark/start{name = "Assistant"},/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor,/area/storage/primary) -"aIy" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/storage/primary) -"aIz" = (/obj/effect/landmark/start{name = "Assistant"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/storage/primary) +"aIu" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Dormitory"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aIv" = (/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/tiled/freezer,/area/crew_quarters/toilet) +"aIw" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aIx" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aIy" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aIz" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) "aIA" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/nuke_storage) -"aIB" = (/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/airlock/vault/bolted,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/security/nuke_storage) -"aIC" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/table/standard,/obj/item/weapon/deck,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/gateway) -"aID" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/gateway) -"aIE" = (/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/gateway) +"aIB" = (/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/plating,/area/crew_quarters/bar) +"aIC" = (/obj/machinery/door/window/southleft{name = "Bar Delivery"; icon_state = "left"; dir = 8; req_access = list(25); base_state = "left"},/turf/simulated/floor/plating,/area/crew_quarters/bar) +"aID" = (/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/plating,/area/maintenance/bar) +"aIE" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/office) "aIF" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/gateway) "aIG" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/evahallway) "aIH" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aII" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aIJ" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A. Cycler Access"; req_one_access = list(18)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aIK" = (/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) -"aIL" = (/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) +"aII" = (/obj/structure/crematorium,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/office) +"aIJ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/carpet,/area/chapel/office) +"aIK" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/storage/fancy/crayons,/turf/simulated/floor/carpet,/area/chapel/office) +"aIL" = (/obj/effect/landmark/start{name = "Chaplain"},/obj/structure/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/chapel/office) "aIM" = (/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) -"aIN" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/head/helmet/space/skrell/black,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/skrell/black,/obj/item/clothing/head/helmet/space/skrell/white,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/skrell/white,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) +"aIN" = (/turf/simulated/floor/lino,/area/chapel/office) "aIO" = (/turf/simulated/wall/r_wall,/area/hallway/primary/central_one) -"aIP" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aIQ" = (/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) -"aIR" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) +"aIP" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aIQ" = (/obj/machinery/button/remote/driver{id = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = 25},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aIR" = (/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/tiled{icon_state = "dark"},/area/chapel/main) "aIS" = (/turf/simulated/wall,/area/hallway/primary/central_one) "aIT" = (/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) "aIU" = (/turf/simulated/wall,/area/maintenance/substation/civilian_east) -"aIV" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Dormitory"},/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) -"aIW" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Dormitory"},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/hallway/primary/central_two) +"aIV" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{tag = "icon-swall_c"; icon_state = "swall_c"},/area/shuttle/arrival/station) +"aIW" = (/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/tiled,/area/hallway/secondary/entry/starboard) "aIX" = (/turf/simulated/wall,/area/hallway/primary/central_two) -"aIY" = (/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) -"aIZ" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aJa" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aJb" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aJc" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) +"aIY" = (/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/tiled,/area/hallway/secondary/entry/port) +"aIZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{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/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aJa" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 20},/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/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aJb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aJc" = (/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/tiled,/area/hallway/secondary/entry/starboard) "aJd" = (/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) -"aJe" = (/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) -"aJf" = (/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) +"aJe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aJf" = (/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/tiled,/area/hallway/secondary/entry/starboard) "aJg" = (/turf/simulated/floor/plating,/area/maintenance/bar) "aJh" = (/obj/effect/landmark{name = "blobstart"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/bar) "aJi" = (/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) -"aJj" = (/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) +"aJj" = (/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/tiled,/area/hallway/secondary/entry/starboard) "aJk" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/bar) "aJl" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/bar) "aJm" = (/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) "aJn" = (/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) -"aJo" = (/obj/item/weapon/material/ashtray/plastic{pixel_x = 4; pixel_y = 6},/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) -"aJp" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{anchored = 0; department = "Internal Affairs"},/obj/machinery/requests_console{department = "Tech storage"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) +"aJo" = (/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/tiled,/area/hallway/secondary/entry/starboard) +"aJp" = (/turf/simulated/floor/tiled,/area/storage/primary) "aJq" = (/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/bar) "aJr" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 4; sortType = "Chapel"; name = "Chapel"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/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) "aJs" = (/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) @@ -1845,78 +1845,78 @@ "aJy" = (/obj/structure/bed/chair/office/dark,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library) "aJz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/library) "aJA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library) -"aJB" = (/obj/structure/crematorium,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"aJC" = (/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) -"aJD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aJE" = (/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) -"aJF" = (/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) -"aJG" = (/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aJH" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aJI" = (/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) -"aJJ" = (/obj/machinery/button/remote/driver{id = "chapelgun"; name = "Chapel Mass Driver"; pixel_x = 25},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aJK" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station) -"aJL" = (/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) -"aJM" = (/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) -"aJN" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 20},/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 = "bot"},/area/hallway/secondary/entry/starboard) -"aJO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{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"},/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/entry/starboard) -"aJP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bot"},/area/hallway/secondary/entry/starboard) -"aJQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aJR" = (/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) -"aJS" = (/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) -"aJT" = (/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) -"aJU" = (/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) +"aJB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/storage/primary) +"aJC" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled,/area/storage/primary) +"aJD" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/storage/primary) +"aJE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/storage/primary) +"aJF" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Tool Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/storage/primary) +"aJG" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/storage/primary) +"aJH" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/tiled,/area/storage/primary) +"aJI" = (/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/tiled{icon_state = "dark"},/area/security/nuke_storage) +"aJJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/gateway) +"aJK" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled,/area/gateway) +"aJL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/gateway) +"aJM" = (/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/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/gateway) +"aJN" = (/obj/machinery/light{dir = 4},/obj/structure/closet/l3closet/scientist,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/gateway) +"aJO" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aJP" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aJQ" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aJR" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aJS" = (/obj/structure/dispenser/oxygen,/obj/machinery/camera/network/security{c_tag = "EVA South"; dir = 1},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"aJT" = (/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) +"aJU" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/rig/unathi,/obj/item/clothing/mask/breath,/turf/simulated/floor/tiled{icon_state = "dark"},/area/ai_monitored/storage/eva) "aJV" = (/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) "aJW" = (/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) "aJX" = (/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) "aJY" = (/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) "aJZ" = (/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) -"aKa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/primary) -"aKb" = (/turf/simulated/floor,/area/storage/primary) -"aKc" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/storage/primary) -"aKd" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor,/area/storage/primary) -"aKe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/storage/primary) -"aKf" = (/turf/simulated/floor{icon_state = "delivery"},/area/storage/primary) -"aKg" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Tool Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "bot"},/area/storage/primary) -"aKh" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor,/area/storage/primary) +"aKa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aKb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aKc" = (/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"},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aKd" = (/obj/effect/floor_decal/corner/blue{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aKe" = (/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aKf" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/primary/central_two) +"aKg" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aKh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aKi" = (/turf/simulated/wall/r_wall,/area/hallway/primary/port) "aKj" = (/obj/structure/window/reinforced{dir = 1},/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/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/port) -"aKk" = (/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 = "vault"; dir = 5},/area/security/nuke_storage) -"aKl" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor,/area/gateway) -"aKm" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/gateway) -"aKn" = (/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/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/gateway) -"aKo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/gateway) -"aKp" = (/obj/machinery/light{dir = 4},/obj/structure/closet/l3closet/scientist,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/gateway) +"aKk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aKl" = (/obj/machinery/light,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet) +"aKm" = (/obj/machinery/door/airlock{name = "Bar Backroom"; req_access = list(25)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/crew_quarters/bar) +"aKn" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aKo" = (/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/tiled/freezer,/area/crew_quarters/kitchen) +"aKp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) "aKq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/evahallway) "aKr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/evahallway) -"aKs" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) -"aKt" = (/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) -"aKu" = (/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) -"aKv" = (/obj/structure/dispenser/oxygen,/obj/machinery/camera/network/security{c_tag = "EVA South"; dir = 1},/turf/simulated/floor,/area/ai_monitored/storage/eva) -"aKw" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva) +"aKs" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Kitchen Delivery"; req_access = list(28)},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) +"aKt" = (/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/tiled/freezer,/area/crew_quarters/kitchen) +"aKu" = (/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/plating,/area/hydroponics) +"aKv" = (/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/tiled{icon_state = "dark"},/area/chapel/office) +"aKw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/office) "aKx" = (/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) -"aKy" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) -"aKz" = (/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) -"aKA" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aKB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/central_one) -"aKC" = (/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aKD" = (/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) -"aKE" = (/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/hallway/primary/central_one) +"aKy" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp{pixel_y = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/chapel/office) +"aKz" = (/obj/structure/table/woodentable,/obj/item/weapon/nullrod,/obj/item/device/eftpos{eftpos_name = "Chapel EFTPOS scanner"},/turf/simulated/floor/carpet,/area/chapel/office) +"aKA" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/chapel/office) +"aKB" = (/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/westleft{name = "Coffin Storage"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/office) +"aKC" = (/obj/structure/table/standard,/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aKD" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aKE" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/shuttle/arrival/station) "aKF" = (/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) -"aKG" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_two) -"aKH" = (/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) -"aKI" = (/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) -"aKJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aKK" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet) -"aKL" = (/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) +"aKG" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t"; icon_state = "swall_t"},/area/shuttle/arrival/station) +"aKH" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aKI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aKJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aKK" = (/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aKL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "aKM" = (/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) "aKN" = (/turf/simulated/wall,/area/crew_quarters/kitchen) -"aKO" = (/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) -"aKP" = (/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) -"aKQ" = (/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) -"aKR" = (/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) -"aKS" = (/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) +"aKO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aKP" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aKQ" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aKR" = (/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/tiled{icon_state = "dark"},/area/hallway/primary/port) +"aKS" = (/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/tiled,/area/hallway/primary/port) "aKT" = (/turf/simulated/wall,/area/hydroponics) -"aKU" = (/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) +"aKU" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(18)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/primary/central_one) "aKV" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/hydroponics) "aKW" = (/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) "aKX" = (/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) @@ -1926,352 +1926,352 @@ "aLb" = (/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) "aLc" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/library) "aLd" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/wood,/area/library) -"aLe" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"aLf" = (/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) -"aLg" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp{pixel_y = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aLh" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aLi" = (/obj/structure/table/woodentable,/obj/item/weapon/nullrod,/obj/item/device/eftpos{eftpos_name = "Chapel EFTPOS scanner"},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aLj" = (/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/westleft{name = "Coffin Storage"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"aLk" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) -"aLl" = (/obj/structure/table/standard,/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) +"aLe" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(18)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/primary/central_one) +"aLf" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aLg" = (/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aLh" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aLi" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/primary/central_two) +"aLj" = (/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aLk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aLl" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/lino,/area/crew_quarters/bar) "aLm" = (/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/chapel/main) -"aLn" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/arrival/station) -"aLo" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/arrival/station) +"aLn" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/light{dir = 1},/obj/machinery/smartfridge/drinks,/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aLo" = (/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/lino,/area/crew_quarters/bar) "aLp" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aLq" = (/obj/machinery/requests_console{department = "Arrival shuttle"; pixel_y = -30},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "aLr" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/space,/area/shuttle/arrival/station) "aLs" = (/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/secondary/entry/port) -"aLt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aLu" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/light,/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/hallway/secondary/entry/starboard) -"aLv" = (/turf/simulated/floor{icon_state = "neutral"},/area/hallway/secondary/entry/starboard) -"aLw" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "neutral"},/area/hallway/secondary/entry/starboard) -"aLx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/hallway/secondary/entry/starboard) -"aLy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) +"aLt" = (/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/lino,/area/crew_quarters/bar) +"aLu" = (/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/lino,/area/crew_quarters/bar) +"aLv" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aLw" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aLx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aLy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) "aLz" = (/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/port) -"aLA" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/port) +"aLA" = (/obj/machinery/door/window/eastright{name = "Hydroponics Delivery"; icon_state = "right"; dir = 2; req_access = list(35)},/turf/simulated/floor/plating,/area/hydroponics) "aLB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/port) "aLC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/port) "aLD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/port) -"aLE" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port) +"aLE" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) "aLF" = (/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,/turf/simulated/floor/plating,/area/hallway/primary/port) "aLG" = (/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/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/port) "aLH" = (/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/port) "aLI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 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"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/hallway/primary/port) -"aLJ" = (/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) +"aLJ" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 22},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) "aLK" = (/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) "aLL" = (/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) "aLM" = (/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) "aLN" = (/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) -"aLO" = (/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) +"aLO" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) "aLP" = (/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) "aLQ" = (/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) "aLR" = (/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) -"aLS" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(18)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_one) -"aLT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_one_access = list(18)},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_one) +"aLS" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) +"aLT" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) "aLU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/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) "aLV" = (/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/hallway/primary/central_one) -"aLW" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor,/area/hallway/primary/central_one) -"aLX" = (/turf/simulated/floor,/area/hallway/primary/central_one) -"aLY" = (/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/hallway/primary/central_one) +"aLW" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) +"aLX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) +"aLY" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) "aLZ" = (/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/hallway/primary/central_one) "aMa" = (/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_one) "aMb" = (/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/primary/central_one) -"aMc" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_two) -"aMd" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/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) -"aMe" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/hallway/primary/central_two) -"aMf" = (/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) -"aMg" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aMh" = (/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) -"aMi" = (/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) -"aMj" = (/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) +"aMc" = (/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},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/hydroponics) +"aMd" = (/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/tiled{icon_state = "dark"},/area/chapel/office) +"aMe" = (/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/tiled{icon_state = "dark"},/area/chapel/office) +"aMf" = (/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/lino,/area/chapel/office) +"aMg" = (/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/tiled{icon_state = "dark"},/area/chapel/office) +"aMh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/lino,/area/chapel/office) +"aMi" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/lino,/area/chapel/office) +"aMj" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor/lino,/area/chapel/office) "aMk" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aMl" = (/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) "aMm" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"aMn" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aMo" = (/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) -"aMp" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aMq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aMr" = (/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) -"aMs" = (/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) -"aMt" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) -"aMu" = (/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) -"aMv" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) -"aMw" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) -"aMx" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) -"aMy" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"aMn" = (/obj/machinery/light{dir = 8},/obj/machinery/camera/network/civilian_east{c_tag = "Chapel North"; dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aMo" = (/obj/structure/table/standard,/obj/machinery/light/small,/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aMp" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aMq" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/shuttle/arrival/station) +"aMr" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aMs" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/lino,/area/hallway/secondary/entry/starboard) +"aMt" = (/turf/simulated/floor/lino,/area/hallway/secondary/entry/starboard) +"aMu" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/lino,/area/hallway/secondary/entry/starboard) +"aMv" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/secondary/entry/starboard) +"aMw" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aMx" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMy" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/primary/port) "aMz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/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/hydroponics) -"aMA" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) -"aMB" = (/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},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics) +"aMA" = (/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/tiled,/area/hallway/primary/port) +"aMB" = (/turf/simulated/floor/tiled,/area/hallway/primary/port) "aMC" = (/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/wood,/area/library) "aMD" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor/wood,/area/library) "aME" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/wood,/area/library) "aMF" = (/obj/structure/table/woodentable,/obj/structure/disposalpipe/segment,/obj/item/weapon/deck,/turf/simulated/floor/wood,/area/library) "aMG" = (/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/library) "aMH" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/wood,/area/library) -"aMI" = (/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) -"aMJ" = (/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) -"aMK" = (/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) -"aML" = (/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) -"aMM" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aMN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aMO" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aMP" = (/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) -"aMQ" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) -"aMR" = (/obj/structure/table/standard,/obj/machinery/light/small,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) +"aMI" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMK" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aML" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMM" = (/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"},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMN" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMO" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMP" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Port - Central"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMQ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMR" = (/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/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/port) "aMS" = (/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) -"aMT" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/arrival/station) -"aMU" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) +"aMT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMU" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/hallway/primary/port) "aMV" = (/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/starboard) -"aMW" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry/starboard) -"aMX" = (/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry/starboard) -"aMY" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry/starboard) -"aMZ" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "dark"},/area/hallway/secondary/entry/starboard) -"aNa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/hallway/secondary/entry/starboard) -"aNb" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aNc" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/port) -"aNd" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor,/area/hallway/primary/port) -"aNe" = (/turf/simulated/floor,/area/hallway/primary/port) -"aNf" = (/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/hallway/primary/port) -"aNg" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/port) -"aNh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/port) -"aNi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/hallway/primary/port) -"aNj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port) -"aNk" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/port) -"aNl" = (/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) -"aNm" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) -"aNn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) -"aNo" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Port - Central"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/primary/port) -"aNp" = (/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) -"aNq" = (/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) -"aNr" = (/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) -"aNs" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/hallway/primary/port) -"aNt" = (/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) -"aNu" = (/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) -"aNv" = (/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) -"aNw" = (/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) -"aNx" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_one) -"aNy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_one) -"aNz" = (/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) -"aNA" = (/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) -"aNB" = (/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) -"aNC" = (/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) -"aND" = (/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) -"aNE" = (/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) -"aNF" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one) -"aNG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one) -"aNH" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aNI" = (/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) -"aNJ" = (/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) -"aNK" = (/obj/machinery/firealarm{dir = 2; pixel_x = -12; pixel_y = 24},/turf/simulated/floor{icon_state = "L5"},/area/hallway/primary/central_one) -"aNL" = (/turf/simulated/floor{icon_state = "L7"},/area/hallway/primary/central_one) -"aNM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "L9"},/area/hallway/primary/central_one) -"aNN" = (/turf/simulated/floor{icon_state = "L11"},/area/hallway/primary/central_one) -"aNO" = (/turf/simulated/floor{desc = ""; icon_state = "L13"; name = "floor"},/area/hallway/primary/central_one) -"aNP" = (/turf/simulated/floor{icon_state = "L15"},/area/hallway/primary/central_one) -"aNQ" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor,/area/hallway/primary/central_two) -"aNR" = (/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/hallway/primary/central_two) -"aNS" = (/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) -"aNT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/hallway/primary/central_two) -"aNU" = (/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) -"aNV" = (/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) -"aNW" = (/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) -"aNX" = (/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) -"aNY" = (/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) -"aNZ" = (/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) -"aOa" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/primary/central_two) -"aOb" = (/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) -"aOc" = (/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) -"aOd" = (/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) -"aOe" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aOf" = (/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aOg" = (/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) +"aMW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMX" = (/obj/structure/extinguisher_cabinet{pixel_x = -13; pixel_y = 28},/obj/machinery/atm{pixel_x = 6; pixel_y = 28},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aMY" = (/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/tiled,/area/hallway/primary/port) +"aMZ" = (/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/tiled,/area/hallway/primary/port) +"aNa" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNb" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNc" = (/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/tiled,/area/hallway/primary/central_one) +"aNd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNe" = (/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/tiled,/area/hallway/primary/central_one) +"aNf" = (/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"},/obj/effect/floor_decal/corner/blue{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNg" = (/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/tiled,/area/hallway/primary/central_one) +"aNh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNi" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNj" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNl" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNm" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNn" = (/obj/machinery/firealarm{dir = 2; pixel_x = -12; pixel_y = 24},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNo" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aNp" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aNq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aNr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aNs" = (/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/tiled,/area/hallway/primary/central_two) +"aNt" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aNu" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aNv" = (/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/tiled,/area/hallway/primary/central_two) +"aNw" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aNx" = (/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/tiled,/area/hallway/primary/central_two) +"aNy" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aNz" = (/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/lino,/area/crew_quarters/bar) +"aNA" = (/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/lino,/area/crew_quarters/bar) +"aNB" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aNC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/reinforced,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aND" = (/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aNE" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/flame/lighter/zippo,/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aNF" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/structure/kitchenspike,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aNG" = (/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/tiled/freezer,/area/crew_quarters/kitchen) +"aNH" = (/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/tiled/freezer,/area/crew_quarters/kitchen) +"aNI" = (/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/tiled/freezer,/area/crew_quarters/kitchen) +"aNJ" = (/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/tiled,/area/hydroponics) +"aNK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics) +"aNL" = (/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/tiled,/area/hydroponics) +"aNM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/hydroponics) +"aNN" = (/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/tiled,/area/hydroponics) +"aNO" = (/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/tiled,/area/hydroponics) +"aNP" = (/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/tiled,/area/hydroponics) +"aNQ" = (/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/tiled,/area/hydroponics) +"aNR" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics) +"aNS" = (/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/tiled,/area/hydroponics) +"aNT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/hydroponics) +"aNU" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/office) +"aNV" = (/obj/structure/morgue,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/office) +"aNW" = (/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/lino,/area/chapel/office) +"aNX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/lino,/area/chapel/office) +"aNY" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/lino,/area/chapel/office) +"aNZ" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/lino,/area/chapel/office) +"aOa" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aOb" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aOc" = (/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/lino,/area/hallway/secondary/entry/starboard) +"aOd" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor/lino,/area/hallway/secondary/entry/starboard) +"aOe" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/secondary/entry/starboard) +"aOf" = (/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/tiled,/area/hallway/secondary/entry/starboard) +"aOg" = (/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/effect/floor_decal/plaque,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "aOh" = (/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) "aOi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aOj" = (/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) -"aOk" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/obj/structure/kitchenspike,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aOl" = (/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) -"aOm" = (/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) -"aOn" = (/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) -"aOo" = (/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) -"aOp" = (/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) -"aOq" = (/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) -"aOr" = (/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) -"aOs" = (/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) -"aOt" = (/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) -"aOu" = (/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) -"aOv" = (/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) -"aOw" = (/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) -"aOx" = (/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) -"aOy" = (/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) +"aOk" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHW"; location = "Lockers"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOl" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOm" = (/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/tiled,/area/hallway/primary/port) +"aOn" = (/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/tiled,/area/hallway/primary/port) +"aOo" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOp" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOr" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOs" = (/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 = 8},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOt" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOu" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOv" = (/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/tiled,/area/hallway/primary/port) +"aOw" = (/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/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOy" = (/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/tiled,/area/hallway/primary/port) "aOz" = (/turf/simulated/floor/wood,/area/library) "aOA" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/library) "aOB" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/wood,/area/library) "aOC" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library) -"aOD" = (/obj/structure/morgue,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"aOE" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office) -"aOF" = (/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 = "grimy"},/area/chapel/office) -"aOG" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aOH" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) -"aOI" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office) +"aOD" = (/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/tiled,/area/hallway/primary/port) +"aOE" = (/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/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOG" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOH" = (/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/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aOI" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aOJ" = (/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/port) "aOK" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aOL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aOM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "aON" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) -"aOO" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aOP" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/secondary/entry/port) +"aOO" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aOP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aOQ" = (/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/starboard) -"aOR" = (/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) +"aOR" = (/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/tiled,/area/hallway/primary/central_one) "aOS" = (/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) "aOT" = (/turf/simulated/floor/carpet,/area/hallway/secondary/entry/starboard) -"aOU" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry/starboard) -"aOV" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "dark"},/area/hallway/secondary/entry/starboard) -"aOW" = (/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{desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding."; dir = 4; icon_state = "plaque"; name = "Comemmorative Plaque"; nitrogen = 30; oxygen = 70; temperature = 80},/area/hallway/secondary/entry/starboard) -"aOX" = (/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/secondary/entry/starboard) -"aOY" = (/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/port) -"aOZ" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHW"; location = "Lockers"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/port) -"aPa" = (/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/hallway/primary/port) -"aPb" = (/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/hallway/primary/port) -"aPc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/port) -"aPd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor,/area/hallway/primary/port) -"aPe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) -"aPf" = (/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 = 8},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/port) -"aPg" = (/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/hallway/primary/port) -"aPh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/primary/port) -"aPi" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/port) -"aPj" = (/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/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/port) -"aPk" = (/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/hallway/primary/port) -"aPl" = (/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,/area/hallway/primary/port) -"aPm" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/port) -"aPn" = (/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/port) -"aPo" = (/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/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) -"aPp" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor,/area/hallway/primary/port) -"aPq" = (/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/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) -"aPr" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/port) -"aPs" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central_one) -"aPt" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor,/area/hallway/primary/central_one) -"aPu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_one) -"aPv" = (/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_one) -"aPw" = (/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_one) -"aPx" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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_one) -"aPy" = (/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{icon_state = "L2"},/area/hallway/primary/central_one) -"aPz" = (/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{dir = 1},/turf/simulated/floor{icon_state = "L4"},/area/hallway/primary/central_one) -"aPA" = (/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{icon_state = "L6"},/area/hallway/primary/central_one) -"aPB" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Lockers"; location = "EVA"},/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{icon_state = "L8"},/area/hallway/primary/central_one) -"aPC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{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{icon_state = "L10"},/area/hallway/primary/central_one) -"aPD" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Security"; location = "EVA2"},/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{icon_state = "L12"},/area/hallway/primary/central_one) -"aPE" = (/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{desc = ""; icon_state = "L14"},/area/hallway/primary/central_one) -"aPF" = (/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{icon_state = "L16"},/area/hallway/primary/central_one) -"aPG" = (/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{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_one) -"aPH" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock 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) -"aPI" = (/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) -"aPJ" = (/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_two) -"aPK" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA2"; location = "Dorm"},/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,/area/hallway/primary/central_two) -"aPL" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/primary/central_two) +"aOU" = (/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/tiled,/area/hallway/primary/central_one) +"aOV" = (/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/tiled,/area/hallway/primary/central_one) +"aOW" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/tiled,/area/hallway/primary/central_one) +"aOX" = (/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{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aOY" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{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/tiled,/area/hallway/primary/central_one) +"aOZ" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Lockers"; location = "EVA"},/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/tiled,/area/hallway/primary/central_one) +"aPa" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Security"; location = "EVA2"},/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/tiled,/area/hallway/primary/central_one) +"aPb" = (/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{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aPc" = (/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/tiled,/area/hallway/primary/central_two) +"aPd" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock 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/tiled,/area/hallway/primary/central_two) +"aPe" = (/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/tiled,/area/hallway/primary/central_two) +"aPf" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA2"; location = "Dorm"},/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/tiled,/area/hallway/primary/central_two) +"aPg" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aPh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aPi" = (/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/lino,/area/crew_quarters/bar) +"aPj" = (/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/lino,/area/crew_quarters/bar) +"aPk" = (/obj/structure/kitchenspike,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aPl" = (/obj/machinery/gibber,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aPm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aPn" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"aPo" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/hydroponics) +"aPp" = (/turf/simulated/floor/tiled,/area/hydroponics) +"aPq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hydroponics) +"aPr" = (/obj/structure/disposalpipe/segment,/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/hydroponics) +"aPs" = (/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/tiled,/area/hydroponics) +"aPt" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor/tiled,/area/hydroponics) +"aPu" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/tiled,/area/hydroponics) +"aPv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hydroponics) +"aPw" = (/obj/machinery/papershredder,/turf/simulated/floor/wood,/area/library) +"aPx" = (/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/tiled{icon_state = "dark"},/area/chapel/office) +"aPy" = (/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1480; name = "Confessional Intercom"; pixel_x = 25},/obj/structure/bed/chair,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aPz" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth (Chaplain)"; req_access = list(22)},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aPA" = (/obj/item/device/radio/beacon,/obj/machinery/camera/network/exodus{c_tag = "Arrivals South"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aPB" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aPC" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aPD" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aPE" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/obj/machinery/camera/network/exodus{c_tag = "Arrivals Southeast"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aPF" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/random/single{icon = 'icons/obj/items.dmi'; icon_state = "lighter-g"; name = "randomly spawned lighter"; spawn_nothing_percentage = 50; spawn_object = /obj/item/weapon/flame/lighter},/turf/simulated/floor/lino,/area/hallway/secondary/entry/starboard) +"aPG" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/secondary/entry/starboard) +"aPH" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aPI" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aPJ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aPK" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aPL" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/port) "aPM" = (/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) -"aPN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aPO" = (/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) -"aPP" = (/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) +"aPN" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aPO" = (/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/tiled,/area/hallway/primary/port) +"aPP" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/port) "aPQ" = (/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) "aPR" = (/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) "aPS" = (/obj/machinery/light/small{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"aPT" = (/obj/structure/kitchenspike,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aPU" = (/obj/machinery/gibber,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aPV" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) -"aPW" = (/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) -"aPX" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) -"aPY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics) -"aPZ" = (/turf/simulated/floor,/area/hydroponics) -"aQa" = (/obj/structure/disposalpipe/segment,/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics) +"aPT" = (/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/tiled,/area/hallway/primary/port) +"aPU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aPV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aPW" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 4; name = "Primary Tool Storage"; sortType = "Primary Tool Storage"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aPX" = (/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/tiled,/area/hallway/primary/port) +"aPY" = (/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/tiled,/area/hallway/primary/port) +"aPZ" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aQa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/port) "aQb" = (/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},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hydroponics) -"aQc" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) -"aQd" = (/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/hydroponics) -"aQe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hydroponics) -"aQf" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics) +"aQc" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aQd" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aQe" = (/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/tiled,/area/hallway/primary/port) +"aQf" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=QM"; location = "CHW"},/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/tiled,/area/hallway/primary/central_one) "aQg" = (/obj/machinery/bookbinder{pixel_y = 0},/turf/simulated/floor/wood,/area/library) "aQh" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library) "aQi" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/library) -"aQj" = (/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) -"aQk" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth (Chaplain)"; req_access = list(22)},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aQl" = (/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1480; name = "Confessional Intercom"; pixel_x = 25},/obj/structure/bed/chair,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) +"aQj" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aQk" = (/obj/machinery/light,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aQl" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aQm" = (/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) "aQn" = (/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) "aQo" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) -"aQp" = (/obj/machinery/vending/snack,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aQq" = (/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) -"aQr" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aQs" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry/port) +"aQp" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aQq" = (/obj/machinery/light,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aQr" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aQs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aQt" = (/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) "aQu" = (/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) -"aQv" = (/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) -"aQw" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/random/single{icon = 'icons/obj/items.dmi'; icon_state = "lighter-g"; name = "randomly spawned lighter"; spawn_nothing_percentage = 50; spawn_object = /obj/item/weapon/flame/lighter},/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry/starboard) +"aQv" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aQw" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aQx" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/hallway/secondary/entry/starboard) -"aQy" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "dark"},/area/hallway/secondary/entry/starboard) -"aQz" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aQA" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor,/area/hallway/primary/port) -"aQB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/port) -"aQC" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor,/area/hallway/primary/port) -"aQD" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/port) -"aQE" = (/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/port) -"aQF" = (/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) -"aQG" = (/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) -"aQH" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) -"aQI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port) -"aQJ" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 4; name = "Primary Tool Storage"; sortType = "Primary Tool Storage"},/turf/simulated/floor,/area/hallway/primary/port) -"aQK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/port) -"aQL" = (/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) -"aQM" = (/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) -"aQN" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/port) -"aQO" = (/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) -"aQP" = (/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) -"aQQ" = (/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) -"aQR" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/port) -"aQS" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=QM"; location = "CHW"},/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) -"aQT" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aQU" = (/obj/machinery/light,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aQV" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aQW" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aQX" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aQY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aQZ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_one) -"aRa" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"aRb" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"aRc" = (/turf/simulated/floor,/area/hallway/primary/central_two) -"aRd" = (/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) -"aRe" = (/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) -"aRf" = (/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) -"aRg" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/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) +"aQy" = (/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/tiled,/area/hallway/primary/central_two) +"aQz" = (/obj/structure/table/reinforced,/obj/machinery/door/blast/shutters{dir = 2; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aQA" = (/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/lino,/area/crew_quarters/bar) +"aQB" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/obj/machinery/door/blast/shutters{dir = 2; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aQC" = (/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/tiled/freezer,/area/crew_quarters/kitchen) +"aQD" = (/obj/item/weapon/material/hatchet,/obj/item/weapon/material/minihoe,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/hydroponics) +"aQE" = (/obj/machinery/seed_extractor,/turf/simulated/floor/tiled,/area/hydroponics) +"aQF" = (/obj/machinery/biogenerator,/turf/simulated/floor/tiled,/area/hydroponics) +"aQG" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/hydroponics) +"aQH" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled,/area/hydroponics) +"aQI" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled,/area/hydroponics) +"aQJ" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/tiled,/area/hydroponics) +"aQK" = (/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics) +"aQL" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/turf/simulated/floor/wood,/area/library) +"aQM" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/invisible,/turf/simulated/floor/wood,/area/library) +"aQN" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/camera,/obj/item/device/eftpos{eftpos_name = "Library EFTPOS scanner"},/turf/simulated/floor/wood,/area/library) +"aQO" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aQP" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aQQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aQR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aQS" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aQT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aQU" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aQV" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals Southwest"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aQW" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aQX" = (/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aQY" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aQZ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aRa" = (/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aRb" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aRc" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"; tag = "icon-comfychair (NORTH)"},/turf/simulated/floor/lino,/area/hallway/secondary/entry/starboard) +"aRd" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/secondary/entry/starboard) +"aRe" = (/obj/structure/cable/green,/obj/machinery/power/apc/high{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aRf" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aRg" = (/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/tiled,/area/hallway/primary/port) "aRh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "aRi" = (/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) "aRj" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor/carpet,/area/crew_quarters/bar) -"aRk" = (/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) -"aRl" = (/obj/item/weapon/material/hatchet,/obj/item/weapon/material/minihoe,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) -"aRm" = (/obj/machinery/biogenerator,/turf/simulated/floor,/area/hydroponics) -"aRn" = (/obj/machinery/seed_extractor,/turf/simulated/floor,/area/hydroponics) -"aRo" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor,/area/hydroponics) -"aRp" = (/obj/machinery/seed_storage/garden,/turf/simulated/floor,/area/hydroponics) -"aRq" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics) +"aRk" = (/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/tiled,/area/hallway/primary/port) +"aRl" = (/obj/structure/table/standard,/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Port - East"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aRm" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aRn" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aRo" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/hallway/primary/port) +"aRp" = (/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/tiled,/area/hallway/primary/central_one) +"aRq" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aRr" = (/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/hydroponics) -"aRs" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics) -"aRt" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor,/area/hydroponics) -"aRu" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor,/area/hydroponics) -"aRv" = (/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hydroponics) -"aRw" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics) +"aRs" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aRt" = (/obj/machinery/disposal,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aRu" = (/obj/machinery/light/small{dir = 1},/obj/item/clothing/head/cakehat,/obj/structure/table/marble,/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aRv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aRw" = (/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/tiled,/area/crew_quarters/kitchen) "aRx" = (/obj/structure/bookcase{name = "bookcase (Religious)"},/turf/simulated/floor/wood,/area/library) "aRy" = (/turf/simulated/floor/carpet,/area/library) "aRz" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/library) "aRA" = (/obj/structure/bookcase{name = "bookcase (Reference)"},/turf/simulated/floor/wood,/area/library) "aRB" = (/obj/machinery/librarypubliccomp,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library) -"aRC" = (/obj/structure/bookcase{name = "Forbidden Knowledge"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) -"aRD" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/camera,/obj/item/device/eftpos{eftpos_name = "Library EFTPOS scanner"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) -"aRE" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/invisible,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) -"aRF" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aRG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aRH" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aRI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aRJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/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/chapel/main) -"aRK" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aRL" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) +"aRC" = (/obj/machinery/door/airlock/glass{name = "Garden 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/tiled,/area/hydroponics/garden) +"aRD" = (/obj/machinery/light/small,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/wood,/area/library) +"aRE" = (/obj/structure/cult/tome,/obj/item/clothing/under/suit_jacket/red,/turf/simulated/floor/wood,/area/library) +"aRF" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/wood,/area/library) +"aRG" = (/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aRH" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aRI" = (/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aRJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aRK" = (/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/tiled{icon_state = "dark"},/area/chapel/main) +"aRL" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) "aRM" = (/turf/simulated/wall,/area/hallway/secondary/exit) "aRN" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aRO" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit) @@ -2279,31 +2279,31 @@ "aRQ" = (/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) "aRR" = (/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) "aRS" = (/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) -"aRT" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals Southwest"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aRU" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/entry/port) +"aRT" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/secondary/exit) +"aRU" = (/obj/machinery/lapvend,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/secondary/exit) "aRV" = (/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/port) -"aRW" = (/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aRX" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aRY" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aRZ" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aSa" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry/port) +"aRW" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aRX" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aRY" = (/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)"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) +"aRZ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "nuke_shuttle_dock_pump"},/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) +"aSa" = (/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 = 26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aSb" = (/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/starboard) -"aSc" = (/obj/structure/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_preview"; tag = "icon-comfychair (NORTH)"},/turf/simulated/floor{icon_state = "grimy"},/area/hallway/secondary/entry/starboard) -"aSd" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "dark"},/area/hallway/secondary/entry/starboard) -"aSe" = (/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) +"aSc" = (/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/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aSd" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aSe" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aSf" = (/turf/simulated/wall,/area/hallway/primary/port) "aSg" = (/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) -"aSh" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor,/area/hallway/primary/port) -"aSi" = (/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) +"aSh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aSi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aSj" = (/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) -"aSk" = (/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) +"aSk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aSl" = (/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) -"aSm" = (/obj/structure/table/standard,/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Port - East"; dir = 1},/turf/simulated/floor,/area/hallway/primary/port) -"aSn" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port) -"aSo" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port) -"aSp" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port) +"aSm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aSn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aSo" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aSp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aSq" = (/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) -"aSr" = (/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) +"aSr" = (/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/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aSs" = (/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) "aSt" = (/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) "aSu" = (/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) @@ -2317,7 +2317,7 @@ "aSC" = (/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) "aSD" = (/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) "aSE" = (/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/hallway/primary/central_two) -"aSF" = (/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central_two) +"aSF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aSG" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aSH" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aSI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -2325,100 +2325,100 @@ "aSK" = (/turf/simulated/floor/wood,/area/crew_quarters/bar) "aSL" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aSM" = (/obj/structure/flora/pottedplant/random,/obj/machinery/camera/network/civilian_east{c_tag = "Bar East"},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aSN" = (/obj/machinery/light/small{dir = 1},/obj/item/clothing/head/cakehat,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aSO" = (/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) +"aSN" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aSO" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "aSP" = (/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) -"aSQ" = (/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) -"aSR" = (/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) +"aSQ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aSR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "aSS" = (/obj/machinery/smartfridge,/turf/simulated/wall/r_wall{name = "transparent wall"; opacity = 0},/area/crew_quarters/kitchen) "aST" = (/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) "aSU" = (/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) "aSV" = (/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/crew_quarters/kitchen) "aSW" = (/turf/simulated/wall,/area/hydroponics/garden) "aSX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/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/hydroponics/garden) -"aSY" = (/obj/machinery/door/airlock/glass{name = "Garden 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/hydroponics/garden) +"aSY" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "aSZ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/library) "aTa" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/library) -"aTb" = (/obj/machinery/light/small,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) -"aTc" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) -"aTd" = (/obj/structure/cult/tome,/obj/item/clothing/under/suit_jacket/red,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) -"aTe" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) -"aTf" = (/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) +"aTb" = (/obj/machinery/atm{pixel_x = 24},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aTc" = (/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTd" = (/obj/structure/closet/wardrobe/xenos,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTe" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTf" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aTg" = (/turf/simulated/floor/carpet,/area/chapel/main) -"aTh" = (/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) -"aTi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) -"aTj" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aTk" = (/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) -"aTl" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "dark"},/area/hallway/secondary/exit) -"aTm" = (/obj/machinery/lapvend,/turf/simulated/floor{icon_state = "dark"},/area/hallway/secondary/exit) -"aTn" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit) -"aTo" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/exit) +"aTh" = (/obj/machinery/vending/cola,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTi" = (/obj/machinery/vending/coffee,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTj" = (/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/tiled,/area/crew_quarters/locker) +"aTk" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTl" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTm" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTn" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aTo" = (/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/storage/art) "aTp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aTq" = (/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) -"aTr" = (/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) -"aTs" = (/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) +"aTr" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/storage/art) +"aTs" = (/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/tiled,/area/storage/art) "aTt" = (/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) -"aTu" = (/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 = 26; req_one_access = list(13)},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aTv" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/entry/port) -"aTw" = (/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/hidden/supply{dir = 4},/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/port) -"aTx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aTy" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/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/port) -"aTz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/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/port) -"aTA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aTB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/entry/port) -"aTC" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/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/port) -"aTD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aTE" = (/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/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/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/port) -"aTF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry/port) -"aTG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aTH" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aTI" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 4},/area/hallway/secondary/entry/starboard) -"aTJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry/starboard) -"aTK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry/starboard) -"aTL" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry/starboard) -"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) +"aTu" = (/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/tiled,/area/hallway/primary/port) +"aTv" = (/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aTw" = (/obj/machinery/computer/security,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aTx" = (/obj/machinery/computer/secure_data,/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/tiled,/area/bridge) +"aTy" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/secure/briefcase,/obj/item/device/gps,/obj/item/device/gps,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/bridge) +"aTz" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aTA" = (/obj/machinery/computer/communications,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/bridge) +"aTB" = (/obj/machinery/modular_computer/console/preset/command,/turf/simulated/floor/tiled,/area/bridge) +"aTC" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/recharger{pixel_y = 0},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/bridge) +"aTD" = (/obj/machinery/modular_computer/console/preset/research,/turf/simulated/floor/tiled,/area/bridge) +"aTE" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/bridge) +"aTF" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/window/reinforced{dir = 4},/obj/item/device/aicard,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aTG" = (/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/bridge) +"aTH" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aTI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aTJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/marble,/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aTK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aTL" = (/obj/machinery/vending/dinnerware,/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera/network/civilian_east{c_tag = "Kitchen"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aTM" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aTN" = (/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aTO" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "aTP" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/maintenance/locker) "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) -"aTT" = (/obj/structure/closet/wardrobe/xenos,/turf/simulated/floor,/area/crew_quarters/locker) -"aTU" = (/turf/simulated/floor,/area/crew_quarters/locker) -"aTV" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/crew_quarters/locker) -"aTW" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor,/area/crew_quarters/locker) -"aTX" = (/obj/machinery/vending/cola,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/crew_quarters/locker) -"aTY" = (/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) -"aTZ" = (/obj/machinery/vending/coffee,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/crew_quarters/locker) -"aUa" = (/obj/machinery/vending/snack,/turf/simulated/floor,/area/crew_quarters/locker) -"aUb" = (/obj/machinery/vending/cigarette,/turf/simulated/floor,/area/crew_quarters/locker) -"aUc" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/crew_quarters/locker) -"aUd" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor,/area/crew_quarters/locker) +"aTT" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aTU" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aTV" = (/obj/structure/closet/secure_closet/freezer/kitchen,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aTW" = (/obj/structure/table/marble,/turf/simulated/floor/lino,/area/hydroponics/garden) +"aTX" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/lino,/area/hydroponics/garden) +"aTY" = (/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},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"aTZ" = (/obj/effect/landmark/start{name = "Gardener"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"aUa" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"aUb" = (/obj/machinery/door/morgue{dir = 2; name = "Private Study"; req_access = list(37)},/turf/simulated/floor/wood,/area/library) +"aUc" = (/obj/machinery/light{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aUd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) "aUe" = (/turf/simulated/wall,/area/storage/art) -"aUf" = (/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/storage/art) -"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) +"aUf" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera/network/civilian_east{c_tag = "Chapel South"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aUg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aUh" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "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/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) "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/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) +"aUl" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "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) +"aUn" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "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) "aUp" = (/turf/simulated/wall/r_wall,/area/bridge) -"aUq" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "red"; dir = 10},/area/bridge) -"aUr" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "red"},/area/bridge) -"aUs" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/turf/simulated/floor{icon_state = "red"},/area/bridge) -"aUt" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/secure/briefcase,/obj/item/device/gps,/obj/item/device/gps,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/bridge) -"aUu" = (/obj/machinery/computer/card,/turf/simulated/floor,/area/bridge) -"aUv" = (/obj/machinery/computer/communications,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/bridge) -"aUw" = (/obj/machinery/computer/station_alert/all,/turf/simulated/floor,/area/bridge) -"aUx" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/bridge) -"aUy" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/window/reinforced{dir = 4},/obj/item/device/aicard,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/bridge) -"aUz" = (/obj/machinery/computer/power_monitor,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/bridge) -"aUA" = (/obj/machinery/computer/rcon,/turf/simulated/floor{dir = 6; icon_state = "whitehall"},/area/bridge) +"aUq" = (/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/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aUr" = (/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aUs" = (/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},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) +"aUt" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) +"aUu" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aUv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aUw" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aUx" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aUy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aUz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) +"aUA" = (/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/tiled,/area/hallway/secondary/entry/starboard) "aUB" = (/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/primary/central_two) -"aUC" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/hallway/primary/central_two) +"aUC" = (/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/tiled,/area/hallway/secondary/entry/starboard) "aUD" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/hallway/primary/central_two) "aUE" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aUF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -2426,84 +2426,84 @@ "aUH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aUI" = (/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},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aUJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aUK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aUL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aUK" = (/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/tiled,/area/hallway/secondary/entry/starboard) +"aUL" = (/obj/structure/closet/wardrobe/mixed,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aUM" = (/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) -"aUN" = (/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) -"aUO" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aUP" = (/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) -"aUQ" = (/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) -"aUR" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aUS" = (/obj/structure/table/standard,/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) -"aUT" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aUU" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aUV" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) -"aUW" = (/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) -"aUX" = (/obj/effect/landmark/start{name = "Gardener"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hydroponics/garden) -"aUY" = (/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{dir = 1; icon_state = "green"},/area/hydroponics/garden) -"aUZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/hydroponics/garden) +"aUN" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aUO" = (/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/storage/art) +"aUP" = (/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/tiled,/area/storage/art) +"aUQ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/storage/art) +"aUR" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) +"aUS" = (/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/tiled,/area/storage/tools) +"aUT" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/tiled,/area/storage/tools) +"aUU" = (/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/tiled,/area/storage/tools) +"aUV" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/storage/tools) +"aUW" = (/obj/structure/bed/chair{dir = 1},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/bridge) +"aUX" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/bridge) +"aUY" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/bridge) +"aUZ" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/bridge) "aVa" = (/obj/structure/flora/ausbushes/brflowers,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/grass,/area/hydroponics/garden) "aVb" = (/obj/structure/flora/ausbushes/ppflowers,/turf/simulated/floor/grass,/area/hydroponics/garden) "aVc" = (/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) "aVd" = (/obj/structure/bookcase{name = "bookcase (Fiction)"},/turf/simulated/floor/wood,/area/library) "aVe" = (/obj/structure/bookcase{name = "bookcase (Non-Fiction)"},/turf/simulated/floor/wood,/area/library) "aVf" = (/obj/machinery/camera/network/civilian_east{c_tag = "Library Central"; dir = 8},/turf/simulated/floor/wood,/area/library) -"aVg" = (/obj/machinery/door/morgue{dir = 2; name = "Private Study"; req_access = list(37)},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library) -"aVh" = (/obj/machinery/light{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aVi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) +"aVg" = (/obj/structure/bed/chair{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/bridge) +"aVh" = (/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/bridge) +"aVi" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/bridge) "aVj" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/chapel/main) -"aVk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) -"aVl" = (/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) -"aVm" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 1; icon_state = "escape"},/area/hallway/secondary/exit) -"aVn" = (/turf/simulated/floor{dir = 1; icon_state = "escape"},/area/hallway/secondary/exit) -"aVo" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{dir = 1; icon_state = "escape"},/area/hallway/secondary/exit) -"aVp" = (/turf/simulated/floor,/area/hallway/secondary/exit) -"aVq" = (/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) +"aVk" = (/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/bridge) +"aVl" = (/obj/structure/bed/chair{dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/bridge) +"aVm" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/bridge) +"aVn" = (/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/bridge) +"aVo" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/marble,/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aVp" = (/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},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aVq" = (/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"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "aVr" = (/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) "aVs" = (/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)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "nuke_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) -"aVt" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/port) -"aVu" = (/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) +"aVt" = (/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/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aVu" = (/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/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "aVv" = (/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) -"aVw" = (/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry/port) -"aVx" = (/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry/port) -"aVy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/hallway/secondary/entry/port) -"aVz" = (/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/hallway/secondary/entry/port) -"aVA" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aVB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/secondary/entry/port) -"aVC" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aVD" = (/turf/simulated/floor,/area/hallway/secondary/entry/starboard) -"aVE" = (/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) -"aVF" = (/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) -"aVG" = (/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) -"aVH" = (/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) +"aVw" = (/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/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aVx" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/landmark/start{name = "Chef"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aVy" = (/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},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aVz" = (/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"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"aVA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aVB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/marble,/turf/simulated/floor/lino,/area/hydroponics/garden) +"aVC" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/lino,/area/hydroponics/garden) +"aVD" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hydroponics/garden) +"aVE" = (/obj/effect/landmark/start{name = "Gardener"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"aVF" = (/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"aVG" = (/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/tiled{icon_state = "dark"},/area/chapel/main) +"aVH" = (/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/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) "aVI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/locker) -"aVJ" = (/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) -"aVK" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/crew_quarters/locker) -"aVL" = (/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/storage/art) -"aVM" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/art) -"aVN" = (/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) +"aVJ" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aVK" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aVL" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aVM" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aVN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "aVO" = (/turf/simulated/wall,/area/storage/emergency2) "aVP" = (/obj/machinery/light_switch{pixel_y = 28},/obj/structure/closet/hydrant{pixel_x = -32},/turf/simulated/floor/plating,/area/storage/emergency2) "aVQ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/storage/emergency2) "aVR" = (/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) "aVS" = (/turf/simulated/floor/plating,/area/storage/emergency2) -"aVT" = (/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) -"aVU" = (/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) -"aVV" = (/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) -"aVW" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor,/area/storage/tools) -"aVX" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor,/area/storage/tools) +"aVT" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aVU" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aVV" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) +"aVW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Vacant Office"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aVX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/closet/wardrobe/white,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aVY" = (/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/primary/central_one) -"aVZ" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/bridge) -"aWa" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) -"aWb" = (/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) -"aWc" = (/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/bridge) -"aWd" = (/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/bridge) -"aWe" = (/obj/structure/bed/chair{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/bridge) -"aWf" = (/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/bridge) -"aWg" = (/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/bridge) -"aWh" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/bridge) -"aWi" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/bridge) -"aWj" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 5},/area/bridge) +"aVZ" = (/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aWa" = (/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aWb" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aWc" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aWd" = (/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,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aWe" = (/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/tiled,/area/crew_quarters/locker) +"aWf" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/turf/simulated/floor/tiled,/area/storage/art) +"aWg" = (/obj/structure/table/standard,/obj/item/device/camera_film,/obj/item/device/camera,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/storage/art) +"aWh" = (/obj/structure/table/standard,/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/tiled,/area/storage/art) +"aWi" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/tiled,/area/storage/tools) +"aWj" = (/turf/simulated/floor/tiled,/area/storage/tools) "aWk" = (/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_two) "aWl" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aWm" = (/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -2515,34 +2515,34 @@ "aWs" = (/obj/structure/table/woodentable,/obj/item/weapon/material/kitchen/utensil/fork,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aWt" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aWu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aWv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"aWw" = (/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) -"aWx" = (/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) -"aWy" = (/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) -"aWz" = (/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) -"aWA" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/landmark/start{name = "Chef"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aWB" = (/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) -"aWC" = (/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) -"aWD" = (/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) -"aWE" = (/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) -"aWF" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) -"aWG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) -"aWH" = (/obj/effect/landmark/start{name = "Gardener"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden) -"aWI" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hydroponics/garden) -"aWJ" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics/garden) +"aWv" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/storage/tools) +"aWw" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/cell_charger,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/storage/tools) +"aWx" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/computer/shuttle_control/mining,/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/bridge) +"aWy" = (/obj/machinery/camera/network/command{c_tag = "Bridge West"},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/bridge) +"aWz" = (/obj/machinery/computer/shuttle_control/research,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/bridge) +"aWA" = (/turf/simulated/floor/tiled,/area/bridge) +"aWB" = (/obj/item/device/radio/beacon,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/bridge) +"aWC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/bridge) +"aWD" = (/obj/structure/noticeboard{pixel_y = 27},/obj/machinery/camera/network/command{c_tag = "Bridge East"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/bridge) +"aWE" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/bridge) +"aWF" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/obj/machinery/modular_computer/console/preset/medical,/turf/simulated/floor/tiled,/area/bridge) +"aWG" = (/obj/machinery/computer/med_data,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/bridge) +"aWH" = (/obj/structure/table/marble,/turf/simulated/floor/lino,/area/crew_quarters/bar) +"aWI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aWJ" = (/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "aWK" = (/obj/structure/flora/bush,/turf/simulated/floor/grass,/area/hydroponics/garden) "aWL" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/hydroponics/garden) "aWM" = (/obj/structure/flora/ausbushes/sparsegrass,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden) "aWN" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/door/window/westright{name = "Library Desk Door"},/turf/simulated/floor/wood,/area/library) "aWO" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/library) "aWP" = (/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) -"aWQ" = (/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) -"aWR" = (/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) -"aWS" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aWT" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) -"aWU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/hallway/secondary/exit) -"aWV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/hallway/secondary/exit) -"aWW" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit) +"aWQ" = (/obj/item/weapon/material/kitchen/rollingpin,/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aWR" = (/obj/machinery/chemical_dispenser/bar_soft/full,/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aWS" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aWT" = (/obj/item/weapon/book/manual/chef_recipes,/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aWU" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aWV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/lino,/area/hydroponics/garden) +"aWW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hydroponics/garden) "aWX" = (/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/hallway/secondary/exit) "aWY" = (/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/exit) "aWZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/exit) @@ -2551,44 +2551,44 @@ "aXc" = (/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/secondary/entry/port) "aXd" = (/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/secondary/entry/port) "aXe" = (/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/port) -"aXf" = (/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) -"aXg" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/secondary/entry/port) +"aXf" = (/obj/effect/landmark/start{name = "Gardener"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"aXg" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) "aXh" = (/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,/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) "aXi" = (/obj/structure/grille,/obj/structure/window/reinforced,/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) "aXj" = (/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) -"aXk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Vacant Office"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/vacantoffice) +"aXk" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) "aXl" = (/turf/simulated/floor/plating,/area/maintenance/locker) "aXm" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/locker) -"aXn" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/closet/wardrobe/white,/turf/simulated/floor,/area/crew_quarters/locker) -"aXo" = (/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor,/area/crew_quarters/locker) -"aXp" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker) -"aXq" = (/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker) -"aXr" = (/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,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker) -"aXs" = (/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/locker) -"aXt" = (/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) -"aXu" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/turf/simulated/floor,/area/storage/art) -"aXv" = (/obj/structure/table/standard,/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) -"aXw" = (/obj/structure/table/standard,/obj/item/device/camera_film,/obj/item/device/camera,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/storage/art) +"aXn" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aXo" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aXp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aXq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aXr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aXs" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aXt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aXu" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aXv" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aXw" = (/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"},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (WEST)"; icon_state = "warningcee"; dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aXx" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/storage/emergency2) "aXy" = (/obj/machinery/light/small,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency2) "aXz" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency2) "aXA" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/storage/emergency2) -"aXB" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor,/area/storage/tools) -"aXC" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/steel,/turf/simulated/floor,/area/storage/tools) -"aXD" = (/turf/simulated/floor,/area/storage/tools) -"aXE" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/cell_charger,/obj/structure/table/steel,/turf/simulated/floor,/area/storage/tools) +"aXB" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "escape_dock_north_sensor"; pixel_x = 0; pixel_y = -25},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (EAST)"; icon_state = "warningcee"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"aXC" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"aXD" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"aXE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) "aXF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aXG" = (/turf/simulated/wall,/area/bridge) -"aXH" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/computer/shuttle_control/mining,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/bridge) -"aXI" = (/obj/machinery/computer/shuttle_control/research,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) -"aXJ" = (/obj/machinery/camera/network/command{c_tag = "Bridge West"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/bridge) -"aXK" = (/obj/item/device/radio/beacon,/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/bridge) -"aXL" = (/turf/simulated/floor,/area/bridge) -"aXM" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/bridge) -"aXN" = (/turf/simulated/floor{dir = 4; icon_state = "escapecorner"},/area/bridge) -"aXO" = (/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) -"aXP" = (/obj/machinery/computer/med_data,/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/bridge) -"aXQ" = (/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) +"aXH" = (/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aXI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aXJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aXK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aXL" = (/obj/structure/window/basic{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aXM" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/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/tiled,/area/security/vacantoffice) +"aXN" = (/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/tiled,/area/security/vacantoffice) +"aXO" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/requests_console{department = "Locker Room"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aXP" = (/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aXQ" = (/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,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aXR" = (/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) "aXS" = (/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) "aXT" = (/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) @@ -2597,19 +2597,19 @@ "aXW" = (/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) "aXX" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aXY" = (/obj/structure/table/woodentable,/obj/item/device/camera,/turf/simulated/floor/wood,/area/crew_quarters/bar) -"aXZ" = (/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) +"aXZ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aYa" = (/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) -"aYb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aYc" = (/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aYd" = (/obj/machinery/chemical_dispenser/bar_soft/full,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aYe" = (/obj/item/weapon/material/kitchen/rollingpin,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aYf" = (/obj/item/weapon/book/manual/chef_recipes,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aYg" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aYh" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"aYb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/storage/tools) +"aYc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/storage/tools) +"aYd" = (/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"},/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aYe" = (/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"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/bridge) +"aYf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/bridge) +"aYg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/bridge) +"aYh" = (/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/tiled,/area/bridge) "aYi" = (/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/hydroponics/garden) -"aYj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) -"aYk" = (/obj/effect/landmark/start{name = "Gardener"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden) -"aYl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hydroponics/garden) +"aYj" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aYk" = (/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/tiled,/area/bridge) +"aYl" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) "aYm" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden) "aYn" = (/obj/structure/flora/ausbushes/sunnybush,/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/floor/grass,/area/hydroponics/garden) "aYo" = (/obj/structure/bookcase{name = "bookcase (Adult)"},/turf/simulated/floor/wood,/area/library) @@ -2617,77 +2617,77 @@ "aYq" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/wood,/area/library) "aYr" = (/obj/effect/landmark/start{name = "Librarian"},/obj/structure/bed/chair/office/dark,/turf/simulated/floor/wood,/area/library) "aYs" = (/obj/item/device/radio/intercom{pixel_x = 28},/obj/machinery/libraryscanner,/turf/simulated/floor/wood,/area/library) -"aYt" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) -"aYu" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) -"aYv" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) -"aYw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) -"aYx" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"aYy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) +"aYt" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aYu" = (/obj/structure/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aYv" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aYw" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aYx" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aYy" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) "aYz" = (/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) -"aYA" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) -"aYB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/hallway/secondary/exit) -"aYC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/secondary/exit) -"aYD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor,/area/hallway/secondary/exit) -"aYE" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; 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) +"aYA" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aYB" = (/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/tiled,/area/bridge) +"aYC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/bridge) +"aYD" = (/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/tiled,/area/bridge) +"aYE" = (/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"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/bridge) "aYF" = (/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) -"aYG" = (/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) -"aYH" = (/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) +"aYG" = (/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"},/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aYH" = (/obj/machinery/camera/network/exodus{c_tag = "Bridge East Entrance"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aYI" = (/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},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "aYJ" = (/turf/space,/area/shuttle/transport1/station) "aYK" = (/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) -"aYL" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/aft) -"aYM" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry/aft) -"aYN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"aYL" = (/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"aYM" = (/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/weapon/packageWrap,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aYN" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "aYO" = (/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,/obj/machinery/door/blast/shutters{dir = 8; id = "office_shutter"; layer = 3.1; name = "Office Shutters"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/starboard) -"aYP" = (/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice) -"aYQ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/security/vacantoffice) -"aYR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice) -"aYS" = (/obj/structure/window/basic{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice) -"aYT" = (/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) -"aYU" = (/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) -"aYV" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/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) +"aYP" = (/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aYQ" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"aYR" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aYS" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aYT" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aYU" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel,/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"aYV" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) "aYW" = (/turf/simulated/wall,/area/security/vacantoffice) -"aYX" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/reinforced,/obj/item/weapon/material/ashtray/plastic{pixel_x = 4; pixel_y = 6},/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice) +"aYX" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "aYY" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/turf/simulated/floor/plating,/area/maintenance/arrivals) -"aYZ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/hidden/cyan,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/arrivals) +"aYZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "aZa" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/locker) -"aZb" = (/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) -"aZc" = (/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker) -"aZd" = (/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,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker) -"aZe" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/crew_quarters/locker) -"aZf" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/storage/tools) -"aZg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/tools) -"aZh" = (/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{dir = 5; icon_state = "blue"},/area/hallway/primary/central_one) +"aZb" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aZc" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"aZd" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"aZe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"aZf" = (/obj/structure/bed/chair/office/light{dir = 8},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aZg" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aZh" = (/turf/simulated/floor/tiled,/area/security/vacantoffice) "aZi" = (/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/bridge) -"aZj" = (/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) -"aZk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/bridge) -"aZl" = (/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) -"aZm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/bridge) -"aZn" = (/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) -"aZo" = (/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) -"aZp" = (/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) -"aZq" = (/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) -"aZr" = (/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) -"aZs" = (/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) -"aZt" = (/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) -"aZu" = (/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) -"aZv" = (/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) -"aZw" = (/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) -"aZx" = (/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) -"aZy" = (/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) -"aZz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/bridge) -"aZA" = (/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) -"aZB" = (/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) -"aZC" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_two) -"aZD" = (/obj/machinery/camera/network/exodus{c_tag = "Bridge East Entrance"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_two) +"aZj" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aZk" = (/obj/structure/window/basic{dir = 4},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aZl" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/table/standard,/obj/item/weapon/stamp,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aZm" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"aZn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aZo" = (/obj/structure/closet/wardrobe/black,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aZp" = (/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/tiled,/area/crew_quarters/locker) +"aZq" = (/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/tiled,/area/crew_quarters/locker) +"aZr" = (/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/tiled,/area/crew_quarters/locker) +"aZs" = (/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/tiled,/area/crew_quarters/locker) +"aZt" = (/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/tiled,/area/crew_quarters/locker) +"aZu" = (/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/tiled,/area/crew_quarters/locker) +"aZv" = (/obj/structure/closet/secure_closet/personal,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"aZw" = (/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/tiled,/area/crew_quarters/locker) +"aZx" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/storage/tools) +"aZy" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/storage/tools) +"aZz" = (/obj/structure/closet/toolcloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) +"aZA" = (/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/tiled,/area/storage/tools) +"aZB" = (/obj/structure/closet/toolcloset,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/storage/tools) +"aZC" = (/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/tiled,/area/hallway/primary/central_one) +"aZD" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aZE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZF" = (/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) "aZG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/kitchen) -"aZH" = (/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/weapon/packageWrap,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aZI" = (/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aZJ" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) -"aZK" = (/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aZL" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) +"aZH" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aZI" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aZJ" = (/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"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/bridge) +"aZK" = (/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/tiled,/area/bridge) +"aZL" = (/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/tiled,/area/bridge) "aZM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hydroponics/garden) "aZN" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/grass,/area/hydroponics/garden) "aZO" = (/obj/structure/flora/ausbushes/brflowers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden) @@ -2701,45 +2701,45 @@ "aZW" = (/obj/structure/table/woodentable,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/item/weapon/pen/blue{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/wood,/area/library) "aZX" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/library) "aZY" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/wood,/area/library) -"aZZ" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"baa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) -"bab" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) -"bac" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) +"aZZ" = (/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/tiled,/area/bridge) +"baa" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/bridge) +"bab" = (/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/tiled,/area/bridge) +"bac" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/item/device/multitool,/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/bridge) "bad" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/chapel/main) -"bae" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) -"baf" = (/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) -"bag" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/hallway/secondary/exit) -"bah" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit) +"bae" = (/obj/structure/table/reinforced,/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"},/obj/item/weapon/storage/box/donut,/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/tiled,/area/bridge) +"baf" = (/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/tiled,/area/bridge) +"bag" = (/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/tiled,/area/bridge) +"bah" = (/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/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/bridge) "bai" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/exit) "baj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bak" = (/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/exit) "bal" = (/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{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bam" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "ban" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) -"bao" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/aft) -"bap" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"bao" = (/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/tiled,/area/bridge) +"bap" = (/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"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "baq" = (/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) -"bar" = (/obj/structure/bed/chair/office/light{dir = 8},/turf/simulated/floor,/area/security/vacantoffice) -"bas" = (/turf/simulated/floor,/area/security/vacantoffice) -"bat" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor,/area/security/vacantoffice) -"bau" = (/obj/structure/window/basic{dir = 4},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice) -"bav" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/security/vacantoffice) -"baw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/security/vacantoffice) -"bax" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/table/standard,/obj/item/weapon/stamp,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/item/weapon/pen,/turf/simulated/floor,/area/security/vacantoffice) -"bay" = (/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/bar) -"baz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/bar) +"bar" = (/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/tiled,/area/bridge) +"bas" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bat" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bau" = (/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/tiled,/area/hallway/primary/central_two) +"bav" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"baw" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bax" = (/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/structure/table/marble,/turf/simulated/floor/lino,/area/crew_quarters/bar) +"bay" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"baz" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "baA" = (/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) "baB" = (/turf/simulated/wall,/area/maintenance/locker) -"baC" = (/obj/structure/closet/wardrobe/black,/turf/simulated/floor,/area/crew_quarters/locker) -"baD" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/crew_quarters/locker) -"baE" = (/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) -"baF" = (/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) -"baG" = (/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) -"baH" = (/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) -"baI" = (/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) -"baJ" = (/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) -"baK" = (/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,/area/crew_quarters/locker) -"baL" = (/obj/structure/closet/secure_closet/personal,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/crew_quarters/locker) +"baC" = (/obj/effect/landmark/start{name = "Chef"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"baD" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"baE" = (/obj/item/weapon/material/hatchet,/obj/item/weapon/material/minihoe,/obj/structure/table/marble,/turf/simulated/floor/lino,/area/hydroponics/garden) +"baF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/turf/simulated/floor/lino,/area/hydroponics/garden) +"baG" = (/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"baH" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; sortType = "Library"; name = "Library"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"baI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"baJ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"baK" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"baL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) "baM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/decal/cleanable/blood/oil,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/locker) "baN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/locker) "baO" = (/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/locker) @@ -2748,80 +2748,80 @@ "baR" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/locker) "baS" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/locker) "baT" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/locker) -"baU" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/storage/tools) -"baV" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/storage/tools) -"baW" = (/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) -"baX" = (/obj/structure/closet/toolcloset,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/storage/tools) -"baY" = (/obj/structure/closet/toolcloset,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/storage/tools) +"baU" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"baV" = (/obj/effect/floor_decal/chapel,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"baW" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"baX" = (/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/camera/network/exodus{c_tag = "Departures West"; dir = 4},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"baY" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "baZ" = (/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_one) -"bba" = (/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,/area/hallway/primary/central_one) -"bbb" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_one) -"bbc" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/primary/central_one) -"bbd" = (/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) -"bbe" = (/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) -"bbf" = (/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) -"bbg" = (/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) -"bbh" = (/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) -"bbi" = (/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) -"bbj" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge) -"bbk" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/item/device/multitool,/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/bridge) +"bba" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bbb" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bbc" = (/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/tiled,/area/hallway/secondary/entry/aft) +"bbd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"bbe" = (/obj/structure/table/standard,/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/tiled,/area/security/vacantoffice) +"bbf" = (/obj/structure/table/rack{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/locker) +"bbg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) +"bbh" = (/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/tiled,/area/crew_quarters/locker/locker_toilet) +"bbi" = (/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/tiled,/area/crew_quarters/locker) +"bbj" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bbk" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "bbl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/bridge) -"bbm" = (/obj/structure/table/reinforced,/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"},/obj/item/weapon/storage/box/donut,/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/bridge) -"bbn" = (/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) -"bbo" = (/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) -"bbp" = (/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) -"bbq" = (/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/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/bridge) -"bbr" = (/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) -"bbs" = (/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) -"bbt" = (/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) -"bbu" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) -"bbv" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/central_two) -"bbw" = (/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,/area/hallway/primary/central_two) -"bbx" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two) +"bbm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bbn" = (/obj/structure/closet/secure_closet/personal,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bbo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bbp" = (/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/tiled,/area/hallway/primary/central_one) +"bbq" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bbr" = (/obj/machinery/light,/obj/machinery/camera/network/exodus{c_tag = "Bridge West Entrance"; dir = 1},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bbs" = (/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bbt" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bbu" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bbv" = (/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/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/bridge) +"bbw" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"bbx" = (/obj/machinery/computer/guestpass{pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/bridge) "bby" = (/obj/structure/table/woodentable,/obj/item/weapon/flame/candle,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bbz" = (/obj/structure/disposalpipe/segment,/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bbA" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bbB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bbC" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bbD" = (/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar) -"bbE" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bbF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bbG" = (/obj/effect/landmark/start{name = "Chef"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"bbH" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) +"bbD" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"bbE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/space) +"bbF" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"bbG" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"bbH" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bbI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hydroponics/garden) -"bbJ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) -"bbK" = (/obj/item/weapon/material/hatchet,/obj/item/weapon/material/minihoe,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden) -"bbL" = (/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden) +"bbJ" = (/obj/machinery/light,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bbK" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bbL" = (/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/tiled,/area/hallway/primary/central_two) "bbM" = (/obj/structure/flora/ausbushes/fernybush,/turf/simulated/floor/grass,/area/hydroponics/garden) "bbN" = (/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) -"bbO" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; sortType = "Library"; name = "Library"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/starboard) -"bbP" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) +"bbO" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bbP" = (/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},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "bbQ" = (/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) "bbR" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet,/area/library) "bbS" = (/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) -"bbT" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"bbU" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"bbV" = (/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) -"bbW" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/exit) -"bbX" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/hallway/secondary/exit) +"bbT" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"bbU" = (/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/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"bbV" = (/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"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"bbW" = (/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)},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"bbX" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "bbY" = (/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) "bbZ" = (/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)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bca" = (/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"},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bcb" = (/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) -"bcc" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; 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) -"bcd" = (/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) -"bce" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/vacantoffice) -"bcf" = (/obj/structure/table/standard,/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) -"bcg" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/bar) -"bch" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/bar) +"bcc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"bcd" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/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/machinery/smartfridge/drying_rack,/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"bce" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/hydroponics/garden) +"bcf" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/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/tiled,/area/hallway/primary/starboard) +"bcg" = (/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/tiled,/area/hallway/primary/starboard) +"bch" = (/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/tiled,/area/hallway/primary/starboard) "bci" = (/turf/simulated/wall,/area/crew_quarters/locker/locker_toilet) -"bcj" = (/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) -"bck" = (/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) -"bcl" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/locker) -"bcm" = (/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) -"bcn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/crew_quarters/locker) -"bco" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/crew_quarters/locker) -"bcp" = (/obj/structure/closet/secure_closet/personal,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/locker) +"bcj" = (/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/tiled{icon_state = "dark"},/area/chapel/main) +"bck" = (/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"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"bcl" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"bcm" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/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/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"bcn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/chapel,/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"bco" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"bcp" = (/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/tiled{icon_state = "dark"},/area/chapel/main) "bcq" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/locker) "bcr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/locker) "bcs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/locker) @@ -2832,78 +2832,78 @@ "bcx" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/locker) "bcy" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/storage/tools) "bcz" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/storage/tools) -"bcA" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor,/area/hallway/primary/central_one) -"bcB" = (/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) -"bcC" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) -"bcD" = (/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) -"bcE" = (/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) -"bcF" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/hallway/primary/central_one) +"bcA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"bcB" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bcC" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bcD" = (/obj/machinery/camera/network/exodus{c_tag = "Departures East"; dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bcE" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bcF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) "bcG" = (/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) -"bcH" = (/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) -"bcI" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"bcJ" = (/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) -"bcK" = (/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) -"bcL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "catwalk12"},/area/space) -"bcM" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) -"bcN" = (/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) -"bcO" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/hallway/primary/central_two) -"bcP" = (/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) -"bcQ" = (/obj/machinery/light,/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/central_two) -"bcR" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"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_two) +"bcH" = (/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"bcI" = (/obj/structure/window/basic{dir = 4},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"bcJ" = (/obj/machinery/photocopier,/turf/simulated/floor/tiled,/area/security/vacantoffice) +"bcK" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/tank/air{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) +"bcL" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) +"bcM" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bcN" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bcO" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bcP" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bcQ" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bcR" = (/obj/structure/table/standard,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bcS" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/wardrobe/suit,/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "bcT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bcU" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bcV" = (/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) -"bcW" = (/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) -"bcX" = (/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) -"bcY" = (/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) -"bcZ" = (/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) -"bda" = (/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) -"bdb" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/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/machinery/smartfridge/drying_rack,/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hydroponics/garden) -"bdc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics/garden) -"bdd" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hydroponics/garden) +"bcV" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bcW" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bcX" = (/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/tiled,/area/crew_quarters/locker) +"bcY" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bcZ" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/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/tiled,/area/hallway/primary/central_one) +"bda" = (/obj/machinery/atm{pixel_x = -32},/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bdb" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bdc" = (/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/tiled{icon_state = "white"},/area/hallway/primary/starboard) +"bdd" = (/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/tiled{icon_state = "white"},/area/hallway/primary/starboard) "bde" = (/obj/structure/flora/ausbushes,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden) -"bdf" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/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,/area/hallway/primary/starboard) -"bdg" = (/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) -"bdh" = (/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) +"bdf" = (/turf/simulated/floor/tiled,/area/hydroponics/garden) +"bdg" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"bdh" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden) "bdi" = (/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) "bdj" = (/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/library) "bdk" = (/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},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/library) "bdl" = (/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{dir = 1},/turf/simulated/floor/carpet,/area/library) "bdm" = (/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/library) -"bdn" = (/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"},/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/main) -"bdo" = (/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{icon_state = "dark"},/area/chapel/main) -"bdp" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/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/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) -"bdq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) +"bdn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hydroponics/garden) +"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/tiled,/area/hallway/primary/starboard) +"bdp" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bdq" = (/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bdr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/chapel/main) -"bds" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main) -"bdt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main) -"bdu" = (/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 = "dark"},/area/chapel/main) -"bdv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main) -"bdw" = (/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) -"bdx" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) -"bdy" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hallway/secondary/exit) -"bdz" = (/obj/machinery/camera/network/exodus{c_tag = "Departures East"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit) +"bds" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/chapel{tag = "icon-chapel (WEST)"; icon_state = "chapel"; dir = 8},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"bdt" = (/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/turf/simulated/floor/tiled{icon_state = "dark"},/area/chapel/main) +"bdu" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bdv" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bdw" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bdx" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bdy" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (WEST)"; icon_state = "warningcee"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bdz" = (/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/tiled,/area/hallway/secondary/entry/aft) "bdA" = (/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) "bdB" = (/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) -"bdC" = (/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) -"bdD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"bdE" = (/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor,/area/security/vacantoffice) -"bdF" = (/obj/structure/window/basic{dir = 4},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice) -"bdG" = (/obj/machinery/photocopier,/turf/simulated/floor,/area/security/vacantoffice) +"bdC" = (/obj/item/weapon/folder/yellow,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"bdD" = (/obj/machinery/newscaster{pixel_y = -32},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/security/vacantoffice) +"bdE" = (/obj/machinery/firealarm{dir = 2; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/tiled,/area/security/vacantoffice) +"bdF" = (/obj/structure/filingcabinet,/turf/simulated/floor/tiled,/area/security/vacantoffice) +"bdG" = (/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/tiled,/area/security/vacantoffice) "bdH" = (/obj/machinery/atmospherics/binary/passive_gate,/turf/simulated/floor/plating,/area/maintenance/arrivals) "bdI" = (/obj/machinery/atmospherics/binary/pump/high_power/on{tag = "icon-map_on (NORTH)"; icon_state = "map_on"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/arrivals) -"bdJ" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bdK" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bdL" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bdM" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bdN" = (/obj/structure/table/standard,/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) -"bdO" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) -"bdP" = (/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) -"bdQ" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) -"bdR" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) -"bdS" = (/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) -"bdT" = (/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) +"bdJ" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) +"bdK" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/locker) +"bdL" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bdM" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bdN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bdO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bdP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bdQ" = (/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},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bdR" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bdS" = (/obj/effect/large_stock_marker,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bdT" = (/obj/structure/closet/crate/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) "bdU" = (/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) "bdV" = (/turf/simulated/wall,/area/quartermaster/storage) "bdW" = (/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) @@ -2911,9 +2911,9 @@ "bdY" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/turf/simulated/floor/plating,/area/quartermaster/office) "bdZ" = (/obj/machinery/conveyor{dir = 4; id = "packageSort2"},/obj/structure/plasticflaps{opacity = 0},/turf/simulated/floor/plating,/area/quartermaster/office) "bea" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/simulated/floor/plating,/area/quartermaster/office) -"beb" = (/obj/machinery/atm{pixel_x = -32},/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/turf/simulated/floor,/area/hallway/primary/central_one) -"bec" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/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) -"bed" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) +"beb" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bec" = (/obj/item/weapon/stool,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bed" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort2"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) "bee" = (/turf/simulated/wall/r_wall,/area/bridge/meeting_room) "bef" = (/turf/simulated/wall,/area/bridge/meeting_room) "beg" = (/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) @@ -2931,16 +2931,16 @@ "bes" = (/obj/item/device/radio/intercom{pixel_y = -30},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bet" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/bar) "beu" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bev" = (/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) -"bew" = (/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) -"bex" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden) -"bey" = (/turf/simulated/floor,/area/hydroponics/garden) -"bez" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hydroponics/garden) -"beA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hydroponics/garden) +"bev" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bew" = (/obj/machinery/modular_computer/console/preset/research,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bex" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/modular_computer/console/preset/security,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bey" = (/obj/machinery/door/firedoor/border_only,/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/tiled,/area/hallway/primary/central_two) +"bez" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"beA" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "beB" = (/obj/structure/flora/grass/brown,/turf/simulated/floor/grass,/area/hydroponics/garden) -"beC" = (/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,/area/hallway/primary/starboard) -"beD" = (/turf/simulated/floor,/area/hallway/primary/starboard) -"beE" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor,/area/hallway/primary/starboard) +"beC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beD" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Diner"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beE" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "beF" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/library) "beG" = (/obj/structure/bed/chair/comfy/black{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/wood,/area/library) "beH" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/turf/simulated/floor/wood,/area/library) @@ -2948,38 +2948,38 @@ "beJ" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/wood,/area/library) "beK" = (/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) "beL" = (/obj/structure/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/library) -"beM" = (/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main) -"beN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) -"beO" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/chapel/main) -"beP" = (/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main) -"beQ" = (/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) -"beR" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/hallway/secondary/exit) -"beS" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/exit) +"beM" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beO" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beP" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central West"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beQ" = (/obj/machinery/computer/guestpass{pixel_y = 28},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beR" = (/obj/machinery/door/airlock/glass{name = "Garden"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beS" = (/obj/machinery/door/airlock/glass{name = "Garden"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "beT" = (/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) -"beU" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry/aft) -"beV" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry/aft) -"beW" = (/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) +"beU" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"beV" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Chapel"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/primary/starboard) +"beW" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Chapel"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/primary/starboard) "beX" = (/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) -"beY" = (/obj/item/weapon/folder/yellow,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice) -"beZ" = (/obj/machinery/firealarm{dir = 2; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor,/area/security/vacantoffice) -"bfa" = (/obj/machinery/newscaster{pixel_y = -32},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice) -"bfb" = (/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) -"bfc" = (/obj/structure/filingcabinet,/turf/simulated/floor,/area/security/vacantoffice) -"bfd" = (/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/bar) -"bfe" = (/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) -"bff" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bfg" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bfh" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) -"bfi" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) -"bfj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/locker) -"bfk" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bfl" = (/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{icon_state = "floorgrime"},/area/quartermaster/storage) -"bfm" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bfn" = (/obj/effect/large_stock_marker,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"beY" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"beZ" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bfa" = (/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/tiled,/area/hallway/secondary/entry/aft) +"bfb" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bfc" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bfd" = (/obj/machinery/washing_machine,/obj/machinery/light,/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bfe" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bff" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bfg" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bfh" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bfi" = (/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bfj" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bfk" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bfl" = (/turf/simulated/floor/tiled,/area/quartermaster/office) +"bfm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bfn" = (/obj/structure/table/standard,/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_y = 30},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) "bfo" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor/plating,/area/quartermaster/office) -"bfp" = (/obj/item/weapon/stool,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/quartermaster/office) -"bfq" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/quartermaster/office) -"bfr" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/quartermaster/office) +"bfp" = (/obj/item/weapon/storage/box,/obj/structure/table/standard,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bfq" = (/obj/structure/table/standard,/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,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue/diagonal,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bfr" = (/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/tiled,/area/hallway/primary/central_one) "bfs" = (/turf/simulated/wall,/area/quartermaster/office) "bft" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bfu" = (/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) @@ -2993,7 +2993,7 @@ "bfC" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "bfD" = (/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) "bfE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bfF" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bfF" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "bfG" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bfH" = (/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) "bfI" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -3002,33 +3002,33 @@ "bfL" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bfM" = (/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/wood,/area/crew_quarters/captain) "bfN" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bfO" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"bfP" = (/obj/machinery/door/firedoor/border_only,/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) -"bfQ" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/central_two) -"bfR" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor,/area/hallway/primary/starboard) +"bfO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/papershredder,/turf/simulated/floor/wood,/area/bridge/meeting_room) +"bfP" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai) +"bfQ" = (/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai) +"bfR" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Dorm"; location = "HOP2"},/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/tiled,/area/hallway/primary/central_two) "bfS" = (/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/starboard) -"bfT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Diner"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/starboard) +"bfT" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bfU" = (/obj/structure/sign/double/barsign,/turf/simulated/wall,/area/hallway/primary/starboard) "bfV" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/hallway/primary/starboard) -"bfW" = (/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 = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bfX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bfY" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bfZ" = (/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bga" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central West"},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bgb" = (/obj/machinery/computer/guestpass{pixel_y = 28},/turf/simulated/floor{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard) +"bfW" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/science{dir = 4; icon_state = "direction_sci"; pixel_y = 40; tag = "icon-direction_sci (EAST)"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bfX" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bfY" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bfZ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bga" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgb" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bgc" = (/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) -"bgd" = (/obj/machinery/door/airlock/glass{name = "Garden"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/starboard) -"bge" = (/obj/machinery/door/airlock/glass{name = "Garden"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/primary/starboard) +"bgd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bge" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bgf" = (/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/starboard) "bgg" = (/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/starboard) "bgh" = (/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/primary/starboard) -"bgi" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/hallway/primary/starboard) +"bgi" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bgj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/starboard) "bgk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/starboard) -"bgl" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Chapel"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/starboard) +"bgl" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bgm" = (/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/hallway/primary/starboard) -"bgn" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Chapel"},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/starboard) -"bgo" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit) +"bgn" = (/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/tiled,/area/hallway/primary/starboard) +"bgo" = (/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/tiled,/area/hallway/primary/starboard) "bgp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bgq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bgr" = (/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/aft) @@ -3036,26 +3036,26 @@ "bgt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bgu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bgv" = (/turf/simulated/wall,/area/hallway/secondary/entry/aft) -"bgw" = (/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) -"bgx" = (/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) +"bgw" = (/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/medical{dir = 8; icon_state = "direction_med"; pixel_x = 0; pixel_y = 32; tag = "icon-direction_med (WEST)"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgx" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bgy" = (/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) "bgz" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/locker) "bgA" = (/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) -"bgB" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bgC" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bgD" = (/obj/machinery/washing_machine,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) -"bgE" = (/obj/machinery/washing_machine,/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker) -"bgF" = (/obj/structure/closet/crate/medical,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bgG" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bgH" = (/obj/structure/closet/crate,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bgI" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/office) -"bgJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/quartermaster/office) -"bgK" = (/turf/simulated/floor,/area/quartermaster/office) -"bgL" = (/obj/item/weapon/storage/box,/obj/structure/table/standard,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{icon_state = "arrival"; dir = 1},/area/quartermaster/office) -"bgM" = (/obj/structure/table/standard,/obj/item/weapon/wrapping_paper,/obj/item/weapon/wrapping_paper,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_y = 30},/turf/simulated/floor{icon_state = "arrival"; dir = 1},/area/quartermaster/office) -"bgN" = (/obj/structure/table/standard,/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) -"bgO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_one) -"bgP" = (/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) +"bgB" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgC" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgD" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgE" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgF" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - East"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgG" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgJ" = (/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"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bgK" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bgL" = (/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 = 26; pixel_y = -26; req_one_access = list(13)},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bgM" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bgN" = (/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"},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (WEST)"; icon_state = "warningcee"; dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"bgO" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "escape_dock_south_sensor"; pixel_x = 0; pixel_y = 25},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (EAST)"; icon_state = "warningcee"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/exit) +"bgP" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) "bgQ" = (/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) "bgR" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Bridge"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bgS" = (/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -3063,13 +3063,13 @@ "bgU" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bgV" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bgW" = (/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) -"bgX" = (/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) +"bgX" = (/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/tiled,/area/hallway/secondary/entry/aft) "bgY" = (/obj/machinery/light/small{dir = 8},/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bgZ" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) +"bgZ" = (/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,/area/maintenance/locker) "bha" = (/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) "bhb" = (/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) "bhc" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bhd" = (/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) +"bhd" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) "bhe" = (/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) "bhf" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bhg" = (/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) @@ -3078,68 +3078,68 @@ "bhj" = (/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) "bhk" = (/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) "bhl" = (/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) -"bhm" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bhn" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"bho" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=Dorm"; location = "HOP2"},/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_two) -"bhp" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = 32; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/science{dir = 4; icon_state = "direction_sci"; pixel_y = 40; tag = "icon-direction_sci (EAST)"},/turf/simulated/floor,/area/hallway/primary/central_two) -"bhq" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhr" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhs" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/hallway/primary/starboard) -"bht" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/starboard) -"bhu" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/starboard) -"bhw" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/hallway/primary/starboard) -"bhz" = (/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/starboard) -"bhA" = (/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,/area/hallway/primary/starboard) -"bhB" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhC" = (/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/medical{dir = 8; icon_state = "direction_med"; pixel_x = 0; pixel_y = 32; tag = "icon-direction_med (WEST)"},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhD" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhE" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhF" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhG" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhH" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhI" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - East"},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/starboard) -"bhK" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/hallway/primary/starboard) -"bhL" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/starboard) -"bhM" = (/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) -"bhN" = (/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/hallway/secondary/exit) -"bhO" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor,/area/hallway/secondary/exit) -"bhP" = (/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 = 26; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor,/area/hallway/secondary/exit) +"bhm" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/machinery/light,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bhn" = (/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/tiled,/area/crew_quarters/locker) +"bho" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"bhp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bhq" = (/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"},/obj/structure/closet/crate,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bhr" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/closet/crate/freezer,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bhs" = (/obj/machinery/light/small{dir = 4},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bht" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort1"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bhu" = (/obj/structure/table/standard,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bhv" = (/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/tiled,/area/hallway/primary/central_one) +"bhw" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai) +"bhx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/papershredder,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bhy" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{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/tiled,/area/hallway/primary/central_two) +"bhz" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bhA" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bhB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bhC" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhD" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhF" = (/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/tiled,/area/hallway/primary/starboard) +"bhG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhH" = (/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/tiled,/area/hallway/primary/starboard) +"bhI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhJ" = (/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/tiled,/area/hallway/primary/starboard) +"bhK" = (/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/tiled,/area/hallway/primary/starboard) +"bhL" = (/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/tiled,/area/hallway/primary/starboard) +"bhM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhO" = (/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 = 5},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhP" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/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/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bhQ" = (/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) -"bhR" = (/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) -"bhS" = (/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) +"bhR" = (/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,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/tiled,/area/hallway/primary/starboard) "bhT" = (/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},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "escape_dock_south_airlock"; name = "exterior access button"; pixel_x = 4; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/exit) "bhU" = (/turf/space,/area/shuttle/specops/station) "bhV" = (/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) -"bhW" = (/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) -"bhX" = (/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) +"bhW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bhX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bhY" = (/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/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bhZ" = (/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) -"bia" = (/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) -"bib" = (/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) -"bic" = (/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) +"bia" = (/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,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bib" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=HOP2"; location = "Stbd"},/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/tiled,/area/hallway/primary/starboard) +"bic" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/tiled,/area/hallway/secondary/exit) "bid" = (/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) "bie" = (/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) "bif" = (/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) "big" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall,/area/maintenance/locker) "bih" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/plating,/area/maintenance/locker) "bii" = (/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) -"bij" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bik" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/machinery/light,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker) -"bil" = (/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) -"bim" = (/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) +"bij" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/tiled,/area/hallway/primary/starboard) +"bik" = (/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/tiled,/area/hallway/secondary/exit) +"bil" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bim" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/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 = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "bin" = (/obj/item/weapon/cigbutt,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/locker) "bio" = (/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) -"bip" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/rack{dir = 8; layer = 2.9},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"bip" = (/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/tiled,/area/hallway/secondary/entry/aft) "biq" = (/obj/structure/flora/pottedplant/random,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bir" = (/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"},/obj/structure/closet/crate,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bis" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bit" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort1"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/office) -"biu" = (/obj/structure/table/standard,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) -"biv" = (/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,/area/hallway/primary/central_one) +"bir" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bis" = (/obj/machinery/door/airlock{name = "Unit 3"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bit" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/large_stock_marker,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"biu" = (/turf/simulated/floor/tiled,/area/quartermaster/storage) +"biv" = (/obj/structure/closet/crate/internals,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) "biw" = (/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) "bix" = (/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) "biy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -3150,7 +3150,7 @@ "biD" = (/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) "biE" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/wood,/area/bridge/meeting_room) "biF" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"biG" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) +"biG" = (/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Warehouse"; dir = 8},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/quartermaster/storage) "biH" = (/turf/simulated/wall,/area/turret_protected/ai) "biI" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/wall,/area/turret_protected/ai) "biJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) @@ -3161,56 +3161,56 @@ "biO" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "biP" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "biQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"biR" = (/obj/machinery/light/small{dir = 4},/obj/structure/table/steel,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"biS" = (/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) -"biT" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{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/central_two) -"biU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/hallway/primary/central_two) -"biV" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/hallway/primary/central_two) -"biW" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/hallway/primary/starboard) -"biX" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/hallway/primary/starboard) -"biY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/hallway/primary/starboard) -"biZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/hallway/primary/starboard) -"bja" = (/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/hallway/primary/starboard) -"bjb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/hallway/primary/starboard) -"bjc" = (/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/hallway/primary/starboard) -"bjd" = (/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/starboard) -"bje" = (/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/hallway/primary/starboard) -"bjf" = (/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/hallway/primary/starboard) -"bjg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/hallway/primary/starboard) -"bjh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/hallway/primary/starboard) -"bji" = (/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 = 5},/turf/simulated/floor,/area/hallway/primary/starboard) -"bjj" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/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/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) -"bjk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/hallway/primary/starboard) -"bjl" = (/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,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/starboard) -"bjm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/hallway/primary/starboard) -"bjn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/hallway/primary/starboard) -"bjo" = (/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,/turf/simulated/floor,/area/hallway/primary/starboard) -"bjp" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=HOP2"; location = "Stbd"},/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/starboard) -"bjq" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/starboard) -"bjr" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/secondary/exit) -"bjs" = (/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/secondary/exit) -"bjt" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/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 = 4},/turf/simulated/floor,/area/hallway/secondary/exit) -"bju" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/hallway/secondary/exit) +"biR" = (/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/tiled,/area/quartermaster/office) +"biS" = (/obj/structure/filingcabinet/filingcabinet,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/quartermaster/office) +"biT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"biU" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 20},/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1343; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{broadcasting = 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) +"biV" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai) +"biW" = (/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1343; name = "Private Channel"; pixel_x = 28; pixel_y = 5},/obj/item/device/radio/intercom{listening = 0; name = "Custom Channel"; pixel_x = -27; pixel_y = 4},/obj/effect/landmark/start{name = "AI"},/obj/item/device/radio/intercom{broadcasting = 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) +"biX" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 19},/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1343; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{broadcasting = 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) +"biY" = (/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/tiled,/area/hallway/primary/central_two) +"biZ" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - East"; dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bja" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bjb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bjc" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjd" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bje" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bji" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjk" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - West"; dir = 1},/obj/effect/floor_decal/corner/paleblue,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjl" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjm" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjn" = (/obj/machinery/light,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjo" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjp" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjq" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjr" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjs" = (/obj/machinery/light,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjt" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bju" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bjv" = (/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/hallway/secondary/exit) "bjw" = (/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/secondary/entry/aft) -"bjx" = (/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) +"bjx" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bjy" = (/turf/simulated/wall,/area/maintenance/disposal) "bjz" = (/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) "bjA" = (/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/plating,/area/maintenance/locker) "bjB" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "bjC" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/locker) "bjD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/locker) -"bjE" = (/obj/machinery/door/airlock{name = "Unit 3"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bjF" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) +"bjE" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjF" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central"; dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bjG" = (/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) "bjH" = (/obj/structure/disposalpipe/tagger/partial{name = "Sorting Office"; sort_tag = "Sorting Office"},/turf/simulated/floor/plating,/area/maintenance/locker) -"bjI" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/flora/pottedplant/random,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bjJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bjK" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/large_stock_marker,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"bjI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjJ" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bjK" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central East"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bjL" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/office) -"bjM" = (/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) -"bjN" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) -"bjO" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_one) +"bjM" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bjN" = (/obj/machinery/newscaster{pixel_y = -32},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bjO" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "bjP" = (/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) "bjQ" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bjR" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) @@ -3219,60 +3219,60 @@ "bjU" = (/obj/structure/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bjV" = (/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) "bjW" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/bridge/meeting_room) -"bjX" = (/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 = 1343; 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) +"bjX" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "bjY" = (/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) -"bjZ" = (/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) -"bka" = (/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1343; 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) +"bjZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) +"bka" = (/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/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "bkb" = (/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) -"bkc" = (/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 = 1343; 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) +"bkc" = (/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)},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/exit) "bkd" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bke" = (/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) "bkf" = (/obj/structure/bed/chair,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bkg" = (/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) "bkh" = (/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) "bki" = (/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) -"bkj" = (/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) -"bkk" = (/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) -"bkl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two) -"bkm" = (/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) -"bkn" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) -"bko" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/starboard) -"bkp" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/starboard) -"bks" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/hallway/primary/starboard) -"bku" = (/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) -"bkv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard) -"bkw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard) -"bkx" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/hallway/primary/starboard) -"bky" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/starboard) -"bkz" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkA" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkB" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkC" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bkD" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/hallway/primary/starboard) -"bkE" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/hallway/primary/starboard) -"bkF" = (/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) -"bkG" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkH" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central"; dir = 1},/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/starboard) -"bkI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/starboard) -"bkK" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central East"; dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) -"bkL" = (/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/starboard) -"bkM" = (/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) -"bkN" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) -"bkO" = (/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) -"bkP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) -"bkQ" = (/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit) -"bkR" = (/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) -"bkS" = (/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/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bkk" = (/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/tiled,/area/hallway/secondary/entry/aft) +"bkl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/civilian_west{c_tag = "Locker Room Toilets"; dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bkm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bko" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkr" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bks" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bkt" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bku" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/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/tiled,/area/hallway/primary/central_two) +"bkv" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bkw" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bkx" = (/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},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/hallway/primary/starboard) +"bky" = (/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},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/hallway/primary/starboard) +"bkz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkB" = (/obj/structure/sign/securearea{pixel_x = 32},/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (NORTH)"; icon_state = "loadingarea"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkC" = (/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (NORTH)"; icon_state = "loadingarea"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkD" = (/obj/effect/floor_decal/corner/purple/full,/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkE" = (/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkF" = (/obj/effect/floor_decal/corner/purple{dir = 8},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkG" = (/obj/machinery/light,/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkH" = (/obj/effect/floor_decal/corner/purple,/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkJ" = (/obj/effect/floor_decal/corner/purple/full{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) +"bkK" = (/obj/machinery/light{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bkL" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bkM" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) +"bkN" = (/obj/machinery/button/remote/blast_door{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; req_access = list(31)},/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/table/steel,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkQ" = (/obj/effect/large_stock_marker,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkR" = (/obj/structure/disposalpipe/sortjunction/untagged{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"bkS" = (/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (NORTH)"; icon_state = "loadingarea"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) "bkT" = (/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) "bkU" = (/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)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bkV" = (/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"},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bkW" = (/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) -"bkX" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; 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) -"bkY" = (/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) +"bkX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bkY" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/tiled,/area/quartermaster/office) "bkZ" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/conveyor{dir = 1; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bla" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) "blb" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -3283,23 +3283,23 @@ "blg" = (/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) "blh" = (/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) "bli" = (/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) -"blj" = (/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) +"blj" = (/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)},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "blk" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/locker) "bll" = (/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) "blm" = (/obj/structure/disposalpipe/junction{dir = 8},/turf/simulated/floor/plating,/area/maintenance/locker) "bln" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 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/plating,/area/maintenance/locker) "blo" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/quartermaster/storage) -"blp" = (/obj/structure/closet/crate/internals,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"blq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"blr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bls" = (/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Warehouse"; dir = 8},/obj/structure/table/steel,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"blt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"blp" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/quartermaster/office) +"blq" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - West"; dir = 8},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"blr" = (/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/tiled,/area/maintenance/substation/command) +"bls" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai) +"blt" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai) "blu" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/office) -"blv" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/quartermaster/office) -"blw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/office) -"blx" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) +"blv" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai) +"blw" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"blx" = (/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light{dir = 8},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) "bly" = (/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) -"blz" = (/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_one) +"blz" = (/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) "blA" = (/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) "blB" = (/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) "blC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/bridge/meeting_room) @@ -3319,28 +3319,28 @@ "blQ" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/wood,/area/crew_quarters/captain) "blR" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "blS" = (/obj/structure/table/woodentable,/obj/item/weapon/pinpointer,/obj/item/weapon/disk/nuclear,/obj/item/weapon/storage/secure/safe{pixel_x = 30; pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"blT" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"blU" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/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) -"blV" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor,/area/hallway/primary/central_two) +"blT" = (/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/tiled{icon_state = "white"},/area/medical/chemistry) +"blU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/button/remote/blast_door{id = "chemcounter"; name = "Pharmacy Counter Lockdown Control"; pixel_y = 25},/obj/machinery/reagentgrinder,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"blV" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/storage/box/cups{pixel_x = 0; pixel_y = 0},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) "blW" = (/turf/simulated/wall/r_wall,/area/hallway/primary/starboard) "blX" = (/obj/structure/sign/nosmoking_1,/turf/simulated/wall,/area/hallway/primary/starboard) "blY" = (/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) -"blZ" = (/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) -"bma" = (/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) -"bmb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/floor,/area/hallway/primary/starboard) +"blZ" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bma" = (/obj/machinery/light{dir = 1},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bmb" = (/obj/machinery/camera/network/medbay{c_tag = "Medbay Lobby Port"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) "bmc" = (/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) -"bmd" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard) -"bme" = (/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/hallway/primary/starboard) -"bmf" = (/obj/structure/sign/securearea{pixel_x = 32},/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/hallway/primary/starboard) -"bmg" = (/turf/simulated/floor{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard) -"bmh" = (/turf/simulated/floor{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard) -"bmi" = (/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard) -"bmj" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "purple"},/area/hallway/primary/starboard) -"bmk" = (/turf/simulated/floor{dir = 6; icon_state = "purple"},/area/hallway/primary/starboard) +"bmd" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bme" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bmf" = (/obj/machinery/camera/network/medbay{c_tag = "Medbay Lobby Starboard"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bmg" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/obj/structure/flora/pottedplant/random,/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bmh" = (/obj/machinery/alarm{pixel_y = 22},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bmi" = (/obj/machinery/light{dir = 1},/obj/structure/closet/secure_closet/medical1,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"bmj" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/camera/network/medbay{c_tag = "Medbay Examination Room"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"bmk" = (/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},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) "bml" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/exit) "bmm" = (/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) "bmn" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/hallway/secondary/exit) -"bmo" = (/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) +"bmo" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) "bmp" = (/obj/machinery/conveyor{dir = 1; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bmq" = (/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/disposal) "bmr" = (/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) @@ -3348,9 +3348,9 @@ "bmt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/locker) "bmu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/locker) "bmv" = (/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) -"bmw" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet) -"bmx" = (/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) -"bmy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"bmw" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue) +"bmx" = (/obj/structure/table/standard,/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = 7},/obj/item/weapon/paper_bin{pixel_y = -6},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue) +"bmy" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue) "bmz" = (/obj/item/weapon/screwdriver,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "bmA" = (/obj/item/device/flashlight,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "bmB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) @@ -3358,176 +3358,176 @@ "bmD" = (/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/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/locker) "bmE" = (/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) "bmF" = (/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) -"bmG" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/table/steel,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"bmG" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue) "bmH" = (/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/locker) -"bmI" = (/obj/machinery/button/remote/blast_door{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; req_access = list(31)},/obj/structure/closet/crate,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"bmJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"bmI" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue) +"bmJ" = (/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"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/morgue) "bmK" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MAIL DELIVERY'."; name = "MAIL DELIVERY"},/turf/simulated/wall,/area/quartermaster/office) -"bmL" = (/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/quartermaster/office) -"bmM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/office) -"bmN" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor,/area/quartermaster/office) -"bmO" = (/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) -"bmP" = (/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) -"bmQ" = (/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) +"bmL" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/medical/morgue) +"bmM" = (/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/tiled,/area/hallway/primary/starboard) +"bmN" = (/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/tiled,/area/hallway/primary/starboard) +"bmO" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bmP" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bmQ" = (/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) "bmR" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/command) -"bmS" = (/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) -"bmT" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) +"bmS" = (/obj/machinery/autolathe,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bmT" = (/obj/structure/table/standard,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/gloves/latex,/obj/item/weapon/computer_hardware/hard_drive/portable,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) "bmU" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"bmV" = (/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) -"bmW" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai) +"bmV" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bmW" = (/obj/structure/closet/emcloset,/obj/machinery/camera/network/exodus{c_tag = "Arrivals Auxiliary Docking South"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) "bmX" = (/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) "bmY" = (/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) "bmZ" = (/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) "bna" = (/obj/machinery/computer/communications,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bnb" = (/obj/structure/table/woodentable,/obj/item/device/eftpos{eftpos_name = "Captain EFTPOS scanner"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bnc" = (/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) -"bnd" = (/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light{dir = 8},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bne" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bnf" = (/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) -"bng" = (/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/item/stack/material/phoron,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bnh" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/button/remote/blast_door{id = "chemcounter"; name = "Pharmacy Counter Lockdown Control"; pixel_y = 25},/obj/machinery/reagentgrinder,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bnd" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bne" = (/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/tiled,/area/quartermaster/storage) +"bnf" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bng" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bnh" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "bni" = (/obj/structure/sign/chemistry,/turf/simulated/wall/r_wall,/area/medical/chemistry) -"bnj" = (/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) -"bnk" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/storage/box/cups{pixel_x = 0; pixel_y = 0},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) -"bnl" = (/obj/machinery/camera/network/medbay{c_tag = "Medbay Lobby Port"},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) -"bnm" = (/obj/machinery/light{dir = 1},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) -"bnn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/reception) -"bno" = (/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/reception) -"bnp" = (/obj/machinery/camera/network/medbay{c_tag = "Medbay Lobby Starboard"},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) -"bnq" = (/obj/machinery/alarm{pixel_y = 22},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception) -"bnr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/table/steel,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) +"bnj" = (/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/tiled,/area/maintenance/substation/command) +"bnk" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/modular_computer/console/preset/command,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bnl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/modular_computer/console/preset/civilian,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bnm" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bnn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/modular_computer/console/preset/medical,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"bno" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Captain's Intercom"; pixel_x = -27; pixel_y = -3},/obj/structure/closet/secure_closet/captains,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bnp" = (/obj/machinery/modular_computer/console/preset/command,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bnq" = (/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/tiled,/area/hallway/primary/central_two) +"bnr" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bns" = (/turf/simulated/wall,/area/medical/reception) -"bnt" = (/obj/machinery/light{dir = 1},/obj/structure/closet/secure_closet/medical1,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bnu" = (/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) -"bnv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/camera/network/medbay{c_tag = "Medbay Examination Room"},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bnw" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) +"bnt" = (/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bnu" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bnv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bnw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) "bnx" = (/turf/simulated/wall,/area/medical/exam_room) -"bny" = (/obj/structure/table/standard,/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = 7},/obj/item/weapon/paper_bin{pixel_y = -6},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/morgue) -"bnz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) -"bnA" = (/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) -"bnB" = (/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) -"bnC" = (/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) -"bnD" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/morgue) -"bnE" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/medical/morgue) +"bny" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "chemcounter"; name = "Pharmacy Counter Shutters"; opacity = 0},/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Chemistry Desk"; req_access = list(33)},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/chemistry) +"bnz" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Chemist"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bnA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bnB" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bnC" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bnD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bnE" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) "bnF" = (/turf/simulated/wall,/area/maintenance/research_port) "bnG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/research_port) -"bnH" = (/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) -"bnI" = (/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) -"bnJ" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bnK" = (/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bnL" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"bnH" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bnI" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bnJ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bnK" = (/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"bnL" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) "bnM" = (/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) "bnN" = (/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) "bnO" = (/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},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/starboard) "bnP" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/plating,/area/hallway/primary/starboard) -"bnQ" = (/obj/machinery/autolathe,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) -"bnR" = (/obj/structure/table/standard,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/gloves/latex,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) +"bnQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"bnR" = (/obj/structure/filingcabinet/medical,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) "bnS" = (/turf/simulated/wall/r_wall,/area/rnd/lab) "bnT" = (/obj/structure/closet/hydrant{pixel_x = -32},/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/storage/emergency) "bnU" = (/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{dir = 6},/turf/simulated/floor/plating,/area/storage/emergency) "bnV" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/plating,/area/storage/emergency) "bnW" = (/turf/simulated/wall,/area/storage/emergency) "bnX" = (/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) -"bnY" = (/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) -"bnZ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"bnY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/medical/morgue) +"bnZ" = (/obj/structure/table/standard,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/morgue) "boa" = (/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) "bob" = (/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) "boc" = (/obj/item/trash/candy,/obj/item/trash/popcorn,/turf/simulated/floor/plating,/area/maintenance/disposal) "bod" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor/plating,/area/maintenance/disposal) "boe" = (/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/disposal) "bof" = (/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) -"bog" = (/obj/structure/disposalpipe/sortjunction/untagged{dir = 1},/obj/structure/table/steel,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage) -"boh" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/obj/structure/flora/pottedplant/random,/turf/simulated/floor{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/reception) +"bog" = (/turf/simulated/floor/tiled,/area/medical/morgue) +"boh" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/morgue) "boi" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/locker) "boj" = (/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) "bok" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/locker) "bol" = (/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/locker) "bom" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/locker) "bon" = (/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/locker) -"boo" = (/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) +"boo" = (/obj/structure/morgue,/turf/simulated/floor/tiled,/area/medical/morgue) "bop" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/storage) -"boq" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/quartermaster/office) -"bor" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office) -"bos" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) +"boq" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor/tiled,/area/medical/morgue) +"bor" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/morgue) +"bos" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/assembly/chargebay) "bot" = (/obj/machinery/alarm{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) "bou" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bov" = (/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) "bow" = (/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/recharger{pixel_y = 4},/obj/structure/table/steel,/turf/simulated/floor/plating,/area/maintenance/substation/command) "box" = (/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) "boy" = (/turf/simulated/wall,/area/maintenance/substation/command) -"boz" = (/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) -"boA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"boB" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"boz" = (/obj/machinery/button/remote/blast_door{dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24; req_access = list(29)},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/assembly/chargebay) +"boA" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/assembly/chargebay) +"boB" = (/turf/simulated/floor/tiled,/area/assembly/chargebay) "boC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "boD" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "boE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"boF" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"boG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"boH" = (/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; listening = 1; name = "Captain's Intercom"; pixel_x = -27; pixel_y = -3},/obj/structure/closet/secure_closet/captains,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"boF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"boG" = (/obj/structure/reagent_dispensers/acid{density = 0; pixel_x = -32},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"boH" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) "boI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"boJ" = (/obj/machinery/computer/card,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"boJ" = (/obj/structure/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) "boK" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/wood,/area/crew_quarters/captain) "boL" = (/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"boM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"boN" = (/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) +"boM" = (/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"boN" = (/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"},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) "boO" = (/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 = "chemwindow"; name = "Chemistry Window Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/hallway/primary/central_two) -"boP" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"boQ" = (/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"boR" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"boS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"boT" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Chemist"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"},/area/medical/chemistry) -"boU" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "chemcounter"; name = "Pharmacy Counter Shutters"; opacity = 0},/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Chemistry Desk"; req_access = list(33)},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/medical/chemistry) -"boV" = (/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/reception) -"boW" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"boX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"boY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"boZ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"bpa" = (/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"bpb" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"bpc" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception) +"boP" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"boQ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"boR" = (/obj/machinery/door/airlock/research{id_tag = "researchdoor"; name = "Research Division Access"; req_access = list(47)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled{icon_state = "white"},/area/hallway/primary/starboard) +"boS" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/stack/material/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/clothing/glasses/welding,/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"boT" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"boU" = (/obj/effect/landmark/start{name = "Scientist"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"boV" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"boW" = (/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"},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"boX" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"boY" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"boZ" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bpa" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bpb" = (/obj/structure/table/standard,/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/tiled,/area/quartermaster/loading) +"bpc" = (/obj/structure/table/standard,/obj/item/clothing/head/soft,/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft,/turf/simulated/floor/tiled,/area/quartermaster/loading) "bpd" = (/obj/structure/sign/examroom,/turf/simulated/wall,/area/medical/reception) -"bpe" = (/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bpf" = (/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) -"bpg" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bph" = (/obj/structure/filingcabinet/medical,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bpi" = (/obj/structure/table/standard,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/morgue) -"bpj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/medical/morgue) -"bpk" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/medical/morgue) -"bpl" = (/turf/simulated/floor,/area/medical/morgue) -"bpm" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor,/area/medical/morgue) -"bpn" = (/obj/structure/morgue,/turf/simulated/floor,/area/medical/morgue) -"bpo" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/medical/morgue) +"bpe" = (/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/tiled,/area/quartermaster/loading) +"bpf" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bpg" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bph" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bpi" = (/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/tiled,/area/quartermaster/loading) +"bpj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bpk" = (/obj/machinery/photocopier,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bpl" = (/obj/structure/disposalpipe/sortjunction{dir = 1; name = "Sorting Office"; sortType = "Sorting Office"},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bpm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bpn" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "packageExternal"},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bpo" = (/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/tiled,/area/hallway/primary/central_one) "bpp" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) -"bpq" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/assembly/chargebay) -"bpr" = (/turf/simulated/floor,/area/assembly/chargebay) -"bps" = (/obj/machinery/button/remote/blast_door{dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 6; pixel_y = 24; req_access = list(29)},/turf/simulated/floor{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/assembly/chargebay) -"bpt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/chargebay) -"bpu" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/chargebay) +"bpq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bpr" = (/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/tiled,/area/maintenance/substation/command) +"bps" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bpt" = (/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/dropper,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bpu" = (/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},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) "bpv" = (/turf/simulated/wall,/area/assembly/robotics) -"bpw" = (/obj/structure/reagent_dispensers/acid{density = 0; pixel_x = -32},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bpx" = (/obj/structure/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bpy" = (/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bpz" = (/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) -"bpA" = (/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics) -"bpB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics) -"bpC" = (/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) -"bpD" = (/obj/machinery/door/airlock/research{id_tag = "researchdoor"; name = "Research Division Access"; req_access = list(47)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/hallway/primary/starboard) +"bpw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bpx" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bpy" = (/obj/item/device/radio/intercom{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,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bpz" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bpA" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bpB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bpC" = (/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/tiled,/area/medical/exam_room) +"bpD" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) "bpE" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/hallway/primary/starboard) -"bpF" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/stack/material/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/clothing/glasses/welding,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab) -"bpG" = (/obj/effect/landmark/start{name = "Scientist"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab) -"bpH" = (/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab) -"bpI" = (/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) -"bpJ" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) -"bpK" = (/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) +"bpF" = (/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/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"bpG" = (/obj/structure/bed/padded,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"bpH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/medical/morgue) +"bpI" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/machinery/light{dir = 8},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/morgue) +"bpJ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/medical/morgue) +"bpK" = (/obj/machinery/optable,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/morgue) "bpL" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency) "bpM" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; target_pressure = 200},/turf/simulated/floor/plating,/area/storage/emergency) "bpN" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/storage/emergency) "bpO" = (/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/secondary/entry/aft) "bpP" = (/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) "bpQ" = (/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) -"bpR" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/aft) -"bpS" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"bpT" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"bpR" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/morgue) +"bpS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"bpT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/assembly/chargebay) "bpU" = (/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) "bpV" = (/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/padded,/turf/simulated/floor/plating,/area/maintenance/disposal) "bpW" = (/obj/item/weapon/cigbutt{pixel_x = -10; pixel_y = -10},/turf/simulated/floor/plating,/area/maintenance/disposal) @@ -3546,27 +3546,27 @@ "bqj" = (/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) "bqk" = (/obj/structure/closet,/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"},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/bar) "bql" = (/turf/simulated/wall,/area/quartermaster/loading) -"bqm" = (/obj/structure/table/standard,/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/loading) -"bqn" = (/obj/structure/table/standard,/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/loading) -"bqo" = (/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/loading) -"bqp" = (/obj/structure/table/standard,/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/loading) -"bqq" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/quartermaster/loading) -"bqr" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor,/area/quartermaster/loading) -"bqs" = (/obj/machinery/photocopier,/turf/simulated/floor,/area/quartermaster/office) -"bqt" = (/obj/structure/disposalpipe/sortjunction{dir = 1; name = "Sorting Office"; sortType = "Sorting Office"},/turf/simulated/floor,/area/quartermaster/office) +"bqm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bqn" = (/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/tiled{icon_state = "white"},/area/assembly/robotics) +"bqo" = (/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/tiled{icon_state = "white"},/area/assembly/robotics) +"bqp" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bqq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bqr" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bqs" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/camera/network/research{c_tag = "Research Division Access"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bqt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) "bqu" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/quartermaster/office) "bqv" = (/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{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/quartermaster/office) -"bqw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/quartermaster/office) -"bqx" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "packageExternal"},/turf/simulated/floor,/area/quartermaster/office) -"bqy" = (/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_one) -"bqz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_one) +"bqw" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bqx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bqy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bqz" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) "bqA" = (/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) "bqB" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/locker) "bqC" = (/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) "bqD" = (/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) "bqE" = (/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) "bqF" = (/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) -"bqG" = (/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) +"bqG" = (/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)"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bqH" = (/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) "bqI" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/mask/gas,/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 0},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/captain,/obj/item/clothing/head/helmet/space/void/captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bqJ" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -3574,80 +3574,80 @@ "bqL" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bqM" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bqN" = (/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) -"bqO" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two) -"bqP" = (/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},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bqQ" = (/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/dropper,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bqR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bqS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bqT" = (/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,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"bqO" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "admin_shuttle_dock_pump"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"bqP" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -8; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bqQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bqR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bqS" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bqT" = (/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) "bqU" = (/turf/simulated/wall/r_wall,/area/medical/chemistry) -"bqV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"bqW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) -"bqX" = (/turf/simulated/floor{dir = 4; icon_state = "whiteblue_ex"; tag = "icon-whiteblue (EAST)"},/area/medical/reception) -"bqY" = (/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) -"bqZ" = (/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) -"bra" = (/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) -"brb" = (/obj/structure/bed/padded,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"brc" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/morgue) -"brd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/morgue) -"bre" = (/obj/machinery/optable,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/medical/morgue) -"brf" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/medical/morgue) -"brg" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/medical/morgue) +"bqV" = (/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bqW" = (/obj/effect/large_stock_marker,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bqX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bqY" = (/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bqZ" = (/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/tiled,/area/quartermaster/office) +"bra" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/office) +"brb" = (/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/tiled,/area/quartermaster/office) +"brc" = (/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/tiled,/area/quartermaster/office) +"brd" = (/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/tiled,/area/quartermaster/office) +"bre" = (/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/tiled,/area/quartermaster/office) +"brf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"brg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/quartermaster/office) "brh" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bri" = (/turf/simulated/floor/bluegrid,/area/assembly/chargebay) -"brj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/assembly/chargebay) -"brk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/assembly/chargebay) -"brl" = (/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) -"brm" = (/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) -"brn" = (/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) -"bro" = (/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) -"brp" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"brj" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"brk" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/quartermaster/office) +"brl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/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/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"brm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"brn" = (/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/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"bro" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"brp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) "brq" = (/turf/simulated/wall/r_wall,/area/assembly/robotics) -"brr" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/rnd/research) -"brs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"brt" = (/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) -"bru" = (/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) -"brv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) -"brw" = (/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) -"brx" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) +"brr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"brs" = (/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,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"brt" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bru" = (/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/reception) +"brv" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/medical/reception) +"brw" = (/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/reception) +"brx" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/med_data/laptop,/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/reception) "bry" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency) "brz" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/storage/emergency) "brA" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency) "brB" = (/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) -"brC" = (/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) -"brD" = (/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) +"brC" = (/obj/structure/filingcabinet/chestdrawer{name = "Medical Forms"},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/medical/reception) +"brD" = (/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 3},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/reception) "brE" = (/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) -"brF" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -8; pixel_y = 26; 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) -"brG" = (/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) -"brH" = (/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) -"brI" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor,/area/hallway/secondary/entry/aft) -"brJ" = (/turf/simulated/floor,/area/hallway/secondary/entry/aft) +"brF" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"brG" = (/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,/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"brH" = (/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,/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"brI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"brJ" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) "brK" = (/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) "brL" = (/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) -"brM" = (/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/loading) +"brM" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/morgue) "brN" = (/obj/machinery/camera/network/civilian_west{c_tag = "Waste Disposal"; dir = 8},/obj/item/weapon/material/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) "brO" = (/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) "brP" = (/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) "brQ" = (/turf/simulated/wall/r_wall,/area/maintenance/locker) "brR" = (/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) -"brS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/quartermaster/loading) +"brS" = (/obj/machinery/mech_recharger,/turf/simulated/floor/plating,/area/assembly/chargebay) "brT" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/loading) -"brU" = (/obj/structure/table/rack{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/random/loot,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/locker) +"brU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/assembly/chargebay) "brV" = (/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/loading) -"brW" = (/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/quartermaster/office) -"brX" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/office) -"brY" = (/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) -"brZ" = (/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) -"bsa" = (/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) -"bsb" = (/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) -"bsc" = (/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) -"bsd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/quartermaster/office) -"bse" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/quartermaster/office) -"bsf" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/office) -"bsg" = (/obj/machinery/conveyor{dir = 4; id = "packageExternal"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/hallway/primary/central_one) -"bsh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/primary/central_one) -"bsi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/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/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/hallway/primary/central_one) -"bsj" = (/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{dir = 4; icon_state = "warning"},/area/hallway/primary/central_one) +"brW" = (/obj/item/stack/material/glass{amount = 20; pixel_x = -3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/structure/table/steel,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) +"brX" = (/obj/machinery/mecha_part_fabricator,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) +"brY" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) +"brZ" = (/obj/machinery/mecha_part_fabricator,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled,/area/assembly/robotics) +"bsa" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bsb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bsc" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bsd" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bse" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bsf" = (/obj/machinery/r_n_d/destructive_analyzer,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/lab) +"bsg" = (/obj/machinery/r_n_d/protolathe,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/lab) +"bsh" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/lab) +"bsi" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bsj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) "bsk" = (/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/door/airlock/hatch{name = "Command Substation"; req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/substation/command) "bsl" = (/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"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/substation/command) "bsm" = (/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) @@ -3664,385 +3664,385 @@ "bsx" = (/turf/simulated/wall,/area/crew_quarters/captain) "bsy" = (/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) "bsz" = (/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) -"bsA" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two) -"bsB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bsC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bsD" = (/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,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bsE" = (/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) -"bsF" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/reception) -"bsG" = (/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) -"bsH" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/med_data/laptop,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) -"bsI" = (/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) -"bsJ" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception) -"bsK" = (/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) -"bsL" = (/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) -"bsM" = (/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,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bsN" = (/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) -"bsO" = (/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,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bsP" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"bsQ" = (/obj/structure/table/standard,/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) -"bsR" = (/obj/machinery/mech_bay_recharge_port,/turf/simulated/floor/plating,/area/assembly/chargebay) -"bsS" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/assembly/chargebay) -"bsT" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/bluegrid,/area/assembly/chargebay) -"bsU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/assembly/chargebay) +"bsA" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bsB" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "admin_shuttle_dock_pump"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"bsC" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "admin_shuttle_dock_sensor"; pixel_x = -30; pixel_y = 8},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) +"bsD" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bsE" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bsF" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/aft) +"bsG" = (/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/airless,/area/maintenance/disposal) +"bsH" = (/obj/machinery/mass_driver{id = "trash"},/obj/machinery/airlock_sensor{pixel_x = -25; pixel_y = 10},/turf/simulated/floor/airless,/area/maintenance/disposal) +"bsI" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/large_stock_marker,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bsJ" = (/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/large_stock_marker,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bsK" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bsL" = (/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/tiled,/area/quartermaster/loading) +"bsM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bsN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bsO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bsP" = (/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/tiled,/area/quartermaster/loading) +"bsQ" = (/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/tiled,/area/quartermaster/office) +"bsR" = (/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/tiled,/area/quartermaster/office) +"bsS" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access = list(50)},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bsT" = (/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/tiled,/area/hallway/primary/central_three) +"bsU" = (/obj/machinery/light{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bsV" = (/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/assembly/robotics) -"bsW" = (/obj/item/stack/material/glass{amount = 20; pixel_x = -3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/structure/table/steel,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics) -"bsX" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics) -"bsY" = (/obj/machinery/mecha_part_fabricator,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics) -"bsZ" = (/obj/machinery/mecha_part_fabricator,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics) -"bta" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/assembly/robotics) -"btb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"btc" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"btd" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/research) -"bte" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"btf" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/research) -"btg" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab) -"bth" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab) -"bti" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab) -"btj" = (/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/lab) -"btk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) -"btl" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) +"bsW" = (/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bsX" = (/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/tiled,/area/maintenance/substation/command) +"bsY" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 8},/area/turret_protected/ai_upload) +"bsZ" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain) +"bta" = (/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/tiled/freezer,/area/crew_quarters/captain) +"btb" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"btc" = (/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/tiled,/area/hallway/primary/central_two) +"btd" = (/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bte" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"btf" = (/obj/machinery/chem_master,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"btg" = (/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/tiled{icon_state = "white"},/area/medical/chemistry) +"bth" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"bti" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = -32},/obj/effect/floor_decal/corner/paleblue/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"btj" = (/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/tiled,/area/medical/reception) +"btk" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/obj/machinery/modular_computer/console/preset/medical,/turf/simulated/floor/tiled,/area/medical/reception) +"btl" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/medical/reception) "btm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/storage/emergency) "btn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/emergency) -"bto" = (/turf/simulated/floor,/area/quartermaster/loading) -"btp" = (/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) -"btq" = (/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) +"bto" = (/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"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/medical/reception) +"btp" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/filingcabinet/medical{pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/reception) +"btq" = (/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/tiled,/area/medical/reception) "btr" = (/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) -"bts" = (/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/aft) -"btt" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/aft) -"btu" = (/obj/machinery/mass_driver{id = "trash"},/obj/machinery/airlock_sensor{pixel_x = -25; pixel_y = 10},/turf/simulated/floor/plating/airless,/area/maintenance/disposal) -"btv" = (/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) +"bts" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 32},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"btt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/reception) +"btu" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"btv" = (/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,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) "btw" = (/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/maintenance/disposal) "btx" = (/obj/item/weapon/cigbutt{pixel_y = 12},/turf/simulated/floor/plating,/area/maintenance/disposal) "bty" = (/turf/space,/area/supply/station) -"btz" = (/obj/effect/large_stock_marker,/turf/simulated/floor,/area/quartermaster/loading) -"btA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/quartermaster/loading) +"btz" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) +"btA" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) "btB" = (/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/loading) "btC" = (/obj/effect/decal/cleanable/generic,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/locker) "btD" = (/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/loading) -"btE" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/large_stock_marker,/turf/simulated/floor,/area/quartermaster/loading) -"btF" = (/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/large_stock_marker,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/loading) -"btG" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor,/area/quartermaster/loading) -"btH" = (/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) -"btI" = (/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) -"btJ" = (/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) +"btE" = (/obj/structure/morgue,/obj/effect/floor_decal/corner/paleblue/full,/turf/simulated/floor/tiled,/area/medical/morgue) +"btF" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) +"btG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) +"btH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) +"btI" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue) +"btJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) "btK" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/office) "btL" = (/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) -"btM" = (/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) +"btM" = (/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/tiled,/area/assembly/chargebay) "btN" = (/turf/simulated/wall,/area/hallway/primary/central_three) -"btO" = (/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) -"btP" = (/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) -"btQ" = (/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor,/area/hallway/primary/central_three) +"btO" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/assembly/chargebay) +"btP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/assembly/robotics) +"btQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/assembly/robotics) "btR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/substation/command) -"btS" = (/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) +"btS" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/assembly/robotics) "btT" = (/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) "btU" = (/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) "btV" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"btW" = (/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) +"btW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) "btX" = (/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) "btY" = (/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) "btZ" = (/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) "bua" = (/obj/structure/displaycase,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bub" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "buc" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"bud" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) -"bue" = (/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) +"bud" = (/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/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/assembly/robotics) +"bue" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) "buf" = (/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) -"bug" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/hallway/primary/central_two) -"buh" = (/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) -"bui" = (/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"buj" = (/obj/machinery/chem_master,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"buk" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bul" = (/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) +"bug" = (/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/tiled{icon_state = "white"},/area/assembly/robotics) +"buh" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bui" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"buj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"buk" = (/obj/machinery/computer/rdconsole/core,/turf/simulated/floor/tiled,/area/rnd/lab) +"bul" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/tiled,/area/rnd/lab) "bum" = (/turf/simulated/wall,/area/medical/chemistry) -"bun" = (/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) -"buo" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception) -"bup" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/crew,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/reception) -"buq" = (/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) -"bur" = (/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"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/medical/reception) -"bus" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/medical/reception) -"but" = (/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) -"buu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/filingcabinet/medical{pixel_y = 0},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/reception) -"buv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/reception) -"buw" = (/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) -"bux" = (/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) -"buy" = (/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) -"buz" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room) -"buA" = (/obj/structure/morgue,/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/medical/morgue) -"buB" = (/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) -"buC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/medical/morgue) -"buD" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) -"buE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) -"buF" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue) -"buG" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/medical/morgue) +"bun" = (/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/tiled,/area/rnd/lab) +"buo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Lab Assistant"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bup" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"buq" = (/obj/machinery/door/blast/regular{id = "trash"; name = "disposal mass driver"},/turf/simulated/floor/airless,/area/maintenance/disposal) +"bur" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bus" = (/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/tiled,/area/quartermaster/loading) +"but" = (/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/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"buu" = (/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/tiled,/area/quartermaster/loading) +"buv" = (/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/tiled,/area/quartermaster/loading) +"buw" = (/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/tiled,/area/quartermaster/loading) +"bux" = (/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/effect/floor_decal/corner/brown{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/office) +"buy" = (/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/tiled,/area/quartermaster/loading) +"buz" = (/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/tiled,/area/quartermaster/office) +"buA" = (/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/tiled,/area/quartermaster/office) +"buB" = (/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/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"buC" = (/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/structure/table/standard,/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/tiled,/area/quartermaster/office) +"buD" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/tiled,/area/quartermaster/office) +"buE" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Lobby"},/turf/simulated/floor/tiled,/area/quartermaster/office) +"buF" = (/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/tiled,/area/quartermaster/office) +"buG" = (/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/tiled,/area/hallway/primary/central_three) "buH" = (/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) -"buI" = (/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) -"buJ" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/assembly/chargebay) +"buI" = (/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"buJ" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "buK" = (/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) -"buL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/table/steel,/turf/simulated/floor,/area/assembly/robotics) -"buM" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/assembly/robotics) -"buN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics) -"buO" = (/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{icon_state = "bot"},/area/assembly/robotics) -"buP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/assembly/robotics) -"buQ" = (/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 = "white"},/area/assembly/robotics) -"buR" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"buS" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/rnd/research) -"buT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"buU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/rnd/research) -"buV" = (/obj/machinery/computer/rdconsole/core,/turf/simulated/floor,/area/rnd/lab) -"buW" = (/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor,/area/rnd/lab) -"buX" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor,/area/rnd/lab) -"buY" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) +"buL" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"buM" = (/obj/machinery/computer/skills{icon_state = "medlaptop"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/glass,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"buN" = (/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"},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"buO" = (/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/tiled,/area/crew_quarters/heads/hop) +"buP" = (/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/tiled,/area/crew_quarters/heads/hop) +"buQ" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_upload) +"buR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai_upload) +"buS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai_upload) +"buT" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain) +"buU" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"buV" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"buW" = (/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/tiled{icon_state = "white"},/area/medical/chemistry) +"buX" = (/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/tiled,/area/medical/reception) +"buY" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "medbayrecquar"; name = "Medbay Emergency Quarantine Shutters"; opacity = 0},/turf/simulated/floor/tiled,/area/medical/reception) "buZ" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/storage/emergency) "bva" = (/turf/simulated/floor/plating,/area/storage/emergency) -"bvb" = (/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,/area/quartermaster/loading) +"bvb" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/medical/reception) "bvc" = (/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) "bvd" = (/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)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "admin_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -28; pixel_y = -6; req_one_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bve" = (/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) "bvf" = (/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) "bvg" = (/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) "bvh" = (/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) -"bvi" = (/obj/machinery/door/blast/regular{id = "trash"; name = "disposal mass driver"},/turf/simulated/floor/plating/airless,/area/maintenance/disposal) +"bvi" = (/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/tiled,/area/medical/reception) "bvj" = (/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) "bvk" = (/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) -"bvl" = (/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/loading) -"bvm" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/quartermaster/loading) -"bvn" = (/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/loading) +"bvl" = (/turf/simulated/floor/tiled,/area/medical/reception) +"bvm" = (/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/tiled,/area/medical/reception) +"bvn" = (/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/tiled,/area/medical/reception) "bvo" = (/obj/structure/table/standard,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/disposal) "bvp" = (/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/loading) -"bvq" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/loading) -"bvr" = (/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/loading) -"bvs" = (/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/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/quartermaster/loading) -"bvt" = (/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) -"bvu" = (/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) -"bvv" = (/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) -"bvw" = (/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/structure/table/standard,/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) -"bvx" = (/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/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/quartermaster/office) -"bvy" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor,/area/quartermaster/office) -"bvz" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Lobby"},/turf/simulated/floor,/area/quartermaster/office) -"bvA" = (/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) +"bvq" = (/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/tiled,/area/medical/reception) +"bvr" = (/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/tiled,/area/medical/reception) +"bvs" = (/obj/structure/table/standard,/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/turf/simulated/floor/tiled,/area/medical/reception) +"bvt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Examination Room"; req_access = list(66)},/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bvu" = (/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/tiled,/area/medical/medbay2) +"bvv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"bvw" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"bvx" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled,/area/assembly/robotics) +"bvy" = (/turf/simulated/floor/tiled,/area/assembly/robotics) +"bvz" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/assembly/robotics) +"bvA" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/assembly/robotics) "bvB" = (/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) -"bvC" = (/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_three) -"bvD" = (/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,/area/hallway/primary/central_three) -"bvE" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/hallway/primary/central_three) -"bvF" = (/obj/machinery/computer/skills{icon_state = "medlaptop"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/glass,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/crew_quarters/heads/hop) -"bvG" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/glass,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bvH" = (/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) -"bvI" = (/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) -"bvJ" = (/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/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/tiled{icon_state = "white"},/area/assembly/robotics) +"bvD" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bvE" = (/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bvF" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bvG" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bvH" = (/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 = 10},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bvI" = (/obj/item/weapon/stock_parts/console_screen,/obj/structure/table/standard,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bvJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/research/station) "bvK" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/hop) "bvL" = (/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) "bvM" = (/obj/structure/table/standard,/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) "bvN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) -"bvO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) -"bvP" = (/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) -"bvQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) +"bvO" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/shuttle/research/station) +"bvP" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/research/station) +"bvQ" = (/obj/machinery/conveyor_switch/oneway{id = "QMLoad2"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/loading) "bvR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bvS" = (/obj/structure/table/standard,/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) "bvT" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/captain,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bvU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bvV" = (/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) -"bvW" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) +"bvW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/loading) "bvX" = (/obj/machinery/light/small{dir = 8},/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) -"bvY" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor,/area/hallway/primary/central_two) -"bvZ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/hallway/primary/central_two) +"bvY" = (/obj/vehicle/train/cargo/trolley,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bvZ" = (/obj/vehicle/train/cargo/engine,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) "bwa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/chemistry) "bwb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/chemistry) "bwc" = (/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) "bwd" = (/obj/machinery/smartfridge/secure/medbay{req_one_access = list(33,66)},/turf/simulated/wall/r_wall{name = "transparent wall"; opacity = 0},/area/medical/chemistry) -"bwe" = (/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) -"bwf" = (/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) -"bwg" = (/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) -"bwh" = (/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) -"bwi" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/medical/reception) -"bwj" = (/turf/simulated/floor,/area/medical/reception) -"bwk" = (/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) -"bwl" = (/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) -"bwm" = (/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) -"bwn" = (/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) -"bwo" = (/obj/structure/table/standard,/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/turf/simulated/floor,/area/medical/reception) +"bwe" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bwf" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bwg" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Cargo Bay"; name = "Cargo Bay"},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bwh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bwi" = (/obj/effect/landmark/start{name = "Cargo Technician"},/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bwj" = (/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/tiled,/area/quartermaster/office) +"bwk" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bwl" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bwm" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bwn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bwo" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bwp" = (/turf/simulated/wall,/area/medical/medbay2) -"bwq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Examination Room"; req_access = list(66)},/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) +"bwq" = (/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"},/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bwr" = (/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) -"bws" = (/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) +"bws" = (/obj/structure/disposalpipe/segment{dir = 4},/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/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bwt" = (/turf/simulated/wall,/area/maintenance/substation/medical) -"bwu" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/assembly/chargebay) -"bwv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/assembly/chargebay) +"bwu" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bwv" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bww" = (/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) -"bwx" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/assembly/robotics) -"bwy" = (/turf/simulated/floor,/area/assembly/robotics) -"bwz" = (/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/assembly/robotics) -"bwA" = (/obj/structure/table/standard,/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) +"bwx" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_upload) +"bwy" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai_upload) +"bwz" = (/obj/item/device/radio/intercom/locked{frequency = 1343; locked_frequency = 1343; name = "Private AI Channel"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai_upload) +"bwA" = (/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/tiled/freezer,/area/crew_quarters/captain) "bwB" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/assembly/robotics) "bwC" = (/turf/simulated/wall/r_wall,/area/rnd/research) -"bwD" = (/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) +"bwD" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bwE" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/rnd/research) -"bwF" = (/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab) -"bwG" = (/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab) -"bwH" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab) -"bwI" = (/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 = 10},/turf/simulated/floor{dir = 4; icon_state = "warnwhitecorner"},/area/rnd/lab) -"bwJ" = (/obj/item/weapon/stock_parts/console_screen,/obj/structure/table/standard,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) +"bwF" = (/obj/structure/closet/secure_closet/medical1,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bwG" = (/obj/structure/table/standard,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bwH" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bwI" = (/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"},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bwJ" = (/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/tiled{icon_state = "white"},/area/medical/chemistry) "bwK" = (/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/supply,/turf/simulated/floor/plating,/area/storage/emergency) "bwL" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency) -"bwM" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/research/station) -"bwN" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research/station) +"bwM" = (/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/tiled{icon_state = "white"},/area/medical/medbay) +"bwN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass{id_tag = "MedbayFoyerPort"; req_access = list(5)},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) "bwO" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/research/station) -"bwP" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/research/station) +"bwP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medbay Reception"; req_access = list(66)},/turf/simulated/floor/tiled,/area/medical/medbay3) "bwQ" = (/turf/space,/area/shuttle/administration/station) -"bwR" = (/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/loading) -"bwS" = (/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/loading) -"bwT" = (/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/loading) -"bwU" = (/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/loading) +"bwR" = (/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bwS" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bwT" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bwU" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) "bwV" = (/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{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/loading) "bwW" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/loading) "bwX" = (/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/loading) -"bwY" = (/obj/machinery/conveyor_switch/oneway{id = "QMLoad2"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/loading) -"bwZ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "browncorner"},/area/quartermaster/office) -"bxa" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/quartermaster/office) -"bxb" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Cargo Bay"; name = "Cargo Bay"},/turf/simulated/floor,/area/quartermaster/office) -"bxc" = (/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) -"bxd" = (/obj/effect/landmark/start{name = "Cargo Technician"},/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor,/area/quartermaster/office) -"bxe" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office) -"bxf" = (/turf/simulated/floor{icon_state = "delivery"},/area/quartermaster/office) -"bxg" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/office) +"bwY" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bwZ" = (/obj/machinery/photocopier,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bxa" = (/obj/machinery/alarm{pixel_y = 25},/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/medical/medbay2) +"bxb" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera/network/medbay{c_tag = "Medbay Fore Starboard Corridor"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bxc" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/medical/medbay2) +"bxd" = (/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/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/medbay2) +"bxe" = (/obj/machinery/vending/medical,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bxf" = (/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/tiled,/area/assembly/chargebay) +"bxg" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/assembly/chargebay) "bxh" = (/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) -"bxi" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/hallway/primary/central_three) -"bxj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/hallway/primary/central_three) -"bxk" = (/obj/structure/disposalpipe/segment{dir = 4},/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{icon_state = "delivery"},/area/hallway/primary/central_three) -"bxl" = (/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"},/obj/structure/table/reinforced,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bxm" = (/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) +"bxi" = (/obj/structure/table/standard,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi,/turf/simulated/floor/tiled,/area/assembly/robotics) +"bxj" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bxk" = (/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},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/research) +"bxl" = (/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},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/research) +"bxm" = (/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,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/research) "bxn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "bxo" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "bxp" = (/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) -"bxq" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/heads/hop) +"bxq" = (/obj/item/weapon/folder/white,/obj/structure/table/standard,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) "bxr" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload) "bxs" = (/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) "bxt" = (/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) -"bxu" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) -"bxv" = (/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) -"bxw" = (/obj/item/device/radio/intercom/locked{frequency = 1343; locked_frequency = 1343; name = "Private AI Channel"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload) +"bxu" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) +"bxv" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/rnd/lab) +"bxw" = (/obj/effect/landmark/start{name = "Lab Assistant"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/lab) "bxx" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai_upload) "bxy" = (/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) "bxz" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bxA" = (/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) "bxB" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/storage/box/matches,/obj/item/clothing/mask/smokable/cigarette/cigar,/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"bxC" = (/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) -"bxD" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two) -"bxE" = (/obj/structure/table/standard,/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) -"bxF" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/chemistry) -"bxG" = (/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) -"bxH" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bxI" = (/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" = (/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/tiled{icon_state = "white"},/area/rnd/lab) +"bxD" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/rnd/lab) +"bxE" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (NORTH)"; icon_state = "swall_straight"; dir = 1},/area/shuttle/research/station) +"bxF" = (/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (EAST)"; icon_state = "loadingarea"; dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bxG" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bxH" = (/obj/machinery/light_switch{pixel_x = 27},/obj/effect/large_stock_marker,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bxI" = (/obj/machinery/autolathe,/obj/machinery/light_switch{pixel_x = -27},/turf/simulated/floor/tiled,/area/quartermaster/office) "bxJ" = (/turf/simulated/wall,/area/medical/medbay) -"bxK" = (/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) -"bxL" = (/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) +"bxK" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bxL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/office) "bxM" = (/turf/simulated/wall,/area/medical/medbay3) "bxN" = (/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) -"bxO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medbay Reception"; req_access = list(66)},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/medbay3) -"bxP" = (/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) -"bxQ" = (/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) -"bxR" = (/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) -"bxS" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bxT" = (/obj/machinery/photocopier,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bxU" = (/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) -"bxV" = (/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) -"bxW" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{dir = 4; icon_state = "whitecorner"},/area/medical/medbay2) -"bxX" = (/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) -"bxY" = (/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) -"bxZ" = (/obj/machinery/vending/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) +"bxO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bxP" = (/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/tiled,/area/hallway/primary/central_three) +"bxQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bxR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bxS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bxT" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bxU" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bxV" = (/obj/machinery/modular_computer/console/preset/command,/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bxW" = (/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/tiled,/area/crew_quarters/heads/hop) +"bxX" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_upload) +"bxY" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bxZ" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) "bya" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Medical Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/medical) "byb" = (/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) "byc" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/machinery/light{dir = 8},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) -"byd" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/assembly/chargebay) -"bye" = (/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/assembly/chargebay) -"byf" = (/obj/structure/table/standard,/obj/item/device/mmi,/obj/item/device/mmi,/obj/item/device/mmi,/turf/simulated/floor,/area/assembly/robotics) -"byg" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"byh" = (/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) -"byi" = (/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) -"byj" = (/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) -"byk" = (/obj/item/weapon/folder/white,/obj/structure/table/standard,/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/tech_disk{pixel_x = 0; pixel_y = 0},/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) -"byl" = (/obj/structure/table/standard,/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{icon_state = "white"},/area/rnd/lab) -"bym" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab) -"byn" = (/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/lab) -"byo" = (/obj/structure/table/standard,/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) +"byd" = (/obj/structure/table/standard,/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,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bye" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"byf" = (/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/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"byg" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"byh" = (/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},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"byi" = (/obj/structure/table/standard,/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"},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"byj" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"byk" = (/obj/structure/closet/secure_closet/medical3,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"byl" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/alarm{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bym" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"byn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"byo" = (/obj/machinery/door/firedoor,/obj/structure/sign/examroom{pixel_y = 32},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) "byp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/storage/emergency) -"byq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/loading) -"byr" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/research/station) +"byq" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"byr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) "bys" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/research/station) "byt" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/research/station) "byu" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/research/station) "byv" = (/turf/simulated/shuttle/floor,/area/shuttle/research/station) "byw" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor,/area/shuttle/research/station) -"byx" = (/obj/vehicle/train/cargo/trolley,/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/loading) -"byy" = (/obj/vehicle/train/cargo/engine,/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/loading) -"byz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/quartermaster/loading) +"byx" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"byy" = (/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/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"byz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) "byA" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/loot,/turf/simulated/floor/plating,/area/storage/emergency) "byB" = (/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/loading) "byC" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating,/area/quartermaster/loading) -"byD" = (/obj/machinery/autolathe,/obj/machinery/light_switch{pixel_x = -27},/turf/simulated/floor,/area/quartermaster/office) -"byE" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor,/area/quartermaster/office) +"byD" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"byE" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) "byF" = (/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/quartermaster/office) -"byG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/office) -"byH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/quartermaster/office) -"byI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/quartermaster/office) -"byJ" = (/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,/area/hallway/primary/central_three) -"byK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) -"byL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) -"byM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/central_three) -"byN" = (/turf/simulated/floor{icon_state = "bot"},/area/hallway/primary/central_three) +"byG" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"byH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"byI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_one_access = list(29)},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"byJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"byK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"byL" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/assembly/chargebay) +"byM" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"byN" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/assembly/robotics) "byO" = (/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) -"byP" = (/obj/machinery/computer/card,/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/crew_quarters/heads/hop) +"byP" = (/obj/structure/table/standard,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/item/device/mmi/digital/posibrain,/obj/item/device/robotanalyzer,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/assembly/robotics) "byQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "byR" = (/mob/living/simple_animal/corgi/Ian,/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) -"byS" = (/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) -"byT" = (/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) +"byS" = (/obj/structure/table/standard,/obj/item/weapon/crowbar,/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"byT" = (/obj/machinery/light{dir = 8},/obj/machinery/computer/guestpass{pixel_x = -28},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/rnd/research) "byU" = (/turf/simulated/wall/r_wall,/area/teleporter) "byV" = (/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) -"byW" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two) -"byX" = (/obj/structure/table/standard,/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) -"byY" = (/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"byZ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bza" = (/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) -"bzb" = (/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) -"bzc" = (/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/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/rnd/research) +"byX" = (/obj/effect/landmark{name = "lightsout"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/rnd/research) +"byY" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/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/tiled{icon_state = "white"},/area/rnd/research) +"byZ" = (/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/airless,/area/shuttle/research/station) +"bza" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bzb" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bzc" = (/obj/effect/large_stock_marker,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) "bzd" = (/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) -"bze" = (/obj/structure/table/standard,/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) -"bzf" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3) -"bzg" = (/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3) -"bzh" = (/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) -"bzi" = (/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) -"bzj" = (/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) -"bzk" = (/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) -"bzl" = (/obj/machinery/door/firedoor,/obj/structure/sign/examroom{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bzm" = (/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) -"bzn" = (/obj/structure/disposalpipe/segment{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/medbay2) -"bzo" = (/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/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bzp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/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) -"bzq" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/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,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bzr" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; 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/medbay2) -"bzs" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) +"bze" = (/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"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bzf" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bzg" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Office"; dir = 4},/obj/structure/table/standard{name = "plastic table frame"},/obj/item/stack/material/glass{pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel,/obj/item/device/multitool,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bzh" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bzi" = (/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/tiled,/area/quartermaster/office) +"bzj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bzk" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bzl" = (/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/tiled,/area/hallway/primary/central_three) +"bzm" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bzn" = (/obj/structure/closet/secure_closet/hop,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bzo" = (/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/tiled,/area/crew_quarters/heads/hop) +"bzp" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bzq" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bzr" = (/obj/machinery/turretid/stun{control_area = "\improper AI Upload Chamber"; name = "AI Upload turret control"; pixel_x = 6; pixel_y = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/device/radio/intercom/locked{frequency = 1343; locked_frequency = 1343; name = "Private AI Channel"; pixel_x = -12; pixel_y = 20},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bzs" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "bzt" = (/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) "bzu" = (/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) "bzv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/substation/medical) "bzw" = (/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) "bzx" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; sortType = "Robotics"; name = "Robotics"},/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},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/research_port) -"bzy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_one_access = list(29)},/turf/simulated/floor,/area/assembly/chargebay) -"bzz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/assembly/chargebay) -"bzA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/assembly/chargebay) -"bzB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/assembly/chargebay) -"bzC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/assembly/chargebay) -"bzD" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/turf/simulated/floor,/area/assembly/chargebay) -"bzE" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/assembly/robotics) -"bzF" = (/obj/structure/table/standard,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/item/device/mmi/digital/posibrain,/obj/item/device/robotanalyzer,/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/assembly/robotics) -"bzG" = (/obj/structure/table/standard,/obj/item/weapon/crowbar,/obj/item/device/radio/headset/headset_sci{pixel_x = -3},/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"bzy" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bzz" = (/obj/machinery/light{dir = 1},/obj/structure/table/standard,/obj/item/weapon/hand_tele,/turf/simulated/floor/tiled,/area/teleporter) +"bzA" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/teleporter) +"bzB" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/teleporter) +"bzC" = (/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/tiled,/area/teleporter) +"bzD" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/teleporter) +"bzE" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/camera/network/command{c_tag = "Bridge - Teleporter"},/turf/simulated/floor/tiled,/area/teleporter) +"bzF" = (/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/tiled,/area/teleporter) +"bzG" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bzH" = (/turf/simulated/wall,/area/rnd/research) -"bzI" = (/obj/machinery/light{dir = 8},/obj/machinery/computer/guestpass{pixel_x = -28},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/rnd/research) -"bzJ" = (/obj/effect/landmark{name = "lightsout"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/rnd/research) -"bzK" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/rnd/research) +"bzI" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/medical/chemistry) +"bzJ" = (/obj/structure/table/standard,/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,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bzK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) "bzL" = (/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) "bzM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/rnd/research) "bzN" = (/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) -"bzO" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/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) +"bzO" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 5; pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/random/firstaid,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) "bzP" = (/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) "bzQ" = (/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,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/storage/emergency) "bzR" = (/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) @@ -4050,730 +4050,730 @@ "bzT" = (/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) "bzU" = (/turf/simulated/wall,/area/rnd/docking) "bzV" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/shuttle/research/station) -"bzW" = (/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) +"bzW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = newlist(); req_one_access = list(33,66)},/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/tiled{icon_state = "white"},/area/medical/medbay) "bzX" = (/obj/machinery/computer/shuttle_control/research,/turf/simulated/shuttle/floor,/area/shuttle/research/station) -"bzY" = (/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/quartermaster/loading) -"bzZ" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/loading) -"bAa" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/loading) -"bAb" = (/obj/machinery/light_switch{pixel_x = 27},/obj/effect/large_stock_marker,/turf/simulated/floor,/area/quartermaster/loading) +"bzY" = (/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/tiled{icon_state = "white"},/area/medical/chemistry) +"bzZ" = (/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/tiled{icon_state = "white"},/area/medical/medbay) +"bAa" = (/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/tiled{icon_state = "white"},/area/medical/medbay) +"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/tiled{icon_state = "white"},/area/medical/medbay3) "bAc" = (/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/loading) "bAd" = (/turf/simulated/floor/plating,/area/quartermaster/loading) -"bAe" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Office"; dir = 4},/obj/structure/table/standard{name = "plastic table frame"},/obj/item/stack/material/glass{pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel,/obj/item/device/multitool,/turf/simulated/floor,/area/quartermaster/office) -"bAf" = (/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) -"bAg" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor,/area/quartermaster/office) +"bAe" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(66)},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bAf" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bAg" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) "bAh" = (/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) -"bAi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/office) -"bAj" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bAk" = (/turf/simulated/floor,/area/hallway/primary/central_three) -"bAl" = (/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) -"bAm" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_three) +"bAi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(66)},/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bAj" = (/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/tiled{icon_state = "white"},/area/medical/medbay3) +"bAk" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bAl" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bAm" = (/obj/machinery/door/firedoor,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) "bAn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_three) "bAo" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable/green,/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/obj/structure/window/reinforced/polarized{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/heads/hop) -"bAp" = (/obj/structure/closet/secure_closet/hop,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bAq" = (/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) +"bAp" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bAq" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) "bAr" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_server_room) -"bAs" = (/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) -"bAt" = (/obj/machinery/turretid/stun{control_area = "\improper AI Upload Chamber"; name = "AI Upload turret control"; pixel_x = 6; pixel_y = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/device/radio/intercom/locked{frequency = 1343; locked_frequency = 1343; name = "Private AI Channel"; pixel_x = -12; pixel_y = 20},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) -"bAu" = (/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) -"bAv" = (/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) +"bAs" = (/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"},/obj/effect/floor_decal/corner/mauve,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bAt" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bAu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bAv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) "bAw" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_cyborg_station) -"bAx" = (/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) -"bAy" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/teleporter) -"bAz" = (/obj/machinery/light{dir = 1},/obj/structure/table/standard,/obj/item/weapon/hand_tele,/turf/simulated/floor,/area/teleporter) -"bAA" = (/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) -"bAB" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/teleporter) -"bAC" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/camera/network/command{c_tag = "Bridge - Teleporter"},/turf/simulated/floor,/area/teleporter) -"bAD" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/teleporter) -"bAE" = (/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) -"bAF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/hallway/primary/central_two) -"bAG" = (/obj/structure/table/standard,/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) -"bAH" = (/obj/structure/table/standard,/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) -"bAI" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{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) -"bAJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"bAK" = (/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) -"bAL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = newlist(); req_one_access = list(33,66)},/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) -"bAM" = (/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) -"bAN" = (/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) -"bAO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(66)},/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) -"bAP" = (/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) -"bAQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) -"bAR" = (/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) -"bAS" = (/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) -"bAT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(66)},/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) -"bAU" = (/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) -"bAV" = (/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) -"bAW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bAX" = (/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) -"bAY" = (/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) -"bAZ" = (/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) -"bBa" = (/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) -"bBb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/medical/medbay2) -"bBc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whitepurplecorner"},/area/medical/medbay2) -"bBd" = (/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) -"bBe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurplecorner"},/area/medical/medbay2) -"bBf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/medical/medbay2) +"bAx" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bAy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bAz" = (/obj/machinery/cryopod/robot{dir = 4},/turf/simulated/floor/tiled,/area/assembly/chargebay) +"bAA" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/assembly/chargebay) +"bAB" = (/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/tiled,/area/assembly/chargebay) +"bAC" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/assembly/chargebay) +"bAD" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = -1; pixel_y = -2},/obj/item/weapon/pen,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/assembly/robotics) +"bAE" = (/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bAF" = (/obj/machinery/optable{name = "Robotics Operating Table"},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bAG" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bAH" = (/obj/structure/closet/wardrobe/robotics_black,/turf/simulated/floor/tiled{icon_state = "white"},/area/assembly/robotics) +"bAI" = (/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/tiled{icon_state = "white"},/area/assembly/robotics) +"bAJ" = (/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) +"bAK" = (/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/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/rnd/research) +"bAL" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bAM" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bAN" = (/obj/structure/noticeboard{pixel_y = 28},/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/tiled{icon_state = "white"},/area/rnd/research) +"bAO" = (/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/effect/floor_decal/corner/mauve{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bAP" = (/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},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bAQ" = (/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,/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bAR" = (/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/tiled{icon_state = "white"},/area/rnd/docking) +"bAS" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bAT" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{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/tiled{icon_state = "white"},/area/rnd/docking) +"bAU" = (/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/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bAV" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bAW" = (/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/tiled{icon_state = "white"},/area/rnd/docking) +"bAX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bAY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bAZ" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bBa" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bBb" = (/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},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bBc" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #2"},/obj/machinery/bot/mulebot{home_destination = "QM #2"; suffix = "#2"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bBd" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos{eftpos_name = "Cargo Bay EFTPOS scanner"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bBe" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bBf" = (/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/tiled,/area/quartermaster/office) "bBg" = (/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"},/obj/machinery/door/airlock/maintenance{name = "Medbay Substation"; req_access = list(5); req_one_access = newlist()},/turf/simulated/floor/plating,/area/maintenance/substation/medical) "bBh" = (/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) "bBi" = (/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) "bBj" = (/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) -"bBk" = (/obj/machinery/cryopod/robot/right,/turf/simulated/floor,/area/assembly/chargebay) -"bBl" = (/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) -"bBm" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/assembly/chargebay) -"bBn" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay) -"bBo" = (/obj/structure/table/standard,/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) -"bBp" = (/obj/machinery/optable{name = "Robotics Operating Table"},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bBq" = (/obj/machinery/computer/operating{name = "Robotics Operating Computer"},/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) -"bBr" = (/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/assembly/robotics) -"bBs" = (/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{icon_state = "white"},/area/assembly/robotics) -"bBt" = (/obj/structure/closet/wardrobe/robotics_black,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) +"bBk" = (/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/tiled,/area/quartermaster/office) +"bBl" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bBm" = (/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bBn" = (/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bBo" = (/obj/structure/closet/secure_closet/hop2,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bBp" = (/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/megaphone,/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bBq" = (/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/tiled,/area/crew_quarters/heads/hop) +"bBr" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bBs" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bBt" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) "bBu" = (/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,/area/rnd/research) -"bBv" = (/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) -"bBw" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bBx" = (/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) -"bBy" = (/obj/structure/noticeboard{pixel_y = 28},/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) -"bBz" = (/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) -"bBA" = (/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 = 4; icon_state = "whitepurplecorner"},/area/rnd/research) -"bBB" = (/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) -"bBC" = (/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) -"bBD" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "bot"},/area/rnd/research) -"bBE" = (/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) -"bBF" = (/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/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bBG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{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) -"bBH" = (/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) -"bBI" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) -"bBJ" = (/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) -"bBK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) -"bBL" = (/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) -"bBM" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bBv" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bBw" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bBx" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_upload_foyer) +"bBy" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bBz" = (/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/teleporter) +"bBA" = (/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/tiled,/area/teleporter) +"bBB" = (/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/tiled,/area/teleporter) +"bBC" = (/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/tiled,/area/teleporter) +"bBD" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/teleporter) +"bBE" = (/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/tiled,/area/teleporter) +"bBF" = (/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/tiled,/area/teleporter) +"bBG" = (/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bBH" = (/obj/structure/table/standard,/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,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bBI" = (/obj/structure/closet/wardrobe/chemistry_white,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/floor_decal/corner/beige,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/chemistry) +"bBJ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/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/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bBK" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bBL" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bBM" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) "bBN" = (/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) "bBO" = (/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"},/obj/structure/table/reinforced,/turf/simulated/shuttle/floor,/area/shuttle/research/station) -"bBP" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/quartermaster/loading) -"bBQ" = (/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/loading) -"bBR" = (/obj/effect/large_stock_marker,/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/loading) -"bBS" = (/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/loading) -"bBT" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos{eftpos_name = "Cargo Bay EFTPOS scanner"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office) -"bBU" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/quartermaster/office) -"bBV" = (/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) -"bBW" = (/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) -"bBX" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor,/area/quartermaster/office) -"bBY" = (/obj/structure/closet/secure_closet/hop2,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bBZ" = (/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bCa" = (/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/megaphone,/obj/structure/table/glass,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bCb" = (/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/structure/table/standard,/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{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 28},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bBQ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bBR" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bBS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(66)},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bBT" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Laboratory"; req_access = list(9)},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bBU" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bBV" = (/obj/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/rnd/research) +"bBW" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bBX" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bBY" = (/obj/machinery/camera/network/research{c_tag = "Research Division North"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bBZ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bCa" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"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},/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/rnd/research) "bCc" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) "bCd" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) -"bCe" = (/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) -"bCf" = (/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) -"bCg" = (/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) -"bCh" = (/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) -"bCi" = (/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) -"bCj" = (/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) -"bCk" = (/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) +"bCe" = (/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},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bCf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bCg" = (/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/tiled{icon_state = "white"},/area/rnd/docking) +"bCh" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bCi" = (/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/tiled{icon_state = "white"},/area/rnd/docking) +"bCj" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable,/obj/machinery/power/apc/critical{name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bCk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) "bCl" = (/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) "bCm" = (/obj/machinery/computer/aifixer,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) -"bCn" = (/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) -"bCo" = (/obj/item/weapon/stool,/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) -"bCp" = (/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) -"bCq" = (/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) -"bCr" = (/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) -"bCs" = (/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) -"bCt" = (/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) -"bCu" = (/obj/structure/table/standard,/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) -"bCv" = (/turf/simulated/floor{dir = 2; icon_state = "whiteyellow"},/area/medical/chemistry) -"bCw" = (/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) -"bCx" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bCy" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/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/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay) -"bCz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay3) -"bCA" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) -"bCB" = (/obj/structure/table/standard,/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) -"bCC" = (/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) -"bCD" = (/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) -"bCE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(66)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bCF" = (/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) +"bCn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bCo" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/shuttle/research/station) +"bCp" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/shuttle/research/station) +"bCq" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bCr" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bCs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bCt" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #3"},/obj/effect/large_stock_marker,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bCu" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/belt/utility,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bCv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bCw" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/light,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bCx" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bCy" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bCz" = (/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/tiled,/area/crew_quarters/heads/hop) +"bCA" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/account_database,/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bCB" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bCC" = (/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/item/device/eftpos{eftpos_name = "HoP EFTPOS scanner"},/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bCD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bCE" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bCF" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_server_room) "bCG" = (/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) -"bCH" = (/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) +"bCH" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) "bCI" = (/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) "bCJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/rnd/research) -"bCK" = (/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) -"bCL" = (/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) -"bCM" = (/obj/machinery/camera/network/research{c_tag = "Research Division North"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bCN" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bCO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bCP" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bCQ" = (/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) -"bCR" = (/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) -"bCS" = (/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) -"bCT" = (/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) -"bCU" = (/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) -"bCV" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bCW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bCX" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable,/obj/machinery/power/apc/critical{name = "south bump"; pixel_y = -24},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bCY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bCK" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bCL" = (/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/tiled{icon_state = "vault"; dir = 1},/area/turret_protected/ai_cyborg_station) +"bCM" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/teleporter) +"bCN" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/teleporter) +"bCO" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled,/area/teleporter) +"bCP" = (/obj/machinery/shieldwallgen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/teleporter) +"bCQ" = (/obj/machinery/shieldwallgen,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/teleporter) +"bCR" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/teleporter) +"bCS" = (/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/tiled,/area/hallway/primary/central_two) +"bCT" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bCU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/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/tiled,/area/hallway/primary/central_two) +"bCV" = (/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"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bCW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = newlist(); req_one_access = list(33,66)},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bCX" = (/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/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bCY" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) "bCZ" = (/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) -"bDa" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/research/station) +"bDa" = (/obj/structure/table/standard,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/effect/floor_decal/corner/paleblue/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) "bDb" = (/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) -"bDc" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/research/station) -"bDd" = (/turf/simulated/floor{icon_state = "delivery"},/area/quartermaster/loading) +"bDc" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bDd" = (/obj/structure/table/standard,/obj/machinery/light,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/masks{pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) "bDe" = (/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/loading) "bDf" = (/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/loading) -"bDg" = (/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/loading) -"bDh" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/belt/utility,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office) +"bDg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bDh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) "bDi" = (/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/office) -"bDj" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/quartermaster/office) -"bDk" = (/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) -"bDl" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/central_three) -"bDm" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "bot"},/area/hallway/primary/central_three) -"bDn" = (/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) -"bDo" = (/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) -"bDp" = (/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/item/device/eftpos{eftpos_name = "HoP EFTPOS scanner"},/obj/structure/table/glass,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bDq" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bDr" = (/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) -"bDs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) -"bDt" = (/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) +"bDj" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bDk" = (/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"},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bDl" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bDm" = (/obj/structure/closet/wardrobe/medic_white,/obj/machinery/camera/network/medbay{c_tag = "Medbay Cloning"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bDn" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bDo" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bDp" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bDq" = (/obj/machinery/light/small{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDr" = (/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"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDs" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/research) +"bDt" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) "bDu" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload_foyer) -"bDv" = (/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) -"bDw" = (/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) -"bDx" = (/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) -"bDy" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/teleporter) -"bDz" = (/turf/simulated/floor{icon_state = "warning"},/area/teleporter) -"bDA" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/teleporter) -"bDB" = (/obj/machinery/shieldwallgen,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "bot"},/area/teleporter) -"bDC" = (/obj/machinery/shieldwallgen,/turf/simulated/floor{icon_state = "bot"},/area/teleporter) -"bDD" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/teleporter) -"bDE" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/hallway/primary/central_two) -"bDF" = (/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_two) -"bDG" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/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,/area/hallway/primary/central_two) +"bDv" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bDw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera/network/research{c_tag = "Research Division West"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDx" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bDy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = 24},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) +"bDE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bDF" = (/obj/machinery/hologram/holopad,/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/tiled{icon_state = "white"},/area/rnd/research) +"bDG" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera/network/research{c_tag = "Research Shuttle Dock"; dir = 8},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) "bDH" = (/turf/simulated/wall,/area/medical/sleeper) -"bDI" = (/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"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/sleeper) +"bDI" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) "bDJ" = (/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) -"bDK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = newlist(); req_one_access = list(33,66)},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) +"bDK" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/quartermaster/loading) "bDL" = (/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) "bDM" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/medbay) -"bDN" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bDO" = (/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{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay) -"bDP" = (/obj/structure/table/standard,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/medical/medbay3) -"bDQ" = (/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) -"bDR" = (/obj/structure/table/standard,/obj/machinery/light,/obj/item/weapon/storage/box/gloves{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/masks{pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay3) -"bDS" = (/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) -"bDT" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bDU" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor{dir = 9; icon_state = "whitered"},/area/medical/cryo) -"bDV" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/cryo) -"bDW" = (/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"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/cryo) +"bDN" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display/supply_display{pixel_y = -32},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/quartermaster/loading) +"bDO" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/quartermaster/loading) +"bDP" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bDQ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bDR" = (/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},/obj/effect/large_stock_marker,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bDS" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #4"},/obj/effect/large_stock_marker,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/loading) +"bDT" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/office) +"bDU" = (/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"},/obj/effect/floor_decal/corner/brown,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bDV" = (/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/tiled,/area/quartermaster/office) +"bDW" = (/obj/structure/noticeboard{pixel_y = -27},/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/quartermaster/office) "bDX" = (/turf/simulated/wall,/area/medical/cryo) -"bDY" = (/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) -"bDZ" = (/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) -"bEa" = (/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) +"bDY" = (/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/tiled,/area/quartermaster/office) +"bDZ" = (/obj/machinery/atm{pixel_x = -28},/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bEa" = (/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (EAST)"; icon_state = "loadingarea"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bEb" = (/turf/simulated/wall,/area/medical/genetics) "bEc" = (/obj/item/frame/apc,/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/genetics) "bEd" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/genetics) "bEe" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plating,/area/medical/genetics) "bEf" = (/obj/structure/table,/turf/simulated/floor/plating,/area/medical/genetics) "bEg" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/medical/genetics) -"bEh" = (/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) -"bEi" = (/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) +"bEh" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bEi" = (/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/tiled,/area/crew_quarters/heads/hop) "bEj" = (/obj/structure/sign/securearea,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/rnd/research) -"bEk" = (/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) -"bEl" = (/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) -"bEm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bEn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera/network/research{c_tag = "Research Division West"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bEo" = (/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) -"bEp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bEq" = (/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) -"bEr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = 24},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bEs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/rnd/research) -"bEt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/rnd/research) -"bEu" = (/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) -"bEv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bEw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) -"bEx" = (/obj/machinery/hologram/holopad,/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) +"bEk" = (/obj/structure/filingcabinet/chestdrawer,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bEl" = (/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bEm" = (/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/tiled,/area/crew_quarters/heads/hop) +"bEn" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bEo" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bEp" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/teleporter) +"bEq" = (/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/tiled,/area/medical/sleeper) +"bEr" = (/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bEs" = (/turf/simulated/floor/tiled,/area/medical/sleeper) +"bEt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bEu" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bEv" = (/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/tiled{icon_state = "white"},/area/medical/medbay) +"bEw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bEx" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) "bEy" = (/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) "bEz" = (/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) "bEA" = (/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) "bEB" = (/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) "bEC" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bED" = (/turf/simulated/wall,/area/maintenance/research_shuttle) -"bEE" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bEF" = (/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) +"bEE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bEF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(66)},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) "bEG" = (/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) "bEH" = (/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) -"bEI" = (/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/loading) -"bEJ" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/loading) -"bEK" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/loading) -"bEL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/quartermaster/loading) -"bEM" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #3"},/obj/effect/large_stock_marker,/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/loading) +"bEI" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bEJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bEK" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bEL" = (/obj/machinery/door/firedoor,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bEM" = (/obj/machinery/power/apc/high{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) "bEN" = (/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/loading) "bEO" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/loading) -"bEP" = (/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/loading) -"bEQ" = (/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/loading) -"bER" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office) -"bES" = (/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/quartermaster/office) -"bET" = (/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) -"bEU" = (/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) -"bEV" = (/obj/structure/noticeboard{pixel_y = -27},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/quartermaster/office) +"bEP" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bEQ" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = 1; pixel_y = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bER" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bES" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bET" = (/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/tiled{icon_state = "white"},/area/medical/genetics) +"bEU" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bEV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) "bEW" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/qm) "bEX" = (/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) "bEY" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/qm) "bEZ" = (/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) "bFa" = (/turf/simulated/wall,/area/quartermaster/qm) -"bFb" = (/obj/machinery/atm{pixel_x = -28},/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_three) -"bFc" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/hallway/primary/central_three) -"bFd" = (/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/hallway/primary/central_three) -"bFe" = (/obj/structure/filingcabinet/chestdrawer,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/crew_quarters/heads/hop) -"bFf" = (/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) -"bFg" = (/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/structure/table/glass,/turf/simulated/floor,/area/crew_quarters/heads/hop) -"bFh" = (/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) +"bFb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bFc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bFd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bFe" = (/obj/structure/disposalpipe/segment{dir = 4},/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/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bFf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bFg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bFh" = (/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/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) "bFi" = (/obj/machinery/message_server,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room) "bFj" = (/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) -"bFk" = (/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) -"bFl" = (/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) +"bFk" = (/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/disposalpipe/segment,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bFl" = (/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/tiled{icon_state = "white"},/area/rnd/research) "bFm" = (/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) "bFn" = (/obj/machinery/recharge_station,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station) "bFo" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/teleporter) "bFp" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/teleporter) "bFq" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/teleporter) "bFr" = (/obj/structure/table/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/teleporter) -"bFs" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/teleporter) -"bFt" = (/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) -"bFu" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/medical/sleeper) -"bFv" = (/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bFw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bFx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bFy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bFz" = (/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) -"bFA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bFB" = (/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) -"bFC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(66)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3) -"bFD" = (/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) -"bFE" = (/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) -"bFF" = (/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/medbay2) -"bFG" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/cryo) -"bFH" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) -"bFI" = (/obj/machinery/power/apc/high{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) -"bFJ" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = 1; pixel_y = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) -"bFK" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) +"bFs" = (/obj/structure/table/standard,/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,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bFt" = (/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},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/machinery/modular_computer/console/preset/research,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bFu" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bFv" = (/obj/machinery/light{dir = 1},/mob/living/simple_animal/yithian,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/hor) +"bFw" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/hor) +"bFx" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/hor) +"bFy" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bFz" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bFA" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bFB" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled,/area/rnd/docking) +"bFC" = (/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/tiled{icon_state = "white"},/area/rnd/docking) +"bFD" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "research_dock_pump"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled,/area/rnd/docking) +"bFE" = (/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(50)},/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/tiled,/area/quartermaster/miningdock) +"bFF" = (/obj/structure/filingcabinet,/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bFG" = (/obj/machinery/computer/security/mining,/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bFH" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bFI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bFJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - Southwest"; dir = 8},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bFK" = (/obj/machinery/door/airlock/command{id_tag = "hopdoor"; name = "Head of Personnel"; req_access = list(57)},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bFL" = (/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/genetics) "bFM" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/medical/genetics) "bFN" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/medical/genetics) "bFO" = (/turf/simulated/floor/plating,/area/medical/genetics) "bFP" = (/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) -"bFQ" = (/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) -"bFR" = (/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) -"bFS" = (/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) -"bFT" = (/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) -"bFU" = (/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/research) -"bFV" = (/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/research) -"bFW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bFX" = (/obj/structure/disposalpipe/segment{dir = 4},/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/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bFY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/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) -"bFZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bGa" = (/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/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bGb" = (/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{dir = 5; icon_state = "whitehall"},/area/rnd/research) -"bGc" = (/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) +"bFQ" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "dark"},/area/turret_protected/ai_server_room) +"bFR" = (/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/tiled{icon_state = "dark"},/area/turret_protected/ai_cyborg_station) +"bFS" = (/obj/machinery/door/airlock/multi_tile/glass{autoclose = 1; dir = 2; req_access = list(5)},/turf/simulated/floor/tiled,/area/medical/sleeper) +"bFT" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bFU" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bFV" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bFW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bFX" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Chemistry"; name = "Chemistry"},/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bFY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bFZ" = (/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 21},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bGa" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bGb" = (/obj/structure/noticeboard{pixel_y = 28},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bGc" = (/obj/machinery/light{dir = 1},/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = 30; pixel_z = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) "bGd" = (/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) -"bGe" = (/obj/structure/table/standard,/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) -"bGf" = (/obj/structure/table/standard,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bGg" = (/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) -"bGh" = (/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) -"bGi" = (/obj/structure/lamarr,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/hor) -"bGj" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/crew_quarters/heads/hor) +"bGe" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bGf" = (/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 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bGg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bGh" = (/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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bGi" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bGj" = (/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/tiled{icon_state = "white"},/area/medical/cryo) "bGk" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/hor) "bGl" = (/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) "bGm" = (/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bGn" = (/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) -"bGo" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bGp" = (/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) -"bGq" = (/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) -"bGr" = (/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) -"bGs" = (/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) -"bGt" = (/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) +"bGo" = (/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/tiled{icon_state = "white"},/area/medical/cryo) +"bGp" = (/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/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bGq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(66)},/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/tiled{icon_state = "white"},/area/medical/cryo) +"bGr" = (/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/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bGs" = (/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/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bGt" = (/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/tiled{icon_state = "white"},/area/medical/genetics) "bGu" = (/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) -"bGv" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/loading) -"bGw" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/quartermaster/loading) -"bGx" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/quartermaster/loading) -"bGy" = (/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},/obj/effect/large_stock_marker,/turf/simulated/floor,/area/quartermaster/loading) -"bGz" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #4"},/obj/effect/large_stock_marker,/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/loading) +"bGv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/medical/genetics) +"bGw" = (/obj/item/frame/light,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/medical/genetics) +"bGx" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bGy" = (/obj/structure/sign/science{pixel_x = 32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bGz" = (/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/tiled{icon_state = "dark"},/area/rnd/research) "bGA" = (/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/loading) "bGB" = (/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/loading) "bGC" = (/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/loading) "bGD" = (/turf/simulated/wall,/area/quartermaster/miningdock) -"bGE" = (/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(50)},/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) -"bGF" = (/obj/structure/filingcabinet,/turf/simulated/floor,/area/quartermaster/qm) -"bGG" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor,/area/quartermaster/qm) -"bGH" = (/obj/machinery/computer/security/mining,/turf/simulated/floor,/area/quartermaster/qm) -"bGI" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/quartermaster/qm) -"bGJ" = (/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) +"bGE" = (/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/tiled,/area/rnd/research) +"bGF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bGG" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bGH" = (/obj/structure/table/standard,/obj/machinery/computer/skills{icon_state = "medlaptop"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bGI" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bGJ" = (/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},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) "bGK" = (/obj/machinery/status_display,/turf/simulated/wall,/area/hallway/primary/central_three) "bGL" = (/turf/simulated/wall/r_wall,/area/hallway/primary/central_three) -"bGM" = (/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) -"bGN" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room) -"bGO" = (/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/turret_protected/ai_cyborg_station) -"bGP" = (/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) -"bGQ" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bGR" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bGS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bGT" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bGU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bGV" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Chemistry"; name = "Chemistry"},/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 = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay) -"bGW" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay) -"bGX" = (/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 = 21},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3) -"bGY" = (/obj/structure/noticeboard{pixel_y = 28},/obj/machinery/hologram/holopad,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3) -"bGZ" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3) -"bHa" = (/obj/machinery/light{dir = 1},/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = 30; pixel_z = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2) -"bHb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) -"bHc" = (/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 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bHd" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/medbay2) -"bHe" = (/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) -"bHf" = (/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) -"bHg" = (/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) -"bHh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access = list(66)},/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) -"bHi" = (/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) -"bHj" = (/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) -"bHk" = (/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) -"bHl" = (/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) +"bGM" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/hor) +"bGN" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/hor) +"bGO" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/hor) +"bGP" = (/obj/machinery/computer/shuttle_control/research,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bGQ" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/docking) +"bGR" = (/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 = "research_dock_pump"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/rnd/docking) +"bGS" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled,/area/rnd/docking) +"bGT" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/critical{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bGU" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bGV" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_y = 24},/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bGW" = (/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/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bGX" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bGY" = (/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bGZ" = (/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(41)},/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/tiled,/area/quartermaster/qm) +"bHa" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bHb" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHc" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHd" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHe" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHf" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHg" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHi" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHj" = (/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},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHk" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHl" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHm" = (/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) "bHn" = (/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) -"bHo" = (/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) +"bHo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bHp" = (/obj/effect/decal/cleanable/dirt,/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) -"bHq" = (/obj/item/frame/light,/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) -"bHr" = (/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) -"bHs" = (/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) -"bHt" = (/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) -"bHu" = (/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) -"bHv" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bHw" = (/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) -"bHx" = (/obj/structure/table/standard,/obj/machinery/computer/skills{icon_state = "medlaptop"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bHy" = (/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) -"bHz" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bHA" = (/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/crew_quarters/heads/hor) -"bHB" = (/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/crew_quarters/heads/hor) -"bHC" = (/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/crew_quarters/heads/hor) +"bHq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/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,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHs" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - South Southeast"},/obj/structure/sign/securearea{pixel_y = 32},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHu" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHv" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHw" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bHx" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bHy" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bHz" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - Southeast"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bHA" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bHB" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acute1"; name = "EMT Storage Privacy Shutters"; opacity = 0},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bHC" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acute1"; name = "EMT Storage Privacy Shutters"; opacity = 0},/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) "bHD" = (/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/research_shuttle) -"bHE" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{icon_state = "white"},/area/rnd/docking) -"bHF" = (/obj/machinery/computer/shuttle_control/research,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking) +"bHE" = (/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"},/obj/effect/floor_decal/corner/paleblue,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bHF" = (/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/tiled{icon_state = "white"},/area/medical/medbay) "bHG" = (/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) -"bHH" = (/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 = "research_dock_pump"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/rnd/docking) -"bHI" = (/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) +"bHH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bHI" = (/obj/machinery/door/firedoor,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) "bHJ" = (/obj/structure/lattice,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 32},/turf/space,/area/space) -"bHK" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor,/area/quartermaster/miningdock) -"bHL" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/critical{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor,/area/quartermaster/miningdock) -"bHM" = (/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/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/miningdock) -"bHN" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/light{dir = 1},/obj/machinery/light_switch{pixel_y = 24},/obj/item/weapon/storage/belt/utility,/turf/simulated/floor,/area/quartermaster/miningdock) +"bHK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bHL" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) +"bHM" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bHN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay3) "bHO" = (/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) -"bHP" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/quartermaster/qm) -"bHQ" = (/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(41)},/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) -"bHR" = (/turf/simulated/floor,/area/quartermaster/qm) -"bHS" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/qm) -"bHT" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/central_three) -"bHU" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor,/area/hallway/primary/central_three) -"bHV" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/hallway/primary/central_three) -"bHW" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bHX" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bHY" = (/obj/structure/sign/securearea{pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_three) -"bHZ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_three) -"bIa" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_three) -"bIb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three) -"bIc" = (/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) -"bId" = (/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) -"bIe" = (/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) -"bIf" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bIg" = (/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) -"bIh" = (/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) -"bIi" = (/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) -"bIj" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/hallway/primary/central_three) -"bIk" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three) -"bIl" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bIm" = (/obj/machinery/atm{pixel_y = 32},/turf/simulated/floor,/area/hallway/primary/central_two) -"bIn" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor,/area/hallway/primary/central_two) -"bIo" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/hallway/primary/central_two) -"bIp" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - Southeast"},/turf/simulated/floor,/area/hallway/primary/central_two) +"bHP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bHQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bHR" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/effect/floor_decal/corner/paleblue/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bHS" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bHT" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/cryo) +"bHU" = (/obj/structure/extinguisher_cabinet{pixel_x = -25},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bHV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bHW" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bHX" = (/obj/structure/table,/turf/simulated/floor/tiled,/area/medical/genetics) +"bHY" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/medical/genetics) +"bHZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/bluegrid{base_icon = 'icons/turf/flooring/plating.dmi'; icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) +"bIa" = (/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"},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/tiled{icon_state = "dark"},/area/server) +"bIb" = (/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/tiled{icon_state = "dark"},/area/server) +"bIc" = (/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/tiled{icon_state = "dark"},/area/server) +"bId" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/rnd/storage) +"bIe" = (/obj/machinery/computer/area_atmos,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/tiled,/area/rnd/storage) +"bIf" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/structure/sign/nosmoking_2{pixel_x = 28},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/rnd/storage) +"bIg" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) +"bIh" = (/obj/structure/table/rack,/obj/item/weapon/rig/hazmat/equipped,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bIi" = (/obj/machinery/computer/mecha,/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bIj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bIk" = (/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bIl" = (/obj/machinery/computer/area_atmos,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bIm" = (/obj/structure/table/standard,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/obj/item/device/radio/intercom{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},/obj/item/device/gps,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bIn" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bIo" = (/obj/structure/table/standard,/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/tiled,/area/quartermaster/miningdock) +"bIp" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "bIq" = (/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) -"bIr" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acute1"; name = "EMT Storage Privacy Shutters"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) -"bIs" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acute1"; name = "EMT Storage Privacy Shutters"; opacity = 0},/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) -"bIt" = (/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) -"bIu" = (/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) -"bIv" = (/obj/machinery/door/firedoor,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) -"bIw" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3) -"bIx" = (/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) -"bIy" = (/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) -"bIz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3) -"bIA" = (/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) -"bIB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/medbay2) -"bIC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2) -"bID" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) -"bIE" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cryo) -"bIF" = (/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) -"bIG" = (/obj/structure/extinguisher_cabinet{pixel_x = -25},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) -"bIH" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Geneticist"},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) -"bII" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning) +"bIr" = (/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/tiled,/area/quartermaster/miningdock) +"bIs" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bIt" = (/obj/item/weapon/clipboard,/obj/item/weapon/stamp{name = "Quartermaster's stamp"; pixel_x = 0; pixel_y = 0},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bIu" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bIv" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo - Quartermaster's Office"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bIw" = (/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/tiled,/area/hallway/primary/central_three) +"bIx" = (/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/tiled,/area/hallway/primary/central_three) +"bIy" = (/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/tiled,/area/hallway/primary/central_three) +"bIz" = (/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{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bIA" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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/tiled,/area/hallway/primary/central_three) +"bIB" = (/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/tiled,/area/hallway/primary/central_three) +"bIC" = (/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/tiled,/area/hallway/primary/central_three) +"bID" = (/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/tiled,/area/hallway/primary/central_three) +"bIE" = (/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{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bIF" = (/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/tiled,/area/hallway/primary/central_three) +"bIG" = (/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/tiled,/area/hallway/primary/central_three) +"bIH" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AftH"; location = "AIW"},/obj/structure/disposalpipe/segment,/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/tiled,/area/hallway/primary/central_three) +"bII" = (/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/tiled,/area/hallway/primary/central_three) "bIJ" = (/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) "bIK" = (/obj/item/frame/light,/turf/simulated/floor/plating,/area/medical/genetics) "bIL" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/genetics) -"bIM" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) -"bIN" = (/obj/structure/table,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) +"bIM" = (/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/tiled,/area/hallway/primary/central_three) +"bIN" = (/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/tiled,/area/hallway/primary/central_three) "bIO" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(5,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) "bIP" = (/turf/simulated/wall/r_wall,/area/maintenance/research_port) "bIQ" = (/turf/simulated/wall/r_wall,/area/server) "bIR" = (/obj/machinery/r_n_d/server/robotics,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bIS" = (/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) -"bIT" = (/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) +"bIT" = (/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/tiled,/area/hallway/primary/central_three) "bIU" = (/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) -"bIV" = (/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) -"bIW" = (/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"},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "dark"},/area/server) -"bIX" = (/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) +"bIV" = (/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/tiled,/area/hallway/primary/central_two) +"bIW" = (/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/tiled,/area/hallway/primary/central_two) +"bIX" = (/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/tiled,/area/hallway/primary/central_two) "bIY" = (/turf/simulated/wall/r_wall,/area/rnd/storage) -"bIZ" = (/obj/machinery/computer/area_atmos,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "bot"},/area/rnd/storage) -"bJa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/rnd/storage) -"bJb" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor{icon_state = "bot"},/area/rnd/storage) +"bIZ" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=HOP"; location = "CHE"},/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/tiled,/area/hallway/primary/central_two) +"bJa" = (/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/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bJb" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) "bJc" = (/turf/simulated/wall,/area/rnd/storage) -"bJd" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) +"bJd" = (/obj/machinery/mech_recharger,/obj/structure/sign/poster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/medical/sleeper) "bJe" = (/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) -"bJf" = (/obj/structure/table/rack,/obj/item/weapon/rig/hazmat/equipped,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bJg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bJh" = (/obj/machinery/computer/mecha,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bJi" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bJj" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bJk" = (/obj/structure/table/standard,/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},/obj/item/device/gps,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) +"bJf" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bJg" = (/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/tiled{icon_state = "white"},/area/medical/sleeper) +"bJh" = (/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/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bJi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{id_tag = "cmodoor"; name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bJj" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bJk" = (/obj/machinery/light/small,/obj/machinery/light_switch{pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/cryo) "bJl" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bJm" = (/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) "bJn" = (/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) "bJo" = (/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) -"bJp" = (/obj/structure/table/standard,/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) -"bJq" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock) -"bJr" = (/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) -"bJs" = (/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) +"bJp" = (/obj/machinery/atmospherics/unary/freezer{dir = 1; icon_state = "freezer"},/obj/machinery/light/small,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/cryo) +"bJq" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/cryo) +"bJr" = (/obj/machinery/clonepod,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bJs" = (/obj/machinery/dna_scannernew,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) "bJt" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/quartermaster/qm) -"bJu" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/qm) -"bJv" = (/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},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/qm) -"bJw" = (/obj/item/weapon/clipboard,/obj/item/weapon/stamp{name = "Quartermaster's stamp"; pixel_x = 0; pixel_y = 0},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/qm) -"bJx" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo - Quartermaster's Office"; dir = 8},/turf/simulated/floor,/area/quartermaster/qm) -"bJy" = (/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) -"bJz" = (/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) -"bJA" = (/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) -"bJB" = (/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{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three) -"bJC" = (/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/hallway/primary/central_three) -"bJD" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/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) -"bJE" = (/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_three) -"bJF" = (/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_three) -"bJG" = (/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) -"bJH" = (/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{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three) -"bJI" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AftH"; location = "AIW"},/obj/structure/disposalpipe/segment,/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) -"bJJ" = (/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) -"bJK" = (/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) -"bJL" = (/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) -"bJM" = (/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) -"bJN" = (/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) -"bJO" = (/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) -"bJP" = (/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) -"bJQ" = (/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) -"bJR" = (/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/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two) -"bJS" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=HOP"; location = "CHE"},/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,/area/hallway/primary/central_two) -"bJT" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/sign/poster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/medical/sleeper) -"bJU" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/medical/sleeper) -"bJV" = (/obj/machinery/computer/mech_bay_power_console,/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/medical/sleeper) -"bJW" = (/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bJX" = (/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) +"bJu" = (/obj/machinery/computer/cloning,/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/genetics_cloning) +"bJv" = (/turf/simulated/floor/tiled,/area/medical/genetics) +"bJw" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/bluegrid{base_icon = 'icons/turf/flooring/plating.dmi'; icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) +"bJx" = (/obj/machinery/alarm/server{dir = 4; pixel_x = -22; pixel_y = 0},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/bluegrid{base_icon = 'icons/turf/flooring/plating.dmi'; icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) +"bJy" = (/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/eastleft{name = "Server Room"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/server) +"bJz" = (/turf/simulated/floor/bluegrid{base_icon = 'icons/turf/flooring/plating.dmi'; icon = 'icons/turf/flooring/tiles.dmi'; icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) +"bJA" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled{icon_state = "dark"},/area/server) +"bJB" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/meter,/turf/simulated/floor/tiled{icon_state = "dark"},/area/server) +"bJC" = (/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/tiled{icon_state = "dark"},/area/server) +"bJD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/storage) +"bJE" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/rnd/storage) +"bJF" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/storage) +"bJG" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) +"bJH" = (/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/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/rnd/research) +"bJI" = (/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,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bJJ" = (/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/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bJK" = (/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)},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bJL" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bJM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bJN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bJO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bJP" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bJQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/rnd/test_area) +"bJR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/rnd/test_area) +"bJS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/rnd/test_area) +"bJT" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/shuttle/mining/station) +"bJU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/mining/station) +"bJV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/mining/station) +"bJW" = (/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bJX" = (/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/tiled,/area/quartermaster/miningdock) "bJY" = (/obj/machinery/vending/medical,/turf/simulated/wall,/area/medical/medbay) -"bJZ" = (/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{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) +"bJZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/qm) "bKa" = (/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 = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay) "bKb" = (/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) -"bKc" = (/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) +"bKc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/quartermaster/qm) "bKd" = (/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) "bKe" = (/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 = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay2) -"bKf" = (/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) -"bKg" = (/obj/machinery/light/small,/obj/machinery/light_switch{pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "delivery"},/area/medical/cryo) -"bKh" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "delivery"},/area/medical/cryo) -"bKi" = (/obj/machinery/atmospherics/unary/freezer{dir = 1; icon_state = "freezer"},/obj/machinery/light/small,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "delivery"},/area/medical/cryo) -"bKj" = (/obj/machinery/clonepod,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/medical/genetics_cloning) -"bKk" = (/obj/machinery/computer/cloning,/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/medical/genetics_cloning) -"bKl" = (/obj/machinery/dna_scannernew,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/medical/genetics_cloning) +"bKf" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bKg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bKh" = (/obj/machinery/light,/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKi" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKj" = (/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/tiled,/area/hallway/primary/central_three) +"bKk" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKl" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bKm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/genetics) -"bKn" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) +"bKn" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bKo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/plating,/area/medical/genetics) "bKp" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/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,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_port) "bKq" = (/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/quartermaster/loading) -"bKr" = (/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) -"bKs" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"bKt" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"bKu" = (/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/eastleft{name = "Server Room"},/turf/simulated/floor{icon_state = "dark"},/area/server) -"bKv" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/meter,/turf/simulated/floor{icon_state = "dark"},/area/server) -"bKw" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "dark"},/area/server) -"bKx" = (/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) -"bKy" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/rnd/storage) -"bKz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage) -"bKA" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) -"bKB" = (/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) -"bKC" = (/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,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bKD" = (/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/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/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},/obj/machinery/door/airlock/command{name = "Research Director"; req_access = list(30)},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/rnd/research) -"bKF" = (/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/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bKG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bKH" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bKI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bKJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bKK" = (/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 = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) +"bKr" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKt" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = -24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = -32; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/engineering{pixel_y = -40},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKy" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Janitor Closet"; name = "Janitor Closet"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 8; name = "hazard door west"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bKB" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bKC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bKD" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bKE" = (/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/tiled{icon_state = "white"},/area/medical/sleeper) +"bKF" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bKG" = (/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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bKH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bKI" = (/obj/structure/disposalpipe/segment,/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 = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bKJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bKK" = (/obj/machinery/light{dir = 1},/obj/structure/filingcabinet/chestdrawer{dir = 1},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) "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/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/loading) "bKN" = (/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/loading) "bKO" = (/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/loading) -"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) +"bKP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bKQ" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bKR" = (/obj/machinery/light{dir = 1},/obj/machinery/photocopier,/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) "bKS" = (/turf/simulated/wall,/area/rnd/test_area) "bKT" = (/turf/simulated/wall/r_wall,/area/rnd/test_area) "bKU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall/r_wall,/area/rnd/test_area) -"bKV" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/mining/station) -"bKW" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/mining/station) +"bKV" = (/obj/structure/computerframe,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/tiled,/area/medical/genetics) +"bKW" = (/obj/item/weapon/material/shard,/turf/simulated/floor/tiled,/area/medical/genetics) "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/network/civilian_west{c_tag = "Cargo Mining Dock"; dir = 4},/turf/simulated/floor,/area/quartermaster/miningdock) -"bLa" = (/turf/simulated/floor,/area/quartermaster/miningdock) +"bKY" = (/obj/structure/window/reinforced,/obj/structure/computerframe,/turf/simulated/floor/tiled,/area/medical/genetics) +"bKZ" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor/tiled{icon_state = "dark"},/area/server) +"bLa" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/tiled{icon_state = "dark"},/area/server) "bLb" = (/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) -"bLc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/qm) -"bLd" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/quartermaster/qm) -"bLe" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/qm) -"bLf" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/qm) -"bLg" = (/obj/machinery/light,/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_three) -"bLh" = (/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,/area/hallway/primary/central_three) -"bLi" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLj" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLk" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLl" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLm" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLn" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLp" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_y = -24; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_y = -32; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/engineering{pixel_y = -40},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/central_three) -"bLs" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Janitor Closet"; name = "Janitor Closet"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLt" = (/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) -"bLu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central_three) -"bLv" = (/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) -"bLw" = (/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) -"bLx" = (/obj/machinery/light,/turf/simulated/floor,/area/hallway/primary/central_two) -"bLy" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/hallway/primary/central_two) -"bLz" = (/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) -"bLA" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bLB" = (/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/medical/sleeper) -"bLC" = (/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) -"bLD" = (/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) -"bLE" = (/obj/structure/disposalpipe/segment,/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 = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) +"bLc" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/tiled{icon_state = "dark"},/area/server) +"bLd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/storage) +"bLe" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/tiled,/area/rnd/storage) +"bLf" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) +"bLg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bLh" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bLi" = (/obj/structure/table/standard,/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},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bLj" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bLk" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk{dir = 1},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bLl" = (/obj/structure/closet/secure_closet/RD,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bLm" = (/obj/structure/window/reinforced,/obj/structure/filingcabinet/chestdrawer,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hor) +"bLn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/rnd/test_area) +"bLo" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless,/area/rnd/test_area) +"bLp" = (/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bLq" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bLr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (NORTH)"; icon_state = "swall_straight"; dir = 1},/area/shuttle/mining/station) +"bLs" = (/obj/machinery/computer/shuttle_control/mining,/obj/effect/floor_decal/corner/brown/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bLt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bLu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bLv" = (/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/tiled,/area/quartermaster/miningdock) +"bLw" = (/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/tiled,/area/quartermaster/miningdock) +"bLx" = (/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/tiled,/area/quartermaster/qm) +"bLy" = (/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/tiled,/area/quartermaster/qm) +"bLz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bLA" = (/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/tiled,/area/quartermaster/qm) +"bLB" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bLC" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bLD" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/junction,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"bLE" = (/obj/machinery/door/airlock{name = "Custodial Closet"; req_access = list(26)},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bLF" = (/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) -"bLG" = (/obj/machinery/light{dir = 1},/obj/structure/filingcabinet/chestdrawer{dir = 1},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/crew_quarters/heads/cmo) -"bLH" = (/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/crew_quarters/heads/cmo) -"bLI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bLJ" = (/obj/machinery/light{dir = 1},/obj/machinery/photocopier,/turf/simulated/floor{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/crew_quarters/heads/cmo) +"bLG" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled{icon_state = "dark"},/area/hallway/primary/central_two) +"bLH" = (/obj/effect/landmark/start{name = "Paramedic"},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bLI" = (/obj/structure/closet/secure_closet/medical1,/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; 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/tiled{icon_state = "white"},/area/medical/sleeper) +"bLJ" = (/obj/machinery/button/remote/blast_door{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = -25; req_access = list(5)},/obj/effect/landmark/start{name = "Paramedic"},/obj/machinery/camera/network/medbay{c_tag = "Medbay EMT Storage"; dir = 1},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) "bLK" = (/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) "bLL" = (/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) "bLM" = (/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) "bLN" = (/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) "bLO" = (/turf/simulated/wall,/area/medical/genetics_cloning) -"bLP" = (/obj/structure/computerframe,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) +"bLP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) "bLQ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/plating,/area/medical/genetics) -"bLR" = (/obj/item/weapon/material/shard,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) +"bLR" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 28},/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/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) "bLS" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/genetics) -"bLT" = (/obj/structure/window/reinforced,/obj/structure/computerframe,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) +"bLT" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/obj/structure/table/glass,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) "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/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) "bLY" = (/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) -"bLZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server) -"bMa" = (/obj/machinery/computer/rdservercontrol,/turf/simulated/floor{icon_state = "dark"},/area/server) -"bMb" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{icon_state = "dark"},/area/server) -"bMc" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor,/area/rnd/storage) -"bMd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage) -"bMe" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research) -"bMf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bMg" = (/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) -"bMh" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bMi" = (/obj/structure/table/standard,/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) -"bMj" = (/obj/structure/closet/secure_closet/RD,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bMk" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) -"bMl" = (/obj/structure/window/reinforced,/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor) +"bLZ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bMa" = (/turf/simulated/floor/tiled{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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bMc" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bMd" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bMe" = (/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},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bMf" = (/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"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bMg" = (/obj/structure/reagent_dispensers/water_cooler,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bMh" = (/obj/machinery/light{dir = 1},/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bMi" = (/obj/structure/noticeboard{pixel_y = 28},/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"},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bMj" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/tiled,/area/medical/genetics) +"bMk" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/tiled,/area/medical/genetics) +"bMl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/mob/living/simple_animal/mouse/white,/turf/simulated/floor/tiled,/area/rnd/storage) "bMm" = (/obj/effect/decal/cleanable/generic,/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/research_shuttle) "bMn" = (/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"},/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_shuttle) "bMo" = (/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/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bMp" = (/obj/effect/decal/cleanable/dirt,/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},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/research_shuttle) -"bMq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"bMr" = (/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"bMs" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/rnd/test_area) +"bMq" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Storage"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/storage) +"bMr" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/storage) +"bMs" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/camera/network/research{c_tag = "Research Division Central"; dir = 4},/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) "bMt" = (/turf/simulated/floor/airless,/area/rnd/test_area) "bMu" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/airless,/area/rnd/test_area) -"bMv" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/mining/station) +"bMv" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/rnd/research) "bMw" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/table/reinforced,/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bMx" = (/obj/machinery/computer/shuttle_control/mining,/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bMy" = (/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"},/obj/machinery/light{dir = 4},/obj/structure/table/reinforced,/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bMz" = (/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) -"bMC" = (/obj/machinery/computer/shuttle_control/mining,/turf/simulated/floor{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock) -"bMD" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/quartermaster/miningdock) -"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/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) -"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},/obj/machinery/light_switch{pixel_x = -24; pixel_y = -24},/turf/simulated/floor,/area/quartermaster/qm) -"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) +"bMC" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bMD" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"},/turf/simulated/floor/airless,/area/rnd/test_area) +"bME" = (/obj/structure/closet/emcloset,/turf/simulated/floor/airless,/area/rnd/test_area) +"bMF" = (/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/tiled/airless,/area/rnd/test_area) +"bMG" = (/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)"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bMH" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "mining_dock_pump"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bMI" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bMJ" = (/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bMK" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "bML" = (/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) -"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/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) +"bMM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bMN" = (/obj/structure/closet,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bMO" = (/obj/structure/table/standard,/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/tiled,/area/quartermaster/qm) +"bMP" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor/tiled,/area/quartermaster/qm) "bMQ" = (/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) -"bMR" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_two) -"bMS" = (/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) -"bMT" = (/obj/effect/landmark/start{name = "Paramedic"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bMU" = (/obj/machinery/button/remote/blast_door{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = -25; req_access = list(5)},/obj/effect/landmark/start{name = "Paramedic"},/obj/machinery/camera/network/medbay{c_tag = "Medbay EMT Storage"; dir = 1},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bMV" = (/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) -"bMW" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 28},/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/medbay) -"bMX" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/obj/structure/table/glass,/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/crew_quarters/heads/cmo) -"bMY" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bMZ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bNa" = (/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) -"bNb" = (/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) -"bNc" = (/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) +"bMR" = (/obj/structure/table/standard,/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/tiled,/area/quartermaster/qm) +"bMS" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bMT" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bMU" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bMV" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/closet/jcloset,/turf/simulated/floor/tiled,/area/janitor) +"bMW" = (/obj/structure/closet/jcloset,/turf/simulated/floor/tiled,/area/janitor) +"bMX" = (/obj/machinery/newscaster{pixel_y = 30},/turf/simulated/floor/tiled,/area/janitor) +"bMY" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera/network/security{c_tag = "Custodial Closet"},/obj/structure/closet/l3closet/janitor,/turf/simulated/floor/tiled,/area/janitor) +"bMZ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/janitor) +"bNa" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/janitor) +"bNb" = (/obj/machinery/door/window/westright{name = "Janitoral Delivery"},/turf/simulated/floor/plating,/area/janitor) +"bNc" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor/tiled,/area/janitor) "bNd" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/medical/medbay2) -"bNe" = (/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) -"bNf" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bNg" = (/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) -"bNh" = (/obj/structure/noticeboard{pixel_y = 28},/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"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bNi" = (/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) +"bNe" = (/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/plating,/area/janitor) +"bNf" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bNg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bNh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bNi" = (/obj/structure/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) "bNj" = (/turf/simulated/wall,/area/crew_quarters/medbreak) -"bNk" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) -"bNl" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics) +"bNk" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bNl" = (/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/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) "bNm" = (/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) "bNn" = (/turf/simulated/wall/r_wall,/area/rnd/misc_lab) -"bNo" = (/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) -"bNp" = (/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) -"bNq" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) -"bNr" = (/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) -"bNs" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bNt" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) +"bNo" = (/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/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bNp" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bNq" = (/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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bNr" = (/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},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bNs" = (/obj/machinery/door/firedoor,/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/medical{name = "Staff Room"; req_access = list(5)},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bNt" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) "bNu" = (/turf/simulated/wall/r_wall,/area/rnd/mixing) "bNv" = (/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) "bNw" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing) "bNx" = (/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) "bNy" = (/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) "bNz" = (/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) -"bNA" = (/turf/simulated/floor/airless{icon_state = "catwalk12"},/area/space) -"bNB" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"},/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"bNC" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"bND" = (/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) +"bNA" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bNB" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/blue,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bNC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bND" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/reinforced,/area/rnd/misc_lab) "bNE" = (/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bNF" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bNG" = (/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) -"bNH" = (/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) -"bNI" = (/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) +"bNH" = (/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bNI" = (/obj/machinery/portable_atmospherics/canister,/obj/machinery/light{dir = 1},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) "bNJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall,/area/quartermaster/miningdock) -"bNK" = (/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) -"bNL" = (/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock) -"bNM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/quartermaster/miningdock) -"bNN" = (/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) -"bNO" = (/obj/structure/closet,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/quartermaster/qm) -"bNP" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor,/area/quartermaster/qm) -"bNQ" = (/obj/structure/table/standard,/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) -"bNR" = (/obj/structure/table/standard,/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) +"bNK" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bNL" = (/obj/machinery/camera/network/research{c_tag = "Research - Miscellaneous Test Chamber"; network = list("Research","Miscellaneous Reseach")},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bNM" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light{dir = 1},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bNN" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bNO" = (/obj/structure/table/standard,/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bNP" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/storage) +"bNQ" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/rnd/storage) +"bNR" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/storage) "bNS" = (/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/loading) "bNT" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/substation/command) "bNU" = (/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/cargo) @@ -4786,74 +4786,74 @@ "bOb" = (/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) "bOc" = (/obj/machinery/vending/assist,/turf/simulated/floor/plating,/area/storage/tech) "bOd" = (/turf/simulated/wall,/area/hallway/primary/aft) -"bOe" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) -"bOf" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/aft) -"bOg" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"bOh" = (/obj/structure/closet/jcloset,/turf/simulated/floor,/area/janitor) -"bOi" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/closet/jcloset,/turf/simulated/floor,/area/janitor) -"bOj" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera/network/security{c_tag = "Custodial Closet"},/obj/structure/closet/l3closet/janitor,/turf/simulated/floor,/area/janitor) -"bOk" = (/obj/machinery/newscaster{pixel_y = 30},/turf/simulated/floor,/area/janitor) -"bOl" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/janitor) -"bOm" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/janitor) -"bOn" = (/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = -29},/obj/structure/table/steel,/obj/item/stack/material/steel{amount = 15},/turf/simulated/floor,/area/janitor) -"bOo" = (/obj/machinery/door/window/westright{name = "Janitoral Delivery"},/turf/simulated/floor{icon_state = "delivery"},/area/janitor) -"bOp" = (/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) +"bOe" = (/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"},/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) +"bOf" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bOg" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bOh" = (/obj/structure/closet/bombcloset,/obj/effect/floor_decal/corner/mauve/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bOi" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/effect/floor_decal/corner/mauve{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bOj" = (/obj/machinery/portable_atmospherics/canister,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bOk" = (/obj/machinery/portable_atmospherics/canister,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bOl" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bOm" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/machinery/atmospherics/portables_connector,/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bOn" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bOo" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_south = 6; tag_west = 2; use_power = 0},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bOp" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled,/area/rnd/mixing) "bOq" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engineering) "bOr" = (/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) "bOs" = (/turf/simulated/wall,/area/maintenance/engineering) -"bOt" = (/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) -"bOu" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bOv" = (/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) -"bOw" = (/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) -"bOx" = (/obj/structure/bed/chair,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bOy" = (/obj/structure/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bOz" = (/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) -"bOA" = (/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) -"bOB" = (/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) -"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"},/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) -"bOD" = (/obj/machinery/door/firedoor,/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/medical{name = "Staff Room"; req_access = list(5)},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay2) -"bOE" = (/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) -"bOF" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bOG" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bOH" = (/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) -"bOI" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/obj/structure/bed/padded,/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) +"bOt" = (/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},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bOu" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bOv" = (/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)},/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bOw" = (/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/tiled,/area/quartermaster/miningdock) +"bOx" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bOy" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bOz" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bOA" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bOB" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bOC" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bOD" = (/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/tiled,/area/janitor) +"bOE" = (/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/tiled,/area/janitor) +"bOF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/janitor) +"bOG" = (/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/tiled,/area/janitor) +"bOH" = (/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/tiled,/area/janitor) +"bOI" = (/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/tiled,/area/janitor) "bOJ" = (/obj/machinery/light,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/medical/genetics) "bOK" = (/obj/item/weapon/camera_assembly,/turf/simulated/floor/plating,/area/medical/genetics) -"bOL" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bOM" = (/obj/machinery/portable_atmospherics/canister,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bON" = (/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bOO" = (/obj/machinery/camera/network/research{c_tag = "Research - Miscellaneous Test Chamber"; network = list("Research","Miscellaneous Reseach")},/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bOP" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bOQ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bOR" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bOS" = (/obj/structure/table/standard,/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bOT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/rnd/storage) -"bOU" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage) -"bOV" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) -"bOW" = (/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) -"bOX" = (/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) -"bOY" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/rnd/mixing) -"bOZ" = (/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) -"bPa" = (/obj/structure/closet/bombcloset,/turf/simulated/floor{dir = 6; icon_state = "whitepurple"},/area/rnd/mixing) -"bPb" = (/obj/machinery/portable_atmospherics/canister,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/rnd/mixing) -"bPc" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing) -"bPd" = (/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) -"bPe" = (/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) -"bPf" = (/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) -"bPg" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing) -"bPh" = (/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) -"bPi" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/rnd/mixing) +"bOL" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bOM" = (/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/tiled{icon_state = "white"},/area/medical/sleeper) +"bON" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; name = "Acute Treatment"; req_access = list(5)},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bOO" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bOP" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bOQ" = (/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,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bOR" = (/obj/machinery/computer/skills{pixel_y = 4},/obj/item/device/megaphone,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bOS" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/obj/structure/table/glass,/obj/effect/floor_decal/corner/paleblue,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bOT" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bOU" = (/obj/machinery/light_switch{pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay2) +"bOV" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bOW" = (/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bOX" = (/obj/machinery/recharger{pixel_y = 0},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bOY" = (/obj/machinery/computer/med_data,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bOZ" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bPa" = (/obj/machinery/sparker{id = "Xenobio"; pixel_x = -25},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bPb" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bPc" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bPd" = (/obj/structure/table/standard,/obj/structure/table/standard,/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/reinforced,/area/rnd/misc_lab) +"bPe" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/tiled,/area/rnd/storage) +"bPf" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/storage) +"bPg" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bPh" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bPi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) "bPj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(7,12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "bPk" = (/turf/simulated/wall,/area/rnd/mixing) "bPl" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/rnd/test_area) "bPm" = (/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) "bPn" = (/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) -"bPo" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/quartermaster/miningdock) -"bPp" = (/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) -"bPq" = (/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) -"bPr" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/miningdock) -"bPs" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor,/area/quartermaster/miningdock) -"bPt" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/quartermaster/miningdock) +"bPo" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Waste to Scrubbers"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bPp" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bPq" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bPr" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bPs" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/rnd/mixing) +"bPt" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) "bPu" = (/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/cargo) "bPv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/cargo) "bPw" = (/obj/structure/disposalpipe/segment{dir = 8; 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/plating,/area/maintenance/cargo) @@ -4866,152 +4866,152 @@ "bPD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/tech) "bPE" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/storage/tech) "bPF" = (/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plating,/area/storage/tech) -"bPG" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) -"bPH" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor,/area/hallway/primary/aft) -"bPI" = (/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) -"bPJ" = (/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) -"bPK" = (/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) -"bPL" = (/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) -"bPM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/janitor) -"bPN" = (/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) -"bPO" = (/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) -"bPP" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor,/area/janitor) +"bPG" = (/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/tiled,/area/rnd/mixing) +"bPH" = (/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/tiled,/area/rnd/mixing) +"bPI" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/rnd/mixing) +"bPJ" = (/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/tiled,/area/rnd/mixing) +"bPK" = (/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/tiled,/area/rnd/mixing) +"bPL" = (/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/tiled,/area/rnd/mixing) +"bPM" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bPN" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bPO" = (/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},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bPP" = (/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"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "bPQ" = (/turf/simulated/wall,/area/janitor) "bPR" = (/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) "bPS" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/engineering) "bPT" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/engineering) "bPU" = (/turf/simulated/floor/plating,/area/maintenance/engineering) "bPV" = (/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) -"bPW" = (/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) -"bPX" = (/obj/machinery/sleep_console,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bPY" = (/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) -"bPZ" = (/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) -"bQa" = (/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) -"bQb" = (/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) -"bQc" = (/obj/machinery/computer/skills{pixel_y = 4},/obj/item/device/megaphone,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bQd" = (/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,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bQe" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/obj/structure/table/glass,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo) -"bQf" = (/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) -"bQg" = (/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) -"bQh" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bQi" = (/obj/machinery/recharger{pixel_y = 0},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bQj" = (/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bQk" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bQl" = (/obj/machinery/computer/med_data,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bQm" = (/obj/machinery/sparker{id = "Xenobio"; pixel_x = -25},/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bQn" = (/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) -"bQo" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bQp" = (/obj/structure/table/standard,/obj/structure/table/standard,/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) -"bQq" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/storage) -"bQr" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) -"bQs" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bQt" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQv" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQw" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Waste to Scrubbers"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQx" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bQy" = (/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) -"bQz" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/rnd/mixing) -"bQA" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/rnd/mixing) -"bQB" = (/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) -"bQC" = (/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) -"bQD" = (/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/rnd/mixing) -"bQE" = (/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) -"bQF" = (/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) -"bQG" = (/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) +"bPW" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/structure/reagent_dispensers/fueltank,/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bPX" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "QM Office"; name = "QM Office"},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bPY" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bPZ" = (/obj/machinery/camera/network/security{c_tag = "Engineering - Secure Technical Storage"},/turf/simulated/floor/tiled,/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/tiled,/area/storage/tech) +"bQb" = (/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bQc" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bQd" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bQe" = (/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = -29},/obj/structure/table/steel,/obj/item/stack/material/steel{amount = 15},/turf/simulated/floor/tiled,/area/janitor) +"bQf" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/steel,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/tiled,/area/janitor) +"bQg" = (/obj/structure/janitorialcart,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/janitor) +"bQh" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled,/area/janitor) +"bQi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/janitor) +"bQj" = (/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/janitor) +"bQk" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/janitor) +"bQl" = (/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/tiled{icon_state = "white"},/area/medical/sleeper) +"bQm" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bQn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bQo" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acute2"; name = "Acute Privacy Shutters"; opacity = 0},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) +"bQp" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bQq" = (/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/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bQr" = (/mob/living/simple_animal/cat/fluff/Runtime,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bQs" = (/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,/obj/structure/table/glass,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bQt" = (/obj/machinery/computer/crew,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bQu" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/closet/secure_closet/personal/patient,/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bQv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/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},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bQw" = (/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bQx" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/closet/secure_closet/personal/patient,/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bQy" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/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},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bQz" = (/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bQA" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bQB" = (/obj/machinery/telepad,/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bQC" = (/obj/structure/table/standard,/obj/item/device/assembly/igniter,/turf/simulated/floor/reinforced,/area/rnd/misc_lab) +"bQD" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/tiled,/area/rnd/storage) +"bQE" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/rnd/storage) +"bQF" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/rnd/research) +"bQG" = (/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/tiled{icon_state = "white"},/area/rnd/research) "bQH" = (/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) -"bQI" = (/turf/simulated/floor/airless{dir = 9; icon_state = "warning"},/area/rnd/test_area) -"bQJ" = (/turf/simulated/floor/airless{icon_state = "warning"; dir = 1},/area/rnd/test_area) +"bQI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bQJ" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) "bQK" = (/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) -"bQL" = (/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) -"bQM" = (/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) +"bQL" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bQM" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) "bQN" = (/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) -"bQO" = (/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) -"bQP" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/quartermaster/miningdock) -"bQQ" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "QM Office"; name = "QM Office"},/turf/simulated/floor,/area/quartermaster/miningdock) +"bQO" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bQP" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bQQ" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) "bQR" = (/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) "bQS" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/cargo) "bQT" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "HoP Office"; name = "HoP Office"},/turf/simulated/floor/plating,/area/maintenance/cargo) "bQU" = (/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) "bQV" = (/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) "bQW" = (/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) -"bQX" = (/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) -"bQY" = (/obj/machinery/camera/network/security{c_tag = "Engineering - Secure Technical Storage"},/turf/simulated/floor,/area/storage/tech) +"bQX" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bQY" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) "bQZ" = (/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) "bRa" = (/obj/item/device/aicard,/obj/item/weapon/aiModule/reset,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech) "bRb" = (/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) "bRc" = (/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) "bRd" = (/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) -"bRe" = (/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) -"bRf" = (/turf/simulated/floor,/area/hallway/primary/aft) -"bRg" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"bRh" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/steel,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor,/area/janitor) -"bRi" = (/obj/machinery/light{dir = 1},/obj/machinery/computer/centrifuge,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"bRj" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light,/turf/simulated/floor,/area/janitor) -"bRk" = (/obj/structure/janitorialcart,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/janitor) -"bRl" = (/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/janitor) -"bRm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/janitor) -"bRn" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/janitor) +"bRe" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bRf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bRg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bRh" = (/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/tiled,/area/rnd/mixing) +"bRi" = (/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(7)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bRj" = (/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(7)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bRk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bRl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bRm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bRn" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) "bRo" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/maintenance/engineering) "bRp" = (/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,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/engineering) "bRq" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/random/loot,/turf/simulated/floor/plating,/area/storage/emergency) -"bRr" = (/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) -"bRs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bRt" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bRu" = (/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) -"bRv" = (/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/medbay) +"bRr" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/shuttle/mining/station) +"bRs" = (/obj/structure/closet/secure_closet/miner,/obj/effect/floor_decal/corner/brown{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"bRt" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/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/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/tiled,/area/storage/tech) +"bRv" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/primary/aft) "bRw" = (/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) -"bRx" = (/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/crew_quarters/heads/cmo) -"bRy" = (/mob/living/simple_animal/cat/fluff/Runtime,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bRz" = (/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) -"bRA" = (/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,/obj/structure/table/glass,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo) +"bRx" = (/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},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bRy" = (/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},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bRz" = (/obj/effect/landmark/start{name = "Nursing Intern"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bRA" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) "bRB" = (/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) "bRC" = (/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) -"bRD" = (/obj/machinery/computer/crew,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bRE" = (/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) -"bRF" = (/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) -"bRG" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/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) +"bRD" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bRE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Nursing Intern"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bRF" = (/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/tiled{icon_state = "white"},/area/medical/sleeper) +"bRG" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay) "bRH" = (/turf/simulated/wall,/area/medical/patient_a) -"bRI" = (/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) -"bRJ" = (/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) -"bRK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/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) +"bRI" = (/obj/machinery/light,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/paleblue/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bRJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bRK" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) "bRL" = (/turf/simulated/wall,/area/medical/patient_b) -"bRM" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bRN" = (/obj/structure/table/standard,/obj/item/device/assembly/igniter,/turf/simulated/floor/engine,/area/rnd/misc_lab) -"bRO" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/storage) -"bRP" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage) -"bRQ" = (/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) -"bRR" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) -"bRS" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/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) -"bRT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bRU" = (/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) -"bRV" = (/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) -"bRW" = (/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) -"bRX" = (/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) -"bRY" = (/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) -"bRZ" = (/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) -"bSa" = (/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) -"bSb" = (/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) -"bSc" = (/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) -"bSd" = (/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) -"bSe" = (/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(7)},/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) -"bSf" = (/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) -"bSg" = (/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) -"bSh" = (/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(7)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/rnd/mixing) -"bSi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/rnd/mixing) -"bSj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/rnd/mixing) +"bRM" = (/obj/machinery/light,/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/obj/machinery/modular_computer/console/preset/medical,/turf/simulated/floor/tiled{icon_state = "white"},/area/crew_quarters/heads/cmo) +"bRN" = (/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/tiled{icon_state = "white"},/area/medical/medbay2) +"bRO" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bRP" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -30},/obj/effect/landmark/start{name = "Chemist"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bRQ" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/landmark/start{name = "Chemist"},/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bRR" = (/obj/machinery/light,/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bRS" = (/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; frequency = 1485; listening = 1; name = "Station Intercom (Medbay Lobby)"; pixel_x = 0; pixel_y = -30},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/medbreak) +"bRT" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bRU" = (/obj/structure/bed/padded,/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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bRV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bRW" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bRX" = (/obj/structure/bed/padded,/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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bRY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bRZ" = (/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,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/storage) +"bSa" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/rnd/storage) +"bSb" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) +"bSc" = (/obj/machinery/vending/phoronresearch,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bSd" = (/obj/machinery/light,/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bSe" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bSf" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (WEST)"; icon_state = "warningcee"; dir = 8},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bSg" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/machinery/meter,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bSh" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (EAST)"; icon_state = "warningcee"; dir = 4},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bSi" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bSj" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) "bSk" = (/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) -"bSl" = (/turf/simulated/floor/airless{dir = 8; icon_state = "warning"},/area/rnd/test_area) +"bSl" = (/obj/structure/dispenser,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) "bSm" = (/obj/structure/closet/crate,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) -"bSn" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/shuttle/mining/station) +"bSn" = (/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) "bSo" = (/obj/structure/ore_box,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/mining/station) "bSp" = (/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/quartermaster/miningdock) -"bSq" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock) +"bSq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Launch Room Access"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/rnd/mixing) "bSr" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/cargo) "bSs" = (/turf/simulated/floor/plating,/area/maintenance/cargo) "bSt" = (/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) -"bSu" = (/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) -"bSv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/storage/tech) +"bSu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/rnd/mixing) +"bSv" = (/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,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/rnd/mixing) "bSw" = (/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) "bSx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/storage/tech) "bSy" = (/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) @@ -5019,62 +5019,62 @@ "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/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) -"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/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) +"bSD" = (/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 = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bSE" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bSF" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/shuttle/mining/station) "bSG" = (/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) "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/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/closet/crate,/obj/random/coin,/turf/simulated/floor/plating,/area/storage/emergency) -"bSM" = (/obj/machinery/sleeper,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper) -"bSN" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bSO" = (/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) -"bSP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bSQ" = (/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) +"bSM" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/shuttle/mining/station) +"bSN" = (/turf/simulated/floor/tiled,/area/storage/tech) +"bSO" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/tiled,/area/storage/tech) +"bSP" = (/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) +"bSQ" = (/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/tiled,/area/hallway/primary/aft) "bSR" = (/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) -"bSS" = (/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) -"bST" = (/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) -"bSU" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo) -"bSV" = (/obj/machinery/computer/crew,/obj/machinery/light,/turf/simulated/floor{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/crew_quarters/heads/cmo) +"bSS" = (/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},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bST" = (/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,/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bSU" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "scanhide"; name = "Diagnostics Room Separation Shutters"; opacity = 0},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) +"bSV" = (/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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) "bSW" = (/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 = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay2) -"bSX" = (/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) +"bSX" = (/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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/sleeper) "bSY" = (/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) -"bSZ" = (/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) -"bTa" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/landmark/start{name = "Chemist"},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bTb" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -30},/obj/effect/landmark/start{name = "Chemist"},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bTc" = (/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) -"bTd" = (/obj/machinery/light,/obj/machinery/vending/snack,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak) -"bTe" = (/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) -"bTf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_a) -"bTg" = (/obj/structure/bed/padded,/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) -"bTh" = (/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) -"bTi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_b) -"bTj" = (/obj/structure/bed/padded,/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) -"bTk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/storage) -"bTl" = (/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) -"bTm" = (/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) -"bTn" = (/obj/machinery/vending/phoronresearch,/turf/simulated/floor{dir = 5; icon_state = "whitepurple"},/area/rnd/mixing) -"bTo" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/rnd/mixing) -"bTp" = (/obj/machinery/light,/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bTq" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/rnd/mixing) -"bTr" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/mixing) -"bTs" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/machinery/meter,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bTt" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/rnd/mixing) -"bTu" = (/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) -"bTv" = (/obj/item/weapon/wrench,/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing) -"bTw" = (/obj/structure/dispenser,/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/rnd/mixing) -"bTx" = (/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) -"bTy" = (/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) -"bTz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "warning"},/area/rnd/mixing) -"bTA" = (/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 = 8},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/rnd/mixing) +"bSZ" = (/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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bTa" = (/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bTb" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bTc" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bTd" = (/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/pink/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bTe" = (/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"},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bTf" = (/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{dir = 10},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_a) +"bTg" = (/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/pink/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bTh" = (/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"},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bTi" = (/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{dir = 10},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_b) +"bTj" = (/obj/machinery/shieldwallgen{anchored = 1; req_access = list(47)},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bTk" = (/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/reinforced,/area/rnd/misc_lab) +"bTl" = (/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/reinforced,/area/rnd/misc_lab) +"bTm" = (/obj/machinery/door/window/southright{dir = 1; name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/door/window/southright{name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bTn" = (/obj/machinery/door/window/southleft{dir = 1; name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/door/window/southleft{name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "misclab"; name = "Test Chamber Blast Doors"; opacity = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bTo" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bTp" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bTq" = (/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,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/rnd/storage) +"bTr" = (/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/tiled,/area/rnd/storage) +"bTs" = (/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/rnd/research) +"bTt" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bTu" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (NORTH)"; icon_state = "warningcee"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bTv" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bTw" = (/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/airless,/area/rnd/mixing) +"bTx" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bTy" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bTz" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bTA" = (/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/tiled,/area/hallway/primary/aft) "bTB" = (/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) -"bTC" = (/turf/simulated/floor/airless{dir = 4; icon_state = "warning"},/area/rnd/test_area) -"bTD" = (/turf/simulated/floor/airless{icon_state = "warningcorner"; dir = 1},/area/rnd/test_area) -"bTE" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/mining/station) +"bTC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bTD" = (/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},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bTE" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/medical/sleeper) "bTF" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/space,/area/shuttle/mining/station) -"bTG" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/mining/station) +"bTG" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/medical/sleeper) "bTH" = (/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) "bTI" = (/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) "bTJ" = (/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) @@ -5084,17 +5084,17 @@ "bTN" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/cargo) "bTO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/cargo) "bTP" = (/obj/structure/disposalpipe/segment,/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/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/cargo) -"bTQ" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor,/area/storage/tech) -"bTR" = (/turf/simulated/floor,/area/storage/tech) +"bTQ" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/medical/sleeper) +"bTR" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/medical/sleeper) "bTS" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/storage/tech) "bTT" = (/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/wirecutters,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech) "bTU" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cloning{pixel_x = 0},/obj/item/weapon/circuitboard/clonescanner,/obj/item/weapon/circuitboard/clonepod,/obj/item/weapon/circuitboard/scan_consolenew,/obj/item/weapon/circuitboard/med_data{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/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert_engineering{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) +"bTW" = (/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/tiled,/area/medical/sleeper) "bTX" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plating,/area/storage/tech) -"bTY" = (/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) -"bTZ" = (/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) -"bUa" = (/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) +"bTY" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"bTZ" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bUa" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/medbay{c_tag = "Medbay Lounge"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) "bUb" = (/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) "bUc" = (/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) "bUd" = (/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) @@ -5102,47 +5102,47 @@ "bUf" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/engineering) "bUg" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engineering) "bUh" = (/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) -"bUi" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "scanhide"; name = "Diagnostics Room Separation Shutters"; opacity = 0},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper) -"bUj" = (/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) -"bUk" = (/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) +"bUi" = (/obj/machinery/light{dir = 1},/obj/structure/bed/chair/comfy/teal{dir = 4; icon_state = "comfychair_preview"; tag = "icon-comfychair (EAST)"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bUj" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 26},/obj/structure/bed/chair/comfy/teal{dir = 8; icon_state = "comfychair_preview"; tag = "icon-comfychair (WEST)"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bUk" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) "bUl" = (/turf/simulated/wall,/area/medical/medbay4) -"bUm" = (/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"bUn" = (/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) +"bUm" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bUn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) "bUo" = (/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) "bUp" = (/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) "bUq" = (/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) "bUr" = (/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) -"bUs" = (/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) -"bUt" = (/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) -"bUu" = (/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "whitered"},/area/medical/patient_a) -"bUv" = (/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{dir = 10},/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/patient_a) -"bUw" = (/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_a) -"bUx" = (/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "whitered"},/area/medical/patient_b) -"bUy" = (/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{dir = 10},/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/patient_b) -"bUz" = (/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) -"bUA" = (/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) -"bUB" = (/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) -"bUC" = (/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) -"bUD" = (/obj/machinery/door/window/southleft{dir = 1; name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/door/window/southleft{name = "Test Chamber"; req_one_access = list(7,29)},/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) -"bUE" = (/obj/machinery/door/window/southright{dir = 1; name = "Test Chamber"; req_one_access = list(7,29)},/obj/machinery/door/window/southright{name = "Test Chamber"; req_one_access = list(7,29)},/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) -"bUF" = (/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) -"bUG" = (/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) +"bUs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bUt" = (/obj/machinery/vending/medical,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bUu" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bUv" = (/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bUw" = (/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/tiled{icon_state = "white"},/area/medical/patient_wing) +"bUx" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bUy" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bUz" = (/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/tiled{icon_state = "white"},/area/medical/patient_wing) +"bUA" = (/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/tiled{icon_state = "white"},/area/medical/patient_wing) +"bUB" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bUC" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bUD" = (/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},/obj/item/device/gps/science,/obj/item/device/gps/science,/obj/item/device/gps/science,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bUE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bUF" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bUG" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) "bUH" = (/turf/simulated/wall,/area/rnd/misc_lab) -"bUI" = (/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) -"bUJ" = (/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) -"bUK" = (/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research) +"bUI" = (/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/computer/telescience{starting_crystals = 3},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bUJ" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bUK" = (/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/tiled,/area/rnd/research) "bUL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/rnd/mixing) "bUM" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/wall/r_wall,/area/rnd/mixing) -"bUN" = (/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) -"bUO" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) +"bUN" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 2},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bUO" = (/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/reinforced,/area/rnd/mixing) "bUP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(7,12)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "bUQ" = (/turf/simulated/wall,/area/maintenance/research_starboard) -"bUR" = (/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) +"bUR" = (/obj/machinery/door/blast/regular{id = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/reinforced,/area/rnd/mixing) "bUS" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/rnd/mixing) "bUT" = (/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) -"bUU" = (/turf/simulated/floor/airless{icon_state = "warning"},/area/rnd/test_area) -"bUV" = (/turf/simulated/floor/airless{dir = 6; icon_state = "warning"},/area/rnd/test_area) -"bUW" = (/turf/simulated/floor/airless{dir = 10; icon_state = "warning"},/area/rnd/test_area) +"bUU" = (/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/reinforced,/area/rnd/mixing) +"bUV" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/floor/reinforced,/area/rnd/mixing) +"bUW" = (/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/reinforced,/area/rnd/mixing) "bUX" = (/turf/simulated/wall/r_wall,/area/maintenance/cargo) "bUY" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/cargo) "bUZ" = (/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) @@ -5151,74 +5151,74 @@ "bVc" = (/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech) "bVd" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/storage/tech) "bVe" = (/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) -"bVf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/hallway/primary/aft) -"bVg" = (/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) -"bVh" = (/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) +"bVf" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bVg" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bVh" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) "bVi" = (/turf/simulated/wall,/area/engineering/break_room) "bVj" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/engineering) "bVk" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/engineering) "bVl" = (/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) "bVm" = (/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/engineering) "bVn" = (/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) -"bVo" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/medical/sleeper) -"bVp" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/medical/sleeper) -"bVq" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/sleeper) -"bVr" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/medical/sleeper) -"bVs" = (/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) +"bVo" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/airlock_sensor{pixel_y = -25},/turf/simulated/floor/airless,/area/rnd/mixing) +"bVp" = (/obj/machinery/mass_driver{dir = 4; id = "toxinsdriver"},/turf/simulated/floor/airless,/area/rnd/mixing) +"bVq" = (/obj/machinery/door/blast/regular{id = "toxinsdriver"; name = "Toxins Launcher Bay Door"},/turf/simulated/floor/airless,/area/rnd/mixing) +"bVr" = (/turf/simulated/floor/airless,/area/rnd/mixing) +"bVs" = (/obj/machinery/door/blast/regular{id = "toxinsdriver"; name = "Toxins Launcher Bay Door"},/turf/simulated/floor/airless,/area/rnd/test_area) "bVt" = (/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) -"bVu" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"bVv" = (/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) -"bVw" = (/obj/machinery/light{dir = 1},/obj/structure/bed/chair/comfy/teal{dir = 4; icon_state = "comfychair_preview"; tag = "icon-comfychair (EAST)"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) -"bVx" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/medbay{c_tag = "Medbay Lounge"},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) -"bVy" = (/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 26},/obj/structure/bed/chair/comfy/teal{dir = 8; icon_state = "comfychair_preview"; tag = "icon-comfychair (WEST)"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) -"bVz" = (/obj/machinery/vending/coffee,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) -"bVA" = (/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) -"bVB" = (/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) -"bVC" = (/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) -"bVD" = (/obj/machinery/light{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4) -"bVE" = (/obj/machinery/vending/medical,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) -"bVF" = (/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) -"bVG" = (/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) -"bVH" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing) -"bVI" = (/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) +"bVu" = (/obj/item/device/radio/beacon,/obj/effect/landmark{name = "blobstart"},/obj/effect/floor_decal/industrial/warning/full,/turf/simulated/floor/tiled,/area/rnd/test_area) +"bVv" = (/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/tiled/airless,/area/rnd/test_area) +"bVw" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/shuttle/escape_pod5/station) +"bVx" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/escape_pod5/station) +"bVy" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bVz" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bVA" = (/obj/machinery/door/window/eastleft{name = "Medical Delivery"; req_access = list(5)},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/medical/sleeper) +"bVB" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Medbay"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plating,/area/medical/sleeper) +"bVC" = (/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/tiled,/area/medical/sleeper) +"bVD" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/tiled,/area/medical/sleeper) +"bVE" = (/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/tiled,/area/medical/sleeper) +"bVF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/medical/sleeper) +"bVG" = (/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/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bVH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/medical/sleeper) +"bVI" = (/obj/structure/disposalpipe/segment,/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/tiled{icon_state = "white"},/area/medical/medbay4) "bVJ" = (/turf/simulated/wall,/area/medical/patient_wing) "bVK" = (/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) -"bVL" = (/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) +"bVL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) "bVM" = (/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) "bVN" = (/obj/structure/grille,/obj/structure/window/reinforced/polarized{id = "isoB_window_tint"},/obj/structure/window/reinforced/polarized{dir = 4; id = "isoB_window_tint"},/obj/structure/window/reinforced/polarized{dir = 1; id = "isoB_window_tint"},/obj/structure/window/reinforced/polarized{dir = 8; id = "isoB_window_tint"},/turf/simulated/floor/plating,/area/medical/patient_b) -"bVO" = (/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) -"bVP" = (/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) -"bVQ" = (/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},/obj/item/device/gps/science,/obj/item/device/gps/science,/obj/item/device/gps/science,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bVR" = (/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) -"bVS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bVT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bVU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Nursing Intern"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bVV" = (/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) -"bVW" = (/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) -"bVX" = (/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) -"bVY" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bVO" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bVP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bVQ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bVR" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bVS" = (/obj/structure/disposalpipe/segment,/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/tiled{icon_state = "white"},/area/medical/medbay4) +"bVT" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bVU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bVV" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"bVW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bVX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bVY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) "bVZ" = (/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) -"bWa" = (/obj/machinery/door/blast/regular{id = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"bWb" = (/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) -"bWc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"bWd" = (/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) +"bWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bWb" = (/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/tiled{icon_state = "white"},/area/medical/patient_wing) +"bWc" = (/obj/structure/bed/chair/comfy/teal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bWd" = (/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,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) "bWe" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/rnd/mixing) -"bWf" = (/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) +"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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) "bWg" = (/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) -"bWh" = (/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) -"bWi" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) -"bWj" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/mixing) +"bWh" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 25},/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bWi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bWj" = (/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,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) "bWk" = (/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) "bWl" = (/obj/structure/table/rack{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb2,/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/maintenance/research_port) -"bWm" = (/obj/machinery/mass_driver{dir = 4; id = "toxinsdriver"},/turf/simulated/floor/plating/airless,/area/rnd/mixing) -"bWn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/airlock_sensor{pixel_y = -25},/turf/simulated/floor/plating/airless,/area/rnd/mixing) -"bWo" = (/turf/simulated/floor/plating/airless,/area/rnd/mixing) -"bWp" = (/obj/machinery/door/blast/regular{id = "toxinsdriver"; name = "Toxins Launcher Bay Door"},/turf/simulated/floor/plating/airless,/area/rnd/mixing) -"bWq" = (/obj/machinery/door/blast/regular{id = "toxinsdriver"; name = "Toxins Launcher Bay Door"},/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"bWr" = (/obj/item/device/radio/beacon,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/airless{icon_state = "bot"},/area/rnd/test_area) -"bWs" = (/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) -"bWt" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod5/station) -"bWu" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod5/station) +"bWm" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bWn" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bWo" = (/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/padded,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bWp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bWq" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bWr" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bWs" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_one_access = list(7,29)},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bWt" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bWu" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) "bWv" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 8},/turf/simulated/wall,/area/shuttle/escape_pod5/station) "bWw" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/cargo) "bWx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/cargo) @@ -5228,8 +5228,8 @@ "bWB" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/yellow,/obj/item/device/t_scanner,/obj/item/clothing/glasses/meson,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/storage/tech) "bWC" = (/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) "bWD" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/device/analyzer/plant_analyzer,/obj/item/device/healthanalyzer,/obj/item/device/analyzer,/obj/item/device/analyzer,/turf/simulated/floor/plating,/area/storage/tech) -"bWE" = (/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) -"bWF" = (/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) +"bWE" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bWF" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/reinforced,/area/rnd/mixing) "bWG" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/carpet,/area/engineering/break_room) "bWH" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/engineering/break_room) "bWI" = (/obj/structure/table/woodentable,/obj/item/weapon/dice,/turf/simulated/floor/carpet,/area/engineering/break_room) @@ -5237,59 +5237,59 @@ "bWK" = (/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) "bWL" = (/obj/structure/bookcase/manuals/engineering,/turf/simulated/floor/carpet,/area/engineering/break_room) "bWM" = (/turf/simulated/wall,/area/crew_quarters/sleep/engi_wash) -"bWN" = (/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) -"bWO" = (/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) -"bWP" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/medical/sleeper) -"bWQ" = (/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) -"bWR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/medical/sleeper) -"bWS" = (/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) -"bWT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/medical/sleeper) -"bWU" = (/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/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/medbay4) -"bWV" = (/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) -"bWW" = (/obj/structure/disposalpipe/segment,/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{icon_state = "white"},/area/medical/medbay4) -"bWX" = (/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) -"bWY" = (/obj/structure/disposalpipe/segment,/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) -"bWZ" = (/obj/machinery/hologram/holopad,/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) -"bXa" = (/obj/structure/disposalpipe/segment,/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/medical/medbay4) -"bXb" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"bXc" = (/obj/structure/disposalpipe/segment,/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{icon_state = "white"},/area/medical/medbay4) -"bXd" = (/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{icon_state = "white"},/area/medical/medbay4) -"bXe" = (/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/medical/patient_wing) -"bXf" = (/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/patient_wing) -"bXg" = (/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/patient_wing) -"bXh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"bXi" = (/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) -"bXj" = (/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) -"bXk" = (/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) -"bXl" = (/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) -"bXm" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 25},/obj/structure/table/standard,/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) -"bXn" = (/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) -"bXo" = (/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) -"bXp" = (/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) +"bWN" = (/obj/machinery/air_sensor{frequency = 1430; id_tag = "toxins_mixing_exterior"; output = 63},/turf/simulated/floor/reinforced,/area/rnd/mixing) +"bWO" = (/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/reinforced,/area/rnd/mixing) +"bWP" = (/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(7)},/turf/simulated/floor/reinforced,/area/rnd/mixing) +"bWQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/mixing) +"bWR" = (/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(7)},/turf/simulated/floor/reinforced,/area/rnd/mixing) +"bWS" = (/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")},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/mixing) +"bWT" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bWU" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled/airless,/area/rnd/test_area) +"bWV" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bWW" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bWX" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/hallway/primary/aft) +"bWY" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/tiled/yellow,/area/crew_quarters/sleep/engi_wash) +"bWZ" = (/obj/structure/table/standard,/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/tiled/yellow,/area/crew_quarters/sleep/engi_wash) +"bXa" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor/tiled/yellow,/area/crew_quarters/sleep/engi_wash) +"bXb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/sleeper) +"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/tiled,/area/medical/sleeper) +"bXd" = (/obj/machinery/body_scanconsole{tag = "icon-body_scannerconsole (WEST)"; icon_state = "body_scannerconsole"; dir = 8},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/sleeper) +"bXe" = (/obj/machinery/bodyscanner{tag = "icon-body_scanner_0 (EAST)"; icon_state = "body_scanner_0"; dir = 4},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/sleeper) +"bXf" = (/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"},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXg" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/medical/sleeper) +"bXh" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j1"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-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"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXi" = (/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,/obj/effect/floor_decal/sign/d,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXj" = (/obj/machinery/newscaster{pixel_y = -32},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "CMO Office"; name = "CMO Office"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXk" = (/obj/structure/disposalpipe/segment{dir = 4},/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/tiled{icon_state = "white"},/area/medical/medbay4) +"bXl" = (/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 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXn" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/disposalpipe/junction{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXo" = (/obj/structure/disposalpipe/segment{dir = 4},/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/tiled{icon_state = "white"},/area/medical/medbay4) +"bXp" = (/obj/structure/disposalpipe/junction{dir = 8},/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/tiled{icon_state = "white"},/area/medical/medbay4) "bXq" = (/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) "bXr" = (/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) -"bXs" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bXt" = (/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/padded,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bXu" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bXv" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bXw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bXx" = (/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) -"bXy" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_one_access = list(7,29)},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bXz" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bXA" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"bXB" = (/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) +"bXs" = (/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 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXu" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bXv" = (/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/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXx" = (/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/effect/floor_decal/corner/paleblue,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXA" = (/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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/pink,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) "bXC" = (/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) -"bXD" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"bXE" = (/obj/machinery/air_sensor{frequency = 1430; id_tag = "toxins_mixing_exterior"; output = 63},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"bXF" = (/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(7)},/turf/simulated/floor/engine,/area/rnd/mixing) -"bXG" = (/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) -"bXH" = (/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(7)},/turf/simulated/floor/engine,/area/rnd/mixing) -"bXI" = (/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) -"bXJ" = (/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/mixing) -"bXK" = (/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) +"bXD" = (/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"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXF" = (/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,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXH" = (/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/tiled{icon_state = "white"},/area/medical/patient_wing) +"bXI" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bXJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bXK" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) "bXL" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"bXM" = (/turf/simulated/floor/airless{dir = 5; icon_state = "warning"},/area/rnd/test_area) -"bXN" = (/turf/simulated/floor/airless{icon_state = "warningcorner"; dir = 4},/area/rnd/test_area) +"bXM" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bXN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) "bXO" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/station) "bXP" = (/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) "bXQ" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/light/small/emergency,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station) @@ -5298,75 +5298,75 @@ "bXT" = (/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"},/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/cargo) "bXU" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/cargo) "bXV" = (/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/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/cargo) -"bXW" = (/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) -"bXX" = (/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) -"bXY" = (/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) +"bXW" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bXX" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bXY" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_one_access = list(7,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/tiled{icon_state = "white"},/area/rnd/misc_lab) "bXZ" = (/obj/machinery/light_switch{pixel_x = -22; pixel_y = -10},/turf/simulated/floor/carpet,/area/engineering/break_room) "bYa" = (/turf/simulated/floor/carpet,/area/engineering/break_room) "bYb" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/bed/chair/comfy/brown,/turf/simulated/floor/carpet,/area/engineering/break_room) "bYc" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/carpet,/area/engineering/break_room) -"bYd" = (/obj/structure/table/standard,/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) -"bYe" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"},/area/crew_quarters/sleep/engi_wash) -"bYf" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash) +"bYd" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bYe" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bYf" = (/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/tiled{icon_state = "white"},/area/rnd/research) "bYg" = (/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) -"bYh" = (/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) -"bYi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/medical/sleeper) -"bYj" = (/obj/machinery/bodyscanner,/turf/simulated/floor{icon_state = "red"},/area/medical/sleeper) -"bYk" = (/obj/machinery/body_scanconsole,/turf/simulated/floor{icon_state = "red"},/area/medical/sleeper) -"bYl" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/medical/sleeper) -"bYm" = (/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) -"bYn" = (/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{icon_state = "white_d"},/area/medical/medbay4) -"bYo" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j1"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-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"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"bYp" = (/obj/structure/disposalpipe/segment{dir = 4},/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{icon_state = "white"},/area/medical/medbay4) -"bYq" = (/obj/machinery/newscaster{pixel_y = -32},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "CMO Office"; name = "CMO Office"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"bYr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whiteredcorner"},/area/medical/medbay4) -"bYs" = (/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 = 4; icon_state = "2-4"},/turf/simulated/floor{dir = 2; icon_state = "whitered_w"; tag = "icon-whitered_w (WEST)"},/area/medical/medbay4) -"bYt" = (/obj/structure/disposalpipe/segment{dir = 4},/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 = 8; icon_state = "whiteredcorner"},/area/medical/medbay4) -"bYu" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/disposalpipe/junction{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4) -"bYv" = (/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 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{tag = "icon-white_p (WEST)"; icon_state = "white_p"; dir = 8},/area/medical/medbay4) -"bYw" = (/obj/structure/disposalpipe/junction{dir = 8},/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{icon_state = "white"},/area/medical/medbay4) -"bYx" = (/obj/machinery/door/firedoor,/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/medbay4) -"bYy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"bYz" = (/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/patient_wing) -"bYA" = (/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/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"bYB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"bYC" = (/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) -"bYD" = (/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 = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/patient_wing) -"bYE" = (/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) -"bYF" = (/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"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"bYG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whiteredcorner"},/area/medical/patient_wing) -"bYH" = (/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) -"bYI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "whiteredcorner"},/area/medical/patient_wing) -"bYJ" = (/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) -"bYK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"bYh" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bYi" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bYj" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bYk" = (/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/tiled{icon_state = "white"},/area/rnd/research) +"bYl" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/reinforced,/area/rnd/mixing) +"bYm" = (/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/reinforced,/area/rnd/mixing) +"bYn" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/reinforced,/area/rnd/mixing) +"bYo" = (/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/reinforced,/area/rnd/mixing) +"bYp" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bYq" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/warning/cee,/turf/simulated/floor/tiled,/area/rnd/mixing) +"bYr" = (/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/tiled{icon_state = "white"},/area/rnd/mixing) +"bYs" = (/obj/machinery/atmospherics/binary/passive_gate{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bYt" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bYu" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bYv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bYw" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/shuttle/escape_pod5/station) +"bYx" = (/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"bYy" = (/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/tiled,/area/crew_quarters/heads/chief) +"bYz" = (/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},/obj/machinery/modular_computer/console/preset/command,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"bYA" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"bYB" = (/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/tiled,/area/crew_quarters/heads/chief) +"bYC" = (/obj/machinery/atm{pixel_y = 28},/obj/effect/floor_decal/corner/yellow/diagonal{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bYD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bYE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/foyer) +"bYF" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/corner/yellow/diagonal,/turf/simulated/floor/tiled,/area/engineering/foyer) +"bYG" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer) +"bYH" = (/obj/machinery/door/airlock/engineering{name = "Engineering Supplies"; req_one_access = list(11,24)},/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/tiled/yellow,/area/engineering/break_room) +"bYI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/sleep/engi_wash) +"bYJ" = (/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/tiled/yellow,/area/crew_quarters/sleep/engi_wash) +"bYK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/sleep/engi_wash) "bYL" = (/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) -"bYM" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bYN" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"bYO" = (/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) -"bYP" = (/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) -"bYQ" = (/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) -"bYR" = (/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) -"bYS" = (/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) -"bYT" = (/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) -"bYU" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_one_access = list(7,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{icon_state = "white"},/area/rnd/misc_lab) -"bYV" = (/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) -"bYW" = (/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) -"bYX" = (/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) -"bYY" = (/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) -"bYZ" = (/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) -"bZa" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research) +"bYM" = (/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/tiled/yellow,/area/crew_quarters/sleep/engi_wash) +"bYN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/sleeper) +"bYO" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/tiled,/area/medical/sleeper) +"bYP" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/medical/sleeper) +"bYQ" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; opacity = 0},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bYR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/medical/sleeper) +"bYS" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"bYT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"bYU" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"bYV" = (/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/tiled{icon_state = "white"},/area/medical/psych) +"bYW" = (/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/tiled{icon_state = "white"},/area/medical/patient_wing) +"bYX" = (/obj/machinery/camera/network/medbay{c_tag = "Medbay Patient Hallway - Port"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bYY" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"bYZ" = (/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/tiled{icon_state = "dark"},/area/medical/biostorage) +"bZa" = (/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/tiled{icon_state = "white"},/area/medical/patient_c) "bZb" = (/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) -"bZc" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"bZd" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing) -"bZe" = (/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) -"bZf" = (/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) +"bZc" = (/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/tiled{icon_state = "white"},/area/medical/patient_wing) +"bZd" = (/obj/machinery/light,/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bZe" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bZf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) "bZg" = (/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) -"bZh" = (/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) -"bZi" = (/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) -"bZj" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/mixing) -"bZk" = (/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) -"bZl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/machinery/meter,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/bar) -"bZm" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape_pod5/station) +"bZh" = (/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/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bZi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -29},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bZj" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light,/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bZk" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/closet/bombcloset,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/misc_lab) +"bZl" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bZm" = (/obj/machinery/light,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/effect/floor_decal/corner/lime,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) "bZn" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/cargo) "bZo" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/wall,/area/maintenance/cargo) "bZp" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/cargo) @@ -5374,113 +5374,113 @@ "bZr" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/chief) "bZs" = (/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) "bZt" = (/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) -"bZu" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/crew_quarters/heads/chief) -"bZv" = (/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},/obj/machinery/computer/station_alert/all,/turf/simulated/floor,/area/crew_quarters/heads/chief) -"bZw" = (/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) -"bZx" = (/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) -"bZy" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/crew_quarters/heads/chief) +"bZu" = (/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/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/research) +"bZv" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; icon_state = "map_on"; tag = "icon-map_on (EAST)"; target_pressure = 15000},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bZw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bZx" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"bZy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "bZz" = (/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) -"bZA" = (/obj/machinery/atm{pixel_y = 28},/turf/simulated/floor{dir = 4; icon_state = "yellowpatch"},/area/engineering/foyer) -"bZB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/foyer) -"bZC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/foyer) -"bZD" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/foyer) -"bZE" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{dir = 2; icon_state = "yellowpatch"},/area/engineering/foyer) +"bZA" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"bZB" = (/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/tiled,/area/maintenance/atmos_control) +"bZC" = (/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/tiled,/area/crew_quarters/heads/chief) +"bZD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"bZE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "bZF" = (/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) "bZG" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor/carpet,/area/engineering/break_room) "bZH" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/supermatter_engine{pixel_x = -3},/turf/simulated/floor/carpet,/area/engineering/break_room) "bZI" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/carpet,/area/engineering/break_room) "bZJ" = (/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/carpet,/area/engineering/break_room) "bZK" = (/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) -"bZL" = (/obj/machinery/door/airlock/engineering{name = "Engineering Supplies"; req_one_access = list(11,24)},/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{icon_state = "yellowfull"; dir = 8},/area/engineering/break_room) -"bZM" = (/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) -"bZN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowfull"},/area/crew_quarters/sleep/engi_wash) -"bZO" = (/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) -"bZP" = (/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) +"bZL" = (/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/tiled/freezer,/area/crew_quarters/heads/chief) +"bZM" = (/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/tiled,/area/crew_quarters/heads/chief) +"bZN" = (/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/tiled,/area/crew_quarters/heads/chief) +"bZO" = (/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/tiled,/area/crew_quarters/heads/chief) +"bZP" = (/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/tiled,/area/crew_quarters/heads/chief) "bZQ" = (/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) "bZR" = (/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) -"bZS" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/medical/sleeper) -"bZT" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/medical/sleeper) -"bZU" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/medical/sleeper) -"bZV" = (/obj/structure/disposalpipe/segment{dir = 4},/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/medical/sleeper) -"bZW" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; opacity = 0},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay4) -"bZX" = (/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) -"bZY" = (/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) +"bZS" = (/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},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bZT" = (/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/tiled,/area/crew_quarters/heads/chief) +"bZU" = (/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/tiled,/area/engineering/foyer) +"bZV" = (/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/tiled,/area/engineering/foyer) +"bZW" = (/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"bZX" = (/obj/structure/disposalpipe/sortjunction{sortType = "CE Office"; name = "CE Office"},/turf/simulated/floor/tiled,/area/engineering/foyer) +"bZY" = (/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/tiled,/area/medical/sleeper) "bZZ" = (/obj/structure/sign/greencross,/turf/simulated/wall,/area/medical/medbay4) -"caa" = (/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) -"cab" = (/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) +"caa" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/medical/sleeper) +"cab" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/iv_drip,/turf/simulated/floor/tiled,/area/medical/sleeper) "cac" = (/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},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/psych) "cad" = (/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},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/psych) "cae" = (/turf/simulated/wall,/area/medical/psych) -"caf" = (/obj/machinery/camera/network/medbay{c_tag = "Medbay Patient Hallway - Port"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"cag" = (/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) -"cah" = (/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) +"caf" = (/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/tiled,/area/medical/sleeper) +"cag" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; name = "Diagnostics Room"; req_access = list(5)},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"cah" = (/obj/machinery/power/apc/high{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/medical/sleeper) "cai" = (/turf/simulated/wall,/area/medical/biostorage) -"caj" = (/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) +"caj" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) "cak" = (/turf/simulated/wall,/area/medical/patient_c) "cal" = (/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) -"cam" = (/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) -"can" = (/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) -"cao" = (/obj/machinery/light,/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"cap" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"caq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"car" = (/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) -"cas" = (/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) -"cat" = (/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) -"cau" = (/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) -"cav" = (/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) -"caw" = (/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/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research) -"cax" = (/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) +"cam" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/medbay4) +"can" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/comfy/teal{dir = 4; icon_state = "comfychair_preview"; tag = "icon-comfychair (EAST)"},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cao" = (/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cap" = (/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"},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"caq" = (/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/tiled{icon_state = "white"},/area/medical/patient_wing) +"car" = (/obj/structure/table/standard,/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/tiled{icon_state = "dark"},/area/medical/biostorage) +"cas" = (/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/tiled{icon_state = "dark"},/area/medical/biostorage) +"cat" = (/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"cau" = (/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"},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"cav" = (/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{dir = 9; pixel_y = 0},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"caw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"cax" = (/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/tiled{icon_state = "white"},/area/rnd/research) "cay" = (/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) -"caz" = (/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) -"caA" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; icon_state = "map_on"; tag = "icon-map_on (EAST)"; target_pressure = 15000},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/bar) +"caz" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"caA" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless,/area/maintenance/atmos_control) "caB" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space) "caC" = (/turf/simulated/wall/r_wall,/area/maintenance/atmos_control) "caD" = (/turf/simulated/wall,/area/maintenance/atmos_control) "caE" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/maintenance/atmos_control) -"caF" = (/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) -"caG" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) -"caH" = (/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) -"caI" = (/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) -"caJ" = (/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) -"caK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"caL" = (/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) -"caM" = (/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) -"caN" = (/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) -"caO" = (/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) -"caP" = (/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) -"caQ" = (/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) -"caR" = (/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) -"caS" = (/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) -"caT" = (/obj/structure/disposalpipe/sortjunction{sortType = "CE Office"; name = "CE Office"},/turf/simulated/floor,/area/engineering/foyer) -"caU" = (/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) +"caF" = (/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,/area/maintenance/atmos_control) +"caG" = (/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/airless,/area/maintenance/atmos_control) +"caH" = (/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)"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"caI" = (/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"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"caJ" = (/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)},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"caK" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"caL" = (/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/tiled,/area/maintenance/atmos_control) +"caM" = (/obj/structure/closet/secure_closet/engineering_chief,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"caN" = (/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/tiled,/area/crew_quarters/heads/chief) +"caO" = (/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/tiled,/area/crew_quarters/heads/chief) +"caP" = (/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/tiled,/area/crew_quarters/heads/chief) +"caQ" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"caR" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"caS" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"caT" = (/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) +"caU" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) "caV" = (/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) "caW" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/yellow,/turf/simulated/floor/carpet,/area/engineering/break_room) "caX" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/carpet,/area/engineering/break_room) "caY" = (/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) "caZ" = (/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) -"cba" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "delivery"},/area/medical/sleeper) -"cbb" = (/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) -"cbc" = (/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) -"cbd" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/iv_drip,/turf/simulated/floor,/area/medical/sleeper) -"cbe" = (/obj/machinery/power/apc/high{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor,/area/medical/sleeper) -"cbf" = (/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) -"cbg" = (/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) -"cbh" = (/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) -"cbi" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/comfy/teal{dir = 4; icon_state = "comfychair_preview"; tag = "icon-comfychair (EAST)"},/turf/simulated/floor{dir = 9; icon_state = "whitered"},/area/medical/ward) -"cbj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/ward) -"cbk" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/ward) -"cbl" = (/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) +"cba" = (/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)},/turf/simulated/floor/tiled,/area/engineering/break_room) +"cbb" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 16},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"cbc" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 16},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"cbd" = (/obj/structure/urinal{pixel_y = 32},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"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/tiled{icon_state = "white"},/area/medical/medbay4) +"cbf" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"cbg" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{pixel_x = -26},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/obj/structure/curtain/open/privacy,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cbh" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cbi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cbj" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/obj/structure/curtain/open/privacy,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cbk" = (/obj/structure/bed/roller,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"cbl" = (/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/tiled{icon_state = "dark"},/area/medical/biostorage) "cbm" = (/turf/simulated/wall,/area/medical/ward) "cbn" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/wood,/area/medical/psych) "cbo" = (/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) "cbp" = (/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) -"cbq" = (/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) -"cbr" = (/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) -"cbs" = (/obj/structure/table/standard,/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) -"cbt" = (/obj/structure/table/standard,/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) -"cbu" = (/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{dir = 9; pixel_y = 0},/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/medical/patient_c) -"cbv" = (/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 = 5; icon_state = "whitered"},/area/medical/patient_c) -"cbw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) +"cbq" = (/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/tiled{icon_state = "dark"},/area/medical/biostorage) +"cbr" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"cbs" = (/obj/structure/bed/padded,/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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"cbt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"cbu" = (/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/tiled/freezer,/area/medical/patient_wing) +"cbv" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cbw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "cbx" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/research) "cby" = (/obj/machinery/door/airlock/maintenance{name = "Miscellaneous Reseach Maintenance"; req_one_access = list(7,29)},/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) "cbz" = (/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) @@ -5489,10 +5489,10 @@ "cbC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/meter,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/research_port) "cbD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/research_port) "cbE" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/spiderling_remains,/turf/simulated/floor/plating,/area/maintenance/research_port) -"cbF" = (/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) +"cbF" = (/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/yellow{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "cbG" = (/obj/structure/table/rack,/obj/random/loot,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "cbH" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cbI" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cbI" = (/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/yellow{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cbJ" = (/obj/machinery/atmospherics/tvalve{dir = 4; name = "siphon switching valve"},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cbK" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cbL" = (/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) @@ -5504,49 +5504,49 @@ "cbR" = (/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) "cbS" = (/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) "cbT" = (/obj/effect/decal/cleanable/spiderling_remains,/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cbU" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control) -"cbV" = (/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) -"cbW" = (/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) -"cbX" = (/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) -"cbY" = (/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) +"cbU" = (/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/yellow{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) +"cbV" = (/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 = 9},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cbW" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cbX" = (/turf/simulated/floor/airless,/area/maintenance/atmos_control) +"cbY" = (/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},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled,/area/maintenance/atmos_control) "cbZ" = (/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) -"cca" = (/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) -"ccb" = (/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) -"ccc" = (/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) -"ccd" = (/obj/structure/closet/secure_closet/engineering_chief,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/crew_quarters/heads/chief) -"cce" = (/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) -"ccf" = (/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) -"ccg" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"cch" = (/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) -"cci" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"ccj" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"cca" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"ccb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (WEST)"; icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"ccc" = (/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/tiled,/area/maintenance/atmos_control) +"ccd" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/breath,/obj/item/weapon/rig/ce/equipped,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"cce" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"ccf" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"ccg" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"cch" = (/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/tiled,/area/crew_quarters/heads/chief) +"cci" = (/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/tiled,/area/crew_quarters/heads/chief) +"ccj" = (/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/tiled,/area/crew_quarters/heads/chief) "cck" = (/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) -"ccl" = (/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) -"ccm" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"ccn" = (/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)},/turf/simulated/floor,/area/engineering/break_room) +"ccl" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"ccm" = (/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/tiled,/area/crew_quarters/heads/chief) +"ccn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) "cco" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room) "ccp" = (/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room) "ccq" = (/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) -"ccr" = (/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) -"ccs" = (/obj/structure/mirror{pixel_y = 32},/obj/structure/sink{pixel_y = 16},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"cct" = (/obj/structure/urinal{pixel_y = 32},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) +"ccr" = (/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/tiled,/area/engineering/foyer) +"ccs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cct" = (/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,/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) "ccu" = (/turf/simulated/wall,/area/medical/surgeryobs) -"ccv" = (/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) -"ccw" = (/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) -"ccx" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed1{pixel_x = -26},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/ward) -"ccy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"ccz" = (/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"ccA" = (/obj/structure/bed/padded,/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) +"ccv" = (/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/tiled,/area/engineering/foyer) +"ccw" = (/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)},/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/tiled,/area/engineering/break_room) +"ccx" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Washroom"; req_one_access = list(10)},/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/tiled,/area/engineering/break_room) +"ccy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"ccz" = (/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/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"ccA" = (/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/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "ccB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/medical/psych) "ccC" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/medical/psych) "ccD" = (/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) -"ccE" = (/obj/structure/bed/roller,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"ccF" = (/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) -"ccG" = (/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) -"ccH" = (/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) -"ccI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_c) -"ccJ" = (/obj/structure/bed/padded,/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) -"ccK" = (/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) +"ccE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"ccF" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"ccG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"ccH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"ccI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"ccJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera/network/medbay{c_tag = "Medbay Surgery Observation"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"ccK" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) "ccL" = (/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) "ccM" = (/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) "ccN" = (/turf/simulated/wall,/area/maintenance/substation/research) @@ -5561,13 +5561,13 @@ "ccW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/research_port) "ccX" = (/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) "ccY" = (/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) -"ccZ" = (/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) -"cda" = (/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) -"cdb" = (/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) -"cdc" = (/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) -"cdd" = (/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) -"cde" = (/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) -"cdf" = (/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) +"ccZ" = (/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},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"cda" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"cdb" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"cdc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cdd" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"cde" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cdf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) "cdg" = (/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) "cdh" = (/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) "cdi" = (/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) @@ -5579,64 +5579,64 @@ "cdo" = (/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) "cdp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cdq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"cdr" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/research_starboard) -"cds" = (/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control) -"cdt" = (/obj/machinery/light/small,/turf/simulated/floor{dir = 10; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) -"cdu" = (/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) -"cdv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control) -"cdw" = (/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) +"cdr" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/newscaster{pixel_x = 30},/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cds" = (/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (NORTH)"; icon_state = "bcarpet_edges"; dir = 1},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"cdt" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (NORTH)"; icon_state = "bcarpet_edges"; dir = 1},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (WEST)"; icon_state = "bcarpet_edges"; dir = 8},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (NORTHWEST)"; icon_state = "bcarpet_edges"; dir = 9},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"cdu" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (NORTH)"; icon_state = "bcarpet_edges"; dir = 1},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (EAST)"; icon_state = "bcarpet_edges"; dir = 4},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (NORTHEAST)"; icon_state = "bcarpet_edges"; dir = 5},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"cdv" = (/obj/machinery/iv_drip,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"cdw" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/turf/simulated/floor/tiled{icon_state = "dark"},/area/medical/biostorage) "cdx" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "cdy" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/cobweb,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/cargo) -"cdz" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"cdA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/chief) -"cdB" = (/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) -"cdC" = (/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) -"cdD" = (/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) -"cdE" = (/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) -"cdF" = (/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) -"cdG" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/crew_quarters/heads/chief) +"cdz" = (/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/tiled{icon_state = "dark"},/area/medical/biostorage) +"cdA" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/closet/secure_closet/personal/patient,/obj/effect/floor_decal/corner/pink/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"cdB" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/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},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"cdC" = (/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_c) +"cdD" = (/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/tiled/freezer,/area/medical/patient_wing) +"cdE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light/small,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cdF" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light/small,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cdG" = (/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/yellow,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "cdH" = (/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) -"cdI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) -"cdJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/engineering/foyer) -"cdK" = (/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) -"cdL" = (/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) -"cdM" = (/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) -"cdN" = (/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)},/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) +"cdI" = (/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 = newlist(); req_one_access = list(7,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/visible,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cdJ" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cdK" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cdL" = (/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 = newlist(); req_one_access = list(7,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless,/area/space) +"cdM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless,/area/space) +"cdN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless,/area/rnd/test_area) "cdO" = (/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) "cdP" = (/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) "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) "cdR" = (/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) "cdS" = (/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) "cdT" = (/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) -"cdU" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Washroom"; req_one_access = list(10)},/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) -"cdV" = (/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) -"cdW" = (/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) -"cdX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"cdY" = (/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) -"cdZ" = (/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) -"cea" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/surgeryobs) -"ceb" = (/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) -"cec" = (/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) -"ced" = (/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) -"cee" = (/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) -"cef" = (/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) -"ceg" = (/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) -"ceh" = (/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) -"cei" = (/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) -"cej" = (/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) -"cek" = (/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) -"cel" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"cem" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/newscaster{pixel_x = 30},/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/ward) -"cen" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "bcarpet01"},/area/medical/psych) -"ceo" = (/turf/simulated/floor{icon_state = "bcarpet02"},/area/medical/psych) -"cep" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "bcarpet03"},/area/medical/psych) -"ceq" = (/obj/machinery/iv_drip,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"cer" = (/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) -"ces" = (/obj/structure/table/standard,/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) -"cet" = (/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) -"ceu" = (/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) -"cev" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/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) -"cew" = (/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{icon_state = "freezerfloor"},/area/medical/patient_wing) +"cdU" = (/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/airless,/area/rnd/test_area) +"cdV" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/rnd/test_area) +"cdW" = (/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/tiled/airless,/area/rnd/test_area) +"cdX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cdY" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cdZ" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Engineering Apprentice"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cea" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"ceb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cec" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"ced" = (/obj/machinery/hologram/holopad,/obj/effect/landmark/start{name = "Engineering Apprentice"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cee" = (/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cef" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"ceg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"ceh" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"cei" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"cej" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"cek" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/paleblue,/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"cel" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"cem" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"cen" = (/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/tiled{icon_state = "white"},/area/medical/medbay4) +"ceo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cep" = (/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"ceq" = (/turf/simulated/floor/carpet/blue,/area/medical/psych) +"cer" = (/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,/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (WEST)"; icon_state = "bcarpet_edges"; dir = 8},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"ces" = (/obj/structure/bookcase,/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (EAST)"; icon_state = "bcarpet_edges"; dir = 4},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"cet" = (/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/tiled{icon_state = "dark"},/area/medical/biostorage) +"ceu" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "dark"},/area/medical/biostorage) +"cev" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"cew" = (/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/tiled/freezer,/area/medical/patient_wing) "cex" = (/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"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/research_port) "cey" = (/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) "cez" = (/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) @@ -5648,9 +5648,9 @@ "ceF" = (/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_storage) "ceG" = (/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) "ceH" = (/turf/simulated/wall/r_wall,/area/rnd/xenobiology) -"ceI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light/small,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology) -"ceJ" = (/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) -"ceK" = (/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) +"ceI" = (/obj/structure/closet/secure_closet/hydroponics{req_access = list(47)},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) +"ceJ" = (/obj/structure/table/standard,/obj/machinery/alarm{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,/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) +"ceK" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/smartfridge/drying_rack,/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) "ceL" = (/turf/simulated/wall/r_wall,/area/rnd/xenobiology/xenoflora) "ceM" = (/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) "ceN" = (/obj/structure/grille,/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) @@ -5658,17 +5658,17 @@ "ceP" = (/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) "ceQ" = (/turf/simulated/floor/plating,/area/maintenance/research_starboard) "ceR" = (/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) -"ceS" = (/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 = newlist(); req_one_access = list(7,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/research_starboard) +"ceS" = (/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/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "ceT" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_inner"; locked = 1; name = "Engineering External Access"; req_access = newlist(); req_one_access = list(7,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) -"ceU" = (/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) -"ceV" = (/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) +"ceU" = (/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"},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"ceV" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "ceW" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_outer"; locked = 1; name = "Engineering External Access"; req_access = newlist(); req_one_access = list(7,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"ceX" = (/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 = newlist(); req_one_access = list(7,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/space) -"ceY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/space) -"ceZ" = (/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) -"cfa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"cfb" = (/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) -"cfc" = (/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) +"ceX" = (/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"},/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"ceY" = (/obj/machinery/vending/hydronutrients{categories = 3},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"ceZ" = (/obj/machinery/seed_storage/xenobotany,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cfa" = (/obj/machinery/botany/editor,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cfb" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table/standard,/obj/item/weapon/storage/box/botanydisk,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cfc" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cfd" = (/turf/simulated/wall,/area/construction) "cfe" = (/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) "cff" = (/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) @@ -5676,400 +5676,400 @@ "cfh" = (/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) "cfi" = (/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) "cfj" = (/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) -"cfk" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) -"cfl" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"cfm" = (/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/computer/telescience{starting_crystals = 3},/turf/simulated/floor{icon_state = "white"},/area/rnd/misc_lab) -"cfn" = (/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) -"cfo" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cfp" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Engineering Apprentice"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cfq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cfr" = (/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cfs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"cft" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"cfu" = (/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) -"cfv" = (/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryobs) -"cfw" = (/obj/structure/bed/chair,/turf/simulated/floor,/area/medical/surgeryobs) -"cfx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "bluecorner"},/area/medical/surgeryobs) -"cfy" = (/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) -"cfz" = (/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) -"cfA" = (/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) -"cfB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/ward) -"cfC" = (/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) -"cfD" = (/turf/simulated/floor{icon_state = "bcarpet05"},/area/medical/psych) -"cfE" = (/obj/structure/bookcase,/turf/simulated/floor{icon_state = "bcarpet06"},/area/medical/psych) -"cfF" = (/obj/machinery/vending/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing) -"cfG" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/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) -"cfH" = (/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) -"cfI" = (/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) -"cfJ" = (/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) +"cfk" = (/obj/machinery/botany/extractor,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cfl" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/smartfridge,/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cfm" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cfn" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cfo" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/maintenance/research_starboard) +"cfp" = (/obj/item/clothing/mask/smokable/cigarette,/turf/simulated/floor/airless,/area/rnd/test_area) +"cfq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/rnd/test_area) +"cfr" = (/obj/machinery/light/small,/turf/simulated/floor/airless,/area/rnd/test_area) +"cfs" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction) +"cft" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction) +"cfu" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"cfv" = (/obj/structure/dispenser{phorontanks = 0},/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cfw" = (/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 Voidsuits"; req_access = list(11)},/obj/item/clothing/suit/space/void/engineering,/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cfx" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cfy" = (/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 Voidsuits"; req_access = list(11)},/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/suit/space/void/engineering,/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cfz" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cfA" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cfB" = (/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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cfC" = (/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cfD" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cfE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cfF" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/structure/flora/pottedplant/random,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cfG" = (/obj/machinery/light,/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cfH" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cfI" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"cfJ" = (/obj/machinery/door/airlock/medical{autoclose = 0; icon_state = "door_open"; id_tag = "engineering_cubicle"; name = "Restroom"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "cfK" = (/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) "cfL" = (/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,7)},/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/substation/research) "cfM" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/maintenance/research_port) -"cfN" = (/obj/structure/table/standard,/obj/machinery/alarm{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) -"cfO" = (/obj/structure/closet/secure_closet/hydroponics{req_access = list(47)},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) -"cfP" = (/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) +"cfN" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/corner/paleblue/full,/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"cfO" = (/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/surgeryobs) +"cfP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "cfQ" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/rnd/xenobiology) -"cfR" = (/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) +"cfR" = (/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"},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/medical/surgeryprep) "cfS" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/rnd/xenobiology) -"cfT" = (/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) -"cfU" = (/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) -"cfV" = (/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) -"cfW" = (/obj/machinery/seed_storage/xenobotany,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cfX" = (/obj/machinery/vending/hydronutrients{categories = 3},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cfY" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table/standard,/obj/item/weapon/storage/box/botanydisk,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cfZ" = (/obj/machinery/botany/editor,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) -"cga" = (/obj/machinery/botany/extractor,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) -"cgb" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) -"cgc" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/smartfridge,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cgd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/research_starboard) -"cge" = (/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) -"cgf" = (/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) -"cgg" = (/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) -"cgh" = (/obj/item/clothing/mask/smokable/cigarette,/turf/simulated/floor/plating/airless,/area/rnd/test_area) -"cgi" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless,/area/rnd/test_area) +"cfT" = (/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,/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cfU" = (/obj/structure/closet/secure_closet/personal/patient,/obj/effect/floor_decal/corner/pink/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cfV" = (/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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cfW" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cfX" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/camera/network/medbay{c_tag = "Medbay Recovery Ward"; dir = 1},/obj/effect/floor_decal/corner/pink/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/ward) +"cfY" = (/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},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (WEST)"; icon_state = "bcarpet_edges"; dir = 8},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"cfZ" = (/obj/structure/bed/chair/comfy/brown,/obj/effect/landmark/start{name = "Psychiatrist"},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (EAST)"; icon_state = "bcarpet_edges"; dir = 4},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"cga" = (/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,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"cgb" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"cgc" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/patient_wing) +"cgd" = (/obj/structure/table/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/turf/simulated/floor/tiled{icon_state = "dark"},/area/medical/biostorage) +"cge" = (/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/tiled{icon_state = "dark"},/area/medical/biostorage) +"cgf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"cgg" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"cgh" = (/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"cgi" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) "cgj" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction) "cgk" = (/obj/machinery/alarm{pixel_y = 23},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction) "cgl" = (/obj/item/weapon/tank/emergency_oxygen/engi,/obj/random/tech_supply,/obj/effect/landmark{name = "blobstart"},/obj/structure/table/steel,/turf/simulated/floor/plating,/area/construction) -"cgm" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor,/area/construction) -"cgn" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor,/area/construction) -"cgo" = (/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) +"cgm" = (/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},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) +"cgn" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) +"cgo" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "cgp" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "cgq" = (/obj/structure/sign/pods,/turf/simulated/wall/r_wall,/area/engineering/engine_eva) -"cgr" = (/obj/structure/dispenser{phorontanks = 0},/turf/simulated/floor,/area/engineering/engine_eva) -"cgs" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/engine_eva) -"cgt" = (/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 Voidsuits"; req_access = list(11)},/obj/item/clothing/suit/space/void/engineering,/turf/simulated/floor,/area/engineering/engine_eva) -"cgu" = (/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 Voidsuits"; 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) +"cgr" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cgs" = (/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/yellow{dir = 8},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"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"},/obj/effect/floor_decal/corner/lime/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cgu" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cgv" = (/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) -"cgw" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/engineering/foyer) -"cgx" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/foyer) -"cgy" = (/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) -"cgz" = (/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"cgA" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) +"cgw" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/effect/floor_decal/corner/lime/full{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cgx" = (/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cgy" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cgz" = (/obj/effect/floor_decal/corner/lime/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cgA" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "cgB" = (/obj/structure/closet,/obj/machinery/light/small{dir = 4},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/engineering) -"cgC" = (/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) -"cgD" = (/obj/structure/table/standard,/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/machinery/light,/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cgF" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cgG" = (/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) -"cgH" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/medical/surgeryobs) -"cgI" = (/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/surgeryobs) -"cgJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/medical/surgeryobs) +"cgC" = (/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cgD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/lime/full{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cgE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/rnd/test_area) +"cgF" = (/turf/simulated/floor/tiled,/area/construction) +"cgG" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/clothing/gloves/black,/obj/item/device/multitool{pixel_x = 5},/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction) +"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/tiled,/area/maintenance/atmos_control) +"cgI" = (/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/tiled,/area/maintenance/atmos_control) +"cgJ" = (/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/tiled,/area/engineering/engine_eva) "cgK" = (/turf/simulated/wall,/area/medical/surgeryprep) -"cgL" = (/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) -"cgM" = (/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) -"cgN" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{dir = 10; icon_state = "whitered"},/area/medical/ward) -"cgO" = (/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) -"cgP" = (/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) -"cgQ" = (/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) -"cgR" = (/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) -"cgS" = (/obj/structure/bed/chair/comfy/brown,/obj/effect/landmark/start{name = "Psychiatrist"},/turf/simulated/floor{icon_state = "bcarpet06"},/area/medical/psych) -"cgT" = (/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) -"cgU" = (/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) -"cgV" = (/obj/structure/table/standard,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/medical/patient_wing) -"cgW" = (/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) -"cgX" = (/obj/structure/table/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) +"cgL" = (/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/tiled,/area/engineering/engine_eva) +"cgM" = (/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/tiled,/area/engineering/engine_eva) +"cgN" = (/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/tiled,/area/engineering/engine_eva) +"cgO" = (/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/tiled,/area/engineering/engine_eva) +"cgP" = (/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/tiled,/area/engineering/engine_eva) +"cgQ" = (/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/tiled,/area/engineering/foyer) +"cgR" = (/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/tiled,/area/engineering/engine_eva) +"cgS" = (/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/tiled,/area/engineering/foyer) +"cgT" = (/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/tiled,/area/engineering/foyer) +"cgU" = (/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/effect/floor_decal/corner/yellow{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cgV" = (/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/tiled,/area/engineering/foyer) +"cgW" = (/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/tiled,/area/engineering/foyer) +"cgX" = (/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/tiled,/area/engineering/foyer) "cgY" = (/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) -"cgZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) -"cha" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) -"chb" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) +"cgZ" = (/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},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cha" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/foyer) +"chb" = (/obj/structure/window/basic{dir = 8},/obj/machinery/shower{dir = 1},/obj/machinery/door/window/northright{name = "Shower"},/obj/structure/curtain/open/shower/engineering,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "chc" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/disposalpipe/sortjunction/flipped{dir = 2; name = "Miscellaneous Research"; sortType = "Miscellaneous Research"},/turf/simulated/floor/plating,/area/maintenance/research_port) "chd" = (/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/research_port) "che" = (/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) "chf" = (/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) "chg" = (/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) -"chh" = (/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) -"chi" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) -"chj" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) +"chh" = (/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/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"chi" = (/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/tiled/freezer,/area/crew_quarters/sleep/engi_wash) +"chj" = (/obj/structure/table/standard,/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"},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled,/area/medical/surgeryprep) "chk" = (/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) -"chl" = (/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) -"chm" = (/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) -"chn" = (/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) +"chl" = (/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"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"chm" = (/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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"chn" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/effect/floor_decal/carpet/blue,/turf/simulated/floor/carpet/blue,/area/medical/psych) "cho" = (/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) -"chp" = (/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) -"chq" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"chr" = (/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) -"chs" = (/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cht" = (/turf/simulated/floor{tag = "icon-whitegreen_v (SOUTHWEST)"; icon_state = "whitegreen_v"; dir = 10},/area/rnd/xenobiology/xenoflora) -"chu" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"chv" = (/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"chw" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"chx" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) +"chp" = (/obj/structure/bed/psych,/obj/item/weapon/bedsheet/brown,/obj/effect/floor_decal/carpet/blue,/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (EAST)"; icon_state = "bcarpet_edges"; dir = 4},/obj/effect/floor_decal/carpet/blue{tag = "icon-bcarpet_edges (SOUTHEAST)"; icon_state = "bcarpet_edges"; dir = 6},/turf/simulated/floor/carpet/blue,/area/medical/psych) +"chq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Virology Access"; req_access = list(5)},/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/tiled{icon_state = "white"},/area/medical/virologyaccess) +"chr" = (/obj/structure/table/standard,/obj/item/weapon/gun/launcher/syringe,/obj/item/weapon/storage/box/syringegun,/turf/simulated/floor/tiled{icon_state = "dark"},/area/medical/biostorage) +"chs" = (/obj/structure/bedsheetbin,/obj/structure/table/standard,/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/tiled{icon_state = "dark"},/area/medical/biostorage) +"cht" = (/obj/machinery/door/airlock/medical{autoclose = 0; icon_state = "door_open"; id_tag = "cubicle1"; name = "Cubicle 1"},/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"chu" = (/obj/machinery/door/airlock/medical{autoclose = 0; icon_state = "door_open"; id_tag = "cubicle2"; name = "Cubicle 2"},/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"chv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) +"chw" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) +"chx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) "chy" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) "chz" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access = list(11)},/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) "chA" = (/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) -"chB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/rnd/test_area) +"chB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "chC" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engineering/atmos) "chD" = (/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) "chE" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction) "chF" = (/turf/simulated/floor/plating,/area/construction) -"chG" = (/turf/simulated/floor,/area/construction) -"chH" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/clothing/gloves/black,/obj/item/device/multitool{pixel_x = 5},/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor,/area/construction) -"chI" = (/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) -"chJ" = (/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) -"chK" = (/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) -"chL" = (/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) -"chM" = (/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) -"chN" = (/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) -"chO" = (/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) -"chP" = (/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) -"chQ" = (/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) -"chR" = (/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) -"chS" = (/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) -"chT" = (/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) -"chU" = (/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) -"chV" = (/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) -"chW" = (/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) -"chX" = (/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) -"chY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/foyer) -"chZ" = (/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) -"cia" = (/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) -"cib" = (/obj/structure/window/basic{dir = 8},/obj/machinery/shower{dir = 1},/obj/machinery/door/window/northright{name = "Shower"},/obj/structure/curtain/open/shower/engineering,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash) -"cic" = (/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) +"chG" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"chH" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"chI" = (/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/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"chJ" = (/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/tiled,/area/rnd/xenobiology/xenoflora) +"chK" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"chL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"chM" = (/obj/structure/table/standard,/obj/item/weapon/tape_roll,/obj/item/device/analyzer/plant_analyzer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"chN" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"chO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"chP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"chQ" = (/obj/machinery/light_switch{pixel_x = 26; pixel_y = -6},/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"chR" = (/turf/simulated/floor/reinforced{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) +"chS" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Air"},/turf/simulated/floor/reinforced{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) +"chT" = (/turf/simulated/floor/reinforced{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) +"chU" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Oxygen"},/turf/simulated/floor/reinforced{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) +"chV" = (/turf/simulated/floor/reinforced{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) +"chW" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Nitrogen"},/turf/simulated/floor/reinforced{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) +"chX" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction) +"chY" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"chZ" = (/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/tiled,/area/maintenance/atmos_control) +"cia" = (/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/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cib" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cic" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor/tiled,/area/engineering/engine_eva) "cid" = (/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) "cie" = (/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) "cif" = (/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) -"cig" = (/obj/structure/table/standard,/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) -"cih" = (/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) -"cii" = (/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) -"cij" = (/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) -"cik" = (/obj/structure/bed/psych,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor{icon_state = "bcarpet09"},/area/medical/psych) +"cig" = (/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cih" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cii" = (/turf/simulated/floor/tiled,/area/engineering/foyer) +"cij" = (/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/tiled,/area/engineering/engine_eva) +"cik" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/tiled,/area/engineering/foyer) "cil" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virologyaccess) -"cim" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Virology Access"; req_access = list(5)},/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) -"cin" = (/obj/structure/bedsheetbin,/obj/structure/table/standard,/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) -"cio" = (/obj/structure/table/standard,/obj/item/weapon/gun/launcher/syringe,/obj/item/weapon/storage/box/syringegun,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage) +"cim" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cin" = (/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cio" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/engineering/locker_room) "cip" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/research_port) -"ciq" = (/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) -"cir" = (/obj/machinery/door/airlock/medical{autoclose = 0; icon_state = "door_open"; id_tag = "cubicle2"; name = "Cubicle 2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) +"ciq" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/machinery/light{dir = 1},/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor/tiled,/area/engineering/locker_room) +"cir" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor/tiled,/area/engineering/locker_room) "cis" = (/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) "cit" = (/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) "ciu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/research_port) "civ" = (/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) -"ciw" = (/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) -"cix" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) -"ciy" = (/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) -"ciz" = (/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) -"ciA" = (/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) -"ciB" = (/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) -"ciC" = (/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) -"ciD" = (/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) -"ciE" = (/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) -"ciF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"ciG" = (/obj/structure/table/standard,/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) -"ciH" = (/obj/structure/table/standard,/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) -"ciI" = (/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) -"ciJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"ciK" = (/obj/machinery/light_switch{pixel_x = 26; pixel_y = -6},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) +"ciw" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/engineering/locker_room) +"cix" = (/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/tiled,/area/engineering/locker_room) +"ciy" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light_switch{pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"ciz" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"ciA" = (/obj/machinery/button/remote/blast_door{id = "surgeryobs"; name = "Privacy Shutters"; pixel_y = 25},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"ciB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"ciC" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"ciD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1"; req_access = list(45)},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"ciE" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"ciF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"ciG" = (/obj/machinery/button/remote/blast_door{id = "surgeryobs2"; name = "Privacy Shutters"; pixel_y = 25},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"ciH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2"; req_access = list(45)},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"ciI" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"ciJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"ciK" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) "ciL" = (/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) "ciM" = (/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) "ciN" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Aft Starboard"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"ciO" = (/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) -"ciP" = (/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) -"ciQ" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) -"ciR" = (/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) -"ciS" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) -"ciT" = (/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) +"ciO" = (/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/tiled,/area/medical/virologyaccess) +"ciP" = (/obj/machinery/camera/network/medbay{c_tag = "Virology Access Fore"},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"ciQ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"ciR" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"ciS" = (/obj/machinery/shower{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/medical/patient_wing) +"ciT" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) "ciU" = (/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) -"ciV" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/table/steel,/turf/simulated/floor,/area/construction) -"ciW" = (/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) -"ciX" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) +"ciV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/lime/full,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) +"ciW" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/corner/lime/full{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) +"ciX" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora_storage) "ciY" = (/turf/simulated/wall/r_wall,/area/engineering/engine_eva) -"ciZ" = (/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/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/engineering/engine_eva) -"cja" = (/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) -"cjb" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/engine_eva) -"cjc" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/engine_eva) -"cjd" = (/turf/simulated/floor,/area/engineering/engine_eva) -"cje" = (/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) -"cjf" = (/turf/simulated/floor,/area/engineering/foyer) -"cjg" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor,/area/engineering/foyer) -"cjh" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/foyer) -"cji" = (/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) +"ciZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cja" = (/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},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) +"cjb" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow,/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cjc" = (/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/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cjd" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cje" = (/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},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) +"cjf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cjg" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cjh" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cji" = (/obj/structure/table/standard,/obj/item/clothing/gloves/latex,/obj/item/weapon/hand_labeler,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) "cjj" = (/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/locker_room) -"cjk" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/locker_room) -"cjl" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/engineering/locker_room) -"cjm" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/machinery/light{dir = 1},/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/engineering/locker_room) -"cjn" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor,/area/engineering/locker_room) -"cjo" = (/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/engineering/locker_room) +"cjk" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cjl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Xenobiologist"},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cjm" = (/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"cjn" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/reinforced{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) +"cjo" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/reinforced{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) "cjp" = (/turf/simulated/wall,/area/engineering/locker_room) "cjq" = (/turf/simulated/wall,/area/maintenance/substation/engineering) "cjr" = (/turf/simulated/wall,/area/medical/surgery) -"cjs" = (/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) -"cjt" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cju" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cjv" = (/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) -"cjw" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1"; req_access = list(45)},/turf/simulated/floor,/area/medical/surgeryprep) -"cjx" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) -"cjy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/medical/surgeryprep) -"cjz" = (/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) -"cjA" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2"; req_access = list(45)},/turf/simulated/floor,/area/medical/surgeryprep) -"cjB" = (/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) -"cjC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"cjD" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"cjE" = (/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) +"cjs" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/reinforced{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) +"cjt" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/construction) +"cju" = (/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/maintenance/atmos_control) +"cjv" = (/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/item/weapon/storage/briefcase/inflatable{pixel_x = -3; pixel_y = 0},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cjw" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/camera/network/engineering{c_tag = "Engineering EVA"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cjx" = (/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cjy" = (/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 Voidsuits"; req_access = list(24)},/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cjz" = (/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 Voidsuits"; req_access = list(24)},/turf/simulated/floor/tiled,/area/engineering/engine_eva) +"cjA" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cjB" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/item/weapon/folder/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cjC" = (/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cjD" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cjE" = (/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/tiled,/area/engineering/foyer) "cjF" = (/turf/simulated/wall,/area/medical/surgery2) -"cjG" = (/obj/machinery/camera/network/medbay{c_tag = "Virology Access Fore"},/turf/simulated/floor,/area/medical/virologyaccess) -"cjH" = (/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) -"cjI" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/medical/virologyaccess) -"cjJ" = (/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) -"cjK" = (/obj/machinery/shower{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing) -"cjL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{tag = "icon-whitegreen_v (SOUTHWEST)"; icon_state = "whitegreen_v"; dir = 10},/area/rnd/xenobiology/xenoflora_storage) -"cjM" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) -"cjN" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) -"cjO" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage) -"cjP" = (/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},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology) -"cjQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cjR" = (/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) -"cjS" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/purple,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cjT" = (/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},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora) -"cjU" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cjV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cjW" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cjX" = (/obj/structure/table/standard,/obj/item/clothing/gloves/latex,/obj/item/weapon/hand_labeler,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cjY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cjZ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cka" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Xenobiologist"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"ckb" = (/obj/structure/table/glass,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) +"cjG" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/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/tiled,/area/engineering/locker_room) +"cjI" = (/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/tiled,/area/engineering/locker_room) +"cjJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/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/tiled,/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/tiled,/area/engineering/locker_room) +"cjM" = (/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/tiled,/area/engineering/locker_room) +"cjN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 28},/turf/simulated/floor/tiled,/area/engineering/locker_room) +"cjO" = (/obj/structure/table/standard,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/item/weapon/surgicaldrill,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cjP" = (/obj/machinery/computer/operating,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cjQ" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cjR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cjS" = (/obj/structure/table/standard,/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 = "Surgery Emergency Phone"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cjT" = (/obj/structure/disposalpipe/segment,/obj/item/roller,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cjU" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cjV" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cjW" = (/obj/machinery/computer/operating,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cjX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cjY" = (/obj/structure/table/standard,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/item/weapon/surgicaldrill,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cjZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/effect/landmark{name = "blobstart"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"cka" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"ckb" = (/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/tiled,/area/medical/virologyaccess) "ckc" = (/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) "ckd" = (/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) "cke" = (/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) -"ckf" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) -"ckg" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) -"ckh" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) -"cki" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/construction) +"ckf" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_storage) +"ckg" = (/obj/machinery/door/window/northright{name = "Xenoflora Containment"; req_access = list(47)},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_storage) +"ckh" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_storage) +"cki" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_storage) "ckj" = (/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) "ckk" = (/obj/structure/cable/green{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/plating,/area/maintenance/atmos_control) -"ckl" = (/obj/machinery/light/small{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/atmos_control) -"ckm" = (/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/item/weapon/storage/briefcase/inflatable{pixel_x = -3; pixel_y = 0},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/engineering/engine_eva) -"ckn" = (/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor,/area/engineering/engine_eva) -"cko" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/camera/network/engineering{c_tag = "Engineering EVA"; dir = 1},/turf/simulated/floor,/area/engineering/engine_eva) -"ckp" = (/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 Voidsuits"; req_access = list(24)},/turf/simulated/floor,/area/engineering/engine_eva) -"ckq" = (/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 Voidsuits"; req_access = list(24)},/turf/simulated/floor,/area/engineering/engine_eva) +"ckl" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"ckm" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"ckn" = (/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cko" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"ckp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"ckq" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) "ckr" = (/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) -"cks" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor,/area/engineering/foyer) -"ckt" = (/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/turf/simulated/floor,/area/engineering/foyer) -"cku" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/item/weapon/folder/yellow,/turf/simulated/floor,/area/engineering/foyer) -"ckv" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor,/area/engineering/foyer) -"ckw" = (/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) -"ckx" = (/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) -"cky" = (/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) -"ckz" = (/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) -"ckA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/locker_room) -"ckB" = (/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) -"ckC" = (/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/engineering/locker_room) -"ckD" = (/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) -"ckE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 28},/turf/simulated/floor,/area/engineering/locker_room) +"cks" = (/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"ckt" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"cku" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/obj/effect/floor_decal/corner/lime/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"ckv" = (/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(11,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"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"ckw" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"ckx" = (/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,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) +"cky" = (/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/reinforced{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) +"ckz" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1443; icon_state = "map_injector"; id = "air_in"; use_power = 1},/turf/simulated/floor/reinforced{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) +"ckA" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/reinforced{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) +"ckB" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1441; icon_state = "map_injector"; id = "o2_in"; use_power = 1},/turf/simulated/floor/reinforced{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) +"ckC" = (/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/reinforced{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) +"ckD" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/reinforced{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) +"ckE" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/turf/simulated/floor/reinforced{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) "ckF" = (/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) "ckG" = (/obj/machinery/light{dir = 1},/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/machinery/power/sensor{name = "Powernet Sensor - Engineering Subgrid"; name_tag = "Engineering Subgrid"},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) "ckH" = (/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) -"ckI" = (/obj/structure/table/standard,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/item/weapon/surgicaldrill,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"ckJ" = (/obj/machinery/computer/operating,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"ckK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"ckL" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor{dir = 4; icon_state = "whitered"},/area/medical/surgery) +"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/reinforced{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) +"ckJ" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/reinforced{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) +"ckK" = (/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/tiled,/area/engineering/engine_eva) +"ckL" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/foyer) "ckM" = (/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) -"ckN" = (/obj/structure/table/standard,/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 = "Surgery Emergency Phone"},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) -"ckO" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/surgeryprep) -"ckP" = (/obj/structure/disposalpipe/segment,/obj/item/roller,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) +"ckN" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/tiled,/area/engineering/foyer) +"ckO" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/tape_roll,/turf/simulated/floor/tiled,/area/engineering/foyer) +"ckP" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIE"; location = "AftH"},/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/tiled,/area/engineering/foyer) "ckQ" = (/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/surgery2) -"ckR" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/surgery2) -"ckS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"ckT" = (/obj/machinery/computer/operating,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"ckU" = (/obj/structure/table/standard,/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) +"ckR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) +"ckS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"ckT" = (/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/tiled,/area/engineering/foyer) +"ckU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/engineering/locker_room) "ckV" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/medbay) "ckW" = (/obj/machinery/alarm{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) "ckX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access = newlist(); req_one_access = list(12,5)},/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) -"ckY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/medical/virologyaccess) -"ckZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/effect/landmark{name = "blobstart"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/medical/virologyaccess) -"cla" = (/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) +"ckY" = (/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/tiled,/area/engineering/locker_room) +"ckZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/locker_room) +"cla" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/locker_room) "clb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,5)},/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) "clc" = (/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) "cld" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port) "cle" = (/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) -"clf" = (/obj/machinery/door/window/northright{name = "Xenoflora Containment"; req_access = list(47)},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) -"clg" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) -"clh" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) -"cli" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) +"clf" = (/turf/simulated/floor/tiled,/area/engineering/locker_room) +"clg" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/tiled,/area/engineering/locker_room) +"clh" = (/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/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cli" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) "clj" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/rnd/xenobiology) -"clk" = (/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) +"clk" = (/obj/machinery/optable,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) "cll" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/rnd/xenobiology/xenoflora) -"clm" = (/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) -"cln" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"clo" = (/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"clp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{tag = "icon-whitegreen_v (NORTHEAST)"; icon_state = "whitegreen_v"; dir = 5},/area/rnd/xenobiology/xenoflora) -"clq" = (/turf/simulated/floor{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/rnd/xenobiology/xenoflora) -"clr" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cls" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"clt" = (/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) -"clu" = (/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) -"clv" = (/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(11,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) -"clw" = (/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) -"clx" = (/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) -"cly" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) -"clz" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1443; icon_state = "map_injector"; id = "air_in"; use_power = 1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/engineering/atmos) -"clA" = (/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) -"clB" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/engineering/atmos) -"clC" = (/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) -"clD" = (/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) -"clE" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) -"clF" = (/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) +"clm" = (/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/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cln" = (/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/tiled{icon_state = "white"},/area/medical/surgery) +"clo" = (/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/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"clp" = (/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/tiled,/area/medical/surgeryprep) +"clq" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"clr" = (/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/tiled,/area/medical/surgeryprep) +"cls" = (/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/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"clt" = (/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/tiled,/area/medical/surgeryprep) +"clu" = (/obj/machinery/optable,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"clv" = (/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/tiled{icon_state = "white"},/area/medical/surgery2) +"clw" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"clx" = (/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"cly" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"clz" = (/obj/machinery/light/small,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/paleblue,/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"clA" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_storage) +"clB" = (/obj/machinery/light,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_storage) +"clC" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_storage) +"clD" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora_storage) +"clE" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"clF" = (/obj/structure/closet/emcloset,/obj/machinery/camera/xray/research{c_tag = "Xenobiology Access"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "clG" = (/obj/item/weapon/wirecutters,/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/plating,/area/construction) "clH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "clI" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"clJ" = (/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) -"clK" = (/obj/machinery/computer/station_alert,/turf/simulated/floor,/area/engineering/foyer) -"clL" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor,/area/engineering/foyer) -"clM" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/tape_roll,/turf/simulated/floor,/area/engineering/foyer) -"clN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor,/area/engineering/foyer) -"clO" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIE"; location = "AftH"},/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/engineering/foyer) -"clP" = (/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) -"clQ" = (/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) -"clR" = (/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) -"clS" = (/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) -"clT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/locker_room) -"clU" = (/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) -"clV" = (/turf/simulated/floor,/area/engineering/locker_room) -"clW" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/engineering/locker_room) +"clJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"clK" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"clL" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"clM" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/portable_atmospherics/hydroponics,/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"clN" = (/obj/machinery/seed_extractor,/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"clO" = (/obj/machinery/biogenerator,/obj/machinery/camera/network/research{c_tag = "Xenoflora"; dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) +"clP" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"clQ" = (/obj/machinery/light,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/portable_atmospherics/hydroponics,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"clR" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket,/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology/xenoflora) +"clS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/construction) +"clT" = (/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/tiled,/area/engineering/foyer) +"clU" = (/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/tiled,/area/engineering/foyer) +"clV" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/foyer) +"clW" = (/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/tiled,/area/engineering/foyer) "clX" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Engineering"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/maintenance/substation/engineering) "clY" = (/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) "clZ" = (/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) -"cma" = (/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) -"cmb" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cmc" = (/obj/machinery/optable,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cmd" = (/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) -"cme" = (/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) -"cmf" = (/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) -"cmg" = (/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) -"cmh" = (/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) -"cmi" = (/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) -"cmj" = (/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) -"cmk" = (/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) -"cml" = (/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) -"cmm" = (/obj/machinery/optable,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"cmn" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) +"cma" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cmb" = (/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/tiled,/area/engineering/foyer) +"cmc" = (/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/tiled,/area/engineering/foyer) +"cmd" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cme" = (/obj/machinery/door/window/eastright{name = "Engineering Reception Desk"; req_one_access = list(11,24)},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cmf" = (/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/tiled,/area/engineering/foyer) +"cmg" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cmh" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cmi" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cmj" = (/obj/structure/closet/secure_closet/atmos_personal,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor/tiled,/area/engineering/locker_room) +"cmk" = (/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/tiled,/area/engineering/locker_room) +"cml" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/locker_room) +"cmm" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/device/suit_cooling_unit,/turf/simulated/floor/tiled,/area/engineering/locker_room) +"cmn" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/standard,/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},/obj/item/device/suit_cooling_unit,/turf/simulated/floor/tiled,/area/engineering/locker_room) "cmo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/medbay) "cmp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/medbay) "cmq" = (/turf/simulated/wall/r_wall,/area/medical/virologyaccess) -"cmr" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/medical/virologyaccess) -"cms" = (/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) -"cmt" = (/obj/machinery/light/small,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "bluecorner"},/area/medical/virologyaccess) +"cmr" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/engineering/locker_room) +"cms" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cmt" = (/obj/structure/table/standard,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) "cmu" = (/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/research_port) "cmv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/research_port) "cmw" = (/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) "cmx" = (/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) "cmy" = (/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) -"cmz" = (/obj/machinery/light,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) -"cmA" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) -"cmB" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora_storage) -"cmC" = (/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) -"cmD" = (/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) -"cmE" = (/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) -"cmF" = (/obj/structure/closet/emcloset,/obj/machinery/camera/xray/research{c_tag = "Xenobiology Access"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/rnd/xenobiology) -"cmG" = (/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) -"cmH" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) -"cmI" = (/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) -"cmJ" = (/obj/machinery/biogenerator,/obj/machinery/camera/network/research{c_tag = "Xenoflora"; dir = 1},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cmK" = (/obj/machinery/seed_extractor,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology/xenoflora) -"cmL" = (/obj/machinery/light,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora) -"cmM" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora) -"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) +"cmz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cmA" = (/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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cmB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cmC" = (/obj/structure/bed/chair/comfy/black{dir = 4},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cmD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cmE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cmF" = (/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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cmG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cmH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cmI" = (/obj/structure/table/standard,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cmJ" = (/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/tiled,/area/medical/virologyaccess) +"cmK" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cmL" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cmM" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cmN" = (/obj/item/device/flashlight,/turf/simulated/floor/tiled,/area/construction) "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/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_inner"; locked = 1; name = "Engineering External Access"; req_access = list(11,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) "cmQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) @@ -6080,51 +6080,51 @@ "cmV" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/wall/r_wall,/area/engineering/atmos) "cmW" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/wall/r_wall,/area/engineering/atmos) "cmX" = (/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) -"cmY" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/construction) +"cmY" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/construction) "cmZ" = (/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) "cna" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"cnb" = (/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) -"cnc" = (/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) -"cnd" = (/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) -"cne" = (/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) -"cnf" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor,/area/engineering/foyer) -"cng" = (/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) -"cnh" = (/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) -"cni" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor,/area/engineering/foyer) -"cnj" = (/obj/machinery/door/window/eastright{name = "Engineering Reception Desk"; req_one_access = list(11,24)},/obj/machinery/light,/turf/simulated/floor,/area/engineering/foyer) -"cnk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer) -"cnl" = (/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) -"cnm" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"cnn" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer) -"cno" = (/obj/structure/closet/secure_closet/atmos_personal,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/engineering/locker_room) -"cnp" = (/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) -"cnq" = (/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) -"cnr" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/device/suit_cooling_unit,/turf/simulated/floor,/area/engineering/locker_room) -"cns" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/standard,/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},/obj/item/device/suit_cooling_unit,/turf/simulated/floor,/area/engineering/locker_room) +"cnb" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/construction) +"cnc" = (/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/tiled,/area/maintenance/atmos_control) +"cnd" = (/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/tiled,/area/maintenance/atmos_control) +"cne" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(12,24)},/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cnf" = (/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"cng" = (/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/tiled,/area/engineering/engineering_monitoring) +"cnh" = (/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)},/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/tiled,/area/engineering) +"cni" = (/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)},/turf/simulated/floor/tiled,/area/engineering) +"cnj" = (/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)},/turf/simulated/floor/tiled,/area/engineering) +"cnk" = (/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/tiled,/area/engineering/workshop) +"cnl" = (/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/tiled,/area/engineering/workshop) +"cnm" = (/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/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cnn" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/machinery/light,/obj/item/weapon/cautery,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cno" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cnp" = (/obj/machinery/computer/med_data,/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cnq" = (/obj/structure/table/standard,/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/random/medical,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery) +"cnr" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cns" = (/obj/machinery/computer/med_data,/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) "cnt" = (/obj/structure/table/standard,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/engineering) "cnu" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Engineering Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/engineering) "cnv" = (/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) "cnw" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(11,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) -"cnx" = (/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) -"cny" = (/obj/structure/table/standard,/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) -"cnz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cnA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"cnB" = (/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) -"cnC" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) -"cnD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/medical/surgeryprep) -"cnE" = (/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) -"cnF" = (/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) -"cnG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"cnH" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"cnI" = (/obj/structure/table/standard,/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) +"cnx" = (/obj/structure/table/standard,/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/random/medical,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cny" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/machinery/light,/obj/item/weapon/cautery,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cnz" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgery2) +"cnA" = (/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/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"cnB" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"cnC" = (/obj/machinery/light{dir = 1},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"cnD" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cnE" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cnF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cnG" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cnH" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cnI" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "cnJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/medbay) "cnK" = (/turf/simulated/floor/plating,/area/maintenance/medbay) "cnL" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/virologyaccess) -"cnM" = (/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) +"cnM" = (/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},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "cnN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/research_port) -"cnO" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/shower{icon_state = "shower"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/xenobiology) -"cnP" = (/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) -"cnQ" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/rnd/xenobiology) +"cnO" = (/obj/structure/closet/l3closet/scientist,/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cnP" = (/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/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cnQ" = (/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/airless,/area/space) "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) @@ -6134,55 +6134,55 @@ "cnX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/lattice,/turf/space,/area/space) "cnY" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/space,/area/space) "cnZ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/space,/area/space) -"coa" = (/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/construction) -"cob" = (/obj/item/device/flashlight,/turf/simulated/floor,/area/construction) -"coc" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/construction) +"coa" = (/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/tiled,/area/engineering/atmos) +"cob" = (/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos) +"coc" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter,/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/atmos) "cod" = (/turf/simulated/wall/r_wall,/area/construction) -"coe" = (/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) -"cof" = (/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) +"coe" = (/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/tiled,/area/engineering/atmos) +"cof" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) "cog" = (/turf/simulated/wall/r_wall,/area/engineering/atmos) "coh" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/wall/r_wall,/area/engineering/atmos) -"coi" = (/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) +"coi" = (/obj/machinery/firealarm{pixel_x = 32; pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "coj" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/monitoring) -"cok" = (/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) +"cok" = (/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/tiled,/area/engineering/atmos/monitoring) "col" = (/turf/simulated/wall/r_wall,/area/engineering/engineering_monitoring) -"com" = (/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) +"com" = (/obj/machinery/computer/atmoscontrol,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "con" = (/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) "coo" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engineering/engineering_monitoring) -"cop" = (/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)},/turf/simulated/floor,/area/engineering) -"coq" = (/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)},/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) -"cor" = (/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)},/turf/simulated/floor,/area/engineering) +"cop" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) +"coq" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) +"cor" = (/obj/machinery/computer/atmos_alert,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) "cos" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/engineering/workshop) "cot" = (/turf/simulated/wall/r_wall,/area/engineering/workshop) -"cou" = (/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) -"cov" = (/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) +"cou" = (/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/tiled,/area/engineering) +"cov" = (/turf/simulated/floor/tiled,/area/engineering) "cow" = (/turf/simulated/wall/r_wall,/area/engineering/locker_room) "cox" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/engineering) -"coy" = (/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) -"coz" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/machinery/light,/obj/item/weapon/cautery,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"coA" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"coB" = (/obj/structure/table/standard,/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/random/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"coC" = (/obj/machinery/computer/med_data,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"coD" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) -"coE" = (/obj/machinery/computer/med_data,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"coF" = (/obj/structure/table/standard,/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/random/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"coG" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"coH" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/machinery/light,/obj/item/weapon/cautery,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2) -"coI" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/medical/virologyaccess) -"coJ" = (/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/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/virologyaccess) -"coK" = (/obj/machinery/light{dir = 1},/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 = 4; icon_state = "bluecorner"},/area/medical/virologyaccess) -"coL" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/engine,/area/rnd/xenobiology) -"coM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"coN" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"coy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/sign/directions/medical{dir = 1; icon_state = "direction_med"; pixel_x = 30; pixel_y = 4; tag = "icon-direction_med (NORTH)"},/obj/structure/sign/directions/evac{dir = 8; icon_state = "direction_evac"; pixel_x = 30; pixel_y = -4; tag = "icon-direction_evac (WEST)"},/turf/simulated/floor/tiled,/area/engineering) +"coz" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/engineering/workshop) +"coA" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/engineering/workshop) +"coB" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight,/turf/simulated/floor/tiled,/area/engineering/workshop) +"coC" = (/obj/structure/closet/toolcloset,/obj/machinery/light{dir = 1},/obj/item/device/flashlight,/turf/simulated/floor/tiled,/area/engineering/workshop) +"coD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/workshop) +"coE" = (/turf/simulated/floor/tiled,/area/engineering/workshop) +"coF" = (/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/tiled{icon_state = "white"},/area/medical/surgery) +"coG" = (/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,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"coH" = (/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/standard,/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},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"coI" = (/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/tiled{icon_state = "white"},/area/medical/surgery2) +"coJ" = (/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,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"coK" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "virologyquar"; name = "Virology Emergency Quarantine Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"coL" = (/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"coM" = (/mob/living/carbon/slime,/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"coN" = (/obj/machinery/door/window/eastleft{name = "Containment Pen"; req_access = list(47)},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) "coO" = (/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) -"coP" = (/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) -"coQ" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"coR" = (/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) +"coP" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/westright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"coQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"coR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "coS" = (/turf/simulated/wall,/area/rnd/xenobiology) -"coT" = (/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) -"coU" = (/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) -"coV" = (/obj/structure/closet/l3closet/scientist,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/rnd/xenobiology) -"coW" = (/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) +"coT" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"coU" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/starboard) +"coV" = (/obj/machinery/atmospherics/valve/digital/open{name = "Mixed Air Outlet Valve"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"coW" = (/obj/machinery/atmospherics/binary/pump{name = "Air Mix to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos) "coX" = (/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) "coY" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "coZ" = (/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) @@ -6198,309 +6198,309 @@ "cpj" = (/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) "cpk" = (/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) "cpl" = (/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) -"cpm" = (/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) -"cpn" = (/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) -"cpo" = (/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) -"cpp" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter,/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor,/area/engineering/atmos) -"cpq" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) +"cpm" = (/obj/machinery/atmospherics/valve/digital/open{name = "Mixed Air Inlet Valve"},/obj/effect/floor_decal/corner/blue/diagonal,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpn" = (/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},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpo" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/corner/blue/full{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpp" = (/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpq" = (/obj/machinery/atmospherics/valve/digital/open{name = "Oxygen Outlet Valve"},/obj/effect/floor_decal/corner/blue/full{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpr" = (/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) -"cps" = (/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) -"cpt" = (/obj/machinery/firealarm{pixel_x = 32; pixel_y = 24},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cpu" = (/obj/machinery/computer/atmoscontrol,/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cpv" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor,/area/engineering/engineering_monitoring) -"cpw" = (/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/engineering_monitoring) -"cpx" = (/obj/machinery/computer/atmos_alert,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor,/area/engineering/engineering_monitoring) -"cpy" = (/turf/simulated/floor,/area/engineering) -"cpz" = (/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) -"cpA" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/sign/directions/medical{dir = 1; icon_state = "direction_med"; pixel_x = 30; pixel_y = 4; tag = "icon-direction_med (NORTH)"},/obj/structure/sign/directions/evac{dir = 8; icon_state = "direction_evac"; pixel_x = 30; pixel_y = -4; tag = "icon-direction_evac (WEST)"},/turf/simulated/floor,/area/engineering) -"cpB" = (/obj/machinery/vending/tool,/turf/simulated/floor,/area/engineering/workshop) -"cpC" = (/obj/machinery/vending/engivend,/turf/simulated/floor,/area/engineering/workshop) -"cpD" = (/obj/structure/closet/toolcloset,/obj/machinery/light{dir = 1},/obj/item/device/flashlight,/turf/simulated/floor,/area/engineering/workshop) -"cpE" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight,/turf/simulated/floor,/area/engineering/workshop) -"cpF" = (/turf/simulated/floor,/area/engineering/workshop) -"cpG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/workshop) +"cps" = (/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"},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpt" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpu" = (/obj/machinery/atmospherics/binary/pump{name = "O2 to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpv" = (/obj/machinery/atmospherics/valve/digital/open{name = "Nitrogen Outlet Valve"},/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpw" = (/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},/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpx" = (/obj/machinery/atmospherics/binary/pump{name = "N2 to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpy" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpz" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpA" = (/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},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpB" = (/obj/structure/dispenser,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpC" = (/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"},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpD" = (/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/table/steel,/obj/item/device/flashlight/heavy,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpF" = (/obj/machinery/newscaster{pixel_y = 30},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpG" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos) "cpH" = (/turf/simulated/wall/r_wall,/area/engineering/storage) "cpI" = (/obj/machinery/shield_gen/external,/turf/simulated/floor/plating,/area/engineering/storage) "cpJ" = (/obj/machinery/shield_gen,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engineering/storage) "cpK" = (/obj/machinery/power/rad_collector,/turf/simulated/floor/plating,/area/engineering/storage) "cpL" = (/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) "cpM" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/surgery) -"cpN" = (/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) -"cpO" = (/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) -"cpP" = (/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/standard,/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) -"cpQ" = (/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) +"cpN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpO" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Ports"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpP" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpQ" = (/obj/machinery/atmospherics/binary/pump/on{name = "Ports to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpR" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/surgery2) "cpS" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/medbay) -"cpT" = (/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) -"cpU" = (/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) -"cpV" = (/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cpW" = (/mob/living/carbon/slime,/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cpX" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/westright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cpY" = (/obj/machinery/door/window/eastleft{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) -"cpZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cqa" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cqb" = (/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) -"cqc" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard) +"cpT" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"cpU" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"cpV" = (/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/tiled,/area/engineering/atmos/monitoring) +"cpW" = (/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/tiled,/area/engineering/engineering_monitoring) +"cpX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Engineering Monitoring Room"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) +"cpY" = (/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) +"cpZ" = (/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/tiled,/area/engineering) +"cqa" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering) +"cqb" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/workshop) +"cqc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/freezer,/area/medical/surgery) "cqd" = (/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) -"cqe" = (/obj/machinery/atmospherics/binary/pump{name = "Air Mix to Connector"},/turf/simulated/floor,/area/engineering/atmos) -"cqf" = (/obj/machinery/atmospherics/valve/digital/open{name = "Mixed Air Outlet Valve"},/turf/simulated/floor{dir = 9; icon_state = "arrival"},/area/engineering/atmos) -"cqg" = (/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) -"cqh" = (/obj/machinery/atmospherics/valve/digital/open{name = "Mixed Air Inlet Valve"},/turf/simulated/floor{icon_state = "arrival"; dir = 5},/area/engineering/atmos) -"cqi" = (/turf/simulated/floor,/area/engineering/atmos) -"cqj" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engineering/atmos) -"cqk" = (/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) -"cql" = (/obj/machinery/atmospherics/valve/digital/open{name = "Oxygen Outlet Valve"},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/engineering/atmos) -"cqm" = (/obj/machinery/atmospherics/binary/pump{name = "O2 to Connector"},/turf/simulated/floor,/area/engineering/atmos) -"cqn" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{icon_state = "red"; dir = 9},/area/engineering/atmos) -"cqo" = (/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) -"cqp" = (/obj/machinery/atmospherics/valve/digital/open{name = "Nitrogen Outlet Valve"},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/engineering/atmos) -"cqq" = (/obj/machinery/atmospherics/binary/pump{name = "N2 to Connector"},/turf/simulated/floor,/area/engineering/atmos) -"cqr" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cqs" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/turf/simulated/floor,/area/engineering/atmos) -"cqt" = (/obj/structure/dispenser,/turf/simulated/floor,/area/engineering/atmos) -"cqu" = (/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},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/atmos) +"cqe" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"cqf" = (/obj/machinery/iv_drip,/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"cqg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"cqh" = (/obj/structure/closet/secure_closet/medical3,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cqi" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cqj" = (/obj/machinery/iv_drip,/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"cqk" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"cql" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"cqm" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"cqn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"cqo" = (/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},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"cqp" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/lime,/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"cqq" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cqr" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cqs" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cqt" = (/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/yellow{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cqu" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/camera/network/research{c_tag = "Xenobiology North"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "cqv" = (/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},/obj/structure/table/steel,/obj/item/device/flashlight/heavy,/turf/simulated/floor/plating,/area/storage/tech) -"cqw" = (/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"},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/atmos) -"cqx" = (/obj/machinery/newscaster{pixel_y = 30},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/atmos) -"cqy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cqz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) -"cqA" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) -"cqB" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/engineering/atmos) -"cqC" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Ports"},/turf/simulated/floor,/area/engineering/atmos) -"cqD" = (/obj/machinery/atmospherics/binary/pump/on{name = "Ports to Waste"},/turf/simulated/floor,/area/engineering/atmos) +"cqw" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cqx" = (/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/yellow{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cqy" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cqz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/starboard) +"cqA" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqB" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqC" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqD" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Air Tank Bypass Pump"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cqE" = (/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) -"cqF" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cqG" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"cqH" = (/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) +"cqF" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqG" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqH" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cqI" = (/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) -"cqJ" = (/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) -"cqK" = (/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) -"cqL" = (/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) +"cqJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqK" = (/obj/machinery/atmospherics/binary/pump/on{name = "Scrubber to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqL" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos) "cqM" = (/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) -"cqN" = (/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) -"cqO" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/engineering) -"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) +"cqN" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Supply"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqO" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cqP" = (/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/tiled,/area/engineering/atmos/monitoring) "cqQ" = (/obj/machinery/shield_capacitor,/turf/simulated/floor/plating,/area/engineering/storage) "cqR" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/engineering) -"cqS" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) -"cqT" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) -"cqU" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) -"cqV" = (/obj/machinery/iv_drip,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) -"cqW" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep) -"cqX" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/surgeryprep) -"cqY" = (/obj/machinery/iv_drip,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) -"cqZ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) -"cra" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) -"crb" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) +"cqS" = (/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/tiled,/area/engineering/atmos/monitoring) +"cqT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"cqU" = (/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/tiled,/area/engineering/engineering_monitoring) +"cqV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) +"cqW" = (/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/tiled,/area/engineering) +"cqX" = (/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/tiled,/area/engineering/workshop) +"cqY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cqZ" = (/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/tiled,/area/engineering/workshop) +"cra" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"crb" = (/obj/machinery/light/small{dir = 8},/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/freezer,/area/medical/surgery) "crc" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/medbay) -"crd" = (/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) -"cre" = (/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) -"crf" = (/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) +"crd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"cre" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"crf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/paleblue/full,/turf/simulated/floor/tiled,/area/medical/surgeryprep) "crg" = (/turf/simulated/wall/r_wall,/area/medical/virology) "crh" = (/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) "cri" = (/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) "crj" = (/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) "crk" = (/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) -"crl" = (/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) -"crm" = (/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) -"crn" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cro" = (/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) -"crp" = (/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) -"crq" = (/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) -"crr" = (/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) -"crs" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"crt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard) +"crl" = (/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},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgeryprep) +"crm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/paleblue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"crn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/medical/surgeryprep) +"cro" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"crp" = (/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},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/surgeryprep) +"crq" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"crr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"crs" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"crt" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cru" = (/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) -"crv" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"crw" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"crx" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Air Tank Bypass Pump"},/turf/simulated/floor,/area/engineering/atmos) -"cry" = (/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) -"crz" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos) -"crA" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) -"crB" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor,/area/engineering/atmos) -"crC" = (/obj/machinery/atmospherics/binary/pump/on{name = "Scrubber to Waste"},/turf/simulated/floor,/area/engineering/atmos) -"crD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor,/area/engineering/atmos) -"crE" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Supply"},/turf/simulated/floor,/area/engineering/atmos) -"crF" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor,/area/engineering/atmos) -"crG" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) -"crH" = (/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) -"crI" = (/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) -"crJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/atmos/monitoring) +"crv" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"crw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/bed/padded,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"crx" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{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},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cry" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"crz" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"crA" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"crB" = (/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/solar/starboard) +"crC" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) +"crD" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"crE" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"crF" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"crG" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos) +"crH" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "O2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"crI" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"crJ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) "crK" = (/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) -"crL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/engineering/engineering_monitoring) -"crM" = (/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) -"crN" = (/obj/machinery/computer/station_alert,/turf/simulated/floor,/area/engineering/engineering_monitoring) +"crL" = (/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/tiled,/area/engineering/atmos) +"crM" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) +"crN" = (/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/tiled,/area/engineering/atmos) "crO" = (/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) -"crP" = (/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) -"crQ" = (/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) -"crR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/workshop) -"crS" = (/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/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/tiled,/area/engineering/atmos) +"crQ" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"crR" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"crS" = (/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/tiled,/area/engineering/atmos/monitoring) "crT" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/plating,/area/engineering/storage) "crU" = (/turf/simulated/floor/plating,/area/engineering/storage) "crV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/engineering/storage) "crW" = (/obj/structure/closet/crate/solar,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/engineering/storage) "crX" = (/obj/structure/closet/wardrobe/grey,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/research_starboard) -"crY" = (/obj/machinery/light/small{dir = 8},/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) -"crZ" = (/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) -"csa" = (/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) -"csb" = (/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) -"csc" = (/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},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgeryprep) -"csd" = (/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) -"cse" = (/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) -"csf" = (/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) -"csg" = (/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},/obj/machinery/door/firedoor,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgeryprep) -"csh" = (/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) -"csi" = (/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) -"csj" = (/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) -"csk" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) +"crY" = (/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/tiled,/area/engineering/engineering_monitoring) +"crZ" = (/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/tiled,/area/engineering/engineering_monitoring) +"csa" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) +"csb" = (/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/tiled,/area/engineering) +"csc" = (/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/tiled,/area/engineering) +"csd" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) +"cse" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled,/area/engineering/workshop) +"csf" = (/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/tiled,/area/engineering/workshop) +"csg" = (/obj/structure/closet/secure_closet/engineering_electrical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/workshop) +"csh" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/tiled,/area/engineering/workshop) +"csi" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/workshop) +"csj" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"csk" = (/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/tiled/freezer,/area/medical/surgery) "csl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/medbay) "csm" = (/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) "csn" = (/turf/simulated/wall,/area/maintenance/medbay) "cso" = (/obj/structure/sign/biohazard,/turf/simulated/wall/r_wall,/area/medical/virology) -"csp" = (/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) -"csq" = (/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) -"csr" = (/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) -"css" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/bed/padded,/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) -"cst" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) -"csu" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"csv" = (/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) +"csp" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"csq" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/freezer,/area/medical/surgery) +"csr" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"css" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"cst" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/freezer,/area/medical/surgery2) +"csu" = (/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/tiled/freezer,/area/medical/surgery2) +"csv" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "csw" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) -"csx" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/starboard) -"csy" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/turf/simulated/floor,/area/engineering/atmos) -"csz" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"csA" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"csB" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) -"csC" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "O2 to Mixing"},/turf/simulated/floor,/area/engineering/atmos) -"csD" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor,/area/engineering/atmos) -"csE" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"csF" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"csG" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor,/area/engineering/atmos) -"csH" = (/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) -"csI" = (/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) -"csJ" = (/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) -"csK" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor,/area/engineering/atmos/monitoring) -"csL" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/atmos/monitoring) -"csM" = (/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) -"csN" = (/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) -"csO" = (/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) -"csP" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor,/area/engineering/engineering_monitoring) -"csQ" = (/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) -"csR" = (/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) -"csS" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering) +"csx" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"csy" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"csz" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"csA" = (/obj/item/roller,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"csB" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"csC" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"csD" = (/turf/simulated/floor/airless,/area/solar/starboard) +"csE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csF" = (/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/tiled,/area/engineering/atmos) +"csG" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csH" = (/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/tiled,/area/engineering/atmos) +"csI" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"csJ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csK" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"csL" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csM" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csN" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csP" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Supply to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csQ" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"csR" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csS" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/blue{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "csT" = (/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) -"csU" = (/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) -"csV" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor,/area/engineering/workshop) -"csW" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor,/area/engineering/workshop) -"csX" = (/obj/structure/closet/secure_closet/engineering_electrical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/workshop) -"csY" = (/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) +"csU" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos) +"csV" = (/obj/structure/disposalpipe/segment,/obj/machinery/pipedispenser/disposal,/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/engineering/atmos) +"csW" = (/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/tiled,/area/engineering/atmos/monitoring) +"csX" = (/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/tiled,/area/engineering/engineering_monitoring) +"csY" = (/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/tiled,/area/engineering) "csZ" = (/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) "cta" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/engineering/storage) "ctb" = (/obj/structure/closet/crate,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/obj/item/stack/material/phoron{amount = 25},/turf/simulated/floor/plating,/area/engineering/storage) "ctc" = (/obj/item/weapon/material/shard,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_port) -"ctd" = (/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) -"cte" = (/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) -"ctf" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) -"ctg" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery) +"ctd" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway North"; dir = 4},/turf/simulated/floor/tiled,/area/engineering) +"cte" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/steel_reinforced,/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/plastic{amount = 50},/obj/item/stack/material/plastic{amount = 50},/obj/item/stack/material/glass/phoronrglass{amount = 20},/turf/simulated/floor/tiled,/area/engineering/workshop) +"ctf" = (/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/steel_reinforced,/turf/simulated/floor/tiled,/area/engineering/workshop) +"ctg" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/steel_reinforced,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor/tiled,/area/engineering/workshop) "cth" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Pre-Op Prep Room Maintenance Access"; req_access = list(5)},/turf/simulated/floor/plating,/area/medical/surgeryprep) -"cti" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) -"ctj" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2) -"ctk" = (/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) -"ctl" = (/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) +"cti" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled,/area/engineering/workshop) +"ctj" = (/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/tiled,/area/engineering/workshop) +"ctk" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"ctl" = (/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "ctm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/medbay) -"ctn" = (/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) -"cto" = (/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) -"ctp" = (/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) -"ctq" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"ctr" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cts" = (/obj/item/roller,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"ctn" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cto" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 26},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"ctp" = (/obj/item/weapon/hand_labeler,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"ctq" = (/obj/machinery/disease2/incubator,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"ctr" = (/obj/machinery/smartfridge/secure/virology,/obj/structure/sign/deathsposal{pixel_y = 32},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cts" = (/obj/machinery/disease2/isolator,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "ctt" = (/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) -"ctu" = (/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) -"ctv" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"ctw" = (/turf/simulated/floor/plating/airless,/area/solar/starboard) -"ctx" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/atmos) -"cty" = (/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/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos) -"ctA" = (/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) -"ctB" = (/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) -"ctC" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"ctD" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) -"ctE" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Mixing"},/turf/simulated/floor,/area/engineering/atmos) -"ctF" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"ctG" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"ctH" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"ctI" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"ctJ" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Supply to Waste"},/turf/simulated/floor,/area/engineering/atmos) -"ctK" = (/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) -"ctL" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"ctM" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) -"ctN" = (/obj/structure/disposalpipe/segment,/obj/machinery/pipedispenser/disposal,/obj/structure/window/reinforced,/turf/simulated/floor,/area/engineering/atmos) +"ctu" = (/obj/machinery/light{dir = 1},/obj/machinery/computer/centrifuge,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 25},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"ctv" = (/obj/machinery/door/window/southright{dir = 1; name = "Virology Isolation Room One"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"ctw" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"ctx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cty" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/westright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"ctz" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"ctA" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"ctB" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syringes,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"ctC" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"ctD" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"ctE" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"ctF" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/starboard) +"ctG" = (/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/tiled,/area/engineering/atmos) +"ctH" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos) +"ctI" = (/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/tiled,/area/engineering/atmos) +"ctJ" = (/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/tiled,/area/engineering/atmos) +"ctK" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos) +"ctL" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"ctM" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"ctN" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) "ctO" = (/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) "ctP" = (/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) -"ctQ" = (/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) -"ctR" = (/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) -"ctS" = (/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) -"ctT" = (/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) +"ctQ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"ctR" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/engineering) +"ctS" = (/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/tiled,/area/engineering/atmos) +"ctT" = (/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/tiled,/area/engineering) "ctU" = (/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) -"ctV" = (/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/steel_reinforced,/turf/simulated/floor,/area/engineering/workshop) -"ctW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/steel_reinforced,/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/plastic{amount = 50},/obj/item/stack/material/plastic{amount = 50},/obj/item/stack/material/glass/phoronrglass{amount = 20},/turf/simulated/floor,/area/engineering/workshop) -"ctX" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/structure/table/steel_reinforced,/turf/simulated/floor,/area/engineering/workshop) -"ctY" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/steel_reinforced,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor,/area/engineering/workshop) -"ctZ" = (/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) +"ctV" = (/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/tiled,/area/engineering) +"ctW" = (/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/tiled,/area/engineering) +"ctX" = (/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/tiled,/area/engineering) +"ctY" = (/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/tiled,/area/engineering) +"ctZ" = (/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/tiled,/area/engineering/workshop) "cua" = (/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) "cub" = (/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) "cuc" = (/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) "cud" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/engineering) "cue" = (/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) -"cuf" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/breath,/obj/item/weapon/rig/ce/equipped,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief) +"cuf" = (/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/tiled,/area/engineering) "cug" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay) "cuh" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/cigbutt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay) "cui" = (/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) -"cuj" = (/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) -"cuk" = (/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) -"cul" = (/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) +"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/tiled,/area/engineering/workshop) +"cuk" = (/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/tiled,/area/engineering/workshop) +"cul" = (/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/tiled,/area/engineering/workshop) "cum" = (/turf/simulated/wall,/area/medical/virology) -"cun" = (/obj/item/weapon/hand_labeler,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cuo" = (/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) -"cup" = (/obj/machinery/smartfridge/secure/virology,/obj/structure/sign/deathsposal{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cuq" = (/obj/machinery/disease2/incubator,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cur" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/structure/flora/pottedplant/random,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) -"cus" = (/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) +"cun" = (/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/tiled,/area/engineering/workshop) +"cuo" = (/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/tiled,/area/engineering/storage) +"cup" = (/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},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/medbay) +"cuq" = (/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},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/medbay) +"cur" = (/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},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/medbay) +"cus" = (/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cut" = (/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) -"cuu" = (/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) -"cuv" = (/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) -"cuw" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cux" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/westright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cuy" = (/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) -"cuz" = (/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) -"cuA" = (/obj/structure/table/standard,/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) -"cuB" = (/obj/structure/table/standard,/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) -"cuC" = (/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) -"cuD" = (/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) -"cuE" = (/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) +"cuu" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"cuv" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cuw" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cux" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/white,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cuy" = (/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cuz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cuA" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cuB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cuC" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cuD" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cuE" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "cuF" = (/turf/space,/area/syndicate_station/southwest) -"cuG" = (/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) -"cuH" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/atmos) -"cuI" = (/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) -"cuJ" = (/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) -"cuK" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cuL" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) -"cuM" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/atmos) -"cuN" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cuO" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/atmos) -"cuP" = (/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) -"cuQ" = (/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) -"cuR" = (/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) -"cuS" = (/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/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) -"cuU" = (/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) -"cuV" = (/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) -"cuW" = (/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) -"cuX" = (/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) -"cuY" = (/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) -"cuZ" = (/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) -"cva" = (/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) -"cvb" = (/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) -"cvc" = (/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) +"cuG" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cuH" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cuI" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cuJ" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cuK" = (/obj/machinery/smartfridge/secure/extract,/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cuL" = (/obj/machinery/computer/operating{name = "Xenobiology Operating Computer"},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cuM" = (/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},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cuN" = (/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/airless,/area/solar/starboard) +"cuO" = (/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/airless,/area/solar/starboard) +"cuP" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/solar/starboard) +"cuQ" = (/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/airless,/area/solar/starboard) +"cuR" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/starboard) +"cuS" = (/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/airless,/area/solar/starboard) +"cuT" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cuU" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cuV" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cuW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cuX" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cuY" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cuZ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cva" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cvb" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cvc" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering) "cvd" = (/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/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage) "cve" = (/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) "cvf" = (/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) @@ -6509,239 +6509,239 @@ "cvi" = (/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) "cvj" = (/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) "cvk" = (/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) -"cvl" = (/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) -"cvm" = (/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) -"cvn" = (/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) +"cvl" = (/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/tiled,/area/engineering/atmos) +"cvm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering) +"cvn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled,/area/engineering) "cvo" = (/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) "cvp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/maintenance/medbay) "cvq" = (/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) -"cvr" = (/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) -"cvs" = (/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) -"cvt" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/medical/virology) -"cvu" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/white,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvv" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvw" = (/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvx" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvA" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cvB" = (/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) -"cvC" = (/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) -"cvD" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cvE" = (/obj/structure/table/standard,/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) -"cvF" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cvG" = (/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) -"cvH" = (/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/rnd/xenobiology) -"cvI" = (/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) -"cvJ" = (/obj/machinery/computer/operating{name = "Xenobiology Operating Computer"},/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/rnd/xenobiology) -"cvK" = (/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) -"cvL" = (/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) -"cvM" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cvN" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cvO" = (/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/starboard) -"cvP" = (/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/starboard) -"cvQ" = (/obj/machinery/light,/turf/simulated/floor,/area/engineering/atmos) -"cvR" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/engineering/atmos) -"cvS" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/atmos) -"cvT" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cvU" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cvV" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cvW" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/engineering/atmos) -"cvX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cvY" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor,/area/engineering/atmos) -"cvZ" = (/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) -"cwa" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engineering) -"cwb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/engineering) -"cwc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor,/area/engineering) -"cwd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/engineering) -"cwe" = (/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) -"cwf" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/engineering) -"cwg" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/workshop) -"cwh" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/workshop) -"cwi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/workshop) -"cwj" = (/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) +"cvr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/engineering) +"cvs" = (/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/tiled,/area/engineering) +"cvt" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering) +"cvu" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cvv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cvw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cvx" = (/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/tiled,/area/engineering/storage) +"cvy" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvz" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvA" = (/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},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvC" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvE" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/yellow,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvK" = (/obj/machinery/door/window/southright{dir = 4; name = "Primate Pen"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cvL" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"cvM" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cvN" = (/obj/structure/table/standard,/obj/item/stack/material/phoron{amount = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cvO" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cvP" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cvQ" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cvR" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cvS" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/solar/starboard) +"cvT" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cvU" = (/obj/machinery/atmospherics/pipe/cap/visible,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cvV" = (/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/tiled,/area/engineering/atmos) +"cvW" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cvX" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/engineering) +"cvY" = (/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/tiled,/area/engineering) +"cvZ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering) +"cwa" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/engineering/workshop) +"cwb" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/tiled,/area/engineering/workshop) +"cwc" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 3},/turf/simulated/floor/tiled,/area/engineering/workshop) +"cwd" = (/obj/machinery/atmospherics/pipe/tank/oxygen{dir = 2; volume = 3200},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cwe" = (/obj/machinery/atmospherics/pipe/tank/phoron{dir = 2; volume = 3200},/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cwf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cwg" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cwh" = (/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/tiled,/area/maintenance/incinerator) +"cwi" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cwj" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/maintenance/incinerator) "cwk" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage) "cwl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage) "cwm" = (/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) "cwn" = (/turf/simulated/wall,/area/maintenance/incinerator) "cwo" = (/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) "cwp" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/medbay) -"cwq" = (/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) -"cwr" = (/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},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cws" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwt" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cwv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cww" = (/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) -"cwx" = (/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) -"cwy" = (/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) -"cwz" = (/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) -"cwA" = (/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) -"cwB" = (/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) -"cwC" = (/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) -"cwD" = (/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) -"cwE" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/xenobiology) -"cwF" = (/obj/structure/table/standard,/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) -"cwG" = (/obj/structure/table/standard,/obj/item/stack/material/phoron{amount = 5},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cwH" = (/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) -"cwI" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/rnd/xenobiology) -"cwJ" = (/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) -"cwK" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/starboard) +"cwq" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/yellow,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/medical/virology) +"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},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/virology) +"cws" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cwt" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled,/area/medical/virology) +"cwu" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cwv" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cww" = (/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/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cwx" = (/obj/item/weapon/storage/fancy/vials,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cwy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cwz" = (/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/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cwA" = (/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},/obj/effect/floor_decal/industrial/warning/full,/turf/simulated/floor/plating,/area/medical/virology) +"cwB" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cwC" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/medbay{c_tag = "Virology Starboard"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cwD" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/medical/virology) +"cwE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cwF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cwG" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cwH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cwI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -7; pixel_y = -32; req_access = newlist()},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 7; pixel_y = -32},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cwJ" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cwK" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/rnd/xenobiology) "cwL" = (/turf/simulated/wall,/area/engineering/atmos) -"cwM" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/engineering/atmos) -"cwN" = (/obj/machinery/atmospherics/pipe/cap/visible,/turf/simulated/floor,/area/engineering/atmos) -"cwO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/atmos) -"cwP" = (/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) +"cwM" = (/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/yellow{dir = 4},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cwN" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cwO" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Waste"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cwP" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "cwQ" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) "cwR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) -"cwS" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellow"},/area/engineering) -"cwT" = (/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) -"cwU" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/engineering) -"cwV" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/engineering/workshop) -"cwW" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor,/area/engineering/workshop) -"cwX" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 3},/turf/simulated/floor,/area/engineering/workshop) +"cwS" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cwT" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cwU" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cwV" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cwW" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cwX" = (/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/tiled,/area/engineering/atmos) "cwY" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage) "cwZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage) "cxa" = (/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/engineering/storage) "cxb" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engineering/storage) "cxc" = (/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/remains/robot,/turf/simulated/floor/plating,/area/maintenance/engineering) "cxd" = (/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) -"cxe" = (/obj/machinery/atmospherics/pipe/tank/phoron{dir = 2; volume = 3200},/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cxf" = (/obj/machinery/atmospherics/pipe/tank/oxygen{dir = 2; volume = 3200},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cxg" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cxh" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cxi" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cxj" = (/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{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cxk" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cxe" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cxf" = (/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/tiled,/area/engineering/atmos/storage) +"cxg" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cxh" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cxi" = (/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/tiled,/area/engineering) +"cxj" = (/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/obj/structure/table/steel,/obj/item/device/flashlight/heavy,/obj/item/device/flashlight/heavy,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cxk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/workshop) "cxl" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/binary/pump/on{dir = 2; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/medbay) -"cxm" = (/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) -"cxn" = (/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) -"cxo" = (/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) -"cxp" = (/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) -"cxq" = (/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) -"cxr" = (/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) -"cxs" = (/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},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cxt" = (/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},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cxu" = (/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},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cxv" = (/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) -"cxw" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/medical/virology) -"cxx" = (/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) -"cxy" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/medical/virology) -"cxz" = (/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) +"cxm" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cxn" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cxo" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cxp" = (/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cxq" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cxr" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cxs" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cxt" = (/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},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/medbay) +"cxu" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/medbay) +"cxv" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled,/area/medical/virology) +"cxw" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/closet/secure_closet/personal/patient,/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/medical/virology) +"cxx" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cxy" = (/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},/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled,/area/medical/virology) +"cxz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cxA" = (/obj/structure/extinguisher_cabinet,/turf/simulated/wall/r_wall,/area/medical/virology) -"cxB" = (/obj/structure/table/standard,/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) +"cxB" = (/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cxC" = (/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 = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/rnd/xenobiology) -"cxD" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cxE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cxF" = (/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) -"cxG" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cxH" = (/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) -"cxI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -7; pixel_y = -32; req_access = newlist()},/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) -"cxJ" = (/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) -"cxK" = (/obj/structure/table/standard,/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) -"cxL" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos) -"cxM" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/turf/simulated/floor,/area/engineering/atmos) -"cxN" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Waste"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cxO" = (/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor,/area/engineering/atmos) -"cxP" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cxQ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor,/area/engineering/atmos) -"cxR" = (/obj/machinery/atmospherics/valve/digital{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cxS" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cxT" = (/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) -"cxU" = (/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) -"cxV" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos/storage) -"cxW" = (/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) -"cxX" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor,/area/engineering/atmos/storage) +"cxD" = (/obj/machinery/computer/med_data/laptop,/obj/structure/disposalpipe/segment,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cxE" = (/obj/machinery/door/window/southright{name = "Virology Isolation Room Two"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cxF" = (/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/yellow,/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cxG" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/westright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cxH" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cxI" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cxJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/research{c_tag = "Xenobiology Southeast"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cxK" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxL" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxM" = (/obj/machinery/atmospherics/omni/filter{use_power = 1; tag_east = 1; tag_north = 3; tag_south = 6; tag_west = 2},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxN" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxO" = (/obj/machinery/atmospherics/omni/filter{use_power = 1; tag_east = 1; tag_north = 4; tag_south = 7; tag_west = 2},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxP" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxQ" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxR" = (/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/tiled,/area/engineering/atmos) +"cxS" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxT" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxU" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxV" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cxW" = (/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/tiled,/area/engineering/atmos) +"cxX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) "cxY" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) -"cxZ" = (/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) +"cxZ" = (/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},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/atmos) "cya" = (/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) -"cyb" = (/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},/obj/structure/table/steel,/obj/item/device/flashlight/heavy,/turf/simulated/floor,/area/engineering/atmos) -"cyc" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/workshop) -"cyd" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/engineering/workshop) +"cyb" = (/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cyc" = (/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/tiled,/area/engineering/atmos/storage) +"cyd" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/engineering/atmos/storage) "cye" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage) "cyf" = (/obj/structure/dispenser{oxygentanks = 0},/obj/machinery/light,/turf/simulated/floor/plating,/area/engineering/storage) -"cyg" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cyh" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cyi" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cyj" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cyk" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cyl" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cym" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/medbay) -"cyn" = (/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},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/medbay) -"cyo" = (/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) -"cyp" = (/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) -"cyq" = (/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) -"cyr" = (/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) -"cys" = (/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/virology) -"cyt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cyu" = (/obj/machinery/computer/med_data/laptop,/obj/structure/disposalpipe/segment,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cyg" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/engineering) +"cyh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering) +"cyi" = (/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},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cyj" = (/obj/structure/bed/chair,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/tiled,/area/engineering/workshop) +"cyk" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cyl" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cym" = (/obj/machinery/atmospherics/trinary/mixer,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cyn" = (/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},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cyo" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cyp" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{pixel_x = 32},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/warning_stripes,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cyq" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cyr" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cys" = (/obj/item/device/antibody_scanner,/obj/machinery/requests_console{department = "Virology"; name = "Virology Requests Console"; pixel_x = -32},/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cyt" = (/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,/obj/structure/table/glass,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cyu" = (/obj/item/roller,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cyv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/virology) "cyw" = (/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) -"cyx" = (/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) +"cyx" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) "cyy" = (/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) "cyz" = (/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) -"cyA" = (/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) -"cyB" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/westright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cyC" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cyD" = (/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) -"cyE" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/research{c_tag = "Xenobiology Southeast"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cyA" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cyB" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cyC" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"cyD" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Transit to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cyE" = (/obj/machinery/atmospherics/binary/passive_gate{name = "Waste to Space"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cyF" = (/turf/space,/area/skipjack_station/southeast_solars) -"cyG" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"cyH" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cyI" = (/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) -"cyJ" = (/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) -"cyK" = (/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) -"cyL" = (/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) -"cyM" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cyN" = (/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) -"cyO" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/engineering/atmos) -"cyP" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor,/area/engineering/atmos) -"cyQ" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor,/area/engineering/atmos) -"cyR" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cyS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"cyT" = (/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) -"cyU" = (/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) -"cyV" = (/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) -"cyW" = (/turf/simulated/floor,/area/engineering/atmos/storage) -"cyX" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor,/area/engineering/atmos/storage) +"cyG" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cyH" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cyI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cyJ" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cyK" = (/obj/machinery/space_heater,/obj/machinery/light/small,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cyL" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/electrical,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cyM" = (/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cyN" = (/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},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cyO" = (/obj/machinery/light,/obj/item/weapon/wrench,/obj/item/device/flashlight,/obj/machinery/cell_charger,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cyP" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/workshop) +"cyQ" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cyR" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cyS" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cyT" = (/obj/machinery/atmospherics/tvalve/digital/bypass{dir = 1; icon_state = "map_tvalve0"; state = 0},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"cyU" = (/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/pipe/manifold/visible{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/maintenance/medbay) +"cyV" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/maintenance/medbay) +"cyW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cyX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cyY" = (/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) -"cyZ" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/engineering) -"cza" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/engineering) -"czb" = (/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},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/workshop) -"czc" = (/obj/structure/bed/chair,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engineering/workshop) -"czd" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor,/area/engineering/workshop) -"cze" = (/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor,/area/engineering/workshop) -"czf" = (/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},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"czg" = (/obj/machinery/atmospherics/trinary/mixer,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"czh" = (/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"czi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{pixel_x = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cyZ" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"cza" = (/obj/machinery/computer/diseasesplicer,/obj/machinery/light,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"czb" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/obj/item/weapon/virusdish/random,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"czc" = (/obj/machinery/disease2/diseaseanalyser,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"czd" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cze" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"czf" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"czg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 9},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"czh" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"czi" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -24},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) "czj" = (/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)},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/maintenance/medbay) -"czk" = (/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) -"czl" = (/obj/item/device/antibody_scanner,/obj/machinery/requests_console{department = "Virology"; name = "Virology Requests Console"; pixel_x = -32},/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"czm" = (/obj/structure/bed/chair/office/dark,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"czn" = (/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,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"czk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"czl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"czm" = (/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 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"czn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "czo" = (/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) "czp" = (/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) -"czq" = (/obj/item/roller,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"czr" = (/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) -"czs" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"czt" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"czu" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"czq" = (/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"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) +"czr" = (/obj/structure/disposalpipe/junction{dir = 8},/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"czs" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"czt" = (/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/tiled{icon_state = "white"},/area/rnd/xenobiology) +"czu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled{icon_state = "white"},/area/rnd/xenobiology) "czv" = (/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) -"czw" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Transit to Waste"},/turf/simulated/floor,/area/engineering/atmos) -"czx" = (/obj/machinery/atmospherics/binary/passive_gate{name = "Waste to Space"},/turf/simulated/floor,/area/engineering/atmos) -"czy" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/atmos) -"czz" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/engineering/atmos) -"czA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/atmos) +"czw" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) +"czx" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"czy" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"czz" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"czA" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "czB" = (/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) -"czC" = (/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) -"czD" = (/obj/machinery/space_heater,/turf/simulated/floor,/area/engineering/atmos/storage) +"czC" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Mixing to Port"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"czD" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) "czE" = (/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) -"czF" = (/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/workshop) -"czG" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/electrical,/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/workshop) -"czH" = (/obj/machinery/light,/obj/item/weapon/wrench,/obj/item/device/flashlight,/obj/machinery/cell_charger,/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/workshop) -"czI" = (/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},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/workshop) -"czJ" = (/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) +"czF" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"czG" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"czH" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"czI" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"czJ" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "czK" = (/obj/structure/bed/chair{dir = 4},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "czL" = (/obj/structure/table/steel,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "czM" = (/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) @@ -6749,56 +6749,56 @@ "czO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(11,24)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "czP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/engineering) "czQ" = (/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) -"czR" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"czS" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"czT" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) -"czU" = (/obj/machinery/atmospherics/tvalve/digital/bypass{dir = 1; icon_state = "map_tvalve0"; state = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"czR" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"czS" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"czT" = (/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)},/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/tiled,/area/engineering) +"czU" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/maintenance/incinerator) "czV" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator) "czW" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator) -"czX" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/medbay) -"czY" = (/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/pipe/manifold/visible{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/medbay) -"czZ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cAa" = (/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) -"cAb" = (/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) -"cAc" = (/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) -"cAd" = (/obj/machinery/computer/diseasesplicer,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cAe" = (/obj/machinery/disease2/diseaseanalyser,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cAf" = (/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) -"cAg" = (/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) -"cAh" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cAi" = (/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) -"cAj" = (/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) +"czX" = (/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,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"czY" = (/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)},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/maintenance/incinerator) +"czZ" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "virology_pump"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/maintenance/medbay) +"cAa" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "virology_pump"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/medbay) +"cAb" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cAc" = (/obj/machinery/light,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cAd" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cAe" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cAf" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cAg" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cAh" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/airless,/area/rnd/xenobiology) +"cAi" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cAj" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) "cAk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/rnd/xenobiology) "cAl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/rnd/xenobiology) -"cAm" = (/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) -"cAn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cAo" = (/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) -"cAp" = (/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) -"cAq" = (/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 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cAr" = (/obj/structure/disposalpipe/junction{dir = 8},/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 = "white"},/area/rnd/xenobiology) -"cAs" = (/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"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) -"cAt" = (/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{icon_state = "white"},/area/rnd/xenobiology) -"cAu" = (/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{icon_state = "white"},/area/rnd/xenobiology) -"cAv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology) +"cAm" = (/obj/machinery/door/window/northright{name = "Containment Pen"; req_access = list(47)},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cAn" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cAo" = (/obj/machinery/light,/obj/structure/reagent_dispensers/watertank,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cAp" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cAq" = (/obj/machinery/light,/obj/structure/closet,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cAr" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cAs" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAt" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Phoron to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAu" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAv" = (/obj/machinery/atmospherics/binary/pump{name = "Mixing to Mix Tank"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cAw" = (/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) "cAx" = (/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) -"cAy" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor,/area/engineering/atmos) -"cAz" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/engineering/atmos) -"cAA" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cAB" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor,/area/engineering/atmos) -"cAC" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Mixing to Port"},/turf/simulated/floor,/area/engineering/atmos) -"cAD" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/turf/simulated/floor,/area/engineering/atmos) -"cAE" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor,/area/engineering/atmos) -"cAF" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cAG" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cAH" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cAI" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cAJ" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/engineering/atmos) -"cAK" = (/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) -"cAL" = (/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) +"cAy" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix Tank to Port"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAz" = (/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/tiled,/area/engineering/atmos) +"cAA" = (/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},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAC" = (/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,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAD" = (/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},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAE" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAF" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAG" = (/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},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cAH" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cAI" = (/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},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos/storage) +"cAJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering) +"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/tiled,/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/tiled,/area/engineering) "cAM" = (/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) "cAN" = (/turf/simulated/wall/r_wall,/area/engineering) -"cAO" = (/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)},/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) +"cAO" = (/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/tiled,/area/engineering) "cAP" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cAQ" = (/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) "cAR" = (/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) @@ -6806,59 +6806,59 @@ "cAT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering) "cAU" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator) "cAV" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cAW" = (/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) -"cAX" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 2; icon_state = "floorgrimecaution"},/area/maintenance/incinerator) -"cAY" = (/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)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 1; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator) +"cAW" = (/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/tiled,/area/engineering) +"cAX" = (/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/tiled,/area/engineering) +"cAY" = (/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/tiled,/area/engineering) "cAZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator) "cBa" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator) -"cBb" = (/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) -"cBc" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "virology_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/medbay) -"cBd" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cBb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering) +"cBc" = (/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/tiled,/area/engineering) +"cBd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/engineering) "cBe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology) "cBf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology) "cBg" = (/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) -"cBh" = (/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) -"cBi" = (/obj/machinery/light,/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) -"cBj" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet,/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) +"cBh" = (/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/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cBi" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cBj" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cBk" = (/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) -"cBl" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor{dir = 3; icon_state = "whitered"},/area/medical/virology) -"cBm" = (/obj/structure/bed/padded,/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) -"cBn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless,/area/rnd/xenobiology) -"cBo" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology) -"cBp" = (/obj/machinery/door/window/northright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) -"cBq" = (/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) -"cBr" = (/obj/machinery/light,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) -"cBs" = (/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) -"cBt" = (/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) -"cBu" = (/obj/machinery/light,/obj/structure/closet,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) -"cBv" = (/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) +"cBl" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"cBm" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/airless,/area/rnd/xenobiology) +"cBn" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"cBo" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cBp" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cBq" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cBr" = (/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 = 'icons/turf/floors.dmi'; icon_state = "solarpanel"},/area/solar/starboard) +"cBs" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBt" = (/obj/machinery/atmospherics/valve/digital{name = "CO2 Outlet Valve"},/obj/effect/floor_decal/corner/brown/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBu" = (/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,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBv" = (/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Southwest"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/corner/orange/full,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos) "cBw" = (/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) -"cBx" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Mixing"},/turf/simulated/floor,/area/engineering/atmos) -"cBy" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Phoron to Mixing"},/turf/simulated/floor,/area/engineering/atmos) -"cBz" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/turf/simulated/floor,/area/engineering/atmos) -"cBA" = (/obj/machinery/atmospherics/binary/pump{name = "Mixing to Mix Tank"},/turf/simulated/floor,/area/engineering/atmos) -"cBB" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix Tank to Port"},/turf/simulated/floor,/area/engineering/atmos) -"cBC" = (/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) -"cBD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/atmos) -"cBE" = (/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) -"cBF" = (/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) -"cBG" = (/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) -"cBH" = (/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) -"cBI" = (/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) -"cBJ" = (/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) -"cBK" = (/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) -"cBL" = (/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) +"cBx" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBy" = (/obj/machinery/atmospherics/valve/digital{name = "Phoron Outlet Valve"},/obj/effect/floor_decal/corner/orange/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBz" = (/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,/obj/effect/floor_decal/corner/orange{dir = 10},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBA" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/corner/red/diagonal,/obj/effect/floor_decal/corner/white{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBB" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Phoron to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBC" = (/obj/machinery/atmospherics/valve/digital{name = "N2O Outlet Valve"},/obj/effect/floor_decal/corner/red,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBD" = (/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,/obj/effect/floor_decal/corner/red,/obj/effect/floor_decal/corner/white{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBE" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBF" = (/obj/machinery/atmospherics/valve/digital{name = "Gas Mix Inlet Valve"},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics South"; dir = 1},/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBG" = (/obj/machinery/atmospherics/valve/digital{name = "Gas Mix Outlet Valve"},/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBH" = (/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/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBJ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix Tank to Connector"},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cBK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering) +"cBL" = (/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/tiled,/area/engineering) "cBM" = (/obj/machinery/door/airlock/maintenance{req_access = list(10,12)},/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) -"cBN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering) -"cBO" = (/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) -"cBP" = (/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) -"cBQ" = (/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) -"cBR" = (/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) -"cBS" = (/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) -"cBT" = (/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) -"cBU" = (/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) -"cBV" = (/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) -"cBW" = (/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) +"cBN" = (/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway Southwest"; dir = 1},/turf/simulated/floor/tiled,/area/engineering) +"cBO" = (/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway Southeast"; dir = 1},/turf/simulated/floor/tiled,/area/engineering) +"cBP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/engineering) +"cBQ" = (/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/tiled,/area/engineering) +"cBR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering) +"cBS" = (/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) +"cBT" = (/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,/area/maintenance/engi_shuttle) +"cBU" = (/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,/area/maintenance/engi_shuttle) +"cBV" = (/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,/area/maintenance/engi_shuttle) +"cBW" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/airless,/area/space) "cBX" = (/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(11,24)},/turf/simulated/floor/plating,/area/engineering) "cBY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cBZ" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) @@ -6869,81 +6869,81 @@ "cCe" = (/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) "cCf" = (/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) "cCg" = (/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) -"cCh" = (/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) -"cCi" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/cups,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cCj" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cCk" = (/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) +"cCh" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/airless,/area/space) +"cCi" = (/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/airless,/area/maintenance/medbay) +"cCj" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/airless,/area/maintenance/medbay) +"cCk" = (/turf/simulated/floor/airless,/area/maintenance/medbay) "cCl" = (/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) "cCm" = (/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) "cCn" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/medical/virology) "cCo" = (/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) "cCp" = (/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) -"cCq" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating/airless,/area/rnd/xenobiology) -"cCr" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "hydrofloor"},/area/rnd/xenobiology) -"cCs" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cCq" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cCr" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"cCs" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cCt" = (/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) "cCu" = (/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) -"cCv" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cCv" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) "cCw" = (/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) "cCx" = (/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) -"cCy" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/engine,/area/rnd/xenobiology) +"cCy" = (/obj/structure/table/standard,/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/tiled{icon_state = "white"},/area/medical/virology) "cCz" = (/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) -"cCA" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 10; icon_state = "yellow"},/area/engineering/atmos) -"cCB" = (/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) -"cCC" = (/obj/machinery/atmospherics/valve/digital{name = "CO2 Outlet Valve"},/turf/simulated/floor{dir = 6; icon_state = "yellow"},/area/engineering/atmos) -"cCD" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Connector"},/turf/simulated/floor,/area/engineering/atmos) -"cCE" = (/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) -"cCF" = (/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) -"cCG" = (/obj/machinery/atmospherics/valve/digital{name = "Phoron Outlet Valve"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engineering/atmos) -"cCH" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Phoron to Connector"},/turf/simulated/floor,/area/engineering/atmos) -"cCI" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 10; icon_state = "escape"},/area/engineering/atmos) -"cCJ" = (/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) -"cCK" = (/obj/machinery/atmospherics/valve/digital{name = "N2O Outlet Valve"},/turf/simulated/floor{icon_state = "escape"; dir = 6},/area/engineering/atmos) -"cCL" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Connector"},/turf/simulated/floor,/area/engineering/atmos) -"cCM" = (/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) -"cCN" = (/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) -"cCO" = (/obj/machinery/atmospherics/valve/digital{name = "Gas Mix Outlet Valve"},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/engineering/atmos) -"cCP" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Mix Tank to Connector"},/obj/machinery/light,/turf/simulated/floor,/area/engineering/atmos) -"cCQ" = (/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) +"cCA" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/airless,/area/medical/virology) +"cCB" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/airless,/area/medical/virology) +"cCC" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/airless,/area/medical/virology) +"cCD" = (/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/airless,/area/medical/virology) +"cCE" = (/obj/machinery/clonepod,/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cCF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cCG" = (/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/airless,/area/engineering/atmos) +"cCH" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cCI" = (/obj/machinery/light{dir = 1},/obj/effect/landmark{name = "JoinLateCyborg"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cCJ" = (/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cCK" = (/obj/structure/bed/chair,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cCL" = (/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/tiled,/area/engineering/engine_smes) +"cCM" = (/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/tiled,/area/engineering/engine_monitoring) +"cCN" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_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/tiled,/area/engineering/engine_airlock) +"cCO" = (/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/airless,/area/maintenance/incinerator) +"cCP" = (/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/airless,/area/space) +"cCQ" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/airless,/area/space) "cCR" = (/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) "cCS" = (/turf/simulated/wall/r_wall,/area/engineering/drone_fabrication) -"cCT" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering) -"cCU" = (/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) -"cCV" = (/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway Southwest"; dir = 1},/turf/simulated/floor,/area/engineering) -"cCW" = (/obj/machinery/camera/network/engineering{c_tag = "Engineering Hallway Southeast"; dir = 1},/turf/simulated/floor,/area/engineering) -"cCX" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering) -"cCY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering) -"cCZ" = (/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) +"cCT" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cCU" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cCV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cCW" = (/obj/machinery/washing_machine,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cCX" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cCY" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cCZ" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon = 'icons/turf/floors.dmi'; icon_state = "solarpanel"},/area/solar/starboard) "cDa" = (/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) -"cDb" = (/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{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle) -"cDc" = (/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 = "warnplate"},/area/maintenance/engi_shuttle) -"cDd" = (/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) -"cDe" = (/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) +"cDb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/airless,/area/space) +"cDc" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDd" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cDe" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/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},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/engine_smes) "cDf" = (/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) -"cDg" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/bar) +"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/tiled,/area/engineering/engine_smes) "cDh" = (/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor/plating,/area/maintenance/arrivals) "cDi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/arrivals) "cDj" = (/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) "cDk" = (/turf/simulated/floor/plating,/area/maintenance/incinerator) "cDl" = (/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) -"cDm" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless,/area/space) -"cDn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"cDo" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless,/area/maintenance/medbay) -"cDp" = (/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) -"cDq" = (/turf/simulated/floor/plating/airless,/area/maintenance/medbay) -"cDr" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cDs" = (/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) -"cDt" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cDu" = (/obj/structure/table/standard,/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) -"cDv" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"cDm" = (/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/tiled,/area/engineering/engine_smes) +"cDn" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cDo" = (/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/tiled,/area/engineering/engine_monitoring) +"cDp" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cDq" = (/obj/structure/closet/radiation,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cDr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cDs" = (/obj/machinery/alarm{pixel_y = 22},/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/tiled,/area/engineering/engine_airlock) +"cDt" = (/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/tiled,/area/engineering/engine_airlock) +"cDu" = (/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/tiled,/area/engineering/engine_airlock) +"cDv" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cDw" = (/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) -"cDx" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/medical/virology) -"cDy" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating/airless,/area/medical/virology) -"cDz" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating/airless,/area/medical/virology) -"cDA" = (/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) -"cDB" = (/obj/machinery/clonepod,/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cDC" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cDD" = (/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) +"cDx" = (/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,/area/maintenance/engi_shuttle) +"cDy" = (/obj/machinery/atmospherics/pipe/tank/air,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cDz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cDA" = (/obj/machinery/atmospherics/pipe/tank/air,/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cDB" = (/turf/simulated/floor/reinforced,/area/maintenance/incinerator) +"cDC" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "map_injector"; id = "air_in"; use_power = 1},/obj/machinery/sparker{id = "Incinerator"; pixel_x = -20},/turf/simulated/floor/reinforced,/area/maintenance/incinerator) +"cDD" = (/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/reinforced,/area/maintenance/incinerator) "cDE" = (/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) "cDF" = (/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) "cDG" = (/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) @@ -6956,22 +6956,22 @@ "cDN" = (/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) "cDO" = (/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) "cDP" = (/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) -"cDQ" = (/obj/machinery/cryopod/robot/right,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cDR" = (/obj/machinery/light{dir = 1},/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/drone_fabrication) -"cDS" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/drone_fabrication) -"cDT" = (/obj/structure/bed/chair,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/drone_fabrication) -"cDU" = (/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) +"cDQ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cDR" = (/obj/structure/table/standard,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cDS" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cDT" = (/obj/machinery/computer/arcade,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cDU" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) "cDV" = (/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) "cDW" = (/obj/machinery/recharge_station,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cDX" = (/turf/simulated/wall/r_wall,/area/engineering/engine_smes) -"cDY" = (/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) +"cDY" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/starboard) "cDZ" = (/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) "cEa" = (/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) "cEb" = (/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) "cEc" = (/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) -"cEd" = (/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) +"cEd" = (/obj/effect/decal/remains/robot,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cEe" = (/turf/simulated/wall/r_wall,/area/engineering/engine_airlock) -"cEf" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_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_airlock) +"cEf" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cEg" = (/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) "cEh" = (/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) "cEi" = (/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) @@ -6981,16 +6981,16 @@ "cEm" = (/obj/effect/decal/cleanable/spiderling_remains,/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/bar) "cEn" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/maintenance/bar) "cEo" = (/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) -"cEp" = (/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) -"cEq" = (/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) -"cEr" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/space) -"cEs" = (/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) -"cEt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cEu" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cEv" = (/obj/machinery/washing_machine,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cEw" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cEx" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cEy" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating/airless,/area/space) +"cEp" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cEq" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = -10},/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cEr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cEs" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cEt" = (/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/tiled,/area/engineering/engine_monitoring) +"cEu" = (/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cEv" = (/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/tiled,/area/engineering/engine_monitoring) +"cEw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cEx" = (/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/item/weapon/book/manual/supermatter_engine,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/engine_airlock) +"cEy" = (/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/tiled,/area/engineering/engine_airlock) "cEz" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/space,/area/space) "cEA" = (/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) "cEB" = (/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) @@ -6998,88 +6998,88 @@ "cED" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space) "cEE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cEF" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cEG" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) +"cEG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/engineering/engine_airlock) "cEH" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cEI" = (/obj/machinery/computer/security/engineering{name = "Drone Monitoring Cameras"; network = list("Engineering")},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cEJ" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) +"cEJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cEK" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cEL" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/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},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/engine_smes) -"cEM" = (/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) -"cEN" = (/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) +"cEL" = (/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,/area/maintenance/engi_shuttle) +"cEM" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cEN" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) "cEO" = (/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) -"cEP" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -2; pixel_y = 5},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cEQ" = (/obj/structure/table/standard,/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) -"cER" = (/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) -"cES" = (/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) -"cET" = (/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) -"cEU" = (/obj/machinery/alarm{pixel_y = 22},/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) -"cEV" = (/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) -"cEW" = (/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) -"cEX" = (/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) -"cEY" = (/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) +"cEP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 4},/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/engineering) +"cEQ" = (/obj/machinery/door/blast/regular{dir = 4; id = "disvent"; name = "Incinerator Vent"},/turf/simulated/floor/reinforced,/area/maintenance/incinerator) +"cER" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cES" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cET" = (/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/tiled{icon_state = "white"},/area/medical/virology) +"cEU" = (/obj/machinery/door/blast/regular{desc = "By gods, release the hounds!"; id = "xenobioout6"; name = "Containment Release"},/turf/simulated/floor/reinforced,/area/rnd/xenobiology) +"cEV" = (/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/reinforced{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cEW" = (/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/reinforced{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cEX" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/reinforced{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cEY" = (/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/reinforced{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) "cEZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) -"cFa" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "map_injector"; id = "air_in"; use_power = 1},/obj/machinery/sparker{id = "Incinerator"; pixel_x = -20},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"cFb" = (/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"cFc" = (/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) -"cFd" = (/obj/structure/bed/padded,/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) -"cFe" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cFf" = (/obj/structure/table/standard,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cFg" = (/obj/machinery/computer/arcade,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cFh" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cFi" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard) +"cFa" = (/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/reinforced{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cFb" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "tox_sensor"},/turf/simulated/floor/reinforced{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cFc" = (/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/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFd" = (/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/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFe" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFf" = (/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/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFg" = (/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/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFh" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFi" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cFj" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/engineering/atmos) "cFk" = (/obj/structure/table/rack{dir = 1},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/research_port) -"cFl" = (/obj/effect/decal/remains/robot,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) +"cFl" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/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"},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/engine_smes) "cFm" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cFn" = (/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cFo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) +"cFo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/engine_smes) "cFp" = (/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) "cFq" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cFr" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/engine_smes) -"cFs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/engine_smes) -"cFt" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = -10},/turf/simulated/floor,/area/engineering/engine_smes) -"cFu" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cFv" = (/turf/simulated/floor,/area/engineering/engine_monitoring) -"cFw" = (/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) -"cFx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cFy" = (/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) -"cFz" = (/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/item/weapon/book/manual/supermatter_engine,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/engine_airlock) -"cFA" = (/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) -"cFB" = (/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) -"cFC" = (/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) -"cFD" = (/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) +"cFr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cFs" = (/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/tiled,/area/engineering/engine_monitoring) +"cFt" = (/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/tiled,/area/engineering/engine_monitoring) +"cFu" = (/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/tiled,/area/engineering/engine_monitoring) +"cFv" = (/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/tiled,/area/engineering/engine_monitoring) +"cFw" = (/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/tiled,/area/engineering/engine_monitoring) +"cFx" = (/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/tiled,/area/engineering/engine_monitoring) +"cFy" = (/obj/machinery/atmospherics/valve,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cFz" = (/obj/machinery/atmospherics/binary/passive_gate,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cFA" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cFB" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled{icon_state = "white"},/area/medical/virology) +"cFC" = (/turf/simulated/floor/airless,/area/rnd/xenobiology) +"cFD" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/solar/starboard) "cFE" = (/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) -"cFF" = (/obj/machinery/door/blast/regular{dir = 4; id = "disvent"; name = "Incinerator Vent"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) -"cFG" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cFH" = (/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) -"cFI" = (/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) -"cFJ" = (/obj/machinery/door/blast/regular{desc = "By gods, release the hounds!"; id = "xenobioout6"; name = "Containment Release"},/turf/simulated/floor/engine,/area/rnd/xenobiology) -"cFK" = (/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) -"cFL" = (/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) -"cFM" = (/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) -"cFN" = (/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) -"cFO" = (/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) -"cFP" = (/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) -"cFQ" = (/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) -"cFR" = (/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) -"cFS" = (/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) -"cFT" = (/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) -"cFU" = (/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) -"cFV" = (/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) +"cFF" = (/turf/simulated/floor/reinforced{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cFG" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/reinforced{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cFH" = (/turf/simulated/floor/reinforced{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cFI" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/reinforced{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cFJ" = (/turf/simulated/floor/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFK" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller,/turf/simulated/floor/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFL" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cFM" = (/obj/effect/landmark{name = "JoinLateCyborg"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cFN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cFO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/network/engine{c_tag = "Engineering SMES"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cFP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cFQ" = (/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/tiled,/area/engineering/engine_monitoring) +"cFR" = (/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/tiled,/area/engineering/engine_monitoring) +"cFS" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cFT" = (/obj/structure/table/reinforced,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/tiled,/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)"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/plating,/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)"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_airlock) "cFW" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cFX" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/drone_fabrication) +"cFX" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/shuttle/constructionsite/station) "cFY" = (/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) "cFZ" = (/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) "cGa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_smes) -"cGb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/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"},/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/engine_smes) -"cGc" = (/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) -"cGd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engineering/engine_smes) -"cGe" = (/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) -"cGf" = (/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) -"cGg" = (/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) -"cGh" = (/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) -"cGi" = (/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) -"cGj" = (/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) +"cGb" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/constructionsite/station) +"cGc" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/constructionsite/station) +"cGd" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/random/loot,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/engineering) +"cGe" = (/obj/structure/table/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/random/loot,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cGf" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/meter,/obj/machinery/space_heater,/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/maintenance/engineering) +"cGg" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Carbon Dioxide"; dir = 1},/turf/simulated/floor/reinforced{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) +"cGh" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Phoron"; dir = 1},/turf/simulated/floor/reinforced{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) +"cGi" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Nitrous Oxide"; dir = 1},/turf/simulated/floor/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) +"cGj" = (/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Gas Mixing"; dir = 1},/turf/simulated/floor/reinforced{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) "cGk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) "cGl" = (/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) "cGm" = (/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(11)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/engineering/engine_airlock) @@ -7093,67 +7093,67 @@ "cGu" = (/obj/structure/table/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/research_port) "cGv" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/plating,/area/maintenance/locker) "cGw" = (/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) -"cGx" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cGy" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"cGz" = (/turf/simulated/floor/plating/airless,/area/rnd/xenobiology) -"cGA" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cGB" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) -"cGC" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/engineering/atmos) -"cGD" = (/turf/simulated/floor/engine{carbon_dioxide = 0; name = "phoron floor"; nitrogen = 0; oxygen = 0; phoron = 70000},/area/engineering/atmos) -"cGE" = (/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) -"cGF" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cGG" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller,/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cGH" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/engineering/atmos) -"cGI" = (/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/drone_fabrication) +"cGx" = (/obj/machinery/computer/drone_control,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cGy" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/machinery/mecha_part_fabricator,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cGz" = (/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"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cGA" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cGB" = (/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/tiled{icon_state = "vault"; dir = 8},/area/engineering/engine_smes) +"cGC" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cGD" = (/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"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/engine_smes) +"cGE" = (/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")},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cGF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/power_monitor,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cGG" = (/obj/machinery/computer/rcon,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cGH" = (/obj/machinery/computer/station_alert,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"cGI" = (/obj/machinery/computer/security/engineering,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cGJ" = (/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) -"cGK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_smes) -"cGL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/engineering/engine_smes) -"cGM" = (/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) -"cGN" = (/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) -"cGO" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cGP" = (/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) -"cGQ" = (/obj/structure/table/reinforced,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/engineering/engine_monitoring) -"cGR" = (/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) +"cGK" = (/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},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/engineering/engine_airlock) +"cGL" = (/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_airlock) +"cGM" = (/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cGN" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (NORTH)"; icon_state = "swall_straight"; dir = 1},/area/shuttle/constructionsite/station) +"cGO" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cGP" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/wall/r_wall,/area/engineering/engine_waste) +"cGQ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cGR" = (/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"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/engineering/engine_waste) "cGS" = (/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) -"cGT" = (/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) -"cGU" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/constructionsite/station) -"cGV" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/constructionsite/station) +"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},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cGU" = (/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(11)},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cGV" = (/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"},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (WEST)"; icon_state = "warningcee"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cGW" = (/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) "cGX" = (/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) -"cGY" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/constructionsite/station) +"cGY" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/machinery/alarm/nobreach{dir = 2; pixel_y = 22},/turf/simulated/floor/plating,/area/engineering/engine_room) "cGZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/turf/simulated/floor/plating,/area/maintenance/locker) "cHa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/binary/passive_gate{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/locker) "cHb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/locker) "cHc" = (/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) -"cHd" = (/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) -"cHe" = (/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) -"cHf" = (/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) -"cHg" = (/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) +"cHd" = (/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"},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (EAST)"; icon_state = "warningcee"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHe" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHf" = (/obj/structure/cable,/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) +"cHg" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/port) "cHh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cHi" = (/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) -"cHj" = (/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) -"cHk" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/drone_fabrication) -"cHl" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/drone_fabrication) -"cHm" = (/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) +"cHj" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/solar/port) +"cHk" = (/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/airless,/area/solar/port) +"cHl" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cHm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cHn" = (/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) -"cHo" = (/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) -"cHp" = (/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) -"cHq" = (/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) -"cHr" = (/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) -"cHs" = (/obj/machinery/computer/rcon,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) -"cHt" = (/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) -"cHu" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) -"cHv" = (/obj/machinery/computer/station_alert,/turf/simulated/floor{icon_state = "warning"},/area/engineering/engine_monitoring) -"cHw" = (/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) +"cHo" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/portables_connector,/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cHp" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cHr" = (/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" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/shuttle/constructionsite/station) +"cHt" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/shuttle/constructionsite/station) +"cHu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/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/airless,/area/solar/port) +"cHv" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cHw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cHx" = (/turf/simulated/floor/plating,/area/engineering/engine_airlock) -"cHy" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_airlock) +"cHy" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cHz" = (/turf/simulated/shuttle/wall{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/area/shuttle/constructionsite/station) "cHA" = (/turf/simulated/shuttle/wall,/area/shuttle/constructionsite/station) "cHB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) -"cHC" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) +"cHC" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/engine_waste) "cHD" = (/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},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) "cHE" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) -"cHF" = (/turf/simulated/shuttle/wall{icon_state = "swall1"; dir = 2},/area/shuttle/constructionsite/station) +"cHF" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cHG" = (/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) "cHH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/binary/pump/high_power/on,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/locker) "cHI" = (/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) @@ -7168,96 +7168,96 @@ "cHR" = (/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) "cHS" = (/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(11)},/turf/simulated/floor/plating,/area/engineering/engine_room) "cHT" = (/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) -"cHU" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) +"cHU" = (/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,/area/engineering/engine_room) "cHV" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) "cHW" = (/obj/machinery/computer/shuttle_control/engineering,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) "cHX" = (/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) "cHY" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area/space) "cHZ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/space,/area/space) "cIa" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 8},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) -"cIb" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/engineering/engine_waste) -"cIc" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cIb" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIc" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cId" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cIe" = (/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) -"cIf" = (/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) -"cIg" = (/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) +"cIf" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cIg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/machinery/meter{id = "wloop_atm_meter"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (EAST)"; icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cIh" = (/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) -"cIi" = (/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(11)},/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_room) +"cIi" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cIj" = (/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) -"cIk" = (/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) -"cIl" = (/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) -"cIm" = (/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) -"cIn" = (/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) +"cIk" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineEmitterPortWest"; layer = 3.3; name = "Engine Waste Handling Access"},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIl" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cIm" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIn" = (/obj/machinery/power/emitter{anchored = 1; id = "EngineEmitter"; state = 2},/obj/structure/cable/cyan,/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (NORTH)"; icon_state = "warningcee"; dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) "cIo" = (/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) "cIp" = (/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) "cIq" = (/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) "cIr" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) "cIs" = (/obj/machinery/light_switch{pixel_x = 12; pixel_y = 25},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Power"; name_tag = "Engine Power"},/obj/machinery/power/apc/super/critical{dir = 1; is_critical = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIt" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating{icon_state = "platebotc"},/area/engineering/engine_room) +"cIt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cIu" = (/turf/simulated/floor/plating,/area/engineering/engine_room) "cIv" = (/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) "cIw" = (/obj/structure/cable,/obj/machinery/power/smes/buildable/power_shuttle,/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) -"cIx" = (/obj/structure/cable,/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/constructionsite/station) +"cIx" = (/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cIy" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) "cIz" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) -"cIA" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"; dir = 2},/area/shuttle/constructionsite/station) +"cIA" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room) "cIB" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) "cIC" = (/obj/structure/grille,/obj/structure/grille,/turf/space,/area/space) -"cID" = (/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) -"cIE" = (/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/solar/port) -"cIF" = (/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) +"cID" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIE" = (/obj/effect/floor_decal/industrial/warning/cee,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIF" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room) "cIG" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space) -"cIH" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_waste) +"cIH" = (/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},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room) "cII" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_waste) "cIJ" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cIK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) -"cIL" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/portables_connector,/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) +"cIK" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIL" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cIM" = (/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) -"cIN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cIN" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) "cIO" = (/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) -"cIP" = (/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) -"cIQ" = (/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) -"cIR" = (/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) -"cIS" = (/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) +"cIP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/maintenance/portsolar) +"cIQ" = (/obj/machinery/camera/network/engine{c_tag = "Engine Core West"; dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIR" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 8},/obj/machinery/meter,/obj/machinery/camera/network/engine{c_tag = "Engine Core East"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIS" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/engine_room) "cIT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) "cIU" = (/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) "cIV" = (/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) "cIW" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/engineering/engine_room) "cIX" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cIY" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/constructionsite/station) -"cIZ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/constructionsite/station) +"cIY" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cIZ" = (/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/yellow{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_room) "cJa" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) -"cJb" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/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/solar/port) +"cJb" = (/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/solar/port) "cJc" = (/obj/item/stack/rods{amount = 10},/turf/space,/area/space) -"cJd" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/engine_waste) -"cJe" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/engine_waste) -"cJf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) -"cJg" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) -"cJh" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cJd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/maintenance/portsolar) +"cJe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/maintenance/portsolar) +"cJf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/airless,/area/maintenance/portsolar) +"cJg" = (/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,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cJh" = (/obj/structure/closet/wardrobe/black,/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJi" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cJj" = (/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) -"cJk" = (/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) -"cJl" = (/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) -"cJm" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/engineering/engine_room) +"cJk" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJl" = (/obj/machinery/air_sensor{frequency = 1438; id_tag = "engine_sensor"; output = 63},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/greengrid/nitrogen{icon = 'icons/turf/flooring/plating.dmi'; icon_state = "plating"},/area/engineering/engine_room) +"cJm" = (/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},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/greengrid/nitrogen{icon = 'icons/turf/flooring/plating.dmi'; icon_state = "plating"},/area/engineering/engine_room) "cJn" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 1"},/turf/simulated/floor/plating,/area/engineering/engine_room) "cJo" = (/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) "cJp" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) "cJq" = (/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) "cJr" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) "cJs" = (/obj/item/stack/cable_coil,/turf/space,/area/space) -"cJt" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/obj/machinery/meter,/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cJu" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/engine_waste) -"cJv" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_waste) -"cJw" = (/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"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_waste) -"cJx" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste) -"cJy" = (/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) -"cJz" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) +"cJt" = (/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},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/greengrid/nitrogen{icon = 'icons/turf/flooring/plating.dmi'; icon_state = "plating"},/area/engineering/engine_room) +"cJu" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/solar/port) +"cJw" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/port) +"cJx" = (/turf/simulated/floor/airless,/area/solar/port) +"cJy" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/solar/port) +"cJz" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/port) "cJA" = (/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) "cJB" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) "cJC" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJD" = (/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) -"cJE" = (/obj/machinery/power/emitter{anchored = 1; id = "EngineEmitter"; state = 2},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cJF" = (/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) +"cJD" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/solar/port) +"cJE" = (/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(11,13)},/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/manifold/visible,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cJF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cJG" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) "cJH" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/plating,/area/engineering/engine_room) "cJI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engineering/engine_room) @@ -7273,50 +7273,43 @@ "cJS" = (/turf/simulated/floor/plating,/area/engineering/engine_waste) "cJT" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/engineering/engine_waste) "cJU" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_waste) -"cJV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/engineering/engine_waste) -"cJW" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/engine_waste) -"cJX" = (/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cJY" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/engineering/engine_room) -"cJZ" = (/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) -"cKa" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/engine_room) -"cKb" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/engine_room) -"cKc" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/engine_room) -"cKd" = (/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) -"cKe" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 10},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/engineering/engine_room) +"cJV" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cJW" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/greengrid/nitrogen{icon_state = "gcircuit"; name = "floor"},/area/engineering/engine_room) +"cJX" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/greengrid/nitrogen{icon = 'icons/turf/flooring/plating.dmi'; icon_state = "plating"},/area/engineering/engine_room) +"cJY" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/greengrid/nitrogen{icon = 'icons/turf/flooring/plating.dmi'; icon_state = "plating"},/area/engineering/engine_room) +"cJZ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKa" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/port) +"cKb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/maintenance/portsolar) +"cKc" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable/yellow,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar) +"cKd" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Aft Port Access"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/engi_engine) +"cKe" = (/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room) "cKf" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) "cKg" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1; dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) "cKh" = (/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) "cKi" = (/obj/machinery/atmospherics/binary/circulator{anchored = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) "cKj" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKk" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cKk" = (/obj/machinery/camera/network/engine{c_tag = "Engine Core South"; dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/greengrid/nitrogen{icon = 'icons/turf/flooring/plating.dmi'; icon_state = "plating"},/area/engineering/engine_room) "cKl" = (/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) "cKm" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/space,/area/space) "cKn" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/turf/space,/area/space) -"cKo" = (/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) +"cKo" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cKp" = (/turf/simulated/wall/r_wall,/area/maintenance/portsolar) "cKq" = (/turf/simulated/wall/r_wall,/area/maintenance/engi_engine) "cKr" = (/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)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cKs" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKt" = (/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) +"cKt" = (/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/airless,/area/solar/port) "cKu" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(11)},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engineering/engine_room) "cKv" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/structure/grille,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cKw" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(11)},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKx" = (/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) +"cKx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/maintenance/portsolar) "cKy" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) "cKz" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKA" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKB" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKC" = (/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) +"cKA" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineVent"; name = "Reactor Vent"; p_open = 0},/turf/simulated/floor/reinforced,/area/engineering/engine_room) +"cKB" = (/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/airless,/area/solar/port) "cKD" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/structure/lattice,/turf/space,/area/space) -"cKE" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/port) -"cKF" = (/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) -"cKG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"cKH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"cKI" = (/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) "cKJ" = (/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) "cKK" = (/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) "cKL" = (/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) -"cKM" = (/obj/structure/closet/wardrobe/black,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/engi_engine) "cKN" = (/obj/structure/table/rack{dir = 1},/obj/machinery/alarm{pixel_y = 22},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cKO" = (/obj/structure/closet,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/engineering) "cKP" = (/turf/simulated/floor/plating,/area/maintenance/engi_engine) @@ -7324,106 +7317,55 @@ "cKR" = (/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,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cKS" = (/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) "cKT" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKU" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engineering/engine_room) "cKV" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cKW" = (/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) -"cKX" = (/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) -"cKY" = (/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) "cKZ" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/structure/grille,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLa" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engineering/engine_room) "cLb" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room) "cLc" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) "cLd" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLe" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLf" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cLg" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cLh" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cLi" = (/turf/simulated/floor/plating/airless,/area/solar/port) -"cLj" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cLk" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port) "cLl" = (/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(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cLm" = (/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) "cLn" = (/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(11,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) -"cLo" = (/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(11,13)},/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/manifold/visible,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/portsolar) "cLp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cLq" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/portsolar) "cLr" = (/obj/machinery/door/airlock/engineering{name = "Aft Port Solar Access"; req_access = list(11)},/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/portsolar) -"cLs" = (/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{icon_state = "warnplate"; dir = 8},/area/maintenance/engi_engine) "cLt" = (/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/engi_engine) "cLu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cLv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cLw" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/engi_engine) -"cLx" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_room) "cLy" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLz" = (/turf/simulated/floor/engine/nitrogen{dir = 4; icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) -"cLA" = (/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) -"cLB" = (/turf/simulated/floor/engine/nitrogen{dir = 8; icon_state = "warnplate"; name = "plating"},/area/engineering/engine_room) "cLC" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/structure/grille,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cLD" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLE" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLF" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/solar/port) -"cLG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) -"cLH" = (/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) "cLI" = (/turf/simulated/floor/plating,/area/maintenance/portsolar) "cLJ" = (/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) -"cLK" = (/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) "cLL" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cLM" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cLN" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cLO" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLP" = (/turf/simulated/floor/engine/nitrogen,/area/engineering/engine_room) -"cLQ" = (/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) "cLR" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "SupermatterPort"; layer = 2.7; name = "Reactor Blast Door"; opacity = 0},/obj/structure/grille,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLS" = (/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) "cLT" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) "cLU" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) "cLV" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 2"},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLW" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLX" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLY" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plating,/area/engineering/engine_room) -"cLZ" = (/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) -"cMa" = (/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) "cMb" = (/turf/simulated/wall,/area/maintenance/engi_engine) "cMc" = (/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) "cMd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cMe" = (/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) -"cMf" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineVent"; name = "Reactor Vent"; p_open = 0},/turf/simulated/floor/engine,/area/engineering/engine_room) "cMg" = (/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) "cMh" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space) "cMi" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/obj/structure/lattice,/turf/space,/area/space) "cMj" = (/turf/space,/area/syndicate_station/southeast) "cMk" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/grille/broken,/obj/structure/lattice,/turf/space,/area/space) -"cMl" = (/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) "cMm" = (/turf/space,/area/syndicate_station/south) "cMn" = (/turf/space,/area/skipjack_station/southwest_solars) -"cMo" = (/obj/machinery/hologram/holopad,/obj/effect/landmark/start{name = "Engineering Apprentice"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room) "cMp" = (/obj/structure/table/rack{dir = 1},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/engineering) "cMq" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/maintenance/locker) -"cMr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/locker) -"cMs" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/tank/air{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/locker) -"cMt" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/locker) -"cMu" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/locker) -"cMv" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/engineering) -"cMw" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/engineering) -"cMx" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/engineering) -"cMy" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/engineering) -"cMz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 4},/obj/machinery/light/small{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/engineering) "cMA" = (/obj/machinery/atmospherics/binary/pump/high_power/on{tag = "icon-map_on (NORTH)"; icon_state = "map_on"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/engineering) -"cMB" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/engineering) -"cMC" = (/obj/machinery/atmospherics/binary/passive_gate,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/engineering) -"cMD" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/engineering/locker_room) "cME" = (/obj/structure/table/rack{dir = 1},/obj/machinery/light/small{dir = 1},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/medbay) -"cMF" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/meter,/obj/machinery/space_heater,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/engineering) "cMG" = (/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/engineering) "cMH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/mob/living/simple_animal/corgi/fox/Chauncey,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "cMI" = (/obj/structure/table/standard,/obj/machinery/light/small{dir = 8},/obj/random/loot,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cMJ" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/random/loot,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/engineering) -"cMK" = (/obj/structure/table/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/random/loot,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/engineering) "cML" = (/obj/structure/closet/crate,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cMM" = (/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/engi_engine) -"cMN" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos) "cMO" = (/obj/structure/closet/crate{name = "engineering mag lock crate"},/obj/item/device/magnetic_lock/engineering,/obj/item/device/magnetic_lock/engineering,/turf/simulated/floor/plating,/area/engineering/storage) -"cMP" = (/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/obj/structure/table/steel,/obj/item/device/flashlight/heavy,/obj/item/device/flashlight/heavy,/turf/simulated/floor,/area/engineering/workshop) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7482,151 +7424,151 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaafaaiaajaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaajaakaalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaanaamaamaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaajaaoaapaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaaaaaaaaaaaaaaraapaasaataafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaaaaaaaauaaaaaaaaaaauaaaaaaaaaaaaaaaaauaaaaaaaaaaauaaaaaaaauaaaaaaaaaaaaaaaaamaaaaavaawaaxaaaaavaawaaxaaaaavaawaaxaafaafaamaaaaaaaaaaaaaaaaafaafaahaayaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaazaazaazaazaazaazaazaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaauaauaauaauaaaaaaaaaaacaaaaamaaaaavaaAaaxaaaaavaaAaaxaaaaavaaAaaxaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaBaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaDaaEaaFaaEaaFaaEaaGaazaazaaHaaIaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaaJaafaavaaAaaxaaaaavaaAaaxaafaavaaAaaxaafaaaaaaaafaafaaKaaaaaaaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaLaaMaafaazaaNaaOaaOaaOaaOaaOaaPaaQaaRaaSaaTaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaafaaaaavaaAaaxaafaavaaAaaxaaaaavaaAaaxaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaUaaUaaUaaUaaUaaUaaUaafaaaaazaaVaaWaaXaaWaaFaaWaaYaaZabaabbabcaazabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaJaafaaaaavaaAaaxaafaavaaAaaxaaaaavaaAaaxaafaaaaaaaacaaaaafaafabeabfabfabfabfabgabhaaaaaaaaUabiabiabjabiabiaaUaaaaafaazabkablaaZablaaZablaaZaazabmabbabnaazaboabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafabqaafaafaafabqaafaaaaafabqaafaaaaaaaaaaaaaaaabrabsabtabuabvabwabxabyabhaafaaaaaUabzabAabBabCabDaaUaaaaaaabEabFabGabHabIaaFabGaaFabJabKabLabMabNabOabPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaJaafabQabRabSabTabTabTabTabTabTabTabTabTabTabTabTabUabRabRabVabWabXabYabZacaacbaccacdaceaceaceaaUaaUacfacgachaaUaaUaciacjackaclacmacnacoacnacpaclaclaclacqacracsactacuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaafaaMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafacvaafaaaaafacvaafaaaaafacvaafaaaaaaaaaaaaaaaabrabsacwacxacyaczabfacAaceaceacBacCacDacEacFacGaceaceacHacIacJacKacMacLacNacOacPacQacRacSacTacUacsactabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaJaafaafaavacVaaxaaaaavacVaaxaaaaavacVaaxaafaaaaaaaaaaaaaafaafacWabfabfabfabfacXaceacYacZacZacZacZacFacZadaadbadcacSaddadeadfadgacNadhacSacSacSacSadiadjacladkadlabdadmadnadoabdaaMaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaavacVaaxaafaavacVaaxaaaaavacVaaxaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabhacXaceadpadqadradsadtaduadvadwadbadcacSadxadeadfadyadzadAacSadBadBadBadfadCacsadDadEadFadEadEadGadFaaMaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaJaafaavacVaaxaaaaavacVaaxaaaaavacVaaxaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadHadIaceadJacZacZacZacZacFacZadKadbadcacSadxadLadMadNadOadPadQadRadRadRadSadTacsadUadEabdadVadWafsabdaaMaaMaafaaaaafaaaaaMaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaJaafaavacVaaxaaaaavacVaaxaafaavacVaaxaafaafaafaaaaafaafaaaaaaaaaaaaaaaadXadIaceaceadYadZaeaaebaecaedaceaceaeeacSaddaefadfaegaehadAadQadRaefadRaeiaejacsadUaekabdabdabdabdabdaaMaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafaavaelaaxaaaaavaelaaxaaaaavaelaaxaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadXaemaceaceaceaceaceaceaenaceaceaceaepaeoaeraeqaesaetaeuaevaewaexaeyaexaezaeAacsadDaeBabdaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaeCadIaeDaeEaeFaeGaeHaeIaeJaeKaeLaeMaeNaeOaePaeOadfaegaeQaeRaeSaeSaeTaeSaeUaeVaeWaeXaeYabdaeZaeZaeZaeZaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJafaaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabhadIafbafcafdaeGaeHaeHafeaffafgaeMafhafiafkafjadfaflafmafnacSacSafoacSafpafqacsafrafyabdaftafuafvafvafwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhabhabhabhabhabhabhabhabhabhabhabhabhadIafxafzagcaeGafAafBafCafDafEafFafHafGafIafGafKafJadzafLafMacSafoacSafNafOafPafQafRafSadEafTafUafVafWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhafXafYafZabhagaagbagvagdageagfaggaggaggaggaggaggaghagiagjagkaeGaglagmagnagoagpaeMagqagragtagsaguagIagwagxagyagzagAagBagCagxagDagEagFabdadEagGafvafvagHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabhahcagJaggaggaggagfagfaggagKagLagLagLagLagLagLagLagLagLagLagMaeGagNagOagPagQagRaeMagSagTagTagTadfagUagVagWagXagYagZagYagXahaagDahbadEabdabdaeZaeZaeZaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhaioahdaheaheaheaheaheaheaheagLahfahgahhaheahiahjahkahlahmahnahoahpahqahrahsahtahuahvahvahvahvadfahwahxahyahzahAahBahCahDahEagDahFaiMahGalqakGannabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHaaaaaaahHaaaaaaaaaahHaaaaaaaaaaaaaaaahHaaaaaaaaaahHaaaaaaahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhafXafYahIabhahJahKaheahLahMahNahOahPahQagLahhahRahOahSahTahUahUahVahWahXahYahZahZaiaahZaibaicaidacSacSaefadfaieaifaigaihaiiaijaikailaimagDahFanXanVaCFaqvaDTabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHaaaaaaaaaahHahHahHahHahHahHahHaaaaaaaaaahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHainamMaipabhaiqahKaheairaisaitaiuaivaiwagLahhahRaixaheaiyahUaizaiAahTahXaiBaiCahZaiDahZahZaiEaiFaidacSacSadfaiGaiHaiIagXagXaiJagXagXaiKagDaiLaFtakDakDakDakFabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHaaaaaaahHahHahHahHahHahHahHahHahHaaaaaaahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeCaiNaiNaiOabhaiNahKaheaiPaiQaiRaiSaiTahOagLaiUaiVaiWaheaiXaiYaiZajaajbajcajdajeajfaiaajgajhaeMajjajiajlajkajnajmajoajpajqajrajsajtcMNajuagDalrabdabdabdabdadDabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaamaamaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHaaaaaaahHahHahHahHahHahHahHahHahHaaaaaaahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhabhajvabhabhajwajxaheaheajyaheaheajzaheaheaheajAaheaheajBajCajDajEajFajGaheajHajIajJajKajLaheaheajMajOajNaheaheaheagxajPagxagxagxagxagxagDalrabdajQajRabdadDabdaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhagJagfajSagfajTajUajVajWajYajXajZakaakcakbakdakeakgakfakhakiakjakkakhaklakjakjakmaknaknakoakqakpakraksakuaktajMakvakwakxakyakzakBakAakCalsakEamaaorabdadDabdaaaaaaaaaaaaaaaaaaaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafakIaafaaJaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaJaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhahKaheaheaheaheaheaheakJakKakLakMakNakOakPakQakRakSakTakUakVakWakNakXakNakNakYakZalaalbalcaldalealfalgalaalhalialjalkallalmalnaloalpakCamNabdamOanuabdanwabdaaaaafaaaaaaaaaaaaaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaaaaaaaaaltaaaaaaaaaaaJaaJaamaamaamaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhahKahealualvalwalxahealyalzahUalAalBahealCalDalCahealEalFalGahealHalJalIalKagLalLalMalNalOalPahealQalRalRalSahealTalUalValWalXalYalZakCadEambambamcambadDabdanxaafaaaaaaaaaaaaaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaamdaafaafaaaaafaafaaaaaaaamaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafameaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabhahKamfamgamgamhamiamjamkamlahTammalBaheamnamoampamqamramsamtamuahTamvahTamwamxamyamyamzamAamBamCamDamEamFamGakCamHamIamJamKalValVamLakCadEambanyaogambadDabdanxaaaaaaaaaaafaaaaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafamPamPamPamPamPaafamQaafamPamPamPamPamPaafaaJaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaJaaJaaaaaaaaaamRaaaaaaaaaaaJaaJaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhahKaheamSamTamUamVaheamWamlalBamXamYaheamZanbanaamqancandaneanfanganhanianjankamAamAamzamAanlanmaFvanoanpanqakCanransalVamKalValVantakCadEambaohaoianvaokabdabdabdaaMaafaafaafaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafanzanAanAanAanAanBamQanCanDanDanDanDanEaafaaJaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaanFaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhanGaheaheaheaheaheaheanHanIaheaheaheaheanJanKanJamqanLanManNamqanOanPanQanRanSamAamAamzanTanUamCaJoanWanpaJpanYanZaoaaobaocaodaoeaofanYaqLambaojaoZaoYapMapaapOabdaafaaMaafaacaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafaolaolaolaolaolaafamQaafaolaolaolaolaolaafaaJaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafaomaomaomaomaomaafaonaafaomaomaomaomaomaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaooaopaoqatragLaosaotaheaouaovaowaoxaoyaozaoAaoBaoCaoDaoDaoEaoDaoFaoGaoHaoIaoJaoKamAamAaoLaoMaoNamCaoOaoPanpaoQanYaoRaoSaoTaoUaoVaoWaoXanYanYanYanYanYanYanYanYapPabdapbapcapdaaaaafaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafamQaaaaaaaaaaafaaaaaaaaaaamaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaJaafapeapfapfapfapfapgaonaphapiapiapiapiapjaafaaJaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaooaooapkaplagLamgapmapnapoappapqaprapsaptapuapuapvapwaoDapxapyapzaoDapAaoDapBapCapDamAamzamAanlapEapFanWanpapGanYapHapIapJapKapHapLapHapHapHapRapQapSapHapHanYapNattapbapbapTapbapbaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafamPamPamPamPamPaafamQaafamPamPamPamPamPaafaaJaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafapUapUapUapUapUaafaonaafapUapUapUapUapUaafaaJaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapVapkaplagLapWapXahealyapYaowapZaqaaqbaqcaoBaqdaqeaqfaqgaqhaqiaqjaqkaqlaqmaqnaqoaoMaqpaoMaqqaqraqsaqtaquaYXanYaqwaqxapHaqyaqzaqAaqzaqBaqBaqBaqBaqBaqBaqBaqCaqEattapbaqHaqIaqJapbaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafanzanAanAanAanAanBamQanCanDanDanDanDanEaafaaJaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafaonaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqKatsaqMagLaheaheaheaqNamlaheamqamqamqaqOaqPaqQaqRaqSaqTaoDaqUaqVaqWaqXaqYaqZarbaraarcardarearfargarhariaFvanYarjarkarlarmarnaroarpapHaqFarqaqGarraqFapHanYapNattapbartaruarvapbaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafaolaolaolaolaolaafamQaafaolaolaolaolaolaafaaJaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafaomaomaomaomaomaafaonaafaomaomaomaomaomaafaaJaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqKarwaqMagLaosarxahearyarzaowaoxarAaozaoBarBarCarDarEarFaoDarGamqarHarIarJarKarLarMarNarOarParQarRarSarTamDanYanYarUanYanYanYanYanYanYanYanYanYanYanYanYanYapNattapbapbasaapbapbaaaaaaaaaakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaamQaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMasbaaMaaaaaaaaaaaaaaaaaaaaaaaJaafapeapfapfapfapfapgaonaphapiapiapiapiapjaafaaJaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqKascaqMagLasdapmaseasfasgashasiasjaskaoDaoDaslasmasnasoaoDaspamqasqasrassastasuarMasvaswasxarQapbapbapbapbapbasyaszasAasBarsasCasCasDarVarWarVarVarXarYarYasEarZasFasKasLasMaqDaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaJaafamPamPamPamPamPaafamQaafamPamPamPamPamPaafaaJaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasNasOasNaaaaaaaaaaaaaaaaaaaaaaaJaafapUapUapUapUapUaafaonaafapUapUapUapUapUaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasPasQaplagLapWapXaheasRasSaowapZasTaozasUasUasVasWaoDasXaoDasYamqasZataatbatcatdarMateatfatgarQathatiatiatjatkatjatlatmatnatnatnatoatnatnatnatnatnatpattattatqatKatKattatuatvatwatxatyatzatzatzatzatAatzatzatzatzatBaafaaaaaaaaaaaaaamaafanzanAanAanAanAanBamQanCanDanDanDanDanEaafaaJaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatCatDatEaaaatFatGatHaaaaafatIatJatIaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaaonaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaooawdatLagLagLagLaheaheaheaheamqamqamqamqamqatMaoDapzatNaqPatOamqamqamqatPatPatParMatQatRatSarQatTatnatnatnatnatUatVatWatXatYatZauaaubaucaudaueaufaugatxatxatxatxatxatxatxatxatxatxauhauhauhauhauhauhauhauhauhauhauiaafaaaaaaaaaaaaaamaaaaolaolaolaolaolaafamQaafaolaolaolaolaolaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaujaukaulaukaujaumaunaumaujaafatIauoaupaaaaaaaaaaaaaaaaaaaaaaaJaafaomaomaomaomaomaafaonaafaomaomaomaomaomaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaooauqaopaurausaooaafaafamqautauuauvauwauxauyaoDapyaoDasXaqPauzauAauBauCauDauEauFarMauGauHauIarQatTatnauJauKauLatUauMauNatXatYauOauPauQauRauSaueaufauTauUauVauWauXauWauYauZavaavbavcauhauhauhauhauhauhauhauhauhauhavdaafaaaaaaaaaaaaaamaaaaafaaaaafaafaaaaaaaveaaaaaaaafaaaaaaaafaaaaaJaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfaukavgaukavfaumavhaumavfaviavjavkavlavmavmavnaviaviaafaaaaaJaafapeapfapfapfapfapgaonaphapiapiapiapiapjaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaooaooaooaooaooaooaplavoaooaaaaaaamqavpamqavqavravsamqavtavuaoDavvavwavwavxavyavwavzavAavBarMavCauHavDarQatTatnavEavFavGatUavHavIatXatYavJauPavKavLavMaueaufavNavOauVauWauWauWauYavPavQavRavSauhauhauhauhauhauhauhauhauhauhavdaafaaaaaaaaaaaaaamaamaaJaaaaaaaafaaaaaaaltaaaaafaafaafaafaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfavTavUavVavfavWavXavYavfavZawaawbawcawYaweawfawgaviaaaaaaaaqaaaapUapUapUapUapUaafawhaafapUapUapUapUapUaaaaaJaaaaaaaaaaaaaaaaaaaaaaaaawiawjawkawlawmawnawoawpaooaaaaaaamqamqamqawqawrawsamqawtawuawvawwawxawyauAawzawAawBawCawDarMawEauHawFarQatTatnawGawHawIawJawKawLatXatXatXawMawNawOatXatXaufawPawQauVauWauWauWauYawRawSavRawTauhauhauhauhauhauhauhauhauhauhavdaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaawUaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfawVawWawXavfawVawWawXavfaxRavZavZavZavZavZavZavZasNaaaaaaaaJaaaaafaaaaafaafaaaaaaawZaaaaaaaafaaaaaaaafaaaaaJaafaaaaaaaafaafaaaaaaaafaxaawjaxbaxcaxdaxeauqaxfaooaafaaMaxgatPatPatPatPatPatPatPatPatPatPatPatPatPatPatPatPatPatParMaxhauHaxiarQatTatnaxjaxkaxlatUaxmaxnaxoaxpaxqaxraxqaxsaxtaxuaxvaxwaxxaxyaxzaxzaxzaxyaxxawSaxAaxBauhauhauhauhauhauhauhauhauhauhavdaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaxCaxDaxCaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaujavfaxEaxFaujavfaxGaxFaujavfaxHavfavfavfavfavfavZatIaaaaaaaaJaaJaaJaaaaaaaafaaaaxIaxJaxIaafaafaafaafaaJaaJaaJaafaooaooaooaooaxKaxLaxLaxMaooaooaooaooaxNauqaxOaooaxPaxQaooaooayjaxSaxTaxUaxUaxUaxUaxUaxUaxUaxUaxVaxUaxUaxUaxUaxUaxWaxXaxYaxZaxWayaatnaybaycaydatUayeayfayfaygayhayiaBSaykayfavIaylaymaynayoaypaypaypaypayqawSaxAaxBauhauhauhauhauhauhauhauhauhauhavdaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaayraysayraaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaytayuayvayuaywayuayxayuayyayzayAayAayAayAayBavfayCatIaaaaafaafaaaaaaaaaaaaaafaaaayDayEayDaafaaaaafaaaaaaaaaaaaaaaaooayFayGayHayGayGayGayGayIayGayGayJayKayHayLayMaxUaxUaxUaxUaxUaxUayNayOayPayPayPayPayQayPayPayRayPayQayPayPayParMaySayTayUarQayVatnaydayWayXatUayYayZazaazbazcazdazcazeayZazfazgazhaziazjaziaziazkazlazmaznazoazpauhauhauhauhauhauhauhauhauhauhavdaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafazqazrazsaztazuaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazvazwazxazyazzazAazBazCazDazBazEazFazBazBazGavfavZavjaafaafaaaaaaaaaaaaaaaaafazHazIazJazKazLaaaaafaaaaaaaaaaaaaaaaooazMaooazNazOazPazPazPazQazPazPazPazRazNazSazTazTazTazTazTazTazTazUazVayPazWazXazYazZaAaaAbaAcaAdaAeaAfazXaAgarMaAhayTayUarQayVatnaAiaAjauLatUaAkayfayfayfayfaygaAlaAmaAnaAoaxvaApaAqaAraAraAraAsaAtatxaAuatxatxauhauhauhauhauhauhauhauhauhauhavdaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaAvaAwaAxaAyaAvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafavfaAzaAAaAzaABazxazxaACaAzaAAaAzaADaAEaAFaAGavfavZaviaviaAHavmavmavmavmavnaviaAIaAJaAKaALaAIaooaooaxPaAMaxQaooaooaooazMaANazNaaaaafaaaaafaaaaafaaaaafaaaazNazSazTaAOaAPaAQaARaASazTazUauqayPaATaATaAUaAVaAWaAXaAYaAWaAZaBaazXaAgarMaAhayTaBbarQayVatnawGaBcaBdaBeaBfaBgaBhaBiaBjaBkaBlaBmaBmaBnaBmatxaBoaBpaBqaBraBsaBtazpaBuaBvaBwauhauhauhauhauhauhauhauhauhauhavdaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaAvaBxaByaBzaAvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBAaujaBBawVaBCaBDaBEaBFaBGaBCawVaBHaBIaBJaBKaBLaBMavZavZavZavZavZavZavZavZaBNaBOaAIaBPaBQaBRaAIaEqaBTayGayGayGayGayGaBUaBVaBWazNaafaBXaBXaBXaBXaBXaBXaBXaafazNazSazTaBYaBZaCaaCbaBYazTazUaCcayPayPayPayPaCdaCeaCfaCgaCeaChaCiazXaCjarMaAhayTaCkarQaClatnaCmaCnaCoatUaAkavIatWaBmaBmaBmaBmaBmaCpaCqaCraBmatxatxatxatxaCsatxatxaCtaCuaCvauhauhauhauhauhauhauhauhauhauhauiaafaDraDraDraDraDraDraaaaaaaafaaaaAvaCwaCxaCyaAvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazvaAAaCzaCAaCAaCAaCAaCBaAAazvaaaaBJaCCaCDaBMaCEaCEaCEaCEaCEaCEaCEaYYaYZaCGaAIaCHaCIaCJaAIaCKaCLaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBXaCNaCOaCPaCQaCRaBXaaaazNazSazTaBYaCSaCTaCUaBYazTazUaooayPaCVaCWaAUaCXaCYaCZaDaaDbaDcayPayPayParMaAhayTayUarQayVatnaDdaDeauLatUaDfavIatWaDgaDhaDiaDjaBmaCpaDkaCraBmaDlaDmaDnaDoaDpaDqaDratxatxatxaDsatzatzatzatzaDtatzatzatzatzaDuaafaDrbaybcgbazbchaDraaaaaaaafaaaaAvaAvaDvaDwaAvaDxaDyaDzaDxaDxaDxaDxaDxaDxaDxaDAaDBaDBaDBaDCaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDEaDFaDGaDFaDFaDHaDIaDFaDFaDGaDJaDKaBJaDLaDMaBMaDOaDNaDQaDPaDSaDRaCEbdHbdIaviaAIaAIaDUaDVaCMaDWaDXaDYaDZaEaaEbaEcaEdaEeaEfaCMaafaBXaEgaEhaEiaEjaEkaBXaafazNazSazTaElaEmaEnaEoaEpazTazUaGmayPazWazXaEraEsaCeaEtaEuaAWaEvaEwasJasJarMaAhayTayUarQayVaEyaEyaEyaEyaEyaEzaEAatWaEBaECaECaEDaEEaECaEFaEGaBmaEHaEIaEJaEKaELaEMaDraaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaDrbfdcaAbZlcDgaDraaaaDxaENaEOaDxaEPaEQaERaESaESaESaESaETaEUaEVaEVaEVaEVaEVaEVaEVaEWaEXaEYaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaDEaDJaDFaEZaFaaFbaFcaFdaFeaFfaFgaFbaFhaFiaFjaFkaDLaFlaBMaFmaFnaFoaFpaFoaFqaFraFscDicDhcElaFuaFwaFxaFyaFzaFAaFBaFBaFBaFCaFBaFBaFDaFEaCMaaaaBXaFFaEhaFGaEjaFHaBXaaaazNazSazTaFIaFJaFKaFJaFLazTazUaFMayPayPayPayPaFNaCeaCfazXaCeaFOaFPazXaFQarMaFRaFSaFTarQayVaFUaFVaFWaFXaFUaFYaFZaGaaGbaGcaBmaBmaBmaBmaBmaBmaGdaGeaGfaGgaDoaGhaGiaDraDraDraDraDraDraDraDraDraGjaGkaDraDraGjaGlaDraDrcEmaDraDxaDxaDxaDxaDxaHGaGnaESaGoaGpaDxaDxaDxaDxaDxaGqaGraGsaGsaGsaGsaGsaGsaGtaGtaGuaGtaGtaGtaGtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaFiaGvaGwaGxaFbaGyaFbaGyaFbaGyaFbaGyaFbaGzaGAaGBaDLaFlaBMaGDaGCaGFaGEaGHaGGaCEaGIaGJaGKaGKaGKaGLaGMaGKaGNaFBaFBaFBaFBaFBaFBaFBaFDaGOaCMaafaBXaGPaGQaGRaGSaGTaBXaafazNazSazTaGUaGVaFKaGWaGXazTaGYaGZayPaHaazXaAUaHbaAWaHcazXaCeaFOaHdazXaHearMaHfaHgaHharQaHiaHjaHkaHlaHmaHnaHoaHpatWaHqaHraBmaHsaBmaHtaBmaHuaBmaHvaGfaHwaDoaHxaHyaHzaHAaHAaHBaHCaHDaHDaHDaHDaHDaHEaHDaHDaHDaHFbqkaDrcEnaDraHHaHIcGsaHJaHJaHKaHLaDxaDxaHMaDxaHNaHOaHPaHQaGsaHRaGsaHSaHTaHUaHVaHWaHXaHYaHZaIaaIbaIcaIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaIgaFbaFbaDGaFbaGyaFbaGyaIhaGyaIiaGyaFbaGzaGAaGBaDLaIjaIkaIkaIlaImaInaImaIkaIkaIoaIpaGKaIqaIraIsaItaGKaIuaIvaIwaFBaFBaIxaFBaIyaIzaIuaCMaaaaBXaBXaIAaIBaIAaBXaBXaaaazNazSazTaICaIDaIEaFJaFJaIFaIGaIHayPaIIazXaIJaEsaCeaIKaEuaAWaILaIMazXaINaIOaIPaIQaIRaISaITaIUaIUaIUaIUaIUaIVaIWaIXaIYaIZaBmaJaaBmaJbaBmaJcaBmaJdaGfaJeaJfaJgaJgaDpaJhaDraDraJiaDraDraJjaDraJgaJkaJgaJgaJgaJlaJmaJncGtaJqaJraJsaJsaJsaJsaJtaJuaHQaJvaJwaJxaJyaJzaJAaHQaJBaJCaGsaJDaJEaJFaJGaHWaJHaHYaJIaJJaGtaGtaGtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaFiaJKaGwaGxaFbaGyaFbaGyaFbaGyaFbaGyaFbaGzaGAaGBaDLaJLaJMaJNaJOaJPaJPaJQaJRaJSaJTaJUaJVaJWaJXaJYaJZaGKaIuaKaaKbaKcaKdaIuaKeaKfaKgaKhaKiaaaaafaaaaKjaKkaKjaaaaafaaaaKiazSazTaKlaKmaKnaKoaKpazTaKqaKrayPaKsazXaAUaKtaKuaHcazXaKvaKwaKxaKyaKzaIOaKAaKBaKCaKDaKEaKFaaaaaaaIXaKGaKHaKIaIXaKJaIZaIZaIZaKKaIZaIZaIZaBmaDoaKLaDoaDoaDoaDoaKMaDoaKNaKOaKPaKQaKRaKSaKTaKUaKVaKTaKTaKTaKTaKTaKWaKTaKTaKTaKTaKTaKTaKTaKTaKXaHQaKYaKZaLaaLbaLcaLdaHQaLeaLfaGsaLgaLhaLiaJGaLjaJHaHYaJIaHYaLkaLlaLmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaLnaLoaDFaEZaFaaFbaFbaLpaFbaFbaLqaFbaFhaFiaLraLsaDLaLtaLuaLvaLwaLvaLvaLvaLvaLvaLxaLyaGKaGKaGKaGKaGKaGKaLzaLAaLBaLCaLCaLCaLCaLDaLEaLFaKiaLGaLHaLHaLIaLJaLKaLHaLHaLLaKiaLMaKiaKiaLNaLOaLNaIOaIOaISaLPaIOaIOaIOaIOaLQaLRaLSaLTaLUaLVaIOaIOaIOaIOaLWaKBaLXaLXaLYaLZaMaaMbaIXaMcaMdaMeaIXaIXaIXaIXaIXaIXaIXaIXaBmaBmaMfaMgaMhaMiaMjaMkaMlaMmaKNaMnaMoaMpaMpaMqaKTaMraMsaMtaMuaMvaMwaMxaMyaMzaMAaMuaMwaMvaMuaMBaKTaKXaHQaMCaMDaMEaMFaMGaMHaHQaMIaMJaMKaMLaMMaMNaMOaGsaGtaMPaJIaHYaMQaMRaMSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLnaDFaDGaDFaDFaDHaDIaDFaDFaDGaLoaMTaBJaMUaLtaMVaMWaMWaMXaMWaMYaIkaMZaNaaLyaNbaNcaNdaNeaNfaNgaNeaNhaNeaNeaNeaNiaNeaNeaNjaNkaNlaNmaNmaNnaNoaNpaNmaNmaNmaNmaNqaNraNsaNtaNeaNuaNvaNwaNxaNyaNzaNyaNAaNBaNCaNDaNDaNEaNFaNGaNFaNHaNIaNJaNKaNLaNMaNNaNOaNPaLXaLXaLXaNQaNRaNSaNTaNUaNVaNWaNXaNYaNZaOaaIXaObaOcaOdaOeaOfaOfaOgaOhaOiaOjaKNaOkaOlaOmaOmaOnaKTaOoaOpaOqaOqaOqaOqaOraOsaOtaOuaOvaOwaOwaOxaOyaKTaKXaHQaOzaOAaOBaOCaOzaOzaHQaODaOEaGsaOFaOGaOHaOIaGsaHYaHYaJIaHYaGtaGtaGtaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOJaOKaOLaOMaOMaOMaOMaONaOKaOJaaaaBJaOOaOPaOQaORaOSaOTaOTaOUaIkaOVaNaaOWaOXaOYaOZaPaaPbaPcaPcaPdaPeaPeaPeaPfaPgaPgaPhaPiaNvaPcaPcaPjaPkaPlaPmaPnaPnaPoaPnaPpaPkaPkaPkaPqaPraPsaPtaLXaPuaPvaPvaPvaPvaPvaPvaPvaPvaPwaPvaPxaPyaPzaPAaPBaPCaPDaPEaPFaPvaPGaPvaPHaPIaPJaPIaPIaPIaPIaPIaPIaPKaPLaPMaPNaPNaPNaPOaPNaPNaPPaPQaPRaPSaKNaPTaMpaPUaPVaPWaKTaPXaPYaPZaPZaPZaPZaPZaQaaQbaQcaQdaPZaPZaQeaQfaKTaKXaHQaQgaOzaOzaQhaOzaQiaHQaGsaGsaGsaGsaGsaGsaQjaGsaHYaHYaJIaHYaQkaQlaGtaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaafaBJaQmaBJaQnaQoaGBaQpaQqaQraQsaGBaQoaQtaQuaBJaQvaLtaOQaQwaQxaOTaOTaOUaIkaQyaNaaLyaQzaNcaQAaQBaNeaNeaQCaQDaQEaQFaNeaQGaQHaQIaQHaQJaQKaQHaQHaQLaQHaQHaQMaQNaQHaQOaQHaQPaNeaNeaNeaQQaQRaPsaPtaLXaQSaLXaQTaQTaQTaQTaQTaQTaQTaQTaQUaQVaQTaQWaQTaQTaQXaQTaQTaQTaQTaQYaQZaRaaRbaRbaRbaRbaRbaRbaRbaRcaRdaRcaIXaReaRfaRfaRfaRfaRfaRgaRhaRiaRjaKNaKNaKNaKNaKNaRkaKTaRlaPYaPZaRmaRnaRoaRpaRqaRraRsaQdaRtaRuaRvaRwaKTaKXaHQaRxaRxaRyaRzaRAaRAaRBaHQaRCaRDaREaGtaRFaRGaRHaRIaRIaRJaRKaGtaRLaGtaRMaRMaRMaRNaROaRPaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaRQaRRaRRaRSaRTaRUaRVaOKaLsaDLaRWaRWaRXaLsaOKaLsaRYaRZaSaaLtaSbaScaScaMXaScaMYaIkaSdaNaaSeaIkaSfaSfaSgaSfaSfaSfaSfaSfaSfaShaSiaSfaSfaSfaSfaSfaSfaSjaSkaSjaSfaSlaSfaNeaQBaSmaSnaSoaSpaNeaQQaSqaISaISaLXaSraKCaSsaMaaMaaStaStaStaStaSuaIOaSvaSwaSxaSyaSyaSzaSyaSyaSxaSwaSAaIOaSBaSCaSCaSCaSCaSDaSDaSEaSFaRdaRcaIXaSGaSHaSHaSHaSHaSHaSHaSIaSJaSKaSLaSMaSNaSOaSPaSQaKNaKNaSRaSSaSTaSUaSVaSWaSWaSWaSXaSYaSXaSWaSWaSWaSWaKXaHQaSZaOzaRyaRzaOzaOzaTaaHQaTbaTcaTdaGtaHYaTeaTfaTgaThaTiaHYaTjaTkaGtaTlaTmaRMaTnaToaTpaafaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaTqaTraTsaTtaTuaTvaTwaTxaTyaTzaTxaTAaTBaTCaTDaTEaTFaTDaTGaTHaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIkaTPaTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeaUfaUgaUhaUeaUiaSfaSfaUjaSfaSfaSfaSfaUkaUlaSfaUmaISaUnaSraKCaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUuaUvaUwaUxaUyaUzaUAaUpaaaaaaaaaaaaaaaaaaaaaaUBaSFaRdaUCaUDaUEaUFaUGaUGaUGaUGaUHaUIaUJaUGaUGaUGaUKaULaUMaUNaUOaUPaUQaURaUSaUTaUUaSXaUVaUWaUXaUYaUZaVaaVbaVcaSWaKXaHQaVdaVdaRyaRzaVeaVeaVfaHQaHQaVgaHQaGtaVhaViaVjaVjaVjaVkaVlaGtaGtaGtaVmaVnaVoaVpaVqaVraafaafaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaVsaVtaVuaVvaDLaVwaVwaVxaVwaVwaVwaVyaVwaVwaVxaVwaVwaVzaVAaVBaVCaVDaVDaVDaVDaVDaVEaVFaVGaVHaIkaTQaTQaVIaTSaVJaTUaTUaTUaTUaTUaTYaVKaTUaTUaTUaUdaUeaVLaVMaVNaUeaUiaVOaVPaVQaVRaVSaUmaVTaVUaVVaVWaVXaVYaLXaSraKCaUoaaaaaaaaaaaaaUpaUpaUpaUpaVZaWaaWbaWcaWdaWeaWfaWgaWhaWiaWjaUpaUpaUpaUpaaaaaaaaaaaaaUBaSFaRdaRcaWkaSKaWlaWmaWnaSKaWoaWpaWqaWraWsaWtaWuaWvaPNaWwaWxaWyaWzaWAaWBaWBaWCaWDaWEaWFaWGaWHaWIaWJaWKaWLaWMaSWaKXaHQaSZaOzaRyaRzaOzaOzaOzaWNaWOaOzaWPaGtaWQaWRaTgaTgaTgaTiaHYaWSaGtaWTaVpaWUaWVaVpaWWaWXaWYaWYaWZaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaXaaRRaXbaRSaBJaBJaBJaXcaXdaXdaXdaXdaXdaXdaXdaXeaBJaBMaXfaXgaIkaXhaXiaXiaXiaXjaXkaIkaIkaIkaIkaTQaXlaXmaTSaXnaTUaTUaXoaXpaXqaXraXsaTUaTUaTUaXtaUeaXuaXvaXwaUeaUiaVOaXxaXyaXzaXAaUmaXBaVXaXCaXDaXEaXFaLXaSraKCaLZaSuaISaXGaUpaUpaXHaXIaXJaXKaXLaXLaWcaWgaXMaWcaWgaXLaXLaXNaXOaXPaXQaUpaUpaXGaIXaXRaXSaSFaRdaRcaIXaXTaWlaXUaWnaSKaXVaXWaSKaXXaXYaWnaSKaXZaOfaYaaYbaURaYcaYdaYeaYfaYgaYhaYiaYjaUWaYkaYlaWJaYmaWLaYnaSWaKXaHQaYoaYoaRyaRzaYpaOzaOzaYqaOzaYraYsaGtaHYaYtaYuaTgaYvaYwaYxaYyaYzaYAaYBaYCaVpaYDaYEaYFaYGaYHaYIaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaafaYKaYLaYMaYNaYOaYPaYPaYQaYRaYSaYTaYUaYVaYWbqBcGZcGvaZaaTSaZbaTUaTUaXoaXqaZcaZdaXoaTUaTUaZeaUdaUeaUeaUeaUeaUeaUiaVOaVOaVOaVOaVOaUmaZfaXDaZgaXDaXDaXFaLXaSraKCaNFaNFaZhaZiaZjaUpaZkaZlaZmaZnaZoaZpaZqaZraZsaZtaZuaZvaZwaZxaZmaZyaZzaUpaZAaZiaZBaZCaZDaSFaRdaRcaWkaSKaSKaSKaSKaSKaXVaZEaSKaXXaZFaWnaSKaXZaOfaZGaYbaURaZHaZIaZJaZKaYgaZLaZMaYjaUWaYkaYlaWJaYmaZNaZOaZPaZQaZPaZPaZPaZRaZSaZTaZUaOAaZVaZWaZXaZYaGtaZZbaababaTgbacbabaHYaHYbadbaeaVpbafaVpbagbahbaibajaWYbakaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJbalbambanbaobapbaqaYPbarbasbatbaubavbawbaxaYWcHacHHcHbbaBaTSbaCbaDbaEbaFbaGbaHbaIbaJbaJbaJbaKbaLaTSbaMbaNbaObaPbaQbaBbaRbaSbaBbmHaUmbaUbaVbaWbaXbaYbaZaLXbbabbbaLXbbcbbdbbebbfbbgbbhbbibbjbbkaUpaUpaUpaUpaUpbblaUpaUpaUpbbmbbjbbnbbobbpbbqbbrbbsbbtbbubbvbbwbbxaIXaUEaWlbbyaWnaSKbbzbbAbbBbbCaXUaWnaSKaXZbbDaUMaYbbbEbbFbbGaURaURaYgbbHbbIbbJbbKbbLaYlaWJbbMaWLbbNaZPbbObbPbbPbbQbbRbbSaRyaRyaRyaRyaRyaRyaRyaGtbbTaYtaYuaTgaYvaYuaHYbbUaGtbbVaVpbafaVpbagbbWbbXbbYaafaafaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJbbZbcabcbbccbcdbaqbasbasbasbasbasbcebasbcfaYWbrUcMrcMqbcibcibcibcibcjbcibckaTUbclbcmbcnbcnbcobcpaTSaXlbcqbcrbcsbctbcubcvbcwbcxbcxbcybcybcybcybcybczaISbcAbcBbcCbcDbcEbcFbcGbcHaUpbcIbcJbcKaUpaUpaaaaaaaafaafbcLaaaaaaaUpaUpbcMbcNbcIaUpbcHbcGbcObcPbcQbcRbcSaRcaWkaSKaSKaSKaSKaSKaGfbcTaSKbcUaSKaSKaSKaSKaSKbcVbcWbcXbcYaURaURaURbcZbdaaSWbdbbdcbddaYlaWJaYmaWLbdeaZPbdfbdgbdhbdibdjbdkbdjbdjbdjbdjbdjbdlbdmbdnbdobdpbdqbdrbdsbdtbdubdvbdwbdxaVpbafbdybagaVpbdzbbYaafaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJbdAbdBbanbdCbdDbaqaYPbdEbasbatbdFbcebasbdGaYWcMscMtbaAbcibdJbdKbdLbdMbcibdNbdObdPaTSbdQbdRbdSbdTaTSaXlbdUbdVbdVbdWbdVbdVbdVbdVbdXbdYbdYbdYbdZbdYbeaaISbebbecbedbeebeebeebeebeebeebefbegbefbeebehbehbehbehbehbeibehbehbehbejbejbekbejaUpaUpaUpbelbelbelbcRbcSaRcaIXbembenaDlbeoaSKbepbcTbeqberbesaSKaSKbetbeuaZPaZPaZPbevbewbewbewaZPaZPaZPbexbeybezbeAaWJaYmaYmbeBaZPbeCbeDbeEaZPbeFbeGbeHaZUbeIbeJbeKbeLaOzaGtaHYbeMbeNbeObeMbePaHYaHYaGtbeQaVpbafaVpbagbeRbeSbbYaafaafaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaafbeTbeUbeVbeWbeXaYPbeYbeZbfabdFbcebfbbfcaYWcMubfebaAbcibcibcibffbfgbcibfhbdObfiaTSbdQbdRbdSbfjaTSaXlbdUbdVbfkbflbgFbfnbgGbdVbfobfpbfqbfrbfsbfsbfsaISaLXbcBbcCbeebftbfubfvbfwbfxbfybfzbfAbeebehbfBbfCbfBbfDbfEbfBbfFbehbejbfGbfHbfIbfJbfKbfLbfMbfNbelbfObfPbfQaIXaZPaZPaZPaZPbfRbfSbfTbfUaZPaZPbfVaZPaZPaZPaZPbfWbfXbfYbfZbfZbfZbgabgbaZPbgcbgdbgebgfbggbggbggbghaZPbeCbeDbgiaZPaZPaZPaZPaZPaZPaZPaZPaZPaZPaZPbgjbgkbglbgmbgnbgjbgkaZPaRMbgoaVpbafaVpbagbahbgpbgqaWYbakaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaabgrbgsbgtbgubanbgvbgvbgvbgvbgvbgvbgwbgxbgvaYWaYWaYWaYWaYWbgyaYWaYWaYWbgzbgzbgAbcibdJbgBbffbgCbcibgDbgEbgDaTSbdQbdRbdSbfjaTSaXlbdUbdVbipbhmbgHbfmbgHbdVbfobgIbgJbgKbgLbgMbgNaISbgObgPbcCbgQbgRbgSbgTbgUbgUbgVbgWbgXbeebehbgYbgZbhabhbbhcbhdbhebehbejbhfbhgbhhbhibhjbhkbhlbiqbelbhnbhoaRcbhpbhqbhrbeDbeDbhsbeDbhtbeDbeDbeDbeDbhubeDbeDbeDbeDbhvbeDbeDbeDbeDbeDbeDbhrbeDbeDbhwbhxbhxbhybhxbhxbhzbhAbeDbhvbhBbhCbhubeDbhDbeDbeDbhEbhFbhGbhHbhIbeDbhJbeDbhKbeDbeDbhLbhMbhNaVpbafaVpbhObhPbhQbhRbhSbhTaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUaaaaafbhVaYLbhWbhXbhYbhZbiabibbicbhZbidbiebifbigbihbiibgAbcibcibcibijbfgbciaTSaTSaTSaTSbdQbikbilbimaTSbinbiobdVbirbjJbisbfmbiRbdVbfobitbgJbgKbgKbgKbiuaISbivaSrbcCbiwbixbiybizbiAbiBbiCbiDbiEbeebehbiFbiGbiHbiIbiHbhdbiJbehbejbiKbiLbiMbiNbiObiPbiQbjIbelbiSbiTbiUbiVbiWbiXbiYbiYbiZbjabjbbjcbjcbjcbjdbjcbjcbjcbjcbjcbjebjfbjfbjfbjgbiYbiYbiXbiYbiYbjhbjfbjfbjibjcbjjbjkbjlbjcbjmbiYbiYbiYbiYbiYbiYbiYbiYbiYbiYbiYbiYbiYbjnbjdbjobjcbjpbjqbjrbjsbjsbjtbjubagaWWbjvaWYaWYaWZaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbalbambjwbaobjxbgvbjybjybjzbjybjybjybjAbjBbjCbjDaXlbaAbcibdJbjEbjFbgCbcibaTbaTbaTaTSaTSaTSaTSbjGaTSbjHbdUbdVbjKbjJblpbfmblsbdVbjLbfsbjMbgKbgKbgKbjNaISbjOaSrbcCbjPbjQbgSbjRbjSbjTbjUbjVbjWbeebjXbjYbjZbiHbkabiHbgZbkbbkcbejbkdbkebkfbkgbkgcMHbkhbkibelbkjbkkbklbkmbknbkobbPbkpbkqbkrbksbktbkubkvbkwbkxbkxbkybeDbeDbeDbeDbeDbkzbkAbkBbeDbkCbkDbkEbkFbeDbkzbkGbkHbkIbhLbeDbeDbkJbeDbeDbkKbkLbeDbkzbeDbeDbeDbeDbeDbeDbeDbeDbeDbhvbeDbeDbhLbkMbkNbkObkPbkQbkRbkSbkTaafaaaaafaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbkUbkVbkWbkXbkYbgvbkZblablbblbblcbldbleblfblgblgblhblibcibcibcibffbljbcibaBbaBbaBbaBblkaXlaXlbllbcvblmblnblobltblqblrbmybmGbdVblubfsblvbgKblwbgKblxblyblzaSrbcCbeeblAblBblCblDblEblFblGbeebeebehblHblIblJblKblLblIblMbehbejbejblNblOblPblQbiMblRblSbelblTblUblVbelblWblWblWblWblWblWaZPaZPblXblYblZbmablYblXaZPaZPaZPaZPaZPaZPaZPaZPaZPaZPbmbaZPaZPaZPaZPaZPaZPbmcaZPbeDbeDbmdbmebmfblWblWblWblWblWbmgbmhbmhbmibmhbeDbmhbmibmjbmhbmkblWbmlbmlbmlbmmaRMbmnaRMaRMaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbdAbdBbjwbaobmobgvbmpbjybmqbmrbjybjybjybmsbmtbmubmubmvbcibdJbmwbffbmxbcibNXbmzbmAbmBbmCbmDbmDbmEbmDbmDbmFbdVbmJbmIbfnbnrbogblobmKbmLbmMbgKbgKbmNbmObmPblzaSrbmQbmRbmRbmRbmRbmRbmRbmRbmSbmRaafbehbgYbmTbmUbmVbmUbmWbmXbehaafbejbmYbmZbnabnbbiMbiQbncbelbcRaRdaRcbelbndbnebnfbngbnhbnibnjbnkbnlbnmbnnbnobnmbnpbnqbohbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDbnDbnEbnFbnGblWblWbnHblWbnIbnIblWbnJbnKbnLblWbnMbnNbnMblWbmgbmhbmkblWbnObnPbnOblWbnQbnRbnSbnTbnUbnVbnWaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUaaaaaabnXbnYbeVbnZbgvboabobbocbodboebofbjybqjbtCboibaRbmvbcibcibcibcibcibcibojbokbolbombonbqlbqlbqlbqlbqlbqlbdVboobdVbdVbdVbopbdVbfsboqbmMbgKbgKbgKborblyblzaSrbosbmRbotboubovbowboxboybozboyaafbehboAboBboCboDboEboFboGbehaafbejboHboIboJboKbiMbiQboLbelboMboNaRcboOboPboQboRboSboTboUboVboWboXboXboYboZbpabpabpbbpcbpdbpebpfbpgbphbnxbpibpjbpkbplbpmbpnbplbpobnFbnGbppbpqbprbpsbptbpubpvbpwbpxbpybpzbpAbpBbpCblWaZPbpDbpEblWbpFbpGbpHbpIbpJbpKbnSbpLbpMbpNbnWaaaaaaaaaaacaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaaaaDDaDDaDDaDDaDDaaaaDDaDDaDDaDDaDDaaaaaaaaaaaaaaabgrbgsbgtbgubdBbpObpObpObpPbpObpQbpRbpSbpTbgvbpUbjybpVbpWbpXbpYbpZbqabqbbqbbqbbqcbqdbqebqdbqdbqdbqdbqfbqgbqgbqhbqibqlbqnbqmbqpbqobqrbqqbrSbrMbrTbqsbqtbqubqubqvbqwbgKbgKbqxbfsaISblzbqybqzbqAbtRbqCbqCbqDbqEbqFbqGboyaafbehbehbehbehbqHbehbehbehbehaafbejbqIboIbqJbqKbqLbqMbqNbelbqOaRdaRcbelbqPbqQbqRbqSbqTbqUboVbqVbpabpabpabpabpabpabqWbqXbqYbpebqZbrabrbbnxbrcbrdbrebrfbpmbpnbplbrgbnFbnGbppbrhbribribrjbrkbrlbrmbrmbrmbrnbrmbrobrpbrqbrrbrsbrtbnSbrubpJbrvbrwbpJbrxbnSbrybrzbrAbnWaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaaaaDDaDDaDDaDDaDDaaaaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaaaaaabrBbrCbrDbrEbrFbrGbrGbrHbrIbrJbgvbrKbrLbvobrNbjybjybjybaBbrObrPbrQbrRbrQbrQbrQbrRbrQbaBbaBbqlbqlbqlbrVbqlbtzbtobtobtobtobtobrSbtAbtBbrWbrXbrYbrZbsabsbbscbsdbsebsfbsgbshbsibsjbskbslbsmbsnbsobspboybozboyaafbsqbsrbssbstbsubsvbssbswbsqaafbejbsxbsybsxbejbejbejbszbelbsAaRdaRcboOboPboQbsBbsCbsDbqUbsEbqVbsFbsGbsHbsIbsJbsKbqWbsLbnsbsMbsNbsObsPbnxbsQbrdbpkbplbpmbpnbplbpobnFbnGbppbsRbsSbsTbsUbprbsVbsWbsXbsYbsZbtabtbbtcbrqbtdbtebtfbnSbtgbthbtibtjbtkbtlbnSbtmbtnbyAbnWaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaaaaacaaaaaaaaaaaaaaaaaaaaabrBbtpbtqbtrbtsbtsbtsbttbtsbtsbgvbtubtvbtwbtxbjyaaaaaaaaaaafaafbtybtybtybtybtybtybtyaaaaaabtDbtFbtEbvbbtGbtobtobtobtobtobtobvmbvlbvnbtHbtIbtJbtKbtLbfsbfsbtMbfsbfsbtNbtObtPbtQbmRbNTbmRbmRbmRbmRbmRbtSbmRaafbtTbtUbtVbtWbtXbtWbtVbtYbtZaafbsxbuabubbucbudbuebsxbufaIXbugbbwbuhbelbuibnebujbukbulbumbunbuobupbuqburbusbutbuubuvbuwbnsbnxbuxbuybuzbnxbuAbuBbuCbuDbuEbuEbuFbuGbnFbuHbppbuIbprbprbsUbuJbuKbuLbuMbuNbuObuPbuQbuRbrqbuSbuTbuUbnSbuVbuWbuXasGbpJbuYbnSbuZbvabRqbnWaaaaaaaaaaaabvcaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeTbvdbvebvfbpObvgbgrbgsbvhbvgbgvbvibjybvjbvkbjyaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaabvpbvqbtobvsbvrbvrbvrbvrbvrbwSbwRbvrbwTbwUbvtbvubvvbvwbvxbfsbvybgKbvzbvAbvBbvCbvDbvEbmRbmRbmRbvFbvGbvHbvIbvJbvKaafbvLbvMbvNbvObvPbvQbvRbvSbvLaafbsxbvTbvUbvVbejbvWbsxbvXaIXbvYbcSbvZbelbwabwbbwcbwdbwebumbwfbwgbwhbwibwjbwjbwkbwlbwmbwnbwobwpbwqbwrbwpbwpbwpbwpbwsbwpbwpbwtbwtbwtbwtbnGbppbsRbsSbsTbwubwvbwwbwxbwybwybwybtabwzbwAbwBbwCbwDbwEbnSbwFbwGbwHbwIbpJbwJbnSbwKbwLbnWbnWaaaaaaaaaaaaaafbwMbwNbwObwNbwObwNbwPaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybwVbwXbwWbwYbtobyqbtobyxbyxbyxbyybyzbtAbtobtobtBbwZbxabxbbxcbxdbxebxfbgKbgKbxgbxhbvCbvDbxibxjbxkbxlbxmbxnbxobxpbxqbvKaafbxrbxsbxtbxubxvbxwbxxbxybxraafbsxbxzbxAbxBbejbxCbsxbufaIXbxDbcSaRcbelbxEbxFbxGbxHbxIbxJbxKbxLbxJbxMbxNbxObxMbwpbxPbxQbwpbwpbxRbxSbxTbxUbxVbxWbxXbxYbxZbwtbyabybbwtbnGbppbycbribribydbyebpvbyfbwybwybwybtabwzbygbwCbyhbyibyjbwCbykbylbymbynasHbyobnSbypbSLbnWaaaaaaaaaaaaaaaaafbyrbysbytbyubyvbywbyraafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybyBbyCbyBbzZbzYbyqbtobtobtobAabtobyzbtAbAbbqlbqlbyDbgKbrXbxcbyEbyFbyGbyHbyHbyIbyJbyKbyLbyMbvBbyNbyObyPbxpbyQbyRbySbvKaafbxrbxrbxrbxrbyTbxrbxrbxrbxraafbyUbyUbyUbyUbyUbyUbyUbyVbelbyWblUblVbelbyXbyYbyYbyZbzabxJbzbbzcbzdbzebzfbzgbzhbwrbzibzjbzkbzlbzmbznbznbzobzpbznbzqbzrbzsbztbzubzvbzwbzxbzybzzbzAbzBbzCbzDbpvbzEbpybpybzFbtabwzbzGbzHbzIbzJbzKbzHbzLbzMbzNbzObzPbwCbwCbzQbnWbnWbzRbzSbzSbzSbzTbzUbzVbzWbytbyvbytbzXbwOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtybtybtybtybtybtybtybAcbAdbAcbBPbtobyqbtobBRbBQbBRbBRbyzbtAbDdbBSbqlbAebgKbrXbAfbAgbAhbAibgKblwbgKbAjbAkbAlbAmbAnbyNbAobApbxpbxpbxpbAqbvKbArbArbAsbArbAtbAubAvbAwbAxbAwbAwbyUbAybAzbAAbABbACbADbAEbelbAFaRdaRcbelbAGbAHbAIbAJbAKbALbAMbANbAObAPbAQbARbASbATbAUbAVbAWbAXbAYbAWbAZbBabBbbBcbBdbBebBfbBgbBhbBibztbBjbppbBkbBlbBmbBnbBnbpvbBobBpbBqbpvbBrbBsbBtbBubBvbBwbBxbBybBzbBzbBAbBBbBCbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbyrbyvbytbyvbyvbBObyraafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybDebwXbDfbDgbtobyqbtobtobtobtobtobyzbtAbDdbEIbqlbBTbgKbBUbBVbgKbBWbgJbgKbgKbBXbvBbvCbAlbAmbAnbyNbvKbBYbBZbCabBZbCbbvKbCcbCdbCebCfbCgbChbCibCjbCkbClbCmbyUbCnbCobCpbCqbCrbCrbCsbCtbAFaRdaRcbelbCubCvbCvbyZbCwbxJbCxbCybxJbCzbCAbCAbCBbwpbCCbCDbwpbwpbwpbwpbwpbwpbCEbwpbwpbwrbCFbwtbwtbwtbwtbCGbppbwCbzHbzHbzHbzHbzHbzHbzHbzHbzHbzPbCHbCIbCJbBvbCKbCLbCMbCNbCNbCNbCObCPbCQbCRbCSbCTbCUbCVbCWbCXbCWbCYbCZbDabwNbwObDbbwObwNbDcaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybAcbAdbAcbEKbEJbELbtobtobtobEJbtobyzbtAbDdbEMbqlbDhbgKbrXbxcbgKbDibDjbgKbgKbDkbxhbvCbAlbDlbxhbDmbvKbDnbDobDpbDqbxqbvKbDrbDsbDtbArbDubDubDubAwbDvbDwbDxbyUbDybDzbDzbDAbDBbDCbDDbelbDEbDFbDGbelbDHbDIbDJbDKbDLbDMbDNbDObzdbDPbDQbCAbDRbwrbDSbDTbwrbDUbDVbDWbDXbDYbDZbEabEbbEcbEdbEebEfbEgbEbbEhbEibEjbEkbElbEmbEmbEnbEobEpbEqbErbEsbEtbEubEvbEwbExbCLbEybEzbEAbwCbwCbwCbwCbwCbEBbECbEDbzRbzTbzUbEEbEFbzUbzRbzSbzTbEGbzUbEHaafbvcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybENbEObENbEQbEPbGvbGvbGvbGvbGvbGwbGybGxbDdbGzbqlbERbESbETbEUbEVbEWbEXbEYbEZbFabtNbFbbAlbFcbFdbyNbvKbFebFfbFgbBZbFhbvKbFibFjbFkbAraaaaaaaaabAwbFlbFmbFnbyUbFobFpbFqbFrbDBbDCbFsbelbxDaRdaRcbFtbFubFvbFwbFxbFybFzbFAbFBbxJbxMbxMbFCbxMbwpbFDbFEbFFbFGbFHbFIbDXbFJbDZbFKbFLbFMbEdbFNbFObFPbFQbFRbEmbFSbEkbFTbEmbEmbFUbFVbFWbFVbFVbFXbFYbFZbGabGbbGcbCLbGdbGebGfbGgbGhbGibGjbGkbGlbGmbGnaafaafbzUbGobGpbGpbGqbGrbGsbGtbGuaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybGAbGCbGBbqlbqlbKqbwXbwXbwXbKMbqlbqlbKNbNSbKObqlbGDbGDbGDbGEbGDbFabGFbGGbGHbGIbtNbvCbAlbGJbGKbtNbGLbGLbGLbGLbGLbGMbGLbGLbGLbGNbGLbGLbGLbGLbGLbGObGLbGLbGLbGLbGLbGLbGLbelbelbelbelbxDaRdaRcbFtbGPbFvbGQbGRbGSbGTbGUbGVbGWbGXbGYbCAbGZbHabHbbHcbHdbHebHfbHgbHhbHibHjbHkbHlbHmbHnbHobHpbHqbEbbHrbHsbwCbwCbwCbwCbwCbHtbwCbwCbwCbzHbHubzHbzHbHvbBvbHwbCLbGdbHxbHybHzbHAbHBbHCbGkbGlbGmbHDaaaaaabzUbHEbHFbEEbBLbHGbHHbHIbzUaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHJaafaaaaaaaaaaaabGDbHKbHLbHMbHNbHObHPbHQbHRbHSbtNbvCbAlbAmbAkbHTbHUbHVbHWbHXbHYbHZbIabIbbIcbIdbIebIfbAkbAkbIgbIhbIibAkbIjbAkbIkbHXbIlbImbInbIobIpbxDaRdbDGaIXbDHbIqbDHbIrbIsbxJbItbIubIvbIwbIxbIybIzbIAbIBbICbwrbIDbIEbIFbDXbIGbIHbIIbIJbIKbFObILbIMbINbEbbIObIPbIQbIRbISbITbIUbIVbIWbIXbIYbIZbJabJbbJcbzHbJdbHwbCLbJebJfbJgbJhbJibJjbJkbGkbGlbJlbEDbEDbEDbzUbzUbzUbJmbJnbzUbzUbHGbzUaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaaaaaaaaaaaaaabJoaaaaaaaaaaaaaaaaaaaaaaaaaaabGDbJpbJqbJrbJsbJtbJubJvbJwbJxbtNbvCbJybJzbJAbJAbJBbJCbJDbJEbJFbJCbJBbJAbJAbJGbJHbJIbJJbJKbJLbJMbJAbJAbJNbJCbJDbJEbJFbJObJPbJQbJPbJRbJSbvZaIXbJTbJUbJVbJWbJXbJYbDNbJZbKabKbbxMbKcbKdbKebDSbKfbwpbKgbKhbKibDXbKjbKkbKlbKmbKnbFObKobIMbKnbEbbKpbWlbIQbKrbKsbKtbKubKvbKwbKxbIYbKybKzbKAbKAbzHbKBbKCbKDbKEbKFbKGbKHbKIbKJbKKbGkbGlbKLbEDcbAcbGcbBbEDaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKPbKQbKQbKRbKSbKSbKTbKTbKTbKTbKUaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtyaaaaaaaaaaaaaaaaaaaaaaaabKVbKWbKXbKWbKYaaaaaaaaabGDbGDbKZbLabJrbLabLbbLcbLdbLebLfbtNbLgbvCbLhbLibAkbLjbAkbAjbHXbIlbAkbLkbLlbLmbLnbLobAmbAkbLpbLqbIbbLrbIbbIbbLsbLtbLubLvbLwbLxbcSbLyaRcaRcaRcaIXbLzbFwbFybLAbLBbLCbLDbLEbLFbLGbLHbLIbLJbLKbDSbICbLLbLMbLNbDXbDXbLObLObLObEbbLPbLQbLRbLSbLTbEbbLUbLVbIQbLWbLXbITbLYbLZbMabMbbIYbMcbMdbKAbKAbzHbMebMfbCLbwCbMgbMhbMibMjbMkbMlbGkbMmbMnbMobMobMobMpbGnaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbMqbMrbMsbMrbKSbKTbKTbMtbMubMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMvbMwbMxbMybMvbMzbMAbMBbGDbMCbMDbMEbMFbMGbMHbMIbMJbMJbMKbtNbtNbtNbMLbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbMMbMNbMObtNbtNbtNbtNbtNbMPbtNbtNbtNaIXaIXbMQaIXaKGaMcbMRaIXbMSbMTbMUbJWbMVbxJbDNbMWbxJbMXbMYbMZbNabwpbNbbNcbNdbNebNfbNgbNhbNibNjbNkbIMbKnbFObFObNlbKnbEbbNmbNnbNnbNnbNnbNnbNnbNnbNnbNnbNnbNobNpbNqbNqbzHbNrbNsbNtbwCbNubNubNubNvbNwbNxbNubNubNubNubNubNubNybNzbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNAbNBbMrbMrbNCbKTbKTbMtbMtbNDbMtbMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKXbNEbNFbNEbKXbNGbNHbNIbNJbNKbNLbLabNMbNNbFabNObNPbNQbNRbFacdyccRbNUbNVaaaaaaaaaaaabNWcqvbNYbNZbOabObbOcbOdbOebOfbOgbOdbOhbOibOjbOkbOlbOmbPPbOobOpbOqbOrbOsbOsbOsbOsbDHbDHbDHbDHbOtbOtbxJbOubOvbOwbMYbOxbOybOzbOAbOBbOCbODbOEbOFbOGbOHbOIbNjbOJbFObFObOKbKnbKnbOJbEbbNmbNnbOLbOMbONbOObOPbOQbORbOSbNnbOTbOUbOVbOVbzHbOWbOXbCLbzPbOYbOZbPabPbbPcbPdbPebPfbPgbPhbPibNubPjbEDbPkbPkbPkbPkbPkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabPlbKTbNBbKTbKTbMtbMtbMtbMtbMtbMtbMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMvbNEbNEbNEbPmbPnbLabPobPpbPqbLabPrbPsbPtbFabFabFabFabFabFabPubPvbPwbPxaaabPybPzbPzbPAbPBbPCbPDbPEbPCbPFbOdbPGbPHbPIbOdbPJbPKbPLbPMbPNbPObPPbPQbPQbOqbPRbPSbPTbPUbPVbDHbPWbPXbPYbJWbJWbPZbDNbQabxJbQbbQcbQdbQebwpbQfbQgbwpbQhbQibQjbQkbQlbNjbEbbEbbEbbEbbEbbEbbEbbEbbBjbNnbQmbQnbQobONbONbONbONbQpbNnbQqbMdbQrbQrbzHbBvbMfbCLbQsbQtbQtbQubQvbQwbQxbQybQzbQAbQzbQBbNubQCbQDbPkbQEbQFbQGbQHaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKSbKTbQIbQJbQJbMtbMtbMtbMtbMtbMtbMtbMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKXbNFbNFbNFbKXbQKbQLbQMbQNbQObLabLabQPbQQbQRbQSbQSbQSbQSbQSbQSbQTbQUbQVaaabQWbQXbQYbQZbRabPCbRbbRcbRdbPCbOdbRebRfbRgbOdbRhbOnbRjbRkbRlbRmbRnbPQbRobPUbRpbOsbPUbPUcgBbDHbRrbJWbRsbRtbJWbRubDNbRvbRwbRxbRybRzbRAbRBbDSbICbRCbQhbQjbQjbQkbRDbNjbREbRFbRGbRHbRIbRJbRKbRLbBjbNnbONbONbRMbONasIbONbONbRNbNnbRObMdbRPbRPbzHbMebRQbRRbRSbRTbRUbRVbRWbRXbRYbRZbSabSbbScbSdbSebSfbSgbShbSibSjbQGbSkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbKTbSlbMtbMtbMtbMtbMtbMtbMtbMtbMtbMtbMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabMvbSmbSnbSobMvbSpbMAbMBbGDbGDbSqbSqbSqbGDbGDbNVbSrbSrbSsbSsbSsbSsbNUbQVaaabStbSubSvbSwbSxbSybSzbSAbSBbSBbSCbSDbSEbSFbOdbPQbPQbPQbPQbPQbSGbPQbPQbSHbSIbSJbOsbPUbSKcntbDHbSMaExbVUbSNbSObRubSPbSQbSRbSSbSTbSUbSVbSWbFDbSXbSYbSZbTabTbbTcbTdbNjbTebTfbTgbRHbThbTibTjbRLbBjbNnbNnbNnbRMbONbONbONbNnbNnbNnbTkbTlbRPbRPbzHbTmbMfbCLbzPbTnbTobTpbQxbTqbTrbTsbTtbTubTvbTwbNubQCbTxbPkbTybTzbTAbTBaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKTbMtbMtbMtbMtbMtbMtbTCbMtbTDbMtbMtbMtbMtbMtbKTbKTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTEbKWbTFbKWbTGbTHaafaaaaaabGDbTIbTJbTKbGDaaabNVbTLbTMbTNbTObTObTObTPbQVaaabQWbTQbTRbTSbTTbPCbTUbTVbTWbTXbOdbTYbTZbUabUbbUcbUcbUcbUdbUdbUebUfbUgbPUbPUbUhbOsbOsbOsbOsbDHbDHbUibUjbUkbDHbUlbUmbUnbUobUpbUlbOwbUqbUrbUsbUtbUlbNjbNjbNjbNjbNjbNjbUubUvbUwbRHbUxbUybUzbRLbBjbNnbUAbUBbUCbUDbUEbUFbUGbUAbUHbUIbUJbJbbJcbzHbJdbMfbUKbwCbNubNubULbUMbNubNubNubNubUNbUObPibNubUPbUQbPkbURbUSbUTbPkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbUUbUUbUUbUUbUUbUUbUVbMtbUWbUUbTDbMtbMtbMtbMtbKTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUXbNVbNVbNVbNVbSsbUYbNUbUZaaabVabPzbPzbVbbVcbPCbPCbVdbPCbVebOdbVfbVgbVhbOdbVibVibVibVibVibVibVibVibVjbVkbVlbVmbVmbVnbOsbDHbVobVpbVqbVrbVsbVtbVubVvbVwbVxbVybVubVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbRHbVNbVObVNbRLbBjbNnbVPbVQbVRbVSbVTcfmbVVbVWbUHbzHbVXbzHbzHbVYbCNbMfbCNbVZaafbWabWbbWcbWdbWebWfbWgbWhbWibWjbNubWkcrXbPkbWmbWnbWobWpaaMaaMaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWqbMrbMrbMrbMrbMrbMrbMrbWrbMubMtbMtbMtbMtbWsbMubKUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWtbWubWubWvbWwbNVbWxbSsbWybNVaaaaaaaaaaaabNWbWzbWAbWBbWCbWDbPCbOdbWEbWFbOgbOdbVibWGbWHbWIbWJbWKbWLbVibWMbWMbWMbWMbWMbUhbWNbWObWPbWQbWRbWSbWTbWUbWVbWWbWXbWYbWXbWZbWXbXabXbbXcbXdbXebXfbXebXgbXhbXibXjbXkbXlbXmbXnbXobXpbXqbXrbNnbXsbXtbXubXvbXwbXxbXvbXvbXybXzbCKbXAbXBbCNbCNbMfbCNbXCaafbWabXDbXDbXEbXFbXGbXHbXIbXJbXKbNubWkbXLbPkbPkbPkbPkbPkaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbQJbQJbQJbQJbQJbQJbXMbMtbQIbQJbXNbMtbMtbMtbMtbKTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXObXPbXQbXRbSsbXSbXTbXUbXVbNVaaLaaaaaaaaabNWbNWbNWbNWbNWbNWbNWbOdbXWbXXbXYbOdbVibXZbYabYbbYbbYabYcbVibYdbYebYebYfbWMbYgbDHbDHbYhbYibYjbYkbYlbYmbYnbYobYpbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbYCbYDbYEbYFbYGbYHbYIbYJbYKbnFbYLbIPbYMbYNbYObYPbYQbYRbYSbYTbYUbYVbYWbBzbYXbYYbBzbYZbZabZbaafbWabZcbZdbZebWebZfbZgbZhbZibZjbNubWkbZkalqakGannbUQaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKTbMtbMtbMtbMtbMtbMtbTCbMtbXNbMtbMtbMtbMtbMtbKTbKTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZmbWubWubWvbZnbZobZpbNVbZqbNVbZrbZsbZtbZrbZrbZubZvbZwbZxbZybZzbZAbZBbZCbZDbZEbZFbYabZGbZHbZIbZJbZKbZLbZMbZNbZObZPbWMbZQbOqbZRbZSbZTbZUbZUbZVbZWbZXbZYbUlbUlbZZcaabUlbUlcabcaccadcaecafcagcahcaicajcaicakcalcamcalcakcanbnFbNmbIPcaocapcaqcarcascatcaubNnbNnbwCbwCbwCbwCbwCcavcawcaxbwCbNubNubNubNubNubNubNubNubNubNubNubNucaycazaCFaqvaDTbUQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbKTbSlbMtbMtbMtbMtbMtbMtbMtbMtbMtbMtbMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamcaBaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaacaCcaDcaDcaDcaEcaDcaDcaFcaGbZrcaHcaIbZrcaJcaKcaLcaMcaNcaOcaPcaQcaRcaScaTcaUcaVbYabZGcaWcaXbZJcaYbVibWMbWMbWMbWMbWMcaZbOqbDHcbacbbcbccbdcbecbfcbgcbhbUlcbicbjcbkcblcbmcbncbocbpcaecahcagcbqcaicbrcbscakcbtcbucbvcakcbwbnFbBjbIPcbxcbycbzcbxcbxbIPbIPbIPcFkcGucbCcbDcbEbwCbwCcbFbwCbwCcKNcbHcbIcbJcbKcbLcbMcbNcbOcbPcbQcbRcbScbTbUQbUQbUQbUQaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKSbKTbUWbUUbUUbMtbMtbMtbMtbMtbMtbMtbMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbUcbVcbWcbXcbYcbZccaccbcccbZrccdccebZrbZrccfccgcchcciccjcckcclbZBbZCbZDccmccnbYabYaccoccpbYaccqbViccrccsbWMcctbWMbUhccuccuccuccuccuccuccubUlccvccwbUlccxccycczccAcbmccBccCccDcaecahcagccEcaiccFccGcakccHccIccJcakccKbnFccLccMccNccOccPccQccNctcccSccTccUccVccWccXccUccYccZcdacdbcdccddcdecdfcdgcdhcdicdjcdhcdkcdlcdmcdncdocdpcdqcdrbUQbUQbUQbUQaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabPlbKTbNBbKTbKTbMtbMtbMtbMtbMtbMtbMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcdscdscbWcdtcducbZcdvcdwcdxbZrcufcdzcdAcdBcdCcdDcdEcdFcdGcdHcdIcdJcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYbWMbUhccucdZceacebceccedceecefcegcehceicejcekcelcemcbmcenceocepcaecahcagceqcaicercescakcetceucevcakcewbnFbnFcexccNceycezceAccNceBceCceDceEceEceFceGceEceHceIceJceKceHceLceMceNceOceLceLceLceLcePceNceOceLceLceQceRceSceTceUceVceWceXceYceYceYceYceYceYceYceYceYceYceYceYceYceYceYceYceZcfacfacfbbKTbKTbMtbMtcfcbMtbMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfdcfdcfdcfdcfdcfdcfdcfecffbZrbZrbZrbZrbZrcfgcfhcficficficfjcfkbZBbZCbZDcflbZFcfpcfncfocMocfqcfrbVicfscftcfucftbWMbUhccucfvcfwcfwcfwcfxcfybUlcfzcfAbUlccxcczcfBccAcbmcfCcfDcfEcaecahcagcfFcaicfGcfHcakcakcakcakcakcfIcfJbnFcexccNcfKcfLccNccNceBcfMceDceEcfNcfOcfOcfPceHcfQcfRcfSceHcfTcfUcfUcfUcfVcfWcfXcfYcfZcgacgbcgcceLcgdcgecgfbUQbUQbUQbUQaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcggcghcgibNCbKSbKTbKTbMtbMubMtbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcfdcgjcgkcglcgmcgncfdcgocgpcgqcgrcgscgtcgucgucgvcgwcgwcgxcgycclbZBbZCbZDcgzcaVcgAcurcgCcgDcgEcgFbVicftcftbWMcgGbWMbUhccucgHcgIcgIcgIcgJccucgKcgLcgMcgKcgNcgOcgPcgQcbmcgRcfDcgScaecgTcgUcgVcaicgWcgXcaicgYbLVbVJcgZchachbbnFchcchdchdchechfchfchfchfchgceEchhchichichjchkchlchmchnchochpchqchqchqchrchschschtchuchvchwchxceLchychzchAchyaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafchBbKQbKQbKRbKSbKSbKTbKTbKTbKTbKUaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafchCchCchCchCchCchCchCchCchCchCchCchCchCaaaaaachDchEchFchFchGchHcfdchIchJchKchLchMchNchOchPchQchRchSchTchUchVchWchXchYchZbVibVibVibVibVibVibVibViciacibbWMcicbWMbUhccuccucidciecifccuccucigcihciicgKcbmcbmcbmcbmcbmcaecijcikcaecilcimcilcaicinciocaicipceBbVJciqbVJcirbnFcisbnFbnFcitciuciuciucivbnFceEciwcixcixciycizciAciBciCciDciEciFciFciFciFciGciHciFciIciFciJciKceLciLciMciNchyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCciOciPciOchCciQciRciQchCciSciTciSchCaaaaaaciUchEchFchGchGciVcfdciWciXciYciZcjacjbcjccjdcjecjfcjfcjgcjfcclbZBcjhbZDcjicjjcjkcjlcjmcjlcjncjocjpcjpcjqcjqcjqcjqbUhcjrcjscjtcjtcjucjvcjwcjxcjycjzcjAcjBcjCcjDcjDcjEcjFcaecaecaecjGcjHcjIcaicaicaicaiceBceBbVJcjJbVJcjKbnFcisbnFaaaaaaaaaaaaaaaaaaaaaceEcjLcjMcjNcjOcjPcjQcjRcjScjTcjUcjVcjUcjUcjWcjXcjYchscjZchsckackbceLckcckdckechyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCciOckfciOchCciQckgciQchCciSckhciSchCaaaaaaciUchFchGchGchGckickjckkcklciYckmcknckockpckqckrckscktckuckvcclbZBckwchYckxckyckzckAckAckAckBckCckDckEckFckGckHcjqbUhcjrckIcjtckJckKckLckMckNckOckPckQckRckSckTcjDckUcjFckVckWckXckYckZclaclbclcclccldclcclebVJbVJbVJbVJbnFcisbnFaaaaaaaaaaaaaaaaaaaaaceEclfclgclhclicljceHclkceHcllclmclnclocloclpchschsclqclrcloclscltceLcluclvclwchyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCclxclyclzchCclAclBclCchCclDclEclFchCaaaaafciUclGchFchGchGchGcfdclHclIciYciYclJciYciYciYciYclKcjfclLclMcclclNclOclPclQclRclSclTclTclTclUclVclVclWcjqclXclYclZcmacjrcmbcjtcmccmdcmecmfcmgcmhcmicmjcmkcmlcmmcjDcmncjFcmocmpcmqcmrcmscmtcmqcmucmvcmwbnFcmxclcclcclcclcclccmybnFaaaaaaaaaaaaaaaaaaaaaceEcmzcmAcmBcmCceHcmDcmEcmFceLcmGcmHcmHcmHcmIcmJcmKcmLcmMcmHcmHcmNceLcmOcmPcmQcmRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafchCcmScmTcmUchCcmVcmTcmWchCcmVcmTcmWchCaaaaafcmXchFchFchGchGcmYcfdcmZcnacnbcnccndcnecnfcnfcngcnhcnfcnicnjcclcnkcnlcnmcnncjjcnocnocnpclVcnqcnscnrcMDcjqcnucnvcnwcnxcjrcnycjtcnzcnAcnBcjrcnCcnDcnEcjFcnFcnGcnHcjDcnIcjFcnJcnKcmqcnLcnMcnLcmqaaaaaaaaabnFbnFbnFcnNcmvcmvcmwbnFbnFaaaaaaaaaaaaceHceHceHceHceHceHceHceHceHcnOcnPcnQceLceLcnRcnScnTceLceLceLceLcnUcnScnTceLceLcnVcnWcnVaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBaafaafaafaaaaafcnXaafcnXaafcnYaafcnZaafcnYaafcnZaafaafaaacfdcoacobchGchGcoccodcoecofcogcohcoicojcojcokcojcolcomconcolcoocopcoqcorcoscotcotcotcotcoucovcowcowcowcoxcoxcoxcoxcoycjrcozcoAcnzcoBcoCcjrcnCcnDcoDcjFcoEcoFcnHcoGcoHcjFcnJcnKcmqcoIcoJcoKcmqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaceHcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcoVceHaaMaafaafaafaafaaaaaaaaacoWaaaaaaaaaaafcoXcoYcoXaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcoZcpacpbcpccpdcpecpfcpccpgcphcpfcpicpjcpkcplcogcogcogcogcogcogcogcogcpmcpncpocppcpqcprcpscptcpucolcpvcpwcpxcolcpycpzcpAcotcpBcpCcpDcpEcpFcpGcpHcpIcpIcpJcpKcpKcpHcpLcjrcjrcpMcpNcjrcjrcjrcpOcnDcpPcjFcjFcjFcpQcpRcjFcjFcnJcpScmqcpTcpUcpTcmqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafceHcpVcpWcpVcpXcpYcpZcqacoScoScqbcoSceHceHaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacqcaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaaaaaaaafcqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncqocqpcqqcqicqrcqscqtcqucybcqwcqxcqycqzcqAcqBcqCcqDcqEcqFcqGcqHcqIcqJcqKcqLcqMcpycqNcqOcotcpFcpFcpFcpFcpFcqPcpHcqQcqQcqQcpKcpKcpHbUhcqRcjrcqScqTcqUcqVcjrcqWcnDcqXcjFcqYcqZcracrbcjFcrccnJcpScmqcrdcrecrfcmqaaaaaaaaaaaaaaaaaacrgcrhcricrjcrgaafaaaaaaaaaaaaceHcpVcpVcpVcrkcrlcrmcrncrocrpcrqcrrcrsceHaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacrtaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcrucrvcrwcrxcrycqicrzcqicrAcrvcrzcqicrAcrvcqicqicqicqicqicrBcqicqicqicrCcrDcrEcrFcrGcqEcrHcrIcrJcrKcrLcrMcrNcrOcpycqNcrPcotcrQcpFcpFcrRcpFcrScpHcrTcrUcrVcMOcrWcpHbUhcKOcjrcrYcrZcsacsbcsccsdcsecsfcsgcshcsicsjcskcjFcslcsmcsncsocrgcspcrgcsoaaaaaaaafaaaaaaaaacrgcsqcsrcsscrgaafaafaaaaaaaaaceHcoScoScoScoScstcpZcsucsucsucnPcsucsvceHaaaaaaaaaaaaaaacswcswcswcaBaafaafaafaafcsxaafaafaafaafaafaaqcswcswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcqdcqicrFcqicrFcqicrzcqicsycszcsAcszcsBcszcszcsCcsDcqicqicsEcsFcsFcsFcsGcsHcsIcsIcsJcqEcsKcsLcsMcolcsNcsOcsPcolcsQcsRcsScsTcsUcsVcsWcsXcpFcsYcpHcsZcrUctacrUctbcpHbUhcMpcjrctdctectfctgcjrcgKcthcgKcjFctictjctkctlcjFctmcsncsncrgctnctoctpcrgcrgcrgcrgcrgcrgcrgcrgctqctrctscrgcrgcrgcsoaaaaaaceHcoLcoMcoNcttctucrmcsucsucsucnPcsuctvceHaaaaaaaaaaaaaaacswaaaaafaaaaafaaaaaaaaactwaaaaafaafaaaaaaaaaaaacswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacqdcqicrFcqictxctyctzctActBctCcsAcszctDcszcszctEctFctGctHctIctJctKctLctLctMcrFcrFctNctOctPctQcojcolctRcolcolcolctSctTcsSctUctVctWctXctYcpFctZcpHcuacrUctacrUcubcpHcuccudcjrcjrcuecjrcjrcjrcMEcugcuhcjFcjFcjFcuicjFcjFctmcsnaaacrgcujcukculcumcuncuocupcuqbRicuscrgcutcuucutcrgcuvcuwcrgaafaafceHcpVcpVcpVcuxcpYcuycuzcuAcuBcuCcsucuDceHceHceHceHaaaaaacswaaacuEcuEcuEcuEcuEaafctwaafcuEcuEcuEcuEcuEaaacswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqdcqictxctyctyctyctzctyctyctyctzctyctyctyctyctycuGcuHctycuIctycuJctyctyctycuKcuLcuMcuNcqicuOcuPcuQcuRcuScuTcuUcuScuVcuWcuXcuYcuZcuZcvacuZcvbcvccvdcvecvfcvgcvgcpHcvhcvicvjcvkcvkcvlcvmcvncvocvocvocvocvpcvocvocvocvqcsmcsnaaacumcvrcvscvtcumcvucvvcvwcvwcvxcvycvwcvwcvzcvwcutcvAcvwcrgaaaaaaceHcpVcpVcpVcttcvBcvCcvDcvEcvFcvGcsucsucvHcvIcvJceHaafaafcswaafcvKcvLcvLcvLcvLcvMctwcvNcvOcvOcvOcvOcvPaafcswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqdcqicqicvQcqicqicrzcqicqicqicrzcqicvQcqicqicqicrAcqicqicrGcvQcvRcqicvScvTcvUcvVcvWcvXcvYcvXcvZcwacwbcwccwdcwacwacwecwfcoucwgcpFcwhcwicpFcpFcwjcwkcwkcwlcvgcvgcpHbPUcwmcwncwncwncwncwocwncwncwncwncnKcwpcsncsncsncsncsncsnaaacumcumcwqcumcumcwrcwscwtcwucwvcwwcwxcwycwzcwAcwBcwCcwDcrgaaaaaaceHcoScoScoScoScwEcpZcvDcwFcwGcwHcsucsucwIcsucwJceHaaaaaacswaafcwKcwKcwKcwKcwKaaactwaaacwKcwKcwKcwKcwKaafcswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaacaBaaaaaaaaaaaacqdcqicqicwLcqicqicrzcqicqicqicrzcqicwLcqicqicqicrAcqicqicrGcwLcwMcqicqicwMcwMcwNcqicqicwOcwPcwQcwQcwQcwQcwRcwScpycwTcwUcsTcwVcpFcwWcwicpFcwXcpHcwYcwkcwZcxacxbcpHcxccxdcwncxecxfcxgcxhcxicxjcxkcwncnKcxlcsnaaaaaaaaaaaaaaaaaacrgcxmcxncxocxpcxqcxrcxscxtcxucxvcxwcxxcxycxzcxAcvwcxBcrgaaaaaaceHcoLcoMcoNcxCctucvCcxDcxEcxEcxFcxGcxHcxIcxJcxKceHaaaaaacswaaaaafaaaaafaafaafaaactwaaaaafaaaaafaaaaafaaacswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqdcqicqicuNcqicqicxLcqicqicqicxLcqicuNcqicqicqicrAcqicqicxMcxNcxOcxPcxPcxOcxQcxOcxRcxScxTcxPcxUcxVcxWcxXcxYcwScpycxZcpycyacMPcpFcpFcyccpFcydcpHcyecyecyfcxacxbcpHbPUcxdcwncygcyhcyicyjcykcyjcylcwncymcyncsnaaaaaaaaaaaaaaaaaacrgcyocypcyqcyrcyscytcyucyvcywcyxcyycyzcywcyAcrgcrgcrgcrgaaaaaaceHcpVcpWcpVcyBcpYcpZcsucsucyCcyDcsucyEcoScoScoSceHaaaaaacswaaacuEcuEcuEcuEcuEaafctwaafcuEcuEcuEcuEcuEaafcswaaacyFaaaaaacyFaaaaaaaaacyFaaaaaaaaaaaaaaacyFaaaaaaaaacyFaaaaaacyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacqdcqicyGcyHcyHcyIcyJcyHcyIcyHcyKcyLcsFcsFcyMcsFcyNcsFcsFcsGcyOcwMcqicqicyPcyQcyRcyScyTcyUcqicyVcyWcyXcyXcyYcyZcpycxZczacotczbcpFczccpFczdczecpHcpHcpHcpHcpHcpHcpHbPUcxdcwnczfczgcyhczhcyhcyjczicwncsnczjcsnaaaaaaaaaaaaaaaaaacrgcutczkcumcumczlczmcznczoctqctrctsczpctqcvzczqcrgaaaaaaaaaaaaceHcpVcpVcpVcxCczrczscsucsucsucyDcsucztcsuczucsuczvaafaafcswaafcvKcvLcvLcvLcvLcvMctwcvNcvOcvOcvOcvOcvPaafcswaaacyFcyFcyFcyFaaaaaaaaacyFcyFcyFcyFcyFcyFcyFaaaaaaaaacyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacqdcqicrzcqicqicqicxLcqicqicqicxLcqicqicqiczwcqicrAcqicqicqiczxcwMcqicqiczycxQczzczAcwQczBcwQcwQcyWczCczDczEcyZcpycxZcpycotczFczGczHczIczJcpFcotczKczLczLczMczNczOczPczQcwnczRczSczTcyjczUczVczWcwnczXczYcsnaaaaaaaaaaaaaaaaaacrgczZcAacAbcutcAccAdcAecumcAfcAgcAhczpczZcAicAjcrgaaaaaaaaaaaacljceHcAkcAlcAlcAmcAncAocApcAqcArcAscAtcAucAvcoQcAwaaaaaacswaafcwKcwKcwKcwKcwKaaactwaafcwKcwKcwKcwKcwKaaacswaaacyFcyFcyFcyFaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaacyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaJaaaaaacAxcqicrzcqicAycszcsAcszcAzcszcsAcszcAzcszcAAcszcABcACcADcxPcAEczzcAFcAGcAHcAIcAJcAKcwQcALcAMcwQcwQcwQcwQcwQcANcopcAOcopcotcotcotcotcotcotcotcotcAPczLczLcAQcARcASbPUcATcwncAUcAVcAWcAXcAYcAZcBacwncBbcBccsnaaaaaaaaaaaaaaaaaacrgcvwcBdcAjcumcBecBfcBgcumcBhcBicBjcBkcBlcBicBmcrgaafaafaaaaaaaaaaaacBnaaaceHcBocBpcBqcBrcBscBpcBtcBucBscBpcBvceHaaaaaacaBaaaaafaaaaafaaaaafaaactwaaaaafaaaaafaafaafaafcswaaacyFcyFcyFcyFaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaacyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBaaaaaaaaaaaJaaaaaacBwcqicrzcqicBxcyQcrzcqicBycyQcrzcqicBzcyQcqicqicBAcqicBBcyQcBCcBDcBEcBFcBGcBHcBIcBJcwQcBKcBLcBMcBNcBOcuScBPcBQcuScBRcuScBScuUcBTcBUcBVcBVcBWcBXcBYcBYcBYcBZcCacASbPUcCbcwncwncCccCdcCecCdcCccCfcwncsncCgcsnaaaaaaaaaaaaaaaaaacrgcumcChcutcumcCicCjcCkcumcClcCmcrjcCncCocCmcCpcsoaaaaaaaaaaaaaaaaaacCqaafceHcCrcCscCtcoScCucCvcCwcoScCxcCycCzceHaaaaaacswaaacuEcuEcuEcuEcuEaafctwaafcuEcuEcuEcuEcuEaafcswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaafaafaafaaJaafaafcBwcqicCAcCBcCCcCDcCEcCFcCGcCHcCIcCJcCKcCLcqicvQcCMcCNcCOcCPcCQcogcogcogcogcogcogcogcogcCRcCScANcCTcCUcpycCVcpycpycxZcpycpycCWcpycCUcCXcCYcCZcDacDbcDccDdcDecDfcASbPTcATcwnaaacCccDjcDkcDlcCccDmcDncDocDpcDqaaaaaaaaaaaaaaaaaacrgcDrctrcvwcDscDtcvwcDucDvcDwaafaaacDxcDycDzcDAaaaaaaaaaaacaaaaaaaaaaaaaaaceHcDBcpVcpVcoScDCcpVcpVcoScDCcpVcpVceHaafaafcswaafcvKcvLcvLcvLcvLcvMctwcvNcvOcvOcvOcvOcvPaafcswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswcDDaaaaaaaaJaaaaaacDEcDFcDGcDHcDIcDJcDKcDLcDIcDJcDKcDLcDIcDJcDMcDMcDNcDLcDIcDJcDOcogaaacDPcDQcDRcDScDTcDUcDVcDWcDXcDXcDYcDZcEacEbcEccEdcEbcEccEacEecEfcEgcEecANcANcAScEhcEicEjcEkcASbOscATcwncwncCccCdcEocCdcCccEpcEqcEraafaaaaaaaaaaaaaaaaaaaaacrgcDrcEscEtcEucEucEtcAhcEvcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceHcEwcpVcpVcoScExcpVcpVcoScExcpVcpVceHaaaaaacswaafcwKcwKcwKcwKcwKaaactwaaacwKcwKcwKcwKcwKaaacswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswcEycEzcEzcEAcEzcEzcEzcEzcEBcEzcECcEzcEBcEzcECcEzcEBcEzcECcEzcEzcEzcECcEzcECcEzcEDaafaaacEEcEFcEGcEHcEIcEJcDVcEKcDXcELcEMcENcEOcEPcEQcERcEScETcEOcEUcEVcEWcEeaaaaafcAScEXcEYcEZaafaaabOscATcMvcMwcCccFacFbcFccCcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcFdcvAcFecFfcFfcFecvwcFgcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceHcpVcpVcpVcoScFhcpVcpVcoScFhcpVcpVceHaacaaacswaaaaaaaafaafaafaaaaaacFiaafaaaaaaaafaafaaaaaacswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaafaafaaaaaqaaaaaaaafchCcmVcmTcmWchCcmVcmTcmWchCcmVcmTcFjchCaaachCcmWcmTcFjchCaaaaafaaacEEcMIcFlcFmcFncFocFpcFqcDXcFrcFscFtcEOcFucFvcFwcFxcFycEOcFzcFAcFBcEeaaaaaacAScFCcFDcFEaaaaaabOscMycMxcMzcCccFFcFFcFFcCcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcFGcFHcvwcvwcvwcvwcvwcFIcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacljceHceHceHceHceHceHceHceHcFJcFJcFJcljaaaaaacswcswcswcswcswaaaaaaaaacrtaaaaaaaaacswcswcswcaBcswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaafaafaaJaaaaaaaafchCcFKcFLcFMchCcFNcFOcFPchCcFQcFRcFSchCaafchCcFTcFUcFVchCaaaaafaaacEEcFWcEGcFncFncFXcFYcFZcGacGbcGccGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncEeaafaaacGocGpcGqcAScGraaabOscMBcMAcMCcCcaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsocrgcrgcGwcGxcFecFecFecGycGwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGzcGzcGzaaaaaaaaaaaaaaaaaaaaaaaaaaacswaafcGAaafcswaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaJaaaaafaafchCcGBcGCcGBchCcGDcGEcGDchCcGFcGGcGFchCaaachCcGFcGFcGHchCaaaaafaaacEEcDQcGIcFmcFncEJcGJcEKcDXcGKcGLcGMcEOcGNcGOcGPcGOcGQcEOcGRcGScGTcEeaaMcGUcGVcGWcGXcGVcGVcGYbOscMKcMJcMFcCcaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHccFfcFfcFfcFfcFfcHcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaafaaacswaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaJaafaafaaachCcGBcHdcGBchCcGDcHecGDchCcGFcHfcGFchCaafchCcGFcHgcGFchCaafaafaafcHhcHicHjcHkcHlcHmcHncEKcDXcHocHpcHqcEOcHrcHscHtcHucHvcEOcHwcHxcHycEeaaacHzcHAcHBcHCcHDcHEcHFcHGcMGcHIbOsbOsaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcHJcricricricCpcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswcswcswcswcswaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBaaaaaachCchCchCchCchCchCchCchCchCchCchCchCchCaaacHKchCchCchCchCaaaaaaaaaaaacCScCScCScCScCScHLcHMcHMcHMcHMcHNcHMcHOcHPcHQcHPcHRcHMcHMcHScHMcHMcHMcHzcHAcHTcHUcHVcHWcHXaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacHYcHZcHZcHZcIacIbcIccIdcIecIfcIgcIhcIicIjcIkcIlcImcIncIocIpcIqcIrcIscItcIucIvcItcHMcHzcHAcIwcIxcIycIzcIAaafaaacHYcIBcHYcIBcHYcIBaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcIDcIEcIFaaacIDcIEcIFaaacIDcIEcIFaafaafaaaaafaafaafaafaafcIGcHZcHZcHZcIacIbcIHcIIcIJcIKcILcIMcINcIOcIPcIQcIRcIScITcIUcITcITcITcIVcITcIWcIXcHMcIYcGVcGVcGVcGVcGVcIZaafaafcJacJacJacJacJacJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacIDcJbcIFaaacIDcJbcIFaaacIDcJbcIFaafaafaaaaafaaaaaacJcaafcHYcHZcHZcHZcIacIbcIHcJdcJecJfcJgcIMcJhcJicJjcIucIucIucJkcJlcJmcIucIucJicJncJocJpcHMcHMcHMcJqaaaaaaaaaaaabvcaaacJrcJrcJrcJrcJrcJraafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafcIDcJbcIFaaacIDcJbcIFaafcIDcJbcIFaafaaaaaaaafaafcJsaaaaafcIGcHZcHZcHZcIacIbcJtcJucJvcJwcJxcJycJzcJAcJBcJCcJCcJCcJDcJEcJFcJCcJCcJGcJHcJIcJJcJKcJLcJMcJNcJOcJOcJOcJOcJOcJOcJPcJQcJPcJQcJPcJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacIDcJbcIFaafcIDcJbcIFaaacIDcJbcIFaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcJRcJScJTcJUcJVcJWcIhcJXcIucIucIucJYcJZcKacKbcKccKdcKecKfcKgcKhcKicKjcKkcKlcJNcKmcKncKmcKncKmcKncKmcKncKmcKncKmcJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJaafaaacIDcJbcIFaafcIDcJbcIFaaacIDcJbcIFaafaaaaaaaaaaaaaafaafcKocKpcKpcKpcKpcKqcKqcKqcKqcKqcKrcKqcHMcKscIucIucIucKtcHMcKucKvcKwcHMcKxcKycKzcJIcKAcKBcKCcHMaaacJrcJrcJrcJrcKDcJrcJrcJrcJrcJrcJrcJraafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcKEaafaafaafcKEaafaaaaafcKEaafaaaaaaaaaaaaaaacKFcKGcKHcKIcKJcKKcKLcKMcMLcMMcKPcKQcKRcKPcHMcKScKTcIucIucKUcKVcKWcKXcKYcKZcLacLbcJHcJIcLccLdcLecHMaafcJacJacJacJacJacJacJacJacJacJacJacJaaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafcLfcLgcLhcLicLicLicLicLicLicLicLicLicLicLicLjcLgcLgcLgcLkcLlcLmcLncLocLpcLqcLrcLscLtcLtcLtcLucLvcLwcHMcLxcLxcIucIucKUcLycLzcLAcLBcLCcLacIucKgcLDcKicIucLEcHMaafcJacJacJacJacJacJacJacJacJacJacJacJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFaaacuFcuFcuFcuFcuFaaacuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcLFaafaaaaafcLFaafaaaaafcLFaafaaaaaaaaaaaaaaacKFcKGcLGcLHcLIcLJcKpcLKcLLcKPcKPcLMcLMcLNcHMcLxcLxcIucIucKUcLOcLzcLPcLQcLRcLScLTcLUcLVcLWcLXcLYcHMaaacJrcJrcJrcJrcKDcJrcJrcJrcJrcJrcJrcJraafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFaaacuFcuFcuFcuFcuFaaacuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJaafaafcIDcLZcIFaaacIDcLZcIFaaacIDcLZcIFaafaaaaaaaaaaaaaafaafcMacKpcKpcKpcKpcMbcMccMdcMdcMecMbcMbcHMcHMcIhcHMcHMcHMcHMcHMcMfcHMcHMcHMcHMcHMcIhcHMcHMcHMcHMaafcJacJacJacJacJacJacJacJacJacJacJacJaaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIDcLZcIFaafcIDcLZcIFaaacIDcLZcIFaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacMgaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaacIGcMhcIGcMhcMicMhcIGcMhcIGcMhcIGcMhaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafcIDcLZcIFaaacIDcLZcIFaaacIDcLZcIFaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaMaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafcIDcLZcIFaaacIDcLZcIFaafcIDcLZcIFaafaafaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJcaBcaBaaJaaJaaaaaaaaaaaJaaJaaJaaJaaJaaqaaJaaJaaJaaJaaJaaJaaJaaJcMkaaJaaJaaJaaJaaqaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaafcIDcMlcIFaaacIDcMlcIFaaacIDcMlcIFaafaaJaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaafaapaapaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaapaaiaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaamaamaamaanaamaamaamaamaamaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaapaapaapaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaaaaaaaaaaaaaakaapaalaataafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaaaaaaaauaaaaaaaaaaauaaaaaaaaaaaaaaaaauaaaaaaaaaaauaaaaaaaauaaaaaaaaaaaaaaaaamaaaaaraaoaasaaaaaraaoaasaaaaaraaoaasaafaafaamaaaaaaaaaaaaaaaaafaafaahaayaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaazaazaazaazaazaazaazaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaauaauaauaauaaaaaaaaaaacaaaaamaaaaaraavaasaaaaaraavaasaaaaaraavaasaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaBaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaawaaAaaxaaAaaxaaAaaDaazaazaaHaaIaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaaJaafaaraavaasaaaaaraavaasaafaaraavaasaafaaaaaaaafaafaaKaaaaaaaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaLaapaafaazaaEaaFaaFaaFaaFaaFaaGaaNaaMaaPaaOaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaafaaaaaraavaasaafaaraavaasaaaaaraavaasaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaUaaUaaUaaUaaUaaUaaUaafaaaaazaaQaaSaaRaaSaaxaaSaaTaaZaaVaaXaaWaazabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaJaafaaaaaraavaasaafaaraavaasaaaaaraavaasaafaaaaaaaacaaaaafaafaaYabfabfabfabfabgabhaaaaaaaaUabaabaabbabaabaaaUaaaaafaazabkabcaaZabcaaZabcaaZaazabeaaXabiaazaboabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafabjaafaafaafabjaafaaaaafabjaafaaaaaaaaaaaaaaaabmablabqabnabvabwabxabrabhaafaaaaaUabtabsabyabuabzaaUaaaaaaabEabAabCabBabDaaxabCaaxabGabFabIabHabNabOabPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaJaafabJabLabKabMabMabMabMabMabMabMabMabMabMabMabMabQabLabLabRabWabXabYabSacaacbaccabTaceaceaceaaUaaUacfabUachaaUaaUaciacjackaclacmacnacoacnacpaclaclaclabVacracsactacuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaafaapaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafabZaafaaaaafabZaafaaaaafabZaafaaaaaaaaaaaaaaaabmablacgacdacyaczabfacqaceaceacwacvacAacxacCacBaceaceacEacDacGacFacIacHacNacJacLacKacOacMacQacPacsactabdabdabdabdabdabdaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaJaafaafaaracRaasaaaaaracRaasaaaaaracRaasaafaaaaaaaaaaaaaafaafacSabfabfabfabfacXaceacTacUacUacUacUacCacUacWacVacYacMadaacZadcadbacNaddacMacMacMacMadfadeacladkadlabdadmadnadoabdaapaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaracRaasaafaaracRaasaaaaaracRaasaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabhacXaceadgadiadhadpadjadradqadsacVacYacMadaacZadcadtadzaduacMadvadvadvadcadwacsadDadEadFadEadEadGadFaapaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaJaafaaracRaasaaaaaracRaasaaaaaracRaasaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadHadIaceadxacUacUacUacUacCacUadyacVacYacMadaadAadCadBadKadJadMadLadLadLadOadNacsadUadEabdadVadWafsabdaapaapaafaaaaafaaaaapaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaJaafaaracRaasaaaaaracRaasaafaaracRaasaafaafaafaaaaafaafaaaaaaaaaaaaaaaadXadIaceaceadQadPadSadRadYadTaceaceadZacMadaaeaadcaebaehaduadMadLaeaadLaedaecacsadUaekabdabdabdabdabdaapaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafaaraeeaasaaaaaraeeaasaaaaaraeeaasaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadXaemaceaceaceaceaceaceaefaceaceaceaeiaegaelaejaeoaenaeqaepaesaeraetaeraevaeuacsadDaeBabdaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaeCadIaeDaeEaeFaeGaexaewaezaeyaeAaeMaeIaeHaeJaeHadcaebaeQaeKaeLaeLaeNaeLaePaeOaeWaeXaeYabdaeZaeZaeZaeZaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJafaaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabhadIafbafcafdaeGaexaexaeSaeRaeTaeMaeVaeUaffafeadcafgafmafhacMacMafiacMafkafjacsafrafyabdaftafuaflaflafnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhabhabhabhabhabhabhabhabhabhabhabhabhadIafxafzagcaeGafpafoafvafqafqafwafBafAafCafAafEafDadzafFafGacMafiacMafIafHafPafQafRafSadEafTafUafVafWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhafXafYafZabhagaagbagvagdageagfaggaggaggaggaggaggaghagiagjagkaeGafKafJaezafLafMaeMafOafNagmaglagoagnagwagxagyagzagpagBagCagxagDagEagFabdadEagGaflaflagqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabhahcagJaggaggaggagfagfaggagKagLagLagLagLagLagLagLagLagLagLagMaeGagNagOagragQagRaeMagtagsagsagsadcaguagVagAagIagHagPagHagIagSagDahbadEabdabdaeZaeZaeZaeZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhaioahdaheaheaheaheaheaheaheagLagTagWagUaheagXagZagYahfahaahgahoahiahhahkahjahmahlahnahnahnahnadcahpahxahqahsahrahuahtahwahvagDahFaiMahyahAahzahBabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHaaaaaaahHaaaaaaaaaahHaaaaaaaaaaaaaaaahHaaaaaaaaaahHaaaaaaahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhafXafYahIabhahJahKaheahDahCahNahEahLahGagLagUahMahEahPahOahOahOahRahQahTahSahUahUahVahUahXahWacMacMacMaeaadcahYaifahZaibaiaaidaicaigaieagDahFanXaihaijaiiaikabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHaaaaaaaaaahHahHahHahHahHahHahHaaaaaaaaaahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHainamMaipabhaiqahKaheaimailaitairaiuaisagLagUahMaivaheaiwahOaixaiyahOahTaizaiAahUaiBahUahUaiCaiDacMacMacMadcaiEaiHaiFagIagIaiGagIagIaiIagDaiLaFtakDakDakDakFabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHaaaaaaahHahHahHahHahHahHahHahHahHaaaaaaahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeCaiNaiNaiOabhaiNahKaheaiKaiJaiRaiPaiQahEagLaiSaiUaiTaheaiVaiXaiWaiZaiYajbajaajdajcahVajeajfaeMajhajgajjajiajlajkajoajmajpajnajrajqajtajsagDalrabdabdabdabdadDabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaamaamaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHaaaaaaahHahHahHahHahHahHahHahHahHaaaaaaahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhabhajvabhabhajwajxaheaheajuaheaheajyaheaheaheajzaheaheajBajCajAajEajDajGaheajHajIajFajKajLaheaheajMajNajJaheaheaheagxajPagxagxagxagxagxagDalrabdajQajRabdadDabdaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhagJagfajSagfajTajUajVajOajXajWajZajYakbakaakdakcakfakeakhakgakjakiakhakkakjakjakmaklaklaknakpakoakrakqaktaksajMakuakwakvakyakxakAakzakCalsakEamaaorabdadDabdaaaaaaaaaaaaaaaaaaaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafakBaafaaJaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaJaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhahKaheaheaheaheaheaheakGakJakIakKakIakMakLakOakNakQakPakSakRakTakIakUakIakIakVakXakWakZakYalbalaaldalcakWalealgalfalkallalmalnaloalhakCamNabdalialjabdanwabdaaaaafaaaaaaaaaaaaaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaaaaaaaaalpaaaaaaaaaaaJaaJaamaamaamaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhahKahealtalqalwalxahealualvahOalzalyahealCalAalCahealEalBalGahealDalHalFalIagLalLalMalJalOalKahealQalRalRalSahealNalUalValWalXalYalPakCadEambambamcambadDabdanxaafaaaaaaaaaaaaaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaalTaafaafaaaaafaafaaaaaaaamaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafalZaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabhahKamfamgamgamhamiameamdalvahOamjalyaheamkammamlamqamnampamoamrahOamsahOamuamtamvamvamwamvamxamCamzamyamBamAakCamDamIamJamKalValVamEakCadEambanyaogambadDabdanxaaaaaaaaaaafaaaaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafamFamFamFamFamFaafamGaafamFamFamFamFamFaafaaJaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaJaaJaaaaaaaaaamHaaaaaaaaaaaJaaJaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhahKaheamOamLamUamVaheamPalvalyamRamQaheamSamWamTamqamXamZamYanbanaandancanfaneamvamvamwamvanganmanianhankanjakCanlansalVamKalValVannakCadEambaohaoianvaokabdabdabdaapaafaafaafaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafanpanoanoanoanoanqamGanrantantantantanuaafaaJaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaanzaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhanGaheaheaheaheaheaheanAanBaheaheaheaheanJanCanJamqanLanDanNamqanOanPanQanRanSamvamvamwanEanFamCanIanHankanKanYanManUanTanWanVaoaanZanYaqLambaojaoZaoYapMapaapOabdaafaapaafaacaaaaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafaobaobaobaobaobaafamGaafaobaobaobaobaobaafaaJaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafaocaocaocaocaocaafaodaafaocaocaocaocaocaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaooaopaoqatragLaosaotaheaoeaofaowaomaolaozaonaovaouaoxaoxaoyaoxaoBaoAaoDaoCaoJaoEamvamvaoGaoFaoHamCaoKaoIankaoLanYaoMaoOaoNaoQaoPaoSaoRanYanYanYanYanYanYanYanYapPabdapbaoTaoUaaaaafaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafamGaaaaaaaaaaafaaaaaaaaaaamaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaJaafaoWaoVaoVaoVaoVaoXaodapcapdapdapdapdapeaafaaJaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaooaooapkaplagLamgapmapgapfapiaphapnapjappapoapoapqapraoxaptapsaoxaoxapuaoxapBapvapwamvamwamvangapxapyanHankapzanYapAapDapCapEapAapFapAapAapGapIapHapJapAapAanYapNattapbapbapTapbapbaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafamFamFamFamFamFaafamGaafamFamFamFamFamFaafaaJaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafapKapKapKapKapKaafaodaafapKapKapKapKapKaafaaJaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapVapkaplagLapWapXahealuapLaowapRapQaqbapSaovapUapZapYaqcaqaaqeaqdaqgaqfaqmaqhaqiaoFaqjaoFaqlaqkaqoaqnaqqaqpanYaqraqsapAaquaqtaqvaqtaqwaqwaqwaqwaqwaqwaqwaqCaqEattapbaqxaqIaqyapbaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafanpanoanoanoanoanqamGanrantantantantanuaafaaJaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafaodaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqKatsaqMagLaheaheaheaqzalvaheamqamqamqaqAaqFaqBaqHaqGaqJaoxaqOaqNaqQaqPaqYaqRaqTaqSaqVaqUaqWarfaqZaqXaraanianYarbardarcargareariarhapAarjarlarkarmarjapAanYapNattapbarnaruaroapbaaaaaaakHakHakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafaobaobaobaobaobaafamGaafaobaobaobaobaobaafaaJaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafaocaocaocaocaocaafaodaafaocaocaocaocaocaafaaJaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqKarwaqMagLaosarxahearparqaowaomarraozaovarvartarzaryarAaoxarBamqarCarIarJarKarDarMarFarEarGarQarLarHarNamzanYanYarUanYanYanYanYanYanYanYanYanYanYanYanYanYapNattapbapbasaapbapbaaaaaaaaaakHakHakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaamGaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaparOaapaaaaaaaaaaaaaaaaaaaaaaaJaafaoWaoVaoVaoVaoVaoXaodapcapdapdapdapdapeaafaaJaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqKascaqMagLasdapmarRarParTarSaseasbasfaoxaoxasgasiashasjaoxaskamqasmaslassasnasoarMasqaspasrarQapbapbapbapbapbasyaszasAasBarsasCasCasDarVarWarVarVarXarYarYasEarZasFastasvasuaqDaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaJaafamFamFamFamFamFaafamGaafamFamFamFamFamFaafaaJaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasNasOasNaaaaaaaaaaaaaaaaaaaaaaaJaafapKapKapKapKapKaafaodaafapKapKapKapKapKaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasPasQaplagLapWapXaheaswasxaowapRasGaozasHasHasIasJaoxasKaoxasLamqasRasMasTasSasUarMasWasVasXarQathatiatiatjatkatjatlatmatnatnatnatoatnatnatnatnatnatpattattatqatKatKattatuatvatwatxatyatzatzatzatzatAatzatzatzatzatBaafaaaaaaaaaaaaaamaafanpanoanoanoanoanqamGanrantantantantanuaafaaJaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasYatDasZaaaataatGatbaaaaafatIatcatIaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaaodaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaooawdatLagLagLagLaheaheaheaheamqamqamqamqamqatdaoxaoxasKaqFateamqamqamqatPatPatParMatgatfatCarQatTatnatnatnatnatUatVatWatXatEatHatFatMatJatOatNaufaugatxatxatxatxatxatxatxatxatxatxatQatQatQatQatQatQatQatQatQatQauiaafaaaaaaaaaaaaaamaaaaobaobaobaobaobaafamGaafaobaobaobaobaobaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaahHahHahHahHahHahHahHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaujatRaulatRaujatSaunatSaujaafatIatYaupaaaaaaaaaaaaaaaaaaaaaaaJaafaocaocaocaocaocaafaodaafaocaocaocaocaocaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaooauqaopaurausaooaafaafamqatZaubauaaudaucaueaoxapsaoxasKaqFauhauAaumaukautauoauuarMauwauvauxarQatTatnauJauyauLatUauBauzatXatEauDauCauFauEauGatNaufauHauIauVauWauXauWauYauMauKauNavcatQatQatQatQatQatQatQatQatQatQavdaafaaaaaaaaaaaaaamaaaaafaaaaafaafaaaaaaauOaaaaaaaafaaaaaaaafaaaaaJaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfatRavgatRavfatSavhatSavfaviavjavkavlavmavmavnaviaviaafaaaaaJaafaoWaoVaoVaoVaoVaoXaodapcapdapdapdapdapeaafaaJaaaaaaaaaaaaaaaaaaaaaaaaaooaooaooaooaooaooaplavoaooaaaaaaamqauPamqauQauSauRamqauTauUaoxavaauZauZavbauZauZavpaveavqarMavrauvavsarQatTatnavEavtavGatUavvavuatXatEavwauCavyavxavzatNaufavAavBauVauWauWauWauYavCauKavDavSatQatQatQatQatQatQatQatQatQatQavdaafaaaaaaaaaaaaaamaamaaJaaaaaaaafaaaaaaalpaaaaafaafaafaafaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfavTavUavVavfavWavXavYavfavZavHavFavIawYaweawfawgaviaaaaaaaaqaaaapKapKapKapKapKaafavJaafapKapKapKapKapKaaaaaJaaaaaaaaaaaaaaaaaaaaaaaaavKawjavLavMawmavNawoawpaooaaaaaaamqamqamqavOavQavPamqavRawbawaawhawcawiauAawlawkawqawnawrarMawsauvawtarQatTatnawGawuawIawJawwawvatXatXatXawxawzawyatXatXaufawAawBauVauWauWauWauYawCauKavDawTatQatQatQatQatQatQatQatQatQatQavdaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaawDaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavfawVawWawXavfawVawWawXavfaxRavZavZavZavZavZavZavZasNaaaaaaaaJaaaaafaaaaafaafaaaaaaawEaaaaaaaafaaaaaaaafaaaaaJaafaaaaaaaafaafaaaaaaaafawFawjawHawKaxdawLauqaxfaooaafaapawMatPatPatPatPatPatPatPatPatPatPatPatPatPatPatPatPatPatParMawNauvawOarQatTatnaxjawPaxlatUawRawQawUawSaxaawZaxaaxbaxeaxcaxvaxgaxiaxhaxkaxkaxkaxhaxiauKauKaxmatQatQatQatQatQatQatQatQatQatQavdaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaxCaxDaxCaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaujavfaxEaxFaujavfaxGaxFaujavfaxHavfavfavfavfavfavZatIaaaaaaaaJaaJaaJaaaaaaaafaaaaxIaxJaxIaafaafaafaafaaJaaJaaJaafaooaooaooaooaxKaxLaxLaxMaooaooaooaooaxnauqaxOaooaxPaxQaooaooayjaxSaxTaxUaxUaxUaxUaxUaxUaxUaxUaxVaxUaxUaxUaxUaxUaxWaxpaxoaxqaxWayaatnaybaycaydatUaxsaxraxraxtaxwaxuaxyaxxaxravuaxzaxgaxBaxAaxNaxNaxNaxNaxXauKauKaxmatQatQatQatQatQatQatQatQatQatQavdaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaayraysayraaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaytaxYayeaxZayfaxYaygaxZayiayhaykaykaykaykaylavfayCatIaaaaafaafaaaaaaaaaaaaaafaaaayDayEayDaafaaaaafaaaaaaaaaaaaaaaaooayFayGayHayGayGayGayGayIayGayGayJayKayHayLayMaxUaxUaxUaxUaxUaxUayNayOayPayPayPayPayQayPayPayRayPayQayPayPayParMaynaymavsarQayVatnaydayWayXatUaypayoayuayqaywayvaywayxayoayyayAayzaySayBaySaySayUayTayZayYazaazpatQatQatQatQatQatQatQatQatQatQavdaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafazqazrazsaztazuaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazvazbazdazcazfazeazhazgaziazhazkazjazhazhazlavfavZavjaafaafaaaaaaaaaaaaaaaaafazHazIazJazKazLaaaaafaaaaaaaaaaaaaaaaooazMaooazNazOazPazPazPazQazPazPazPazRazNazSazTazTazTazTazTazTazTazUazVayPazmazoaznazxazwazzazyazAazxazBazoazCarMazDaymavsarQayVatnaAiawPauLatUazEaxraxraxraxraxtazGazFazXazWaxvazYazZazZazZazZaAbaAaatxaAcatxatxatQatQatQatQatQatQatQatQatQatQavdaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaAvaAdaAfaAeaAvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafavfaAzaAAaAzaAgazdazdaAhaAzaAAaAzaAjaAlaAkaAmavfavZaviaviaAHavmavmavmavmavnaviaAIaAJaAKaALaAIaooaooaxPaAMaxQaooaooaooazMaANazNaaaaafaaaaafaaaaafaaaaafaaaazNazSazTaAoaAnaAqaApaArazTazUauqayPaAsaAsaAUaAuaAtaAxaAwaAtaAyaBaazoazCarMazDaymaABarQayVatnawGaACaBdaBeaAEaADaAGaAFaAPaAOaAQaBmaBmaARaBmatxaATaASaAWaAVaAYaAXazpaAZaBbaBwatQatQatQatQatQatQatQatQatQatQavdaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaAvaBxaByaBzaAvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBAaujaBBawVaBCaBfaBcaBhaBgaBCawVaBHaBIaBJaBiaBjaBMavZavZavZavZavZavZavZavZaBkaBOaAIaBPaBQaBRaAIaEqaBTayGayGayGayGayGaBUaBVaBWazNaafaBXaBXaBXaBXaBXaBXaBXaafazNazSazTaBnaBlaBpaBoaBnazTazUaCcayPayPayPayPaBqazxaBsaBrazxaBtaCiazoaBuarMazDaymaBvarQaClatnaCmawPaCoatUazEavuatWaBmaBmaBmaBmaBmaBEaBDaBFaBmatxatxatxatxaCsatxatxaBGaBKaCvatQatQatQatQatQatQatQatQatQatQauiaafaDraDraDraDraDraDraaaaaaaafaaaaAvaCwaCxaCyaAvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazvaAAaCzaCAaCAaCAaCAaCBaAAazvaaaaBJaBLaBNaBMaCEaCEaCEaCEaCEaCEaCEaYYaBYaBSaAIaCHaCIaCJaAIaCKaCLaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBXaCaaBZaCdaCbaCeaBXaaaazNazSazTaBnaCfaChaCgaBnazTazUaooayPaCjaCkaAUaCpaCnaCraCqaCuaCtayPayPayParMazDaymavsarQayVatnaDdaCCauLatUaCDavuatWaCFaCNaCGaCOaBmaBEaCPaBFaBmaDlaDmaDnaDoaDpaDqaDratxatxatxaDsatzatzatzatzaDtatzatzatzatzaDuaafaDraCQaCSaCRaCTaDraaaaaaaafaaaaAvaAvaDvaDwaAvaDxaDyaDzaDxaDxaDxaDxaDxaDxaDxaDAaDBaDBaDBaDCaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaaaaaaaCVaCUaDGaCUaCUaDHaDIaCUaCUaDGaCXaCWaBJaCYaCZaBMaDbaDaaDeaDcaDgaDfaCEbdHbdIaviaAIaAIaDUaDVaCMaDhaDjaDiaDEaDkaDJaDFaDLaDKaDMaCMaafaBXaDOaDNaDPaDNaDQaBXaafazNazSazTaDSaDRaDWaDTaDXazTazUaGmayPazmazoaDYazxazxaEaaDZaAtaEbaEwaEcaEcarMazDaymavsarQayVaEyaEyaEyaEyaEyaEeaEdatWaEfaEgaEgaEiaEhaEgaEjaEkaBmaEHaEIaEJaEKaELaEMaDraaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaDraElaEnaEmaEoaDraaaaDxaENaEOaDxaEpaEsaEraESaESaESaESaETaEUaEVaEVaEVaEVaEVaEVaEVaEWaEXaEtaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaCVaCXaCUaEuaFaaFbaFcaFdaFeaFfaFgaFbaFhaEvaFjaFkaCYaExaBMaEAaEzaECaEBaECaEDaFraFscDicDhcElaFuaEFaEEaFyaEGaEQaEPaEPaEPaERaEPaEPaEYaEZaCMaaaaBXaFiaDNaFlaDNaFmaBXaaaazNazSazTaFoaFnaFpaFnaFqazTazUaFMayPayPayPayPaFvazxaBsazoazxazxaFwazoaFxarMaFAaFzaFBarQayVaFUaFVaFWaFXaFUaFDaFCaFFaFEaFGaBmaBmaBmaBmaBmaBmaGdaGeaGfaGgaDoaGhaGiaDraDraDraDraDraDraDraDraDraGjaGkaDraDraGjaGlaDraDrcEmaDraDxaDxaDxaDxaDxaHGaGnaESaGoaGpaDxaDxaDxaDxaDxaGqaGraGsaGsaGsaGsaGsaGsaGtaGtaGuaGtaGtaGtaGtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaEvaFHaGwaFIaFbaGyaFbaGyaFbaGyaFbaGyaFbaFJaGAaGBaCYaExaBMaFLaFKaFOaFNaFQaFPaCEaGIaGJaGKaGKaGKaGLaGMaGKaFRaEPaEPaEPaEPaEPaEPaEPaEYaFSaCMaafaBXaDNaFTaFZaFYaGaaBXaafazNazSazTaGcaGbaFpaGvaGxazTaGYaGZayPaGzazoaAUaGCaAtaGDazoazxazxaHdazoaGEarMaGGaGFaGHarQaHiaHjaHkaHlaHmaHnaGOaGNatWaGPaGQaBmaGRaBmaGSaBmaGTaBmaHvaGfaHwaDoaHxaHyaHzaHAaHAaHBaHCaHDaHDaHDaHDaHDaHEaHDaHDaHDaHFbqkaDrcEnaDraHHaHIcGsaHJaHJaHKaHLaDxaDxaHMaDxaHNaHOaHPaHQaGsaHRaGsaGUaGWaGVaHaaGXaHcaHbaHfaHeaHhaHgaIdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaIgaFbaFbaDGaFbaGyaFbaGyaIhaGyaIiaGyaFbaFJaGAaGBaCYaHoaIkaIkaHpaImaHqaImaIkaIkaIoaIpaGKaIqaIraIsaItaGKaHraHtaHsaEPaEPaHuaEPaHTaHSaHraCMaaaaBXaBXaIAaHUaIAaBXaBXaaaazNazSazTaHWaHVaHXaFnaFnaIFaIGaIHayPaHYazoaHZazxazxaIaaDZaAtaAtaIMazoaIbaIOaIjaIcaIlaISaITaIUaIUaIUaIUaIUaIuaInaIXaIvaIwaBmaIxaBmaIyaBmaIzaBmaJdaGfaICaIBaJgaJgaDpaJhaDraDraJiaDraDraIDaDraJgaJkaJgaJgaJgaJlaJmaJncGtaJqaJraJsaJsaJsaJsaJtaJuaHQaJvaJwaJxaJyaJzaJAaHQaIIaIEaGsaIJaILaIKaINaGXaIPaHbaIRaIQaGtaGtaGtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaEvaIVaGwaFIaFbaGyaFbaGyaFbaGyaFbaGyaFbaFJaGAaGBaCYaIYaIWaJaaIZaJbaJbaJeaJcaJjaJfaJoaJVaJWaJXaJYaJZaGKaHraJBaJpaJDaJCaHraJEaJGaJFaJHaKiaaaaafaaaaKjaJIaKjaaaaafaaaaKiazSazTaJKaJJaJMaJLaJNazTaKqaKrayPaJOazoaAUaJQaJPaGDazoaJSaJRaKxaJTaJUaIOaKbaKaaKdaKcaKeaKFaaaaaaaIXaKfaKhaKgaIXaKkaIwaIwaIwaKlaIwaIwaIwaBmaDoaKmaDoaDoaDoaDoaKMaDoaKNaKnaKpaKoaKtaKsaKTaKuaKVaKTaKTaKTaKTaKTaKWaKTaKTaKTaKTaKTaKTaKTaKTaKXaHQaKYaKZaLaaLbaLcaLdaHQaKwaKvaGsaKyaKAaKzaINaKBaIPaHbaIRaHbaKDaKCaLmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaKEaKGaCUaEuaFaaFbaFbaLpaFbaFbaLqaFbaFhaEvaLraLsaCYaKIaKHaKKaKJaKKaKKaKKaKKaKKaKLaKOaGKaGKaGKaGKaGKaGKaLzaKPaLBaLCaLCaLCaLCaLDaKQaLFaKiaLGaLHaLHaLIaKRaLKaLHaLHaLLaKiaLMaKiaKiaLNaKSaLNaIOaIOaISaLPaIOaIOaIOaIOaLQaLRaLeaKUaLUaLVaIOaIOaIOaIOaLfaKaaLgaLgaLhaLZaMaaMbaIXaLiaLkaLjaIXaIXaIXaIXaIXaIXaIXaIXaBmaBmaLnaLlaLtaLoaLuaMkaMlaMmaKNaLvaLxaLwaLwaLyaKTaLAaLJaLEaLSaLOaLWaLTaLXaMzaLYaLSaLWaLOaLSaMcaKTaKXaHQaMCaMDaMEaMFaMGaMHaHQaMeaMdaMgaMfaMiaMhaMjaGsaGtaMnaIRaHbaMpaMoaMSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaaaaaaaKEaCUaDGaCUaCUaDHaDIaCUaCUaDGaKGaMqaBJaMraKIaMVaMsaMsaMtaMsaMuaIkaMvaKLaKOaMwaMyaMxaMBaMAaMIaMBaMJaMBaMBaMBaMKaMBaMBaMLaMNaMMaMOaMOaMQaMPaMRaMOaMOaMOaMOaMTaMWaMUaMXaMBaMZaMYaNbaNaaNdaNcaNdaNeaNgaNfaNhaNhaNjaNiaNkaNiaNmaNlaNoaNnaLgaKaaLgaLgaLgaLgaLgaLgaNpaLjaNraNqaNtaNsaNvaNuaNxaNwaNyaIXaNAaNzaNCaNBaNDaNDaNEaOhaOiaOjaKNaNFaNHaNGaNGaNIaKTaNJaNLaNKaNKaNKaNKaNMaNOaNNaNQaNPaNRaNRaNTaNSaKTaKXaHQaOzaOAaOBaOCaOzaOzaHQaNVaNUaGsaNWaNYaNXaNZaGsaHbaHbaIRaHbaGtaGtaGtaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOJaOKaOLaOMaOMaOMaOMaONaOKaOJaaaaBJaOaaObaOQaOcaOSaOTaOTaOdaIkaOeaKLaOgaOfaOlaOkaOnaOmaOoaOoaOqaOpaOpaOpaOsaOraOraOtaOuaMYaOoaOoaOwaOvaOyaOxaODaODaOEaODaOFaOvaOvaOvaOHaOGaOOaOIaLgaOPaORaORaORaORaORaORaORaORaOUaORaOWaOVaOXaORaOZaOYaPaaORaORaORaPbaORaPdaPcaPeaPcaPcaPcaPcaPcaPcaPfaPgaPMaPhaPhaPhaPiaPhaPhaPjaPQaPRaPSaKNaPkaLwaPlaPnaPmaKTaPoaPqaPpaPpaPpaPpaPpaPraQbaPtaPsaPpaPpaPvaPuaKTaKXaHQaQgaOzaOzaQhaPwaQiaHQaGsaGsaGsaGsaGsaGsaPxaGsaHbaHbaIRaHbaPzaPyaGtaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaafaBJaQmaBJaQnaQoaGBaPBaPAaPDaPCaGBaQoaQtaQuaBJaPEaKIaOQaPFaQxaOTaOTaOdaIkaPGaKLaKOaPHaMyaPIaPJaMBaMBaPKaPNaPLaPOaMBaPTaPPaPUaPPaPWaPVaPPaPPaPXaPPaPPaPYaPZaPPaQaaPPaQcaMBaMBaMBaQeaQdaOOaOIaLgaQfaLgaQjaQjaQjaQjaQjaQjaQjaQjaQkaQlaQjaQpaQjaQjaQqaQjaQjaQjaQjaQsaQraQwaQvaQvaQvaQvaQvaQvaQvaLjaQyaLjaIXaQAaQzaQzaQzaQzaQzaQBaRhaRiaRjaKNaKNaKNaKNaKNaQCaKTaQDaPqaPpaQFaQEaQGaPtaQHaRraQGaPsaQJaQIaQKaQIaKTaKXaHQaRxaRxaRyaRzaRAaRAaRBaHQaQLaQNaQMaGtaQOaQQaQPaQRaQRaQTaQSaGtaQUaGtaRMaRMaRMaRNaROaRPaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaRQaRRaRRaRSaQVaQWaRVaOKaLsaCYaQXaQXaQYaLsaOKaLsaQZaRbaRaaKIaSbaRcaRcaMtaRcaMuaIkaRdaKLaReaIkaSfaSfaSgaSfaSfaSfaSfaSfaSfaRfaRgaSfaSfaSfaSfaSfaSfaSjaRkaSjaSfaSlaSfaMBaPJaRlaRnaRmaRoaMBaQeaSqaISaISaLgaRpaRqaSsaMaaMaaStaStaStaStaSuaIOaSvaSwaSxaSyaSyaSzaSyaSyaSxaSwaSAaIOaSBaSCaSCaSCaSCaSDaSDaSEaRsaQyaLjaIXaSGaSHaSHaSHaSHaSHaSHaSIaSJaSKaSLaSMaRuaRtaSPaRvaKNaKNaRwaSSaSTaSUaSVaSWaSWaSWaSXaRCaSXaSWaSWaSWaSWaKXaHQaSZaOzaRyaRzaOzaOzaTaaHQaRDaRFaREaGtaHbaRHaRGaTgaRIaRJaHbaRLaRKaGtaRTaRUaRMaRXaRWaTpaafaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaTqaRZaRYaTtaSaaSdaScaShaSeaSiaShaSmaSkaSoaSnaSraSpaSnaSFaSOaSNaSRaSQaKKaKKaKKaSYaKKaKLaTbaIkaTPaTQaTRaTSaTdaTcaTfaTeaThaTcaTjaTiaTlaTkaTnaTmaUeaToaTsaTraUeaUiaSfaSfaUjaSfaSfaSfaSfaUkaTuaSfaUmaISaTvaRpaRqaUoaaaaaaaaaaaaaaaaaaaaaaUpaTxaTwaTzaTyaTBaTAaTDaTCaTFaTEaTGaUpaaaaaaaaaaaaaaaaaaaaaaUBaRsaQyaTHaUDaUEaUFaUGaUGaUGaUGaUHaUIaUJaUGaUGaUGaTJaTIaUMaTKaTMaTLaTOaTNaTUaTTaTVaSXaTXaTWaTZaTYaUaaVaaVbaVcaSWaKXaHQaVdaVdaRyaRzaVeaVeaVfaHQaHQaUbaHQaGtaUcaUdaVjaVjaVjaUgaUfaGtaGtaGtaUhaUnaUlaUraUqaVraafaafaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaVsaUtaUsaVvaCYaQXaQXaUuaQXaQXaQXaUvaQXaQXaUuaQXaQXaQXaUwaUyaUxaKKaKKaKKaKKaKKaUzaUCaUAaUKaIkaTQaTQaVIaTSaULaTcaTcaTcaTcaTcaTjaUNaTcaTcaTcaTmaUeaUOaUQaUPaUeaUiaVOaVPaVQaVRaVSaUmaUSaURaUUaUTaUVaVYaLgaRpaRqaUoaaaaaaaaaaaaaUpaUpaUpaUpaUXaUWaUZaUYaVhaVgaVkaViaVmaVlaVnaUpaUpaUpaUpaaaaaaaaaaaaaUBaRsaQyaLjaWkaSKaWlaWmaWnaSKaWoaWpaWqaWraWsaWtaWuaVoaPhaVqaVpaVuaVtaVxaVwaVwaVyaVAaVzaVCaVBaVEaVDaVFaWKaWLaWMaSWaKXaHQaSZaOzaRyaRzaOzaOzaOzaWNaWOaOzaWPaGtaVGaVHaTgaTgaTgaRJaHbaVJaGtaVLaVKaVNaVMaUraVTaWXaWYaWYaWZaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaXaaRRaXbaRSaBJaBJaBJaXcaXdaXdaXdaXdaXdaXdaXdaXeaBJaBMaVUaVVaIkaXhaXiaXiaXiaXjaVWaIkaIkaIkaIkaTQaXlaXmaTSaVXaTcaTcaVZaWbaWaaWdaWcaTcaTcaTcaWeaUeaWfaWhaWgaUeaUiaVOaXxaXyaXzaXAaUmaWiaUVaWvaWjaWwaXFaLgaRpaRqaLZaSuaISaXGaUpaUpaWxaWzaWyaWBaWAaWAaUYaViaWCaUYaViaWAaWAaWEaWDaWGaWFaUpaUpaXGaIXaXRaXSaRsaQyaLjaIXaXTaWlaXUaWnaSKaXVaXWaSKaXXaXYaWnaSKaWHaNDaYaaWIaTNaWJaWRaWQaWTaWSaWUaYiaWVaTWaXfaWWaVFaYmaWLaYnaSWaKXaHQaYoaYoaRyaRzaYpaOzaOzaYqaOzaYraYsaGtaHbaXkaXgaTgaXnaXpaXoaXqaYzaXsaXraXtaUraXvaXuaYFaXwaXBaYIaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaafaYKaXDaXCaXEaYOaXHaXHaXJaXIaXLaXKaXNaXMaYWbqBcGZcGvaZaaTSaXOaTcaTcaVZaWaaXPaXQaVZaTcaTcaXZaTmaUeaUeaUeaUeaUeaUiaVOaVOaVOaVOaVOaUmaYbaWjaYcaWjaWjaXFaLgaRpaRqaNiaNiaYdaZiaYeaUpaYfaYhaYgaYkaYjaYtaYlaYvaYuaYxaYwaYAaYyaYBaYgaYDaYCaUpaYEaZiaYGaYLaYHaRsaQyaLjaWkaSKaSKaSKaSKaSKaXVaZEaSKaXXaZFaWnaSKaWHaNDaZGaWIaTNaYMaYPaYNaYQaWSaTNaZMaWVaTWaXfaWWaVFaYmaZNaZOaZPaZQaZPaZPaZPaZRaZSaZTaZUaOAaZVaZWaZXaZYaGtaYRaYTaYSaTgaYUaYVaRGaHbbadaYXaUraYZaUraZcaZbbaibajaWYbakaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJbalbambanaZdaZebaqaXHaZfaZhaZgaZkaZjaZmaZlaYWcHacHHcHbbaBaTSaZoaZnaZqaZpaZsaZraZuaZtaZtaZtaZwaZvaTSbaMbaNbaObaPbaQbaBbaRbaSbaBbmHaUmaZyaZxaZAaZzaZBbaZaLgaZCaZDaLgaZIaZHaZKaZJaZZaZLbabbaabacaUpaUpaUpaUpaUpbblaUpaUpaUpbaebaabagbafbaobahbarbapbatbasbavbaubawaIXaUEaWlbbyaWnaSKbbzbbAbbBbbCaXUaWnaSKaWHbaxaUMaWIbazbaybaCaTNaTNaWSbaDbbIbaFbaEbaGaWWaVFbbMaWLbbNaZPbaHbaIbaIbbQbbRbbSaRyaRyaRyaRyaRyaRyaRyaGtbaJbaLbaKaTgbaUaYUbaVbaWaGtbaXaUraYZaUraZcbaYbbabbYaafaafaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJbbZbcabcbbbbbbcbaqaZhaZhaZhaZhaZhbbdaZhbbeaYWbbfbbgcMqbcibcibcibcibbhbcibbiaTcbbkbbjbbmbbmbbobbnaTSaXlbcqbcrbcsbctbcubcvbcwbcxbcxbcybcybcybcybcybczaISbbqbbpbbsbbrbbubbtbcGbbvaUpbbwbbDbbxaUpaUpaaaaaaaafaafbbEaaaaaaaUpaUpbbFbbGbbwaUpbbvbcGbbHbbKbbJbbObbLaLjaWkaSKaSKaSKaSKaSKaGfbcTaSKbcUaSKaSKaSKaSKaSKbbTbbPbbVbbUaTNaTNaTNbbWbbXaSWbcdbccbceaWWaVFaYmaWLbdeaZPbcfbchbcgbdibdjbdkbdjbdjbdjbdjbdjbdlbdmbckbcjbcmbclbdrbcnbcobcobcAbcpbcBaUraYZbcCaZcaUrbcDbbYaafaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJbdAbdBbanbcEbcFbaqaXHbcHaZhaZgbcIbbdaZhbcJaYWbcKbcLbaAbcibcMbcObcNbcPbcibcRbcQbcSaTSbcWbcVbcYbcXaTSaXlbdUbdVbdVbdWbdVbdVbdVbdVbdXbdYbdYbdYbdZbdYbeaaISbdabcZbdbbeebeebeebeebeebeebefbegbefbeebehbehbehbehbehbeibehbehbehbejbejbekbejaUpaUpaUpbelbelbelbbObbLaLjaIXbembenaDlbeoaSKbepbcTbeqberbesaSKaSKbetbeuaZPaZPaZPbdcbddbddbddaZPaZPaZPbdgbdfbdnbdhaVFaYmaYmbeBaZPbdobdqbdpaZPbeFbeGbeHaZUbeIbeJbeKbeLaOzaGtaHbaHbbdsbdtbaVaHbaHbaHbaGtbduaUraYZaUraZcbdvbdwbbYaafaafaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaYJaafbeTbdybdxbdzbeXaXHbdCbdEbdDbcIbbdbdGbdFaYWbdJbdKbaAbcibcibcibdLbdMbcibdNbcQbdOaTSbcWbcVbcYbdPaTSaXlbdUbdVbdRbdQbdTbdSbebbdVbfobecbevbedbfsbfsbfsaISaLgbbpbbsbeebftbfubfvbfwbfxbfybfzbfAbeebehbewbfCbfBbfDbfEbfBbexbehbejbfGbfHbfIbfJbfKbfLbfMbfNbelbezbeybeAaIXaZPaZPaZPaZPbeCbfSbeDbfUaZPaZPbfVaZPaZPaZPaZPbeEbeNbeMbeObeObeObePbeQaZPbgcbeRbeSbgfbggbggbggbghaZPbdobdqbeUaZPaZPaZPaZPaZPaZPaZPaZPaZPaZPaZPbgjbgkbeVbgmbeWbgjbgkaZPaRMbeYaUraYZaUraZcaZbbgpbgqaWYbakaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaabgrbgsbgtbgubanbgvbgvbgvbgvbgvbgvbeZbfabgvaYWaYWaYWaYWaYWbgyaYWaYWaYWbgzbgzbgAbcibcMbfbbdLbfcbcibfebfdbfeaTSbcWbcVbcYbdPaTSaXlbdUbdVbfgbffbfibfhbfjbdVbfobfkbfmbflbfpbfnbfqaISbfFbfrbbsbgQbgRbgSbgTbgUbgUbgVbgWbfObeebehbgYbfPbhabhbbhcbfQbhebehbejbhfbhgbhhbhibhjbhkbhlbiqbelbfTbfRaLjbfWbfYbfXbdqbdqbfZbdqbgabdqbdqbdqbdqbgbbdqbdqbdqbdqbgdbdqbdqbdqbdqbdqbdqbfXbdqbdqbgibgebgebglbgebgebgobgnbdqbgdbgxbgwbgbbdqbgBbdqbdqbgCbgEbgDbgGbgFbdqbgHbdqbgIbdqbdqbgKbgJaVKaUraYZaUrbgMbgLbhQbgNbgObhTaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUaaaaafbhVbdybgPbgXbhYbhZbgZbhZbhZbhZbidbiebifbigbihbiibgAbcibcibcibhdbdMbciaTSaTSaTSaTSbcWbhmbhobhnaTSbinbiobdVbhqbhpbhrbfhbhsbdVbfobhtbfmbflbflbflbhuaISbhvaRpbbsbiwbixbiybizbiAbiBbiCbiDbiEbeebehbiFbhwbiHbiIbiHbfQbiJbehbejbiKbiLbiMbiNbiObiPbiQbhxbelbhzbhybhBbhAbhDbhCbhEbhEbhGbhFbhIbhHbhHbhHbhJbhHbhHbhHbhHbhHbhLbhKbhKbhKbhMbhEbhEbhCbhEbhEbhNbhKbhKbhObhHbhPbhSbhRbhHbhWbhEbhEbhEbhEbhEbhEbhEbhEbhEbhEbhEbhEbhEbhXbhJbiabhHbibbijbicbikbikbimbilaZcaVTbjvaWYaWYaWZaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbalbambjwaZdbipbgvbjybjybjzbjybjybjybjAbjBbjCbjDaXlbaAbcibcMbisbirbfcbcibaTbaTbaTaTSaTSaTSaTSbjGaTSbjHbdUbdVbitbhpbivbiubiGbdVbjLbfsbiRbflbflbflbiSaISbiTaRpbbsbjPbjQbgSbjRbjSbjTbjUbjVbjWbeebiUbjYbiVbiHbiWbiHbfPbkbbiXbejbkdbkebkfbkgbkgcMHbkhbkibelbiZbiYbjbbjabjdbjcbaIbjebjgbjfbjibjhbjkbjjbjmbjlbjlbjnbdqbdqbdqbdqbdqbjobjqbjpbdqbjrbjtbjsbjubdqbjobjxbjFbjEbgKbdqbdqbjIbdqbdqbjKbjJbdqbjobdqbdqbdqbdqbdqbdqbdqbdqbdqbgdbdqbdqbgKbjMbjObjNbjZbjXbkcbkabkTaafaaaaafaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbkUbkVbkWbkjbkkbgvbkZblablbblbblcbldbleblfblgblgblhblibcibcibcibdLbklbcibaBbaBbaBbaBblkaXlaXlbllbcvblmblnblobknbkmbkpbkobkqbdVblubfsbkrbflbksbflbktblyaLgaRpbbsbeeblAblBblCblDblEblFblGbeebeebehblHblIblJblKblLblIblMbehbejbejblNblOblPblQbiMblRblSbelbkvbkubkwbelblWblWblWblWblWblWaZPaZPblXblYbkybkxblYblXaZPaZPaZPaZPaZPaZPaZPaZPaZPaZPbkzaZPaZPaZPaZPaZPaZPbmcaZPbdqbdqbkAbkCbkBblWblWblWblWblWbkDbkEbkEbkGbkFbdqbkHbkGbkIbkEbkJblWbmlbmlbmlbmmaRMbmnaRMaRMaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbhUbdAbdBbjwaZdbkKbgvbmpbjybmqbmrbjybjybjybmsbmtbmubmubmvbcibcMbkLbdLbkMbcibNXbmzbmAbmBbmCbmDbmDbmEbmDbmDbmFbdVbkObkNbkQbkPbkRblobmKbkSbkXbflbflbkYblpbljaLgaRpblqbmRbmRbmRbmRbmRbmRbmRblrbmRaafbehbgYblsbmUbltbmUblvbmXbehaafbejbmYbmZbnabnbbiMbiQbncbelbbOaQyaLjbelblxblwblTblzblUbniblZblVbmbbmabmebmdbmabmfbmhbmgbnsbmibmkbmjbmobnxbmxbmwbmGbmybmJbmIbmIbmLbnFbnGblWblWbmMblWbmNbmNblWbmObmQbmPblWbnMbnNbnMblWbkDbkEbkJblWbnObnPbnOblWbmSbmTbnSbnTbnUbnVbnWaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaDDaaaaaaaaabhUbhUbhUbhUbhUbhUbhUbhUbhUbhUaaaaaabnXbmWbmVbndbgvboabobbocbodboebofbjybqjbtCboibaRbmvbcibcibcibcibcibcibojbokbolbombonbqlbqlbqlbqlbqlbqlbdVbnebdVbdVbdVbopbdVbfsbnfbkXbflbflbflbngblyaLgaRpbnhbmRbotboubovbowboxboybnjboyaafbehbnlbnkboCboDboEbnmbnnbehaafbejbnoboIbnpboKbiMbiQboLbelbnrbnqaLjboObnubntbnwbnvbnzbnybnBbnAbnCbnCbnEbnDbnHbnHbnJbnIbpdbnKbnQbnLbnRbnxbnZbnYbohbogboqboobogborbnFbnGbppbosboAbozboFboBbpvboGboJboHboNboMboQboPblWaZPboRbpEblWboSboUboTboWboVboXbnSbpLbpMbpNbnWaaaaaaaaaaacaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaaaaDDaDDaDDaDDaDDaaaaDDaDDaDDaDDaDDaaaaaaaaaaaaaaabgrbgsbgtbgubdBbpObpObpObpPbpObpQboZboYbpabgvbpUbjybpVbpWbpXbpYbpZbqabqbbqbbqbbqcbqdbqebqdbqdbqdbqdbqfbqgbqgbqhbqibqlbpcbpbbpfbpebphbpgbpjbpibrTbpkbplbqubqubqvbpmbflbflbpnbfsaISaLgbpobpqbqAbtRbqCbqCbqDbqEbqFbprboyaafbehbehbehbehbqHbehbehbehbehaafbejbqIboIbqJbqKbqLbqMbqNbelbpsaQyaLjbelbpubptbpxbpwbpybqUbnBbpzbnHbnHbnHbnHbnHbnHbpBbpAbpCbnKbpFbpDbpGbnxbpIbpHbpKbpJboqboobogbpRbnFbnGbppbrhbribribpTbpSbqnbqmbqmbqmbqobqmbqqbqpbrqbqrbqtbqsbnSbqwboVbqxbqyboVbqzbnSbrybrzbrAbnWaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaaaaDDaDDaDDaDDaDDaaaaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaaaaaabrBbqObqGbrEbqPbqQbqQbqSbqRbqTbgvbrKbrLbvobrNbjybjybjybaBbrObrPbrQbrRbrQbrQbrQbrRbrQbaBbaBbqlbqlbqlbrVbqlbqWbqVbqVbqVbqVbqVbpjbqXbtBbqYbrabqZbrcbrbbrebrdbrgbrfbrkbrjbrmbrlbrnbskbslbsmbsnbsobspboybnjboyaafbsqbsrbssbstbsubsvbssbswbsqaafbejbsxbsybsxbejbejbejbszbelbroaQyaLjboObnubntbrrbrpbrsbqUbrtbpzbrvbrubrxbrwbrDbrCbpBbrFbnsbrGbrIbrHbrJbnxbrMbpHbohbogboqboobogborbnFbnGbppbrSbribrSbrUboBbsVbrWbrYbrXbrZboHbsbbsabrqbscbsebsdbnSbsfbshbsgbsjbsibsAbnSbtmbtnbyAbnWaaaaaaaaaaaaaaaaaaaaaaaaaIeaIeaIeaIeaIeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaaaaaaaaaaaaaaaaaaaaaaDDaDDaDDaDDaDDaaaaacaaaaaaaaaaaaaaaaaaaaabrBbsCbsBbtrbsDbsEbsEbsFbsEbsEbgvbsHbsGbtwbtxbjyaaaaaaaaaaafaafbtybtybtybtybtybtybtyaaaaaabtDbsJbsIbsLbsKbqVbqVbqVbqVbqVbqVbsNbsMbsPbsObsRbsQbtKbtLbfsbfsbsSbfsbfsbtNbsUbsTbsWbmRbNTbmRbmRbmRbmRbmRbsXbmRaafbtTbtUbtVbsYbtXbsYbtVbtYbtZaafbsxbuabubbucbsZbtabsxbufaIXbtbbaubtcbelbtdblwbtfbtebtgbumbtibthbtkbtjbtobtlbtqbtpbttbtsbnsbnxbtvbtubtzbnxbtEbtAbtGbtFbtHbtHbtJbtIbnFbuHbppbtMboBboBbrUbtObuKbtPbtSbtQbudbtWbugbuebrqbuhbujbuibnSbukbunbulbuoboVbupbnSbuZbvabRqbnWaaaaaaaaaaaabvcaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeTbvdbvebvfbpObvgbgrbgsbvhbvgbgvbuqbjybvjbvkbjyaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaabvpburbqVbutbusbusbusbusbusbuvbuubusbuwbuybuxbuAbuzbuCbuBbfsbuDbflbuEbuFbvBbuIbuGbuJbmRbmRbmRbuMbuLbuObuNbuPbvKaafbvLbvMbvNbuRbuQbuSbvRbvSbvLaafbsxbvTbvUbvVbejbuTbsxbvXaIXbuUbbLbuVbelbwabwbbwcbwdbuWbumbuYbuXbvibvbbvlbvlbvnbvmbvrbvqbvsbwpbvtbwrbwpbwpbwpbwpbvubwpbwpbwtbwtbwtbwtbnGbppbrSbribrSbvwbvvbwwbvxbvybvybvzboHbvCbvAbwBbwCbvDbwEbnSbvEbvGbvFbvHboVbvIbnSbwKbwLbnWbnWaaaaaaaaaaaaaafbvJbvObwObvObwObvObvPaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybwVbwXbwWbvQbqVbvWbqVbvYbvYbvYbvZbwebqXbqVbqVbtBbwfbwhbwgbwjbwibwlbwkbflbflbwmbxhbuIbuGbwobwnbwsbwqbwubxnbxobxpbwvbvKaafbxrbxsbxtbwybwxbwzbxxbxybxraafbsxbxzbxAbxBbejbwAbsxbufaIXbwDbbLaLjbelbwGbwFbwIbwHbwJbxJbwNbwMbxJbxMbxNbwPbxMbwpbwSbwRbwpbwpbwUbwTbwZbwYbxbbxabxdbxcbxebwtbyabybbwtbnGbppbycbribribxgbxfbpvbxibvybvybvzboHbvCbxjbwCbxkbxmbxlbwCbxqbxvbxubxCbxwbxDbnSbypbSLbnWaaaaaaaaaaaaaaaaafbxEbysbytbyubyvbywbxEaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybyBbyCbyBbyCbxFbvWbqVbqVbqVbxGbqVbwebqXbxHbqlbqlbxIbflbrabwjbxKbyFbxLbxObxObxQbxPbxSbxRbxTbvBbxUbyObxVbxpbyQbyRbxWbvKaafbxrbxrbxrbxrbxXbxrbxrbxrbxraafbyUbyUbyUbyUbyUbyUbyUbyVbelbxYbkubkwbelbydbxZbxZbyebyfbxJbyhbygbzdbyibykbyjbylbwrbynbymbyqbyobyxbyrbyrbyybyzbyrbyEbyDbyGbztbzubzvbzwbzxbyIbyHbyKbyJbyMbyLbpvbyNboHboHbyPboHbvCbySbzHbyTbyXbyWbzHbzLbzMbzNbyYbzPbwCbwCbzQbnWbnWbzRbzSbzSbzSbzTbzUbzVbyZbytbyvbytbzXbwOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtybtybtybtybtybtybtybAcbAdbAcbzabqVbvWbqVbzcbzbbzcbzcbwebqXbzfbzebqlbzgbflbrabzibzhbAhbzjbflbksbflbzkbuIbzlbzmbAnbxUbAobznbxpbxpbxpbzobvKbArbArbzpbArbzrbzqbzsbAwbzybAwbAwbyUbzAbzzbzCbzBbzEbzDbzFbelbzGaQyaLjbelbzJbzIbzObzKbzYbzWbAabzZbAebAbbAgbAfbAjbAibAlbAkbApbAmbAqbApbAtbAsbAvbAubAxbApbAybBgbBhbBibztbBjbppbAzbABbAAbACbACbpvbADbAFbAEbpvbAGbAIbAHbBubAJbALbAKbANbAMbAMbAObAQbAPbASbARbAUbATbAWbAVbAYbAXbBabAZbBNbxEbyvbytbyvbyvbBObxEaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybDebwXbDfbBbbqVbvWbqVbqVbqVbqVbqVbwebqXbzfbBcbqlbBdbflbBebBfbflbBkbfmbflbflbBlbvBbBmbzlbzmbAnbxUbvKbBobBnbBpbBnbBqbvKbCcbCdbBsbBrbBvbBtbBxbBwbBybClbCmbyUbBAbBzbBCbBBbBDbBDbBFbBEbzGaQyaLjbelbBHbBGbBGbyebBIbxJbBKbBJbxJbBLbBMbBMbBPbwpbBRbBQbwpbwpbwpbwpbwpbwpbBSbwpbwpbwrbBTbwtbwtbwtbwtbCGbppbwCbzHbzHbzHbzHbzHbzHbzHbzHbzHbzPbBUbCIbCJbAJbBWbBVbBYbBXbBXbBXbCabBZbCebCbbCgbCfbCibChbCkbCjbCkbCnbCZbCobvObwObDbbwObvObCpaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybAcbAdbAcbCrbCqbCsbqVbqVbqVbCqbqVbwebqXbzfbCtbqlbCubflbrabwjbflbDibCvbflbflbCwbxhbBmbzlbCxbxhbCybvKbCAbCzbCCbCBbwvbvKbCEbCDbCFbArbDubDubDubAwbCKbCHbCLbyUbCNbCMbCMbCObCQbCPbCRbelbCTbCSbCUbelbDHbCVbDJbCWbDLbDMbCYbCXbzdbDabDcbBMbDdbwrbDhbDgbwrbDjbDlbDkbDXbDmbDobDnbEbbEcbEdbEebEfbEgbEbbDpbDqbEjbDsbDrbDtbDtbDwbDvbDybDxbDAbDzbDCbDBbDEbDDbDFbBVbEybEzbEAbwCbwCbwCbwCbwCbEBbECbEDbzRbzTbzUbDIbDGbzUbzRbzSbzTbEGbzUbEHaafbvcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybENbEObENbDNbDKbDObDObDObDObDObDPbDRbDQbzfbDSbqlbDTbDVbDUbDYbDWbEWbEXbEYbEZbFabtNbDZbzlbEhbEabxUbvKbEkbEibElbBnbEmbvKbFibFjbEnbAraaaaaaaaabAwbEobFmbFnbyUbFobFpbFqbFrbCQbCPbEpbelbwDaQyaLjbEqbEsbErbEubEtbEwbEvbEEbExbxJbxMbxMbEFbxMbwpbEJbEIbELbEKbEPbEMbDXbEQbDobERbFLbFMbEdbFNbFObFPbETbESbDtbEUbDsbEVbDtbDtbFcbFbbFdbFbbFbbFebFgbFfbFkbFhbFlbBVbGdbFsbFubFtbFwbFvbFxbGkbGlbGmbGnaafaafbzUbFzbFybFybFAbFCbFBbFDbGuaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybGAbGCbGBbqlbqlbKqbwXbwXbwXbKMbqlbqlbKNbNSbKObqlbGDbGDbGDbFEbGDbFabFFbFHbFGbFIbtNbBmbzlbFJbGKbtNbGLbGLbGLbGLbGLbFKbGLbGLbGLbFQbGLbGLbGLbGLbGLbFRbGLbGLbGLbGLbGLbGLbGLbelbelbelbelbwDaQyaLjbEqbFSbErbFUbFTbFWbFVbFYbFXbGabFZbGbbBMbGebGcbGgbGfbGibGhbGobGjbGqbGpbGsbGrbGtbHmbHnbGvbHpbGwbEbbGxbGybwCbwCbwCbwCbwCbGzbwCbwCbwCbzHbGEbzHbzHbGFbAJbGGbBVbGdbGHbGJbGIbGNbGMbGObGkbGlbGmbHDaaaaaabzUbGQbGPbDIbBabHGbGRbGSbzUaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHJaafaaaaaaaaaaaabGDbGUbGTbGWbGVbHObGXbGZbGYbHabtNbBmbzlbzmbuIbHcbHbbHebHdbHgbHfbHibHhbHkbHjbHobHlbHqbuIbuIbHrbHtbHsbuIbHubuIbHvbHgbHwbHybHxbHAbHzbwDaQybCUaIXbDHbIqbDHbHBbHCbxJbHFbHEbHIbHHbHLbHKbHNbHMbHQbHPbwrbHRbHTbHSbDXbHUbHWbHVbIJbIKbFObILbHYbHXbEbbIObIPbIQbIRbISbHZbIUbIbbIabIcbIYbIebIdbIfbJcbzHbIgbGGbBVbJebIhbIjbIibIlbIkbImbGkbGlbJlbEDbEDbEDbzUbzUbzUbJmbJnbzUbzUbHGbzUaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaaaaaaaaaaaaaabJoaaaaaaaaaaaaaaaaaaaaaaaaaaabGDbIobInbIrbIpbJtbIsbIubItbIvbtNbBmbIwbIybIxbIxbIzbIBbIAbIDbICbIBbIzbIxbIxbIFbIEbIHbIGbIMbIIbINbIxbIxbITbIBbIAbIDbICbIWbIVbIXbIVbJabIZbuVaIXbJdbJbbJfbJbbJgbJYbCYbJhbKabKbbxMbJibKdbKebDhbJjbwpbJkbJqbJpbDXbJrbJubJsbKmbJvbFObKobHYbJvbEbbKpbWlbIQbJxbJwbJzbJybJBbJAbJCbIYbJEbJDbJFbJFbzHbJGbJIbJHbJKbJJbJMbJLbJObJNbJPbGkbGlbKLbEDcbAcbGcbBbEDaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJRbJQbJQbJSbKSbKSbKTbKTbKTbKTbKUaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtyaaaaaaaaaaaaaaaaaaaaaaaabJUbJTbKXbJTbJVaaaaaaaaabGDbGDbJXbJWbIrbJWbLbbJZbKfbKcbKgbtNbKhbBmbKjbKibuIbKkbuIbzkbHgbHwbuIbKlbKrbKnbKtbKsbzmbuIbKvbKubHkbKwbHkbHkbKybKxbKAbKzbKCbKBbbLbKDaLjaLjaLjaIXbKEbEubEwbKFbKHbKGbKJbKIbLFbKKbKQbKPbKRbLKbDhbHPbLLbLMbLNbDXbDXbLObLObLObEbbKVbLQbKWbLSbKYbEbbLUbLVbIQbLWbLXbHZbLYbLabKZbLcbIYbLebLdbJFbJFbzHbLfbLgbBVbwCbLhbLjbLibLlbLkbLmbGkbMmbMnbMobMobMobMpbGnaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLnbMtbLobMtbKSbKTbKTbLpbLqbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLrbMwbMxbMybLrbMzbMAbMBbGDbLsbLubLtbLwbLvbLybLxbLzbLzbLAbtNbtNbtNbMLbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbLCbLBbLDbtNbtNbtNbtNbtNbLEbtNbtNbtNaIXaIXbMQaIXaKfaLibLGaIXbLIbLHbLJbJbbLPbxJbCYbLRbxJbLTbMabLZbMbbwpbMdbMcbNdbMebMgbMfbMibMhbNjbMjbHYbJvbFObFObMkbJvbEbbNmbNnbNnbNnbNnbNnbNnbNnbNnbNnbNnbMqbMlbMrbMrbzHbMsbMCbMvbwCbNubNubNubNvbNwbNxbNubNubNubNubNubNubNybNzaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapbMDbMtbMtbMEbKTbKTbLpbLpbMFbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKXbNEbNFbNEbKXbNGbMHbMGbNJbMIbMJbJWbMMbMKbFabMNbMPbMObMRbFacdyccRbNUbNVaaaaaaaaaaaabNWcqvbNYbNZbOabObbOcbOdbMTbMSbMUbOdbMWbMVbMYbMXbNabMZbNcbNbbNebOqbOrbOsbOsbOsbOsbDHbDHbDHbDHbNfbNfbxJbNgbCXbNhbMabNkbNibNobNlbNqbNpbNsbNrbNAbNtbNCbNBbNjbOJbFObFObOKbJvbJvbOJbEbbNmbNnbNDbNIbNHbNLbNKbNNbNMbNObNnbNQbNPbNRbNRbzHbOebOfbBVbzPbOgbOibOhbOkbOjbOmbOlbOobOnbOtbOpbNubPjbEDbPkbPkbPkbPkbPkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabPlbKTbMDbKTbKTbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLrbNEbNEbNEbPmbPnbJWbOubOwbOvbJWbOxbOzbOybFabFabFabFabFabFabPubPvbPwbPxaaabPybPzbPzbPAbPBbPCbPDbPEbPCbPFbOdbOBbOAbOCbOdbOEbODbOGbOFbOIbOHbNcbPQbPQbOqbPRbPSbPTbPUbPVbDHbOLbJbbOMbJbbJbbONbCYbOObxJbOPbORbOQbOSbwpbOUbOTbwpbOVbOXbOWbOZbOYbNjbEbbEbbEbbEbbEbbEbbEbbEbbBjbNnbPabPcbPbbNHbNHbNHbNHbPdbNnbPebLdbPfbPfbzHbAJbLgbBVbPhbPgbPgbPibPpbPobPrbPqbPtbPsbPtbPGbNubPHbPIbPkbPKbPJbPLbQHaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKSbKTbPNbPMbPMbLpbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKXbNFbNFbNFbKXbQKbPPbPObQNbPWbJWbJWbPYbPXbQRbQSbQSbQSbQSbQSbQSbQTbQUbQVaaabQWbQabPZbQZbRabPCbRbbRcbRdbPCbOdbQcbQbbQdbOdbQfbQebQhbQgbQjbQibQkbPQbRobPUbRpbOsbPUbPUcgBbDHbQlbJbbQnbQmbJbbQobCYbCXbRwbQpbQrbQqbQsbRBbDhbHPbRCbOVbOWbOWbOZbQtbNjbQubQwbQvbRHbQxbQzbQybRLbBjbNnbNHbNHbQAbNHbQBbNHbNHbQCbNnbQDbLdbQEbQEbzHbLfbQGbQFbQJbQIbQMbQLbQPbQObQXbQQbRebQYbRgbRfbRibRhbRkbRjbRmbRlbPLbSkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbKTbRnbLpbLpbLpbLpbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabLrbSmbRrbSobLrbSpbMAbMBbGDbGDbRsbRsbRsbGDbGDbNVbSrbSrbSsbSsbSsbSsbNUbQVaaabStbRubRtbSwbSxbSybSzbSAbSBbSBbSCbRxbRvbRybOdbPQbPQbPQbPQbPQbSGbPQbPQbSHbSIbSJbOsbPUbSKcntbDHbRAbRzbREbRDbRFbQobRGbExbSRbRIbRKbRJbRMbSWbEJbRNbSYbRObRQbRPbRSbRRbNjbRTbRVbRUbRHbRWbRYbRXbRLbBjbNnbNnbNnbQAbNHbNHbNHbNnbNnbNnbSabRZbQEbQEbzHbSbbLgbBVbzPbScbSebSdbPrbSfbShbSgbSjbSibSnbSlbNubPHbSqbPkbSvbSubSDbTBaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKTbLpbLpbLpbLpbLpbLpbSEbMtbRnbLpbLpbLpbLpbLpbKTbKTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSFbJTbTFbJTbSMbTHaafaaaaaabGDbTIbTJbTKbGDaaabNVbTLbTMbTNbTObTObTObTPbQVaaabQWbSObSNbTSbTTbPCbTUbTVbSPbTXbOdbSSbSQbSTbUbbUcbUcbUcbUdbUdbUebUfbUgbPUbPUbUhbOsbOsbOsbOsbDHbDHbSUbSXbSVbDHbUlbTabSZbUobUpbUlbNhbUqbUrbTcbTbbUlbNjbNjbNjbNjbNjbNjbTdbTfbTebRHbTgbTibThbRLbBjbNnbTjbTlbTkbTnbTmbTpbTobTjbUHbTrbTqbIfbJcbzHbIgbLgbTsbwCbNubNubULbUMbNubNubNubNubTtbTvbTubNubUPbUQbPkbTwbUSbUTbPkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbTxbTxbTxbTxbTxbTxbTybMtbTzbTxbTxbLpbLpbLpbLpbKTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUXbNVbNVbNVbNVbSsbUYbNUbUZaaabVabPzbPzbVbbVcbPCbPCbVdbPCbVebOdbTCbTAbTDbOdbVibVibVibVibVibVibVibVibVjbVkbVlbVmbVmbVnbOsbDHbTGbTEbTRbTQbTWbVtbTZbTYbUibUabUjbTZbUmbUkbUsbUnbUubUtbUwbUvbUybUxbVJbVKbUzbVMbRHbVNbUAbVNbRLbBjbNnbUBbUDbUCbUFbUEbUIbUGbUJbUHbzHbUKbzHbzHbUNbBXbLgbBXbVZaafbURbUObUVbUUbWebUWbWgbVfbVhbVgbNubWkcrXbPkbVpbVobVrbVqaapaapaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVsbMtbMtbMtbMtbMtbMtbMtbVubMubMtbMtbLpbLpbVvbLqbKUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVxbVwbVwbWvbWwbNVbWxbSsbWybNVaaaaaaaaaaaabNWbWzbWAbWBbWCbWDbPCbOdbVzbVybMUbOdbVibWGbWHbWIbWJbWKbWLbVibWMbWMbWMbWMbWMbUhbVBbVAbVDbVCbVFbVEbVHbVGbVLbVIbVPbVObVPbVQbVPbVRbVTbVSbVVbVUbVWbVUbVYbVXbWbbWabWdbWcbWhbWfbWjbWibXqbXrbNnbWmbWobWnbWqbWpbWrbWqbWqbWsbWtbBWbWEbWubBXbBXbLgbBXbXCaafbURbWFbWFbWNbWPbWObWRbWQbPgbWSbNubWkbXLbPkbPkbPkbPkbPkaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbPMbPMbPMbPMbPMbPMbWTbMtbWUbPMbPMbLpbLpbLpbLpbKTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXObXPbXQbXRbSsbXSbXTbXUbXVbNVaaLaaaaaaaaabNWbNWbNWbNWbNWbNWbNWbOdbWWbWVbWXbOdbVibXZbYabYbbYbbYabYcbVibWZbWYbWYbXabWMbYgbDHbDHbXcbXbbXebXdbXgbXfbXibXhbXkbXjbXmbXlbXobXnbXsbXpbXubXtbXwbXvbXybXxbXAbXzbXDbXBbXFbXEbXHbXGbnFbYLbIPbXIbXKbXJbXNbXMbXXbXWbYdbXYbYfbYebAMbYhbYibAMbYkbYjbZbaafbURbYlbYnbYmbWebYobZgbYpbYrbYqbNubWkbYtbYsbYvbYubUQaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKTbLpbLpbLpbLpbLpbLpbSEbMtbRnbLpbLpbLpbLpbLpbKTbKTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYwbVwbVwbWvbZnbZobZpbNVbZqbNVbZrbZsbZtbZrbZrbYxbYzbYybYBbYAbZzbYCbYEbYDbYGbYFbZFbYabZGbZHbZIbZJbZKbYHbYJbYIbYMbYKbWMbZQbOqbZRbYObYNbYPbYPbYRbYQbYTbYSbUlbUlbZZbYUbUlbUlbYVcaccadcaebYXbYWbYYcaibYZcaicakcalbZacalcakbZcbnFbNmbIPbZdbZfbZebZibZhbZkbZjbNnbNnbwCbwCbwCbwCbwCbZlbZubZmbwCbNubNubNubNubNubNubNubNubNubNubNubNucaybZwbZvbZybZxbUQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbKTbRnbLpbLpbLpbLpbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamcaBaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaacaCcaDcaDcaDcaEcaDcaDbZBbZAbZrbZCbZDbZrbZLbZEbZNbZMbZPbZObZTbZSbZVbZUbZXbZWcaVbYabZGcaWcaXbZJcaYbVibWMbWMbWMbWMbWMcaZbOqbDHcaabZYcafcabcahcagcamcajbUlcancaocaocapcbmcbncbocbpcaebYYbYWcaqcaicascarcakcatcavcaucakcawbnFbBjbIPcbxcbycbzcbxcbxbIPbIPbIPcFkcGucbCcbDcbEbwCbwCcaxbwCbwCcKNcbHcazcbJcbKcbLcbMcbNcbOcbPcbQcbRcbScbTbUQbUQbUQbUQaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKSbKTbTzbTxbTxbLpbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcaAcaGcaFcaIcaHcbZcaJcaLcaKbZrcaMcaNbZrbZrcaOcaQcaPcaScaRcckcaTbYEbYDbYGcaUcbabYabYaccoccpbYaccqbVicbccbbbWMcbdbWMbUhccuccuccuccuccuccuccubUlcbfcbebUlcbgcbicbhcbjcbmccBccCccDcaebYYbYWcbkcaicbqcblcakcbrcbtcbscakcbubnFccLccMccNccOccPccQccNctcccSccTccUccVccWccXccUccYcbvcbFcbwcbUcbIcdhcbVcdgcdhcdicdjcdhcdkcdlcdmcdncdocdpcdqcbWbUQbUQbUQbUQaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabPlbKTbMDbKTbKTbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcbXcbXcaFccacbYcbZccbccccdxbZrccdccfccecchccgccjcciccmcclcdHccnccsccrccvcctccwcdOcdPcdQcdRcdScdTccxcczccyccEccAbWMbUhccuccFccHccGccJccIccZccKcdbcdacddcdccdfcdecdrcbmcdtcdscducaebYYbYWcdvcaicdzcdwcakcdAcdCcdBcakcdDbnFbnFcexccNceycezceAccNceBceCceDceEceEceFceGceEceHcdEcdGcdFceHceLceMceNceOceLceLceLceLcePceNceOceLceLceQceRcdIceTcdKcdJceWcdLcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdUcdNcdNcdVbKTbKTbLpbLpcdWbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfdcfdcfdcfdcfdcfdcfdcfecffbZrbZrbZrbZrbZrcfgcfhcficficficfjcdXbYEbYDbYGcdYbZFcdZcebceacedcecceebVicegcefcehcefbWMbUhccuceicejcejcejcekcelbUlcencembUlcbgcbhceocepcbmcerceqcescaebYYbYWbUtcaiceucetcakcakcakcakcakcevcewbnFcexccNcfKcfLccNccNceBcfMceDceEceJceIceIceKceHcfQceScfSceHceUceVceVceVceXceZceYcfbcfacfkcfccflceLcfncfmcfobUQbUQbUQbUQaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcfqcfpcfrbMEbKSbKTbKTbLpbLqbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcfdcgjcgkcglcfscftcfdcfucgpcgqcfvcfxcfwcfycfycgvcfzcfzcfAcfBcaTbYEbYDbYGcfCcaVcfDcfFcfEcfHcfGcfIbVicefcefbWMcfJbWMbUhccucfNcfOcfOcfOcfPccucgKcfTcfRcgKcfUcfWcfVcfXcbmcfYceqcfZcaecgbcgacgccaicgecgdcaicgYbLVbVJcggcgfcghbnFchcchdchdchechfchfchfchfchgceEcgmcgicgicgnchkcgocgscgrchocgtcgucgucgucgwcgxcgxcgzcgycgCcgAcgDceLchychzchAchyaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgEbJQbJQbJSbKSbKSbKTbKTbKTbKTbKUaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafchCchCchCchCchCchCchCchCchCchCchCchCchCaaaaaachDchEchFchFcgFcgGcfdcgIcgHcgLcgJcgNcgMcgPcgOcgRcgQcgTcgScgVcgUcgXcgWchacgZbVibVibVibVibVibVibVibVichhchbbWMchibWMbUhccuccucidciecifccuccuchjchmchlcgKcbmcbmcbmcbmcbmcaechnchpcaecilchqcilcaichschrcaicipceBbVJchtbVJchubnFcisbnFbnFcitciuciuciucivbnFceEchwchvchvchxchGchBchIchHchKchJchLchLchLchLchNchMchLchOchLchPchQceLciLciMciNchyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCchRchSchRchCchTchUchTchCchVchWchVchCaaaaaaciUchEchFcgFcgFchXcfdchZchYciYciaciccibcihcigcijciiciicikciicaTbYEcimbYGcincjjciocirciqcirciwcixcjpcjpcjqcjqcjqcjqbUhcjrciycizcizciBciAciDciCciFciEciHciGciJciIciIciKcjFcaecaecaeciPciOciQcaicaicaicaiceBceBbVJciRbVJciSbnFcisbnFaaaaaaaaaaaaaaaaaaaaaceEciVciTciXciWcjaciZcjccjbcjecjdcjfcjdcjdcjgcjicjhcgxcjkcgxcjlcjmceLckcckdckechyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCchRcjnchRchCchTcjochTchCchVcjschVchCaaaaaaciUchFcgFcgFcgFcjtckjckkcjuciYcjvcjxcjwcjzcjyckrcjAcjCcjBcjDcaTbYEcjEchacjGcjIcjHcjJcjJcjJcjKcjMcjLcjNckFckGckHcjqbUhcjrcjOcizcjPcjRcjQckMcjScjUcjTckQcjVcjXcjWciIcjYcjFckVckWckXckacjZckbclbclcclccldclcclebVJbVJbVJbVJbnFcisbnFaaaaaaaaaaaaaaaaaaaaaceEckgckfckickhcljceHcklceHcllckmckockncknckpcgxcgxcksckqckncktckuceLckwckvckxchyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCckyckAckzchCckBckDckCchCckEckJckIchCaaaaafciUclGchFcgFcgFcgFcfdclHclIciYciYckKciYciYciYciYckLciickNckOcaTckRckPckTckSckYckUckZckZckZclaclfclfclgcjqclXclYclZclhcjrclicizclkclnclmclpcloclrclqcltclsclvcluciIclwcjFcmocmpcmqclyclxclzcmqcmucmvcmwbnFcmxclcclcclcclcclccmybnFaaaaaaaaaaaaaaaaaaaaaceEclBclAclDclCceHclEclJclFceLclKclLclLclLclMclOclNclQclPclLclLclRceLcmOcmPcmQcmRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafchCcmScmTcmUchCcmVcmTcmWchCcmVcmTcmWchCaaaaafcmXchFchFcgFcgFclScfdcmZcnaclUclTclWclVcmacmacmccmbcmacmdcmecaTcmgcmfcmicmhcjjcmjcmjcmkclfcmlcmncmmcmrcjqcnucnvcnwcmscjrcmtcizcmzcmBcmAcjrcmCcmEcmDcjFcmFcmHcmGciIcmIcjFcnJcnKcmqcnLcmJcnLcmqaaaaaaaaabnFbnFbnFcnNcmvcmvcmwbnFbnFaaaaaaaaaaaaceHceHceHceHceHceHceHceHceHcmKcmMcmLceLceLcnRcnScnTceLceLceLceLcnUcnScnTceLceLcnVcnWcnVaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBaafaafaafaaaaafcnXaafcnXaafcnYaafcnZaafcnYaafcnZaafaafaaacfdcmYcmNcgFcgFcnbcodcndcnccogcohcnecojcojcnfcojcolcngconcolcoocnicnhcnjcoscotcotcotcotcnlcnkcowcowcowcoxcoxcoxcoxcnmcjrcnncnocmzcnqcnpcjrcmCcmEcnrcjFcnscnxcmGcnzcnycjFcnJcnKcmqcnBcnAcnCcmqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaceHcnDcnFcnEcoOcnGcnIcnHcoScnMcnPcnOceHaapaafaafaafaafaaaaaaaaacnQaaaaaaaaaaafcoXcoYcoXaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcoZcpacpbcpccpdcpecpfcpccpgcphcpfcpicpjcpkcplcogcogcogcogcogcogcogcogcobcoacoecoccofcprcokcoicomcolcoqcopcorcolcovcoucoycotcoAcozcoCcoBcoEcoDcpHcpIcpIcpJcpKcpKcpHcpLcjrcjrcpMcoFcjrcjrcjrcoGcmEcoHcjFcjFcjFcoIcpRcjFcjFcnJcpScmqcoKcoJcoKcmqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafceHcoLcoMcoLcoPcoNcoRcoQcoScoScoTcoSceHceHaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacoUaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaaaaaaaafcqdcoWcoVcpncpmcppcpocpscpqcpucptcpwcpvcpxcppcpzcpycpBcpAcpDcpCcpFcpEcpNcpGcpPcpOcpQcqEcpUcpTcpVcqIcpXcpWcpYcqMcovcpZcqacotcoEcoEcoEcoEcoEcqbcpHcqQcqQcqQcpKcpKcpHbUhcqRcjrcqecqccqgcqfcjrcqhcmEcqicjFcqjcqlcqkcqmcjFcrccnJcpScmqcqocqncqpcmqaaaaaaaaaaaaaaaaaacrgcrhcricrjcrgaafaaaaaaaaaaaaceHcoLcoLcoLcrkcqqcqscqrcqucqtcqxcqwcqyceHaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacqzaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcrucqBcqAcqDcqCcppcqFcppcqGcqBcqFcppcqGcqBcppcppcppcppcppcqHcppcppcppcqKcqJcqNcqLcqOcqEcqScqPcqTcrKcqVcqUcpYcrOcovcpZcqWcotcqXcoEcoEcqYcoEcqZcpHcrTcrUcrVcMOcrWcpHbUhcKOcjrcrbcracrecrdcrlcrfcrncrmcrpcrocrrcrqcrscjFcslcsmcsncsocrgcrtcrgcsoaaaaaaaafaaaaaaaaacrgcrvcrxcrwcrgaafaafaaaaaaaaaceHcoScoScoScoScrycoRcrzcrzcrzcmMcrzcrAceHaaaaaaaaaaaaaaacswcswcswcaBaafaafaafaafcrBaafaafaafaafaafaaqcswcswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcqdcppcqLcppcqLcppcqFcppcrCcrEcrDcrEcrFcrEcrEcrHcrGcppcppcrJcrIcrIcrIcrMcrLcrNcrNcrPcqEcrRcrQcrScolcrZcrYcsacolcsccsbcsdcsTcsfcsecshcsgcoEcsicpHcsZcrUctacrUctbcpHbUhcMpcjrcskcsjcsqcspcjrcgKcthcgKcjFcsrcstcsscsucjFctmcsncsncrgcsxcsvcsycrgcrgcrgcrgcrgcrgcrgcrgcszcsBcsAcrgcrgcrgcsoaaaaaaceHcnDcnFcnEcttcnGcqscrzcrzcrzcmMcrzcsCceHaaaaaaaaaaaaaaacswaaaaafaaaaafaaaaaaaaacsDaaaaafaafaaaaaaaaaaaacswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacqdcppcqLcppcsEcsGcsFcsIcsHcsJcrDcrEcsKcrEcrEcsMcsLcsOcsNcsQcsPcsScsRcsRcsUcqLcqLcsVctOctPcsWcojcolcsXcolcolcolctdcsYcsdctUctfctectictgcoEctjcpHcuacrUctacrUcubcpHcuccudcjrcjrcuecjrcjrcjrcMEcugcuhcjFcjFcjFcuicjFcjFctmcsnaaacrgctlctkctncumctpctoctrctqctuctscrgcutctvcutcrgctwctxcrgaafaafceHcoLcoLcoLctycoNctActzctCctBctDcrzctEceHceHceHceHaaaaaacswaaactFctFctFctFctFaafcsDaafctFctFctFctFctFaaacswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqdcppcsEcsGcsGcsGcsFcsGcsGcsGcsFcsGcsGcsGcsGcsGctGctHcsGctIcsGctJcsGcsGcsGctLctKctNctMcppctQctSctRctVctTctXctWctTctYcufctZcukcujcujculcujcuncuocvdcvecvfcvgcvgcpHcvhcvicvjcvkcvkcuqcupcurcvocvocvocvocvpcvocvocvocvqcsmcsnaaacumcuucuscuvcumcuxcuwcuycuycuAcuzcuycuycuBcuycutcuCcuycrgaaaaaaceHcoLcoLcoLcttcuDcuGcuEcuIcuHcuJcrzcrzcuKcuMcuLceHaafaafcswaafcuNcuOcuOcuOcuOcuPcsDcuRcuQcuQcuQcuQcuSaafcswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqdcppcppcuTcppcppcqFcppcppcppcqFcppcuTcppcppcppcqGcppcppcqOcuTcuUcppcuWcuVcuYcuXcvacuZcvbcuZcvlcvccvncvmcvrcvccvccvscvtcnlcvucoEcvwcvvcoEcoEcvxcwkcwkcwlcvgcvgcpHbPUcwmcwncwncwncwncwocwncwncwncwncnKcwpcsncsncsncsncsncsnaaacumcumcvycumcumcvAcvzcvCcvBcvEcvDcvGcvFcvIcvHcvKcvJcvLcrgaaaaaaceHcoScoScoScoScvMcoRcuEcvOcvNcvPcrzcrzcvQcrzcvRceHaaaaaacswaafcvScvScvScvScvSaaacsDaaacvScvScvScvScvSaafcswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaacaBaaaaaaaaaaaacqdcppcppcwLcppcppcqFcppcppcppcqFcppcwLcppcppcppcqGcppcppcqOcwLcvTcppcppcvTcvTcvUcppcppcvWcvVcwQcwQcwQcwQcwRcvXcovcvYcvZcsTcwacoEcwbcvvcoEcwccpHcwYcwkcwZcxacxbcpHcxccxdcwncwecwdcwgcwfcwicwhcwjcwncnKcxlcsnaaaaaaaaaaaaaaaaaacrgcwrcwqcwtcwscwvcwucwxcwwcwzcwycwBcwAcuycwCcxAcuycwDcrgaaaaaaceHcnDcnFcnEcxCcnGcuGcwEcwFcwFcwHcwGcwJcwIcwMcwKceHaaaaaacswaaaaafaaaaafaafaafaaacsDaaaaafaaaaafaaaaafaaacswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqdcppcppctMcppcppcwNcppcppcppcwNcppctMcppcppcppcqGcppcppcwPcwOcwTcwScwScwTcwUcwTcwWcwVcwXcwScxfcxecxhcxgcxYcvXcovcxicovcyacxjcoEcoEcxkcoEcxmcpHcyecyecyfcxacxbcpHbPUcxdcwncxocxncxqcxpcxrcxpcxscwncxucxtcsnaaaaaaaaaaaaaaaaaacrgcxwcxvcxycxxcxBcxzcxDcyvcywcxEcyycyzcywcxFcrgcrgcrgcrgaaaaaaceHcoLcoMcoLcxGcoNcoRcrzcrzcxHcxIcrzcxJcoScoScoSceHaaaaaacswaaactFctFctFctFctFaafcsDaafctFctFctFctFctFaafcswaaacyFaaaaaacyFaaaaaaaaacyFaaaaaaaaaaaaaaacyFaaaaaaaaacyFaaaaaacyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacqdcppcxKcxLcxLcxNcxMcxLcxNcxLcxOcxPcrIcrIcxQcrIcxRcrIcrIcrMcxScvTcppcppcxTcxVcxUcxXcxWcxZcppcyccybcydcydcyYcygcovcxicyhcotcyicoEcyjcoEcylcykcpHcpHcpHcpHcpHcpHcpHbPUcxdcwncyncymcxncyocxncxpcypcwncsnczjcsnaaaaaaaaaaaaaaaaaacrgcutcyqcumcumcyscyrcytczocszcsBcsAczpcszcuBcyucrgaaaaaaaaaaaaceHcoLcoLcoLcxCcyxcyAcrzcrzcrzcxIcrzcyBcrzcyCcrzczvaafaafcswaafcuNcuOcuOcuOcuOcuPcsDcuRcuQcuQcuQcuQcuSaafcswaaacyFcyFcyFcyFaaaaaaaaacyFcyFcyFcyFcyFcyFcyFaaaaaaaaacyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacqdcppcqFcppcppcppcwNcppcppcppcwNcppcppcppcyDcppcqGcppcppcppcyEcvTcppcppcyGcwUcyHcyIcwQczBcwQcwQcybcyKcyJczEcygcovcxicovcotcyMcyLcyOcyNcyPcoEcotczKczLczLczMczNczOczPczQcwncyRcyQcyScxpcyTczVczWcwncyVcyUcsnaaaaaaaaaaaaaaaaaacrgcyXcyWcyZcutczbczaczccumczeczdczfczpcyXczgczhcrgaaaaaaaaaaaacljceHcAkcAlcAlcziczlczkcznczmczrczqcztczsczucnIcAwaaaaaacswaafcvScvScvScvScvSaaacsDaafcvScvScvScvScvSaaacswaaacyFcyFcyFcyFaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaacyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaJaaaaaacAxcppcqFcppczwcrEcrDcrEczxcrEcrDcrEczxcrEczycrEczzczCczAcwSczDcyHczFczHczGczJczIczRcwQczScAMcwQcwQcwQcwQcwQcANcniczTcnicotcotcotcotcotcotcotcotcAPczLczLcAQcARcASbPUcATcwncAUcAVczXczUczYcAZcBacwncAaczZcsnaaaaaaaaaaaaaaaaaacrgcuycAbczhcumcBecBfcBgcumcAdcAccAecBkcAfcAccAgcrgaafaafaaaaaaaaaaaacAhaaaceHcAicAmcAjcAocAncAmcApcAqcAncAmcArceHaaaaaacaBaaaaafaaaaafaaaaafaaacsDaaaaafaaaaafaafaafaafcswaaacyFcyFcyFcyFaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaacyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBaaaaaaaaaaaJaaaaaacBwcppcqFcppcAscxVcqFcppcAtcxVcqFcppcAucxVcppcppcAvcppcAycxVcAzcABcAAcADcACcAFcAEcAGcwQcAIcAHcBMcAJcAKctTcAOcALctTcAWctTcAXctWcAYcBccBbcBbcBdcBXcBYcBYcBYcBZcCacASbPUcCbcwncwncCccCdcCecCdcCccCfcwncsncCgcsnaaaaaaaaaaaaaaaaaacrgcumcBhcutcumcBjcBicBlcumcClcCmcrjcCncCocCmcCpcsoaaaaaaaaaaaaaaaaaacBmaafceHcBncBocCtcoScCucBpcCwcoScCxcBqcCzceHaaaaaacswaaacBrcBrcBrcBrcBraafcsDaafcBrcBrcBrcBrcBraafcswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaafaafaafaaJaafaafcBwcppcBscBucBtcBxcBvcBzcBycBBcBAcBDcBCcBEcppcuTcBFcBHcBGcBJcBIcogcogcogcogcogcogcogcogcCRcCScANcBKcBLcovcBNcovcovcxicovcovcBOcovcBLcBPcBRcBQcDacBScBUcBTcBVcDfcASbPTcATcwnaaacCccDjcDkcDlcCccChcBWcCjcCicCkaaaaaaaaaaaaaaaaaacrgcCqcsBcuycCrcCscuycCycCvcDwaafaaacCAcCCcCBcCDaaaaaaaaaaacaaaaaaaaaaaaaaaceHcCEcoLcoLcoScCFcoLcoLcoScCFcoLcoLceHaafaafcswaafcuNcuOcuOcuOcuOcuPcsDcuRcuQcuQcuQcuQcuSaafcswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswcCGaaaaaaaaJaaaaaacDEcDFcDGcDHcDIcDJcDKcDLcDIcDJcDKcDLcDIcDJcDMcDMcDNcDLcDIcDJcDOcogaaacDPcFncCIcCHcCKcCJcDVcDWcDXcDXcCLcDZcEacEbcEccCMcEbcEccEacEecCNcEgcEecANcANcAScEhcEicEjcEkcASbOscATcwncwncCccCdcEocCdcCccCPcCOcCQaafaaaaaaaaaaaaaaaaaaaaacrgcCqcCTcCVcCUcCUcCVczfcCWcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceHcCXcoLcoLcoScCYcoLcoLcoScCYcoLcoLceHaaaaaacswaafcCZcCZcCZcCZcCZaaacsDaaacCZcCZcCZcCZcCZaaacswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswcDbcEzcEzcEAcEzcEzcEzcEzcEBcEzcECcEzcEBcEzcECcEzcEBcEzcECcEzcEzcEzcECcEzcECcEzcEDaafaaacEEcEFcDccEHcEIcDdcDVcEKcDXcDecDmcDgcEOcDncDpcDocDrcDqcEOcDscDucDtcEeaaaaafcAScDxcDvcEZaafaaabOscDzcDycDAcCccDCcDBcDDcCcaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcDQcuCcDScDRcDRcDScuycDTcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceHcoLcoLcoLcoScDUcoLcoLcoScDUcoLcoLceHaacaaacswaaaaaaaafaafaafaaaaaacDYaafaaaaaaaafaafaaaaaacswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaafaafaaaaaqaaaaaaaafchCcmVcmTcmWchCcmVcmTcmWchCcmVcmTcFjchCaaachCcmWcmTcFjchCaaaaafaaacEEcMIcEdcFmcFncEfcFpcFqcDXcEpcErcEqcEOcEscEucEtcEwcEvcEOcExcEGcEycEeaaaaaacAScELcEJcFEaaaaaabOscENcEMcEPcCccEQcEQcEQcCcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcEScERcuycuycuycuycuycETcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacljceHceHceHceHceHceHceHceHcEUcEUcEUcljaaaaaacswcswcswcswcswaaaaaaaaacqzaaaaaaaaacswcswcswcaBcswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaafaafaaJaaaaaaaafchCcEVcEXcEWchCcEYcFbcFachCcFccFecFdchCaafchCcFfcFhcFgchCaaaaafaaacEEcFWcDccFncFncFicFYcFZcGacFlcFrcFocFtcFscFvcFucFxcFwcGkcGlcGmcGncEeaafaaacGocGpcGqcAScGraaabOscFycMAcFzcCcaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsocrgcrgcGwcFAcDScDScDScFBcGwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFCcFCcFCaaaaaaaaaaaaaaaaaaaaaaaaaaacswaafcFDaafcswaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaJaaaaafaafchCcFFcFGcFFchCcFHcFIcFHchCcFJcFKcFJchCaaachCcFJcFJcFLchCaaaaafaaacEEcFncFMcFmcFncDdcGJcEKcDXcFNcFPcFOcEOcFQcFScFRcFScFTcEOcFUcGScFVcEeaapcGbcFXcGWcGXcFXcFXcGcbOscGecGdcGfcCcaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHccDRcDRcDRcDRcDRcHcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaafaaacswaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaJaafaafaaachCcFFcGgcFFchCcFHcGhcFHchCcFJcGicFJchCaafchCcFJcGjcFJchCaafaafaafcHhcHicGycGxcGAcGzcHncEKcDXcGBcGDcGCcEOcGEcGGcGFcGIcGHcEOcGKcHxcGLcEeaaacHzcHAcHBcGMcHDcHEcGNcHGcMGcHIbOsbOsaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcHJcricricricCpcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswcswcswcswcswaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBaaaaaachCchCchCchCchCchCchCchCchCchCchCchCchCaaacHKchCchCchCchCaaaaaaaaaaaacCScCScCScCScCScHLcHMcHMcHMcHMcHNcHMcHOcHPcHQcHPcHRcHMcHMcHScHMcHMcHMcHzcHAcHTcGOcHVcHWcHXaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacHYcHZcHZcHZcIacGPcGQcIdcIecGRcGTcIhcGUcIjcGYcGVcHdcIrcIocIpcIqcIrcIscHecIucIvcHecHMcHzcHAcIwcHfcIycIzcGNaafaaacHYcIBcHYcIBcHYcIBaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHgcHkcHjaaacHgcHkcHjaaacHgcHkcHjaafaafaaaaafaafaafaafaafcIGcHZcHZcHZcIacGPcHlcIIcIJcHmcHocIMcHpcIOcHrcHqcITcITcITcIUcITcITcITcIVcITcIWcIXcHMcHscFXcFXcFXcFXcFXcHtaafaafcJacJacJacJacJacJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHgcHucHjaaacHgcHucHjaaacHgcHucHjaafaafaaaaafaaaaaacJcaafcHYcHZcHZcHZcIacGPcHlcHvcHycHwcHCcIMcHFcJicJjcIucIucIucIbcHUcJHcIucIucJicJncJocJpcHMcHMcHMcJqaaaaaaaaaaaabvcaaacJrcJrcJrcJrcJrcJraafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafcHgcHucHjaaacHgcHucHjaafcHgcHucHjaafaaaaaaaafaafcJsaaaaafcIGcHZcHZcHZcIacGPcIfcIccIicIgcIlcIkcImcJAcJBcJCcJCcJCcHrcIncLbcJCcJCcJGcJHcJIcJJcJKcJLcJMcJNcJOcJOcJOcJOcJOcJOcJPcJQcJPcJQcJPcJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHgcHucHjaafcHgcHucHjaaacHgcHucHjaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcJRcJScJTcJUcItcIxcIhcIucIucIucIucIDcIAcIFcIEcIKcIHcILcKfcKgcKhcKicKjcINcKlcJNcKmcKncKmcKncKmcKncKmcKncKmcKncKmcJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJaafaaacHgcHucHjaafcHgcHucHjaaacHgcHucHjaafaaaaaaaaaaaaaafaafcIPcKpcKpcKpcKpcKqcKqcKqcKqcKqcKrcKqcHMcKscIucIucIucIQcHMcKucKvcKwcHMcIRcKycKzcJIcIYcIScIZcHMaaacJrcJrcJrcJrcKDcJrcJrcJrcJrcJrcJrcJraafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcJbaafaafaafcJbaafaaaaafcJbaafaaaaaaaaaaaaaaacJdcJfcJecJgcKJcKKcKLcJhcMLcMMcKPcKQcKRcKPcHMcKScKTcIucIucJkcKVcJmcJlcJtcKZcHFcLbcJHcJIcLccLdcJucHMaafcJacJacJacJacJacJacJacJacJacJacJacJaaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafcJwcJvcJycJxcJxcJxcJxcJxcJxcJxcJxcJxcJxcJxcJzcJvcJvcJvcJDcLlcLmcLncJEcLpcLqcLrcJFcLtcLtcLtcLucLvcLwcHMcJVcJVcIucIucJkcLycJXcJWcJYcLCcHFcIucKgcLDcKicIucJZcHMaafcJacJacJacJacJacJacJacJacJacJacJacJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFaaacuFcuFcuFcuFcuFaaacuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafcKaaafaaaaafcKaaafaaaaafcKaaafaaaaaaaaaaaaaaacJdcJfcKbcKccLIcLJcKpcKdcLLcKPcKPcLMcLMcLNcHMcJVcJVcIucIucJkcLOcJXcKecKkcLRcKocLTcLUcLVcLUcLTcKzcHMaaacJrcJrcJrcJrcKDcJrcJrcJrcJrcJrcJrcJraafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFaaacuFcuFcuFcuFcuFaaacuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJaafaafcHgcKtcHjaaacHgcKtcHjaaacHgcKtcHjaafaaaaaaaaaaaaaafaafcKxcKpcKpcKpcKpcMbcMccMdcMdcMecMbcMbcHMcHMcIhcHMcHMcHMcHMcHMcKAcHMcHMcHMcHMcHMcIhcHMcHMcHMcHMaafcJacJacJacJacJacJacJacJacJacJacJacJaaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHgcKtcHjaafcHgcKtcHjaaacHgcKtcHjaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacMgaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaacIGcMhcIGcMhcMicMhcIGcMhcIGcMhcIGcMhaafaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafcHgcKtcHjaaacHgcKtcHjaaacHgcKtcHjaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaapaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaafcHgcKtcHjaaacHgcKtcHjaafcHgcKtcHjaafaafaafaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJcaBcaBaaJaaJaaaaaaaaaaaJaaJaaJaaJaaJaaqaaJaaJaaJaaJaaJaaJaaJaaJcMkaaJaaJaaJaaJaaqaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaafcHgcKBcHjaaacHgcKBcHjaaacHgcKBcHjaafaaJaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaJaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMmcMmcMmcMmcMmcMmcMmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaJaamaamaaqaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaacJcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMmcMmcMmcMmcMmcMmcMmcMmcMmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMnaaaaaacMnaaaaaaaaacMnaaaaaaaaaaaaaaacMnaaaaaaaaacMnaaaaaacMnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMmcMmcMmcMmcMmcMmcMmcMmcMmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMjcMjcMjcMjcMjcMjcMjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index fe1ad8792f2..d4b0513f848 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -37,10 +37,10 @@ "aK" = (/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/east/shuttlespace_ew4,/area/space) "aL" = (/turf/space{icon_state = "black"},/area/space) "aM" = (/turf/space,/area/space) -"aN" = (/turf/unsimulated/wall{icon_state = "iron6"},/area/space) -"aO" = (/obj/structure/window/reinforced,/turf/unsimulated/wall{icon_state = "iron12"},/area/space) -"aP" = (/turf/unsimulated/wall{icon_state = "iron14"},/area/space) -"aQ" = (/turf/unsimulated/wall{icon_state = "iron10"},/area/space) +"aN" = (/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space) +"aO" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/prison/solitary) +"aP" = (/obj/structure/bed,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/prison/solitary) +"aQ" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/prison/solitary) "aR" = (/turf/space/transit/north/shuttlespace_ns8,/area/space) "aS" = (/turf/space/transit/north/shuttlespace_ns4,/area/space) "aT" = (/turf/space/transit/north/shuttlespace_ns11,/area/space) @@ -64,73 +64,73 @@ "bl" = (/turf/space/transit/east/shuttlespace_ew11,/area/space) "bm" = (/turf/space/transit/east/shuttlespace_ew12,/area/space) "bn" = (/turf/space/transit/east/shuttlespace_ew9,/area/space) -"bo" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/wall{icon_state = "iron3"},/area/space) +"bo" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/prison/solitary) "bp" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) -"bq" = (/obj/effect/landmark/costume,/obj/structure/table/rack/holorack,/turf/simulated/floor/holofloor{icon_state = "cult"; dir = 2},/area/holodeck/source_theatre) -"br" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall{icon_state = "iron3"},/area/space) +"bq" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/wall,/area/space) +"br" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall,/area/space) "bs" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) "bt" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bu" = (/obj/structure/table/rack/holorack,/obj/item/clothing/under/dress/dress_saloon,/obj/item/clothing/head/hairflower,/turf/simulated/floor/holofloor{icon_state = "cult"; dir = 2},/area/holodeck/source_theatre) +"bu" = (/obj/structure/table/rack/holorack,/obj/item/clothing/under/dress/dress_saloon,/obj/item/clothing/head/hairflower,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) "bv" = (/obj/structure/flora/ausbushes/fullgrass,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) -"bw" = (/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Holodeck Projector Floor"},/area/holodeck/source_wildlife) -"bx" = (/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Holodeck Projector Floor"},/area/holodeck/source_plating) -"by" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_emptycourt) -"bz" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_emptycourt) -"bA" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_emptycourt) -"bB" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall{icon_state = "iron3"},/area/space) +"bw" = (/obj/effect/landmark/costume,/obj/structure/table/rack/holorack,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) +"bx" = (/obj/structure/window/reinforced/holowindow{dir = 4},/obj/structure/flora/pottedplant{tag = "icon-plant-10"; icon_state = "plant-10"},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom) +"by" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom) +"bz" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"bA" = (/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_wildlife) +"bB" = (/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_plating) "bC" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_desert) "bD" = (/turf/space,/area/syndicate_mothership) "bE" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) "bF" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) -"bG" = (/turf/simulated/floor/holofloor{icon_state = "cult"; dir = 2},/area/holodeck/source_theatre) -"bH" = (/obj/effect/landmark{name = "Holocarp Spawn"},/turf/simulated/floor/holofloor{icon_state = "engine"; name = "Holodeck Projector Floor"},/area/holodeck/source_wildlife) -"bI" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_emptycourt) -"bJ" = (/turf/simulated/floor/holofloor,/area/holodeck/source_emptycourt) -"bK" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_emptycourt) +"bG" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) +"bH" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"bI" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"bJ" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"bK" = (/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "bL" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"bM" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{icon_state = "wood_siding2"; dir = 4},/area/holodeck/source_picnicarea) -"bN" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{icon_state = "wood_siding2"; dir = 4},/area/holodeck/source_picnicarea) +"bM" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall,/area/space) +"bN" = (/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "bO" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/green,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/green,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "bP" = (/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/syndicate_mothership) -"bQ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor{icon_state = "asteroid"; dir = 2},/area/holodeck/source_picnicarea) -"bR" = (/turf/simulated/floor/holofloor{icon_state = "wood"; dir = 4},/turf/simulated/floor/holofloor{icon_state = "siding1"; dir = 2},/area/holodeck/source_theatre) +"bQ" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/prison/solitary) +"bR" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_theatre) "bS" = (/turf/space,/area/shuttle/escape/transit) "bT" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/blue,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "bU" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area/space) -"bV" = (/obj/effect/decal/cleanable/dirt,/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "asteroid"; dir = 2},/area/holodeck/source_picnicarea) +"bV" = (/obj/machinery/door/window/holowindoor,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom) "bW" = (/turf/simulated/floor/holofloor/space,/area/holodeck/source_space) "bX" = (/obj/effect/landmark{name = "Holocarp Spawn Random"},/turf/simulated/floor/holofloor/space,/area/holodeck/source_space) -"bY" = (/turf/simulated/floor/holofloor{icon_state = "wood"; dir = 4},/area/holodeck/source_theatre) -"bZ" = (/turf/simulated/floor/holofloor{icon_state = "carpet6-2"; dir = 4},/area/holodeck/source_theatre) -"ca" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet15-15"; dir = 4},/area/holodeck/source_meetinghall) -"cb" = (/turf/simulated/floor/holofloor{icon_state = "carpet10-8"; dir = 4},/area/holodeck/source_theatre) +"bY" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"bZ" = (/obj/effect/landmark{name = "Holocarp Spawn"},/turf/simulated/floor/holofloor/reinforced,/area/holodeck/source_wildlife) +"ca" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"cb" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "cc" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area/space) "cd" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area/space) -"ce" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet7-3"; dir = 4},/area/holodeck/source_meetinghall) +"ce" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "cf" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area/space) "cg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area/space) "ch" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area/space) "ci" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"cj" = (/turf/simulated/floor/holofloor{icon_state = "cult"; dir = 2},/area/holodeck/source_meetinghall) -"ck" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_meetinghall) -"cl" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor{dir = 5; icon_state = "vault"},/area/holodeck/source_basketball) -"cm" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet15-15"; dir = 4},/area/holodeck/source_theatre) -"cn" = (/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_basketball) -"co" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_emptycourt) -"cp" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_emptycourt) +"cj" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"ck" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood/corner,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"cl" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"cm" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{tag = "icon-spline_fancy_corner (WEST)"; icon_state = "spline_fancy_corner"; dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"cn" = (/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom) +"co" = (/obj/structure/bed/chair/holochair,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"cp" = (/obj/structure/window/reinforced/holowindow{dir = 1},/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) "cq" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area/space) -"cr" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{dir = 5; icon_state = "vault"},/area/holodeck/source_basketball) -"cs" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{dir = 5; icon_state = "vault"},/area/holodeck/source_thunderdomecourt) -"ct" = (/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_thunderdomecourt) -"cu" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor{dir = 5; icon_state = "vault"},/area/holodeck/source_thunderdomecourt) -"cv" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_boxingcourt) +"cr" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Jury Box"},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"cs" = (/obj/structure/window/reinforced/holowindow{dir = 1},/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"ct" = (/obj/machinery/door/window/holowindoor{name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) +"cu" = (/obj/structure/bed,/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/prison/solitary) +"cv" = (/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) "cw" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area/space) "cx" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area/space) -"cy" = (/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) +"cy" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (SOUTHEAST)"; icon_state = "spline_fancy"; dir = 6},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) "cz" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns11,/area/space) -"cA" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) -"cB" = (/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) -"cC" = (/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) +"cA" = (/obj/effect/decal/cleanable/dirt,/obj/structure/holostool,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) +"cB" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (WEST)"; icon_state = "spline_fancy"; dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"cC" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) "cD" = (/turf/space/transit/east/shuttlespace_ew1,/area/shuttle/escape_pod3/transit) "cE" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area/space) "cF" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew4,/area/space) @@ -139,95 +139,95 @@ "cI" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew15,/area/space) "cJ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew1,/area/space) "cK" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew9,/area/space) -"cL" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/holofloor{icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) -"cM" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{icon_state = "wood_siding1"; dir = 2},/area/holodeck/source_picnicarea) -"cN" = (/turf/simulated/floor/holofloor{icon_state = "bluefull"},/area/holodeck/source_boxingcourt) +"cL" = (/obj/effect/floor_decal/spline/plain{tag = "icon-spline_plain (NORTH)"; icon_state = "spline_plain"; dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) +"cM" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"cN" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) "cO" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area/space) -"cP" = (/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor,/area/holodeck/source_thunderdomecourt) -"cQ" = (/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"cR" = (/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_thunderdomecourt) +"cP" = (/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/wood,/area/holodeck/source_courtroom) +"cQ" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"cR" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) "cS" = (/turf/space/transit/east/shuttlespace_ew15,/area/shuttle/escape_pod3/transit) "cT" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area/space) "cU" = (/turf/space/transit/east/shuttlespace_ew7,/area/shuttle/escape_pod5/transit) -"cV" = (/obj/structure/window/reinforced/holowindow/disappearing,/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"cW" = (/obj/structure/window/reinforced/holowindow/disappearing,/turf/simulated/floor/holofloor,/area/holodeck/source_thunderdomecourt) +"cV" = (/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_courtroom) +"cW" = (/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/wood,/area/holodeck/source_courtroom) "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_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) +"da" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet/corners{tag = "icon-carpet_corners (NORTHWEST)"; icon_state = "carpet_corners"; dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) "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) "dd" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew11,/area/space) -"de" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet14-10"; dir = 4},/area/holodeck/source_meetinghall) -"df" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet6-2"; dir = 4},/area/holodeck/source_meetinghall) +"de" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"df" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/desert,/area/holodeck/source_picnicarea) "dg" = (/turf/space/transit/east/shuttlespace_ew4,/area/shuttle/escape_pod5/transit) "dh" = (/turf/space/transit/east/shuttlespace_ew5,/area/shuttle/escape_pod5/transit) "di" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew1,/area/space) "dj" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"}) -"dk" = (/obj/item/weapon/beach_ball/holoball,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/holodeck/source_basketball) -"dl" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet10-8"; dir = 4},/area/holodeck/source_meetinghall) -"dm" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet13-5"; dir = 4},/area/holodeck/source_theatre) +"dk" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (WEST)"; icon_state = "spline_fancy"; dir = 8},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"dl" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) +"dm" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) "dn" = (/turf/space/transit/east/shuttlespace_ew14,/area/shuttle/escape_pod3/transit) -"do" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/source_emptycourt) -"dp" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_emptycourt) -"dq" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_emptycourt) -"dr" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_boxingcourt) +"do" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"dp" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"dq" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"dr" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) "ds" = (/obj/item/weapon/beach_ball,/turf/simulated/floor/beach/sand{tag = "icon-desert0"; icon_state = "desert0"},/area/holodeck/source_beach) "dt" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area/space) "du" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area/space) -"dv" = (/turf/simulated/floor/holofloor{icon_state = "grimy"; dir = 2},/turf/simulated/floor/holofloor{icon_state = "siding1"; dir = 2},/area/holodeck/source_meetinghall) +"dv" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) "dw" = (/turf/space/transit/east/shuttlespace_ew14,/area/shuttle/escape_pod5/transit) "dx" = (/turf/space/transit/east/shuttlespace_ew15,/area/shuttle/escape_pod5/transit) "dy" = (/turf/space/transit/east/shuttlespace_ew1,/area/shuttle/escape_pod5/transit) "dz" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew10,/area/space) -"dA" = (/turf/simulated/floor/holofloor{icon_state = "rampbottom"; dir = 2},/turf/simulated/floor/holofloor{icon_state = "siding1"; dir = 2},/area/holodeck/source_meetinghall) -"dB" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{icon_state = "iron12"},/area/space) +"dA" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"dB" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) "dC" = (/turf/unsimulated/wall,/area/space) -"dD" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall{icon_state = "iron12"},/area/space) -"dE" = (/turf/unsimulated/wall{icon_state = "iron11"},/area/space) -"dF" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove{icon_state = "boxinggreen"; item_state = "boxinggreen"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) +"dD" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"dE" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"dF" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) "dG" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns2,/area/space) "dH" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew10,/area/space) "dI" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew12,/area/space) -"dJ" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet13-5"; dir = 4},/area/holodeck/source_meetinghall) -"dK" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet5-1"; dir = 4},/area/holodeck/source_meetinghall) -"dL" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet9-4"; dir = 4},/area/holodeck/source_meetinghall) -"dM" = (/turf/simulated/floor/holofloor{icon_state = "snow"},/area/holodeck/source_snowfield) -"dN" = (/turf/simulated/floor/holofloor{icon_state = "grimy"; dir = 2},/area/holodeck/source_meetinghall) -"dO" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_basketball) -"dP" = (/obj/structure/holohoop,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_basketball) -"dQ" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_basketball) +"dJ" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"dK" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"dL" = (/obj/structure/table/woodentable/holotable,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"dM" = (/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"dN" = (/obj/structure/table/woodentable/holotable,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"dO" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"dP" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"dQ" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (NORTH)"; icon_state = "spline_fancy"; dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) "dR" = (/turf/simulated/floor/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/holodeck/source_beach) "dS" = (/turf/simulated/floor/beach/sand{tag = "icon-desert1"; icon_state = "desert1"},/area/holodeck/source_beach) "dT" = (/turf/simulated/floor/beach/sand{tag = "icon-desert4"; icon_state = "desert4"},/area/holodeck/source_beach) "dU" = (/turf/simulated/floor/beach/sand{tag = "icon-desert0"; icon_state = "desert0"},/area/holodeck/source_beach) -"dV" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"dW" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/under/color/red,/obj/item/weapon/holo/esword/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"dX" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_thunderdomecourt) +"dV" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (NORTH)"; icon_state = "spline_fancy"; dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"dW" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (NORTHEAST)"; icon_state = "spline_fancy"; dir = 5},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"dX" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) "dY" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area/space) -"dZ" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_boxingcourt) -"ea" = (/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) +"dZ" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"ea" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) "eb" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns1,/area/space) -"ec" = (/obj/structure/flora/grass/both,/turf/simulated/floor/holofloor{icon_state = "snow"},/area/holodeck/source_snowfield) -"ed" = (/turf/simulated/floor/holofloor{icon_state = "carpet4-0"; dir = 4},/area/holodeck/source_meetinghall) -"ee" = (/turf/simulated/floor/holofloor{icon_state = "carpetsymbol"; dir = 6},/area/holodeck/source_meetinghall) -"ef" = (/turf/simulated/floor/holofloor{icon_state = "carpet8-0"; dir = 4},/area/holodeck/source_meetinghall) -"eg" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_basketball) -"eh" = (/turf/simulated/floor/holofloor,/area/holodeck/source_basketball) -"ei" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_basketball) +"ec" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{tag = "icon-spline_fancy_corner (NORTH)"; icon_state = "spline_fancy_corner"; dir = 1},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"ed" = (/obj/structure/flora/ausbushes/ywflowers,/obj/effect/floor_decal/spline/fancy/wood/corner{tag = "icon-spline_fancy_corner (EAST)"; icon_state = "spline_fancy_corner"; dir = 4},/turf/simulated/floor/holofloor/grass,/area/holodeck/source_picnicarea) +"ee" = (/obj/machinery/door/window/holowindoor{base_state = "right"; icon_state = "right"},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_courtroom) +"ef" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"eg" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"eh" = (/obj/machinery/door/window/holowindoor{base_state = "right"; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_emptycourt) +"ei" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) "ej" = (/obj/effect/overlay/palmtree_r,/turf/simulated/floor/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/holodeck/source_beach) "ek" = (/turf/simulated/floor/beach/sand{tag = "icon-desert3"; icon_state = "desert3"},/area/holodeck/source_beach) "el" = (/obj/effect/overlay/palmtree_l,/obj/effect/overlay/coconut,/turf/simulated/floor/beach/sand{tag = "icon-desert0"; icon_state = "desert0"},/area/holodeck/source_beach) -"em" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Green Corner"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) -"en" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"eo" = (/turf/simulated/floor/holofloor,/area/holodeck/source_thunderdomecourt) -"ep" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_thunderdomecourt) -"eq" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/holodeck/source_boxingcourt) -"er" = (/turf/simulated/floor/holofloor,/area/holodeck/source_boxingcourt) -"es" = (/obj/machinery/door/window/holowindoor{base_state = "right"; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_thunderdomecourt) -"et" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/holofloor{icon_state = "snow"},/area/holodeck/source_snowfield) -"eu" = (/obj/machinery/door/window/holowindoor{base_state = "right"; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_basketball) -"ev" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_basketball) +"em" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"en" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"eo" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"ep" = (/obj/structure/bed/chair/holochair{dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"eq" = (/obj/structure/flora/pottedplant{tag = "icon-plant-06"; icon_state = "plant-06"},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_theatre) +"er" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_theatre) +"es" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"et" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"eu" = (/obj/structure/bed/chair/holochair{dir = 1},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_courtroom) +"ev" = (/obj/structure/window/reinforced/holowindow/disappearing,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "ew" = (/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/beach/sand{tag = "icon-desert0"; icon_state = "desert0"},/area/holodeck/source_beach) "ex" = (/turf/space/transit/east/shuttlespace_ew7,/area/shuttle/escape_pod3/transit) "ey" = (/turf/space/transit/east/shuttlespace_ew8,/area/shuttle/escape_pod3/transit) @@ -237,63 +237,63 @@ "eC" = (/turf/space/transit/east/shuttlespace_ew3,/area/shuttle/escape_pod3/transit) "eD" = (/turf/space/transit/east/shuttlespace_ew4,/area/shuttle/escape_pod3/transit) "eE" = (/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_ns10,/area/space) -"eF" = (/obj/structure/flora/grass/green,/turf/simulated/floor/holofloor{icon_state = "snow"},/area/holodeck/source_snowfield) +"eF" = (/obj/structure/window/reinforced/holowindow/disappearing,/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) "eG" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew5,/area/space) "eH" = (/turf/space/transit/east/shuttlespace_ew5,/area/shuttle/escape_pod3/transit) "eI" = (/turf/space/transit/north/shuttlespace_ns14,/area/shuttle/escape/transit) -"eJ" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/holodeck/source_basketball) -"eK" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/holodeck/source_basketball) -"eL" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "red"},/area/holodeck/source_basketball) +"eJ" = (/obj/structure/window/reinforced/holowindow/disappearing,/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_emptycourt) +"eK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall,/area/space) +"eL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/wall,/area/space) "eM" = (/turf/space/transit/north/shuttlespace_ns3,/area/shuttle/escape/transit) "eN" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/escape/transit) "eO" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape/transit) -"eP" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor{dir = 5; icon_state = "vault"},/area/holodeck/source_emptycourt) -"eQ" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{dir = 5; icon_state = "vault"},/area/holodeck/source_emptycourt) -"eR" = (/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_emptycourt) -"eS" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) -"eT" = (/obj/structure/flora/tree/dead,/turf/simulated/floor/holofloor{icon_state = "snow"},/area/holodeck/source_snowfield) -"eU" = (/obj/structure/window/reinforced/holowindow{dir = 4},/obj/structure/flora/pottedplant{tag = "icon-plant-10"; icon_state = "plant-10"},/turf/simulated/floor/holofloor{icon_state = "grimy"; dir = 2},/area/holodeck/source_courtroom) -"eV" = (/turf/simulated/floor/holofloor{icon_state = "grimy"; dir = 2},/area/holodeck/source_courtroom) -"eW" = (/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) -"eX" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "green"},/area/holodeck/source_basketball) -"eY" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "green"},/area/holodeck/source_basketball) -"eZ" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "green"},/area/holodeck/source_basketball) +"eP" = (/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"eQ" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) +"eR" = (/obj/structure/flora/pottedplant{tag = "icon-plant-06"; icon_state = "plant-06"},/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) +"eS" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"eT" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) +"eU" = (/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"eV" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"eW" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"eX" = (/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"eY" = (/obj/structure/holohoop,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"eZ" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "fa" = (/turf/simulated/floor/beach/sand{tag = "icon-beachcorner"; icon_state = "beachcorner"; dir = 2},/area/holodeck/source_beach) "fb" = (/turf/simulated/floor/beach/sand{tag = "icon-beach"; icon_state = "beach"},/area/holodeck/source_beach) "fc" = (/turf/simulated/floor/beach/sand{tag = "icon-beachcorner (NORTH)"; icon_state = "beachcorner"; dir = 1},/area/holodeck/source_beach) -"fd" = (/obj/machinery/door/window/holowindoor,/turf/simulated/floor/holofloor{icon_state = "grimy"; dir = 2},/area/holodeck/source_courtroom) -"fe" = (/turf/simulated/floor/holofloor{icon_state = "rampbottom"; dir = 2},/turf/simulated/floor/holofloor{icon_state = "siding1"; dir = 2},/area/holodeck/source_theatre) -"ff" = (/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor{icon_state = "grimy"; dir = 2},/area/holodeck/source_courtroom) -"fg" = (/turf/simulated/floor/holofloor{icon_state = "carpet14-10"; dir = 4},/area/holodeck/source_courtroom) -"fh" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_boxingcourt) -"fi" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_basketball) -"fj" = (/turf/simulated/floor/holofloor{icon_state = "carpet6-2"; dir = 4},/area/holodeck/source_courtroom) -"fk" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_basketball) +"fd" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) +"fe" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"ff" = (/obj/structure/holostool,/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"fg" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/under/color/red,/obj/item/weapon/holo/esword/red,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"fh" = (/obj/structure/table/holotable,/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"fi" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"fj" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"fk" = (/obj/structure/flora/grass/both,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) "fl" = (/turf/simulated/floor/beach/sand{tag = "icon-beach (SOUTHEAST)"; icon_state = "beach"; dir = 6},/area/holodeck/source_beach) "fm" = (/turf/simulated/floor/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"; dir = 2},/area/holodeck/source_beach) "fn" = (/turf/simulated/floor/beach/sand{tag = "icon-beach (SOUTHWEST)"; icon_state = "beach"; dir = 10},/area/holodeck/source_beach) -"fo" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"fp" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"fq" = (/obj/structure/flora/grass/brown,/turf/simulated/floor/holofloor{icon_state = "snow"},/area/holodeck/source_snowfield) -"fr" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_basketball) +"fo" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"fp" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"fq" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"fr" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "fs" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns9,/area/space) -"ft" = (/obj/structure/window/reinforced/holowindow{dir = 8},/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet7-3"; dir = 4},/area/holodeck/source_courtroom) -"fu" = (/turf/simulated/floor/holofloor{icon_state = "carpet10-8"; dir = 4},/area/holodeck/source_courtroom) -"fv" = (/obj/structure/bed/chair/holochair{dir = 8},/turf/simulated/floor/holofloor{icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_courtroom) -"fw" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/source_basketball) -"fx" = (/obj/structure/holohoop{dir = 1},/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_basketball) -"fy" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_basketball) -"fz" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"fA" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/under/color/green,/obj/item/weapon/holo/esword/green,/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"fB" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_thunderdomecourt) -"fC" = (/obj/structure/bed/chair/holochair{dir = 8},/turf/simulated/floor/holofloor{icon_state = "carpet15-15"; dir = 4},/area/holodeck/source_courtroom) -"fD" = (/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_boxingcourt) -"fE" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "asteroid"; dir = 2},/area/holodeck/source_picnicarea) +"ft" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"fu" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"fv" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"fw" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"fx" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"fy" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"fz" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"fA" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_meetinghall) +"fB" = (/obj/machinery/door/window/holowindoor{name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) +"fC" = (/obj/machinery/door/window/holowindoor{name = "Red Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) +"fD" = (/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"fE" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 2; icon_state = "right"; name = "Red Corner"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) "fF" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area/space) -"fG" = (/turf/unsimulated/wall{icon_state = "iron5"},/area/space) -"fH" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{icon_state = "iron12"},/area/space) -"fI" = (/turf/unsimulated/wall{icon_state = "iron13"},/area/space) -"fJ" = (/turf/unsimulated/wall{icon_state = "iron9"},/area/space) +"fG" = (/obj/structure/flora/tree/dead,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"fH" = (/turf/simulated/floor/holofloor/lino,/area/holodeck/source_meetinghall) +"fI" = (/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_meetinghall) +"fJ" = (/obj/structure/window/reinforced/holowindow{dir = 4},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) "fK" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area/space) "fL" = (/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) "fM" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership) @@ -305,16 +305,16 @@ "fS" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/space,/area/shuttle/syndicate_elite/mothership) "fT" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite/mothership) "fU" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate_elite/mothership) -"fV" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/syndicate_elite/mothership) +"fV" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) "fW" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area/space) "fX" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area/space) "fY" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area/space) "fZ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns10,/area/space) "ga" = (/obj/effect/landmark{name = "Syndicate-Commando-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate_elite/mothership) -"gb" = (/mob/living/silicon/decoy{icon_state = "ai-malf"; name = "GLaDOS"},/turf/unsimulated/floor{icon_state = "whiteshiny"},/area/syndicate_mothership/control) -"gc" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; freerange = 1; frequency = 1213; listening = 1; name = "Syndicate Ops Intercom"; pixel_y = 0; subspace_transmission = 1; syndie = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "circuit"},/area/syndicate_mothership) +"gb" = (/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"gc" = (/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) "gd" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns7,/area/space) -"ge" = (/turf/simulated/floor/holofloor/grass,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/holofloor{dir = 4; icon_state = "wood_siding8"},/area/holodeck/source_picnicarea) +"ge" = (/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) "gf" = (/turf/space/transit/north/shuttlespace_ns6,/area/syndicate_station/transit) "gg" = (/turf/space/transit/north/shuttlespace_ns8,/area/syndicate_station/transit) "gh" = (/turf/space/transit/north/shuttlespace_ns3,/area/syndicate_station/transit) @@ -337,13 +337,13 @@ "gy" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area/space) "gz" = (/turf/space,/area/syndicate_mothership/elite_squad) "gA" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership/elite_squad) -"gB" = (/obj/machinery/computer/pod{id = "syndicate_elite"; name = "Hull Door Control"},/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership/elite_squad) -"gC" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; freerange = 1; frequency = 1213; listening = 0; name = "Syndicate Ops Intercom"; pixel_y = 28; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership/elite_squad) -"gD" = (/obj/effect/landmark{name = "Syndicate-Commando"},/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership/elite_squad) -"gE" = (/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership/elite_squad) -"gF" = (/obj/machinery/mech_bay_recharge_port,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership/elite_squad) -"gG" = (/obj/mecha/combat/marauder/mauler,/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership) -"gH" = (/turf/unsimulated/floor{icon_state = "floor4"},/area/syndicate_mothership) +"gB" = (/obj/structure/flora/grass/green,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"gC" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"gD" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"gE" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"gF" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"gG" = (/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"gH" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "gI" = (/turf/space/transit/north/shuttlespace_ns12,/area/syndicate_station/transit) "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) @@ -351,7 +351,7 @@ "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) +"gP" = (/obj/item/weapon/beach_ball/holoball,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "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) @@ -359,8 +359,8 @@ "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 = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) -"gX" = (/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) -"gY" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership/elite_squad) +"gX" = (/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"gY" = (/obj/structure/window/reinforced/holowindow/disappearing,/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "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_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) @@ -370,7 +370,7 @@ "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/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) +"hi" = (/obj/structure/window/reinforced/holowindow/disappearing,/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "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) @@ -384,33 +384,33 @@ "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" = (/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) +"hw" = (/obj/structure/window/reinforced/holowindow/disappearing,/obj/effect/floor_decal/corner/red/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"hx" = (/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) "hy" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 1},/turf/space,/area/centcom/evac) "hz" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 1},/turf/space,/area/centcom/evac) "hA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 1},/turf/space,/area/centcom/evac) -"hB" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/centcom/evac) +"hB" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) "hC" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns5,/area/space) "hD" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns13,/area/space) -"hE" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/centcom/evac) -"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) +"hE" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"hF" = (/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) +"hG" = (/obj/structure/holostool,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"hH" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) "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) +"hJ" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"hK" = (/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "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) +"hN" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"hO" = (/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "hP" = (/obj/structure/closet/emcloset,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) -"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) +"hQ" = (/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (WEST)"; icon_state = "corner_white_full"; dir = 8},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "hR" = (/obj/structure/table/standard,/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/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) "hT" = (/obj/structure/table/standard,/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/structure/table/standard,/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) -"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) +"hV" = (/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"hW" = (/obj/structure/window/reinforced/holowindow/disappearing{dir = 1},/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (NORTH)"; icon_state = "corner_white_full"; dir = 1},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "hX" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/shuttle/plating,/area/centcom/evac) "hY" = (/obj/machinery/vending/engineering,/turf/simulated/shuttle/plating,/area/centcom/evac) "hZ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns15,/area/space) @@ -423,7 +423,7 @@ "ig" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns14,/area/space) "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) +"ij" = (/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) "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) @@ -444,9 +444,9 @@ "iB" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership{name = "\improper Ninja Base"}) "iC" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"}) "iD" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"}) -"iE" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/centcom/evac) +"iE" = (/obj/effect/floor_decal/corner/blue/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) "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) +"iG" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "iH" = (/turf/space/transit/north/shuttlespace_ns11,/area/shuttle/escape_pod1/transit) "iI" = (/turf/space/transit/north/shuttlespace_ns6,/area/shuttle/escape_pod1/transit) "iJ" = (/turf/space/transit/north/shuttlespace_ns8,/area/shuttle/escape_pod1/transit) @@ -456,7 +456,7 @@ "iN" = (/turf/space/transit/north/shuttlespace_ns13,/area/shuttle/escape_pod2/transit) "iO" = (/turf/space/transit/north/shuttlespace_ns10,/area/shuttle/escape_pod2/transit) "iP" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space/transit/north/shuttlespace_ns6,/area/space) -"iQ" = (/obj/structure/holostool,/turf/simulated/floor/holofloor{icon_state = "carpet14-10"; dir = 4},/area/holodeck/source_theatre) +"iQ" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "iR" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "iS" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "iT" = (/obj/machinery/vending/cola,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) @@ -479,7 +479,7 @@ "jk" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "jl" = (/turf/space,/area/shuttle/escape_pod3/centcom) "jm" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/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) +"jn" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "jo" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "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) @@ -490,10 +490,10 @@ "jv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) "jw" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) "jx" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) -"jy" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "swallc1"},/area/centcom/evac) +"jy" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "jz" = (/obj/machinery/computer/arcade,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "jA" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/syndicate_mothership{name = "\improper Ninja Base"}) -"jB" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/syndicate_mothership{name = "\improper Ninja Base"}) +"jB" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) "jC" = (/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"}) "jD" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/syndicate_mothership{name = "\improper Ninja Base"}) "jE" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/syndicate_mothership{name = "\improper Ninja Base"}) @@ -509,7 +509,7 @@ "jO" = (/turf/unsimulated/wall{desc = "That looks like it doesn't open easily."; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/ferry) "jP" = (/turf/space,/area/skipjack_station/transit) "jQ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/turf/space,/area/space) -"jR" = (/obj/machinery/light/small{dir = 4},/turf/unsimulated/floor{icon_state = "loadingarea"},/area/centcom/specops) +"jR" = (/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_boxingcourt) "jS" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light/small{brightness_color = "#DA0205"; brightness_power = 1; brightness_range = 5},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "jT" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac) "jU" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) @@ -518,34 +518,34 @@ "jX" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "jY" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "jZ" = (/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},/obj/machinery/light/small/readylight{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) -"ka" = (/obj/machinery/button/remote/blast_door{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint Access"; pixel_x = -6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_thunderdome"; name = "Thunderdome Access"; pixel_x = 6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_vip_shuttle"; name = "VIP Shuttle Access"; pixel_x = 6; pixel_y = -34; req_access = list(101)},/obj/machinery/turretid{pixel_x = 28; pixel_y = -28; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"kb" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/transport1/centcom) +"ka" = (/obj/structure/flora/grass/brown,/turf/simulated/floor/holofloor/snow,/area/holodeck/source_snowfield) +"kb" = (/obj/machinery/door/window/holowindoor{base_state = "right"; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_basketball) "kc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership) -"kd" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) -"ke" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/transport1/centcom) -"kf" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/transport1/centcom) +"kd" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"ke" = (/obj/machinery/door/window/holowindoor{base_state = "right"; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_thunderdomecourt) +"kf" = (/obj/structure/window/reinforced/holowindow{dir = 1},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) "kg" = (/obj/structure/window/shuttle{icon_state = "window12"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) "kh" = (/obj/machinery/door/airlock/hatch{name = "Infirmary"},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/centcom/evac) "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) +"kj" = (/obj/machinery/door/window/holowindoor{dir = 1; name = "Green Corner"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) "kk" = (/obj/structure/window/shuttle{icon_state = "window4"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) "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) +"ko" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet,/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) "kp" = (/obj/structure/window/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) -"kq" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/shuttle/transport1/centcom) -"kr" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/transport1/centcom) +"kq" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) +"kr" = (/obj/structure/holostool,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/turf/simulated/floor/holofloor/carpet,/area/holodeck/source_meetinghall) "ks" = (/obj/machinery/microwave,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"kt" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_floor_f9"},/area/shuttle/transport1/centcom) +"kt" = (/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "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/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/transport1/centcom) -"kw" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_floor_f5"},/area/shuttle/transport1/centcom) +"kv" = (/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) +"kw" = (/obj/structure/holohoop{dir = 1},/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_basketball) "kx" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "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/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/window/reinforced,/turf/space,/area/shuttle/transport1/centcom) -"kB" = (/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) +"kA" = (/obj/structure/table/holotable,/obj/effect/floor_decal/corner/green/full,/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) +"kB" = (/obj/structure/table/holotable,/obj/item/clothing/head/helmet/thunderdome,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/under/color/green,/obj/item/weapon/holo/esword/green,/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "kC" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/transport1/centcom) "kD" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership) "kE" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) @@ -554,28 +554,28 @@ "kH" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "kI" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/obj/item/device/flash,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "kJ" = (/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) -"kK" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/transport1/centcom) +"kK" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/holofloor/tiled,/area/holodeck/source_thunderdomecourt) "kL" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "kM" = (/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) -"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" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "swall_floor_f10"},/area/shuttle/transport1/centcom) +"kN" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove{icon_state = "boxinggreen"; item_state = "boxinggreen"},/turf/simulated/floor/holofloor/tiled/dark,/area/holodeck/source_boxingcourt) +"kO" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall,/area/space) +"kP" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership) "kQ" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"kR" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "swall_floor_f6"},/area/shuttle/transport1/centcom) +"kR" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1213; listening = 1; name = "Syndicate Ops Intercom"; pixel_y = 0; subspace_transmission = 1; syndie = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) "kS" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "kT" = (/obj/structure/urinal{pixel_y = 32},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "kU" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom) "kV" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "kW" = (/obj/structure/bed/chair{dir = 4; name = "Defense"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "kX" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) -"kY" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/shuttle/transport1/centcom) -"kZ" = (/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) +"kY" = (/mob/living/silicon/decoy{icon_state = "ai-malf"; name = "GLaDOS"},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/control) +"kZ" = (/obj/machinery/computer/pod{id = "syndicate_elite"; name = "Hull Door Control"},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/elite_squad) "la" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"lb" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/transport1/centcom) +"lb" = (/obj/effect/landmark{name = "Syndicate-Commando"},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/elite_squad) "lc" = (/obj/item/device/radio/off,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"},/area/centcom/evac) "ld" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 4; name = "thrower_escapeshuttletop(right)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns8,/area/space) -"le" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/transport1/centcom) -"lf" = (/obj/machinery/porta_turret/crescent,/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/control) +"le" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1213; listening = 0; name = "Syndicate Ops Intercom"; pixel_y = 28; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/elite_squad) +"lf" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/elite_squad) "lg" = (/obj/item/device/multitool,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "lh" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "li" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) @@ -639,11 +639,11 @@ "mo" = (/obj/structure/table/rack,/obj/random/energy_antag,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "mp" = (/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,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "mq" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter/zippo,/obj/item/clothing/gloves/yellow,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/weapon/card/emag,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"mr" = (/turf/unsimulated/wall,/area/start) +"mr" = (/obj/mecha/combat/marauder/mauler,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) "ms" = (/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) "mt" = (/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) "mu" = (/turf/simulated/mineral,/area/space) -"mv" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start) +"mv" = (/obj/machinery/mech_recharger,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/elite_squad) "mw" = (/turf/unsimulated/wall{icon_state = "phoron6"},/area/alien) "mx" = (/turf/unsimulated/wall{icon_state = "phoron12"},/area/alien) "my" = (/turf/unsimulated/wall{icon_state = "phoron14"},/area/alien) @@ -655,7 +655,7 @@ "mE" = (/turf/unsimulated/wall{icon_state = "phoron1"},/area/alien) "mF" = (/obj/item/weapon/paper{info = "Some stuff is missing..."; name = "Insert alien artifacts here."},/turf/unsimulated/floor{icon_state = "floor5"},/area/alien) "mG" = (/obj/machinery/door/airlock/hatch,/turf/unsimulated/floor{icon_state = "floor5"},/area/alien) -"mH" = (/turf/unsimulated/wall/splashscreen,/area/start) +"mH" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) "mI" = (/obj/structure/closet/acloset,/turf/unsimulated/floor{icon_state = "floor5"},/area/alien) "mJ" = (/turf/unsimulated/wall{icon_state = "phoron2"},/area/alien) "mK" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) @@ -664,20 +664,20 @@ "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/broken,/turf/space,/area/space) -"mQ" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 8},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"mR" = (/obj/structure/table/standard,/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) -"mS" = (/obj/structure/table/standard,/obj/effect/landmark{name = "Nuclear-Code"},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"mQ" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/elite_squad) +"mR" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/elite_squad) +"mS" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership/elite_squad) "mT" = (/obj/structure/bed/alien,/turf/unsimulated/floor{icon_state = "floor5"},/area/alien) -"mU" = (/obj/structure/bed,/obj/item/weapon/bedsheet/hos,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"mV" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"mW" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) +"mU" = (/turf/simulated/floor/airless,/area/shuttle/syndicate_elite/mothership) +"mV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/centcom/evac) +"mW" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/centcom/evac) "mX" = (/turf/unsimulated/wall{icon_state = "phoron5"},/area/alien) -"mY" = (/obj/item/device/pda/syndicate,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership) -"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/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "grimy"},/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) +"mY" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 1},/turf/simulated/floor/airless,/area/centcom/evac) +"mZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight"; icon_state = "swall_straight"},/area/centcom/evac) +"na" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/centcom/evac) +"nb" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (WEST)"; icon_state = "swall_t"; dir = 8},/area/centcom/evac) +"nc" = (/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{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) +"nd" = (/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{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) "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) @@ -715,28 +715,28 @@ "nM" = (/obj/item/weapon/folder{pixel_y = 2},/obj/structure/table/glass,/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) +"nP" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (EAST)"; icon_state = "swall_t"; dir = 4},/area/centcom/evac) "nQ" = (/obj/item/weapon/storage/box/donkpockets{pixel_x = 2; pixel_y = 3},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "nR" = (/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "nS" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"nT" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) -"nU" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) +"nT" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_c (EAST)"; icon_state = "swall_c"; dir = 4},/area/centcom/evac) +"nU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f (WEST)"; icon_state = "swall_f"; dir = 8},/area/centcom/evac) "nV" = (/obj/machinery/shower{pixel_y = 32},/obj/structure/window/basic{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "nW" = (/obj/machinery/shower{pixel_y = 32},/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "nX" = (/obj/structure/table/rack,/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 = "dark"},/area/syndicate_mothership) "nY" = (/obj/structure/table/rack,/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 = "dark"},/area/syndicate_mothership) "nZ" = (/obj/structure/computerframe,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oa" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"ob" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) +"ob" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_c"; icon_state = "swall_c"},/area/centcom/evac) "oc" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "od" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "oe" = (/obj/structure/table/rack,/obj/item/device/suit_cooling_unit/improved,/obj/item/device/suit_cooling_unit/improved,/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 = "dark"},/area/syndicate_mothership) "of" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) "og" = (/obj/item/stack/material/glass{amount = 15},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/structure/table/reinforced,/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_y = -32; subspace_transmission = 1; syndie = 1},/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"oi" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership) +"oh" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f (NORTH)"; icon_state = "swall_f"; dir = 1},/area/centcom/evac) +"oi" = (/turf/simulated/shuttle/wall{tag = "icon-swall (NORTH)"; icon_state = "swall"; dir = 1},/area/centcom/evac) "oj" = (/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) -"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) +"ok" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/space) "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/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -744,7 +744,7 @@ "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) "or" = (/obj/structure/closet,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"os" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "carpet2-0"},/area/holodeck/source_theatre) +"os" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/space) "ot" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space) "ou" = (/obj/structure/closet/hydrant{pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "ov" = (/obj/structure/table/rack,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) @@ -759,7 +759,7 @@ "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/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) -"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) +"oH" = (/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{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor2"},/area/centcom/evac) "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) @@ -767,13 +767,13 @@ "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/recharger/wallcharger{pixel_x = -25},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/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) +"oP" = (/turf/simulated/shuttle/wall{tag = "icon-swall (SOUTHWEST)"; icon_state = "swall"; dir = 10},/area/centcom/evac) "oQ" = (/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,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"oR" = (/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) +"oR" = (/obj/machinery/modular_computer/console/preset/command,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac) "oS" = (/obj/machinery/flasher{id = "syndieflash"; pixel_x = 0; pixel_y = 28},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "oT" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "vox_east_control"; pixel_x = 22; req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"oU" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 8},/area/centcom) -"oV" = (/turf/unsimulated/floor{name = "plating"},/area/centcom) +"oU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/centcom/evac) +"oV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (NORTH)"; icon_state = "swall_t"; dir = 1},/area/centcom/evac) "oW" = (/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) "oX" = (/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},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "oY" = (/obj/item/device/radio/electropack,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/syndicate_station/start) @@ -781,11 +781,11 @@ "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/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) "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) +"pd" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t"; icon_state = "swall_t"},/area/centcom/evac) "pe" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration/centcom) "pf" = (/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) -"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) +"pg" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/centcom/evac) +"ph" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/syndicate_mothership{name = "\improper Ninja Base"}) "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/machinery/door/airlock/external{frequency = 1331; id_tag = "merc_base_hatch"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) @@ -802,7 +802,7 @@ "pv" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "pw" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "px" = (/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) -"py" = (/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) +"py" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp{pixel_x = 4; pixel_y = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "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/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pB" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) @@ -810,7 +810,7 @@ "pD" = (/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) "pE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "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) +"pG" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "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/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(150)},/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) @@ -826,15 +826,15 @@ "pT" = (/obj/machinery/door/window{dir = 4; name = "Brig"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "pU" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) "pV" = (/obj/structure/closet/secure_closet/personal,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) -"pW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/centcom/living) -"pX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/centcom/living) -"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) +"pW" = (/obj/structure/table/standard,/obj/effect/landmark{name = "Nuclear-Code"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"pX" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"pY" = (/obj/structure/bed,/obj/item/weapon/bedsheet/hos,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "pZ" = (/turf/unsimulated/wall,/area/centcom/suppy) "qa" = (/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) "qb" = (/obj/structure/closet/syndicate/suit{name = "suit closet"},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qc" = (/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) "qd" = (/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) -"qe" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/space,/area/shuttle/administration/centcom) +"qe" = (/obj/item/device/pda/syndicate,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "qf" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/administration/centcom) "qg" = (/obj/machinery/vending/snack,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "qh" = (/obj/item/weapon/stool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) @@ -846,48 +846,48 @@ "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{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) +"qq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) +"qr" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) +"qs" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) "qt" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "qu" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom) -"qv" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) -"qw" = (/obj/machinery/vending/cola,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) -"qx" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) -"qy" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 8},/area/centcom/suppy) -"qz" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/suppy) -"qA" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 4},/area/centcom/suppy) +"qv" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"qw" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) +"qx" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_y = -32; subspace_transmission = 1; syndie = 1},/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"qy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) +"qz" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) +"qA" = (/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "qB" = (/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,/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "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/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "qE" = (/obj/item/stack/material/steel{amount = 50},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "qF" = (/obj/item/stack/material/glass{amount = 50},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"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) +"qG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) +"qH" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) "qI" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living) "qJ" = (/obj/machinery/sleeper,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "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) -"qM" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/living) +"qL" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) +"qM" = (/obj/structure/table/rack,/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) "qN" = (/obj/item/robot_parts/head,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"qO" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/supply/dock) -"qP" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/supply/dock) -"qQ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/supply/dock) -"qR" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) -"qS" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) +"qO" = (/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 = "dark"},/area/syndicate_mothership) +"qP" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; 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) +"qQ" = (/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/simulated/floor,/area/syndicate_station/start) +"qR" = (/obj/machinery/door/window{dir = 1; name = "Cell"; req_access = list(150)},/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"qS" = (/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,/area/syndicate_station/start) "qT" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "qU" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/shuttle/plating,/area/shuttle/administration/centcom) -"qV" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 4},/area/centcom) -"qW" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"qX" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/supply/dock) +"qV" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership) +"qW" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom) +"qX" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) "qY" = (/turf/simulated/shuttle/floor,/area/supply/dock) "qZ" = (/obj/structure/table/standard,/obj/structure/closet/secure_closet/medical_wall{pixel_y = 32; req_access = list(150)},/obj/item/bodybag,/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,/obj/machinery/light{dir = 4},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"ra" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"ra" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) "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) +"rc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) "rd" = (/obj/structure/table/standard,/obj/item/roller{pixel_y = 8},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"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/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"re" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) +"rf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) "rg" = (/obj/machinery/light{dir = 4},/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) @@ -899,11 +899,11 @@ "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/item/clothing/gloves/yellow,/obj/item/device/assembly/signaler{pixel_y = 2},/obj/item/clothing/glasses/night,/obj/structure/table/steel,/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) +"rr" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"rs" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/shuttle/administration/centcom) "rt" = (/obj/item/clothing/gloves/yellow,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/glasses/night,/obj/machinery/light{dir = 4},/obj/structure/table/steel,/turf/simulated/shuttle/floor{icon_state = "floor6"},/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) +"ru" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) +"rv" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "dark"},/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) @@ -912,25 +912,25 @@ "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 = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) -"rF" = (/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) -"rG" = (/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) +"rE" = (/obj/machinery/atm{pixel_y = 24},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) +"rF" = (/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) +"rG" = (/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) "rH" = (/obj/item/weapon/screwdriver,/obj/effect/spawner/newbomb/timer/syndicate,/obj/structure/table/steel,/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) "rJ" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) -"rK" = (/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) -"rL" = (/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) +"rK" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) +"rL" = (/obj/machinery/vending/cola,/turf/unsimulated/floor{icon_state = "dark"},/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/structure/table/standard,/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) +"rO" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/suppy) "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/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) +"rQ" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rR" = (/obj/machinery/door/window{dir = 4; name = "Infirmary"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "rS" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rT" = (/obj/effect/spawner/newbomb/timer/syndicate,/obj/structure/table/steel,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "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) +"rV" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (WEST)"; icon_state = "propulsion_r"; dir = 8},/turf/space,/area/shuttle/administration/centcom) +"rW" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom) "rX" = (/obj/item/weapon/stool/padded,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "rY" = (/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) "rZ" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -939,34 +939,34 @@ "sc" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/supply/dock) "sd" = (/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) "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/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"sf" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) "sg" = (/obj/machinery/door/window/northright{icon_state = "right"; dir = 2},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "sh" = (/obj/machinery/door/window{dir = 1; name = "Secure Storage"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "si" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"sj" = (/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/shuttle/administration/centcom) -"sk" = (/turf/simulated/floor{icon_state = "chapel"},/area/shuttle/administration/centcom) +"sj" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) +"sk" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) "sl" = (/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) -"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) +"sm" = (/obj/machinery/door/airlock/external,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) +"sn" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/supply/dock) "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/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) "sq" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Administration"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"sr" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) +"sr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/supply/dock) "ss" = (/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) "st" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "su" = (/obj/machinery/door/window{dir = 1; name = "Surgery"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "sv" = (/obj/structure/table/standard,/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) "sw" = (/obj/structure/table/standard,/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) "sx" = (/obj/item/weapon/weldingtool,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"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) +"sy" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/supply/dock) +"sz" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) "sA" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) "sB" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) -"sC" = (/obj/machinery/computer/card/centcom,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) +"sC" = (/obj/machinery/sleeper{tag = "icon-sleeper_0 (EAST)"; icon_state = "sleeper_0"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) "sD" = (/obj/structure/sign/securearea{name = "\improper CAUTION"; pixel_x = 32},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "sE" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/floor,/area/supply/dock) "sF" = (/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) -"sG" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -6},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living) +"sG" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_bay_door"; locked = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) "sH" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/iv_drip,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "sI" = (/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) "sJ" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -974,90 +974,90 @@ "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" = (/obj/structure/table/standard,/obj/item/weapon/scalpel,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"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) -"sR" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/centcom/living) +"sO" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (NORTH)"; icon_state = "swall_straight"; dir = 1},/area/supply/dock) +"sP" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"sQ" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) +"sR" = (/obj/structure/device/piano{dir = 4},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) "sS" = (/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)},/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"sT" = (/obj/machinery/vending/dinnerware,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) +"sT" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) "sU" = (/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{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "sV" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"sW" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) +"sW" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) "sX" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"sY" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) -"sZ" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/syndicate_station/start) +"sY" = (/obj/machinery/vending/boozeomat,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) +"sZ" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -6},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) "ta" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "tb" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"tc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"td" = (/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/living) -"te" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"tf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"tg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"th" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"ti" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/supply/dock) -"tj" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "swall_floor_f10"},/area/supply/dock) -"tk" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "swall_floor_f6"},/area/supply/dock) -"tl" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/supply/dock) +"tc" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) +"td" = (/obj/structure/bookcase,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) +"te" = (/obj/structure/table/reinforced,/obj/machinery/librarycomp,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) +"tf" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) +"tg" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) +"th" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"ti" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/syndicate_station/start) +"tj" = (/obj/machinery/door/airlock/centcom{name = "Commander Quarters"; opacity = 1; req_access = list(109)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) +"tk" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) +"tl" = (/obj/item/weapon/stool{pixel_y = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) "tm" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/syndicate_station/start) "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) +"tp" = (/obj/machinery/sleeper{tag = "icon-sleeper_0 (WEST)"; icon_state = "sleeper_0"; dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) "tq" = (/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) -"tr" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/supply/dock) +"tr" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/material/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) "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) -"tu" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/supply/dock) +"tt" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) +"tu" = (/obj/machinery/vending/dinnerware,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) "tv" = (/turf/unsimulated/wall,/area/centcom/specops) "tw" = (/turf/unsimulated/wall,/area/prison/solitary) "tx" = (/turf/unsimulated/wall,/area/centcom/control) "ty" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/living) -"tz" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/living) +"tz" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) "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" = (/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) "tE" = (/obj/item/robot_parts/l_leg,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"tF" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/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) +"tF" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/living) "tG" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) "tH" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom) -"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/machinery/door/airlock/centcom{name = "Commander Quarters"; opacity = 1; req_access = list(109)},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/living) -"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) -"tR" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "green"; dir = 1},/area/centcom/control) -"tS" = (/obj/machinery/account_database{name = "CentComm Accounts database"},/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/control) -"tT" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/control) -"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/structure/table/standard,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/living) -"tY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/material/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) +"tI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) +"tJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) +"tK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) +"tL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/living) +"tM" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f"; icon_state = "swall_f"},/area/supply/dock) +"tN" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f (EAST)"; icon_state = "swall_f"; dir = 4},/area/supply/dock) +"tO" = (/turf/unsimulated/floor{tag = "icon-grass0"; icon_state = "grass0"},/area/centcom/living) +"tP" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"tQ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/supply/dock) +"tR" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/airless,/area/supply/dock) +"tS" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/supply/dock) +"tT" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) +"tU" = (/obj/machinery/telecomms/relay/preset/centcom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) +"tV" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) +"tW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) +"tX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/creed) +"tY" = (/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "tZ" = (/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) "ua" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom) -"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) -"ue" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control) -"uf" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"ub" = (/obj/machinery/telecomms/receiver/preset_cent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"uc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) +"ud" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"ue" = (/obj/machinery/telecomms/bus/preset_cent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"uf" = (/obj/machinery/account_database{name = "CentComm Accounts database"},/turf/unsimulated/floor{icon_state = "steel"},/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/table/standard,/obj/item/weapon/card/id/centcom,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living) -"uj" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) +"uj" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "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" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living) -"um" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access = list(105)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/living) +"ul" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"um" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "un" = (/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/rifle/l6_saw,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "uo" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "up" = (/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) "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) +"ut" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "uu" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "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) @@ -1065,14 +1065,14 @@ "uy" = (/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/rifle/z8,/obj/item/weapon/gun/projectile/automatic/rifle/z8,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "uz" = (/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) "uA" = (/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) -"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) -"uE" = (/obj/machinery/telecomms/broadcaster/preset_cent,/turf/unsimulated/floor{icon_state = "green"},/area/centcom/control) -"uF" = (/obj/machinery/telecomms/hub/preset_cent,/turf/unsimulated/floor{icon_state = "green"},/area/centcom/control) -"uG" = (/obj/machinery/computer/rdservercontrol{badmin = 1; name = "Master R&D Server Controller"},/turf/unsimulated/floor{icon_state = "green"},/area/centcom/control) -"uH" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/centcom/control) -"uI" = (/turf/unsimulated/floor{icon_state = "warning"; dir = 1; heat_capacity = 1},/area/centcom/control) +"uB" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"uC" = (/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 = "dark"},/area/centcom/creed) +"uD" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/button/remote/blast_door{id = "CREED"; name = "Spec Ops Ready Room"; pixel_x = -5; pixel_y = 4; req_access = list(108)},/obj/machinery/button/remote/blast_door{icon_state = "doorctrl0"; id = "ASSAULT"; name = "Mech Storage"; pixel_x = -5; pixel_y = -4; req_access = list(108)},/obj/machinery/button/remote/blast_door{id = "ert_synth_equipment"; name = "Synth Modification Equipment"; pixel_x = 5; pixel_y = -4; req_access = list(108)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) +"uE" = (/obj/mecha/combat/gygax/dark,/obj/machinery/camera/network/ert{c_tag = "Assault Armor North"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"uF" = (/obj/structure/closet/secure_closet/hos,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) +"uG" = (/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) +"uH" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) +"uI" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) "uJ" = (/obj/machinery/dna_scannernew,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "uK" = (/obj/machinery/computer/scan_consolenew,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "uL" = (/obj/machinery/computer/cloning,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) @@ -1084,27 +1084,27 @@ "uR" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "uS" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "uT" = (/obj/machinery/door/window/northleft,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) -"uU" = (/obj/effect/landmark{name = "Marauder Exit"},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) -"uV" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"uU" = (/obj/effect/landmark{name = "Marauder Exit"},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) +"uV" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT3"; name = "Launch Bay #3"; p_open = 0},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) "uW" = (/obj/machinery/door/blast/regular{id = "ert_synth_equipment"; name = "Synthetics Modification Equipment"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"uX" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 8},/area/centcom/specops) -"uY" = (/turf/unsimulated/floor{icon_state = "warnplate"; dir = 4},/area/centcom/specops) -"uZ" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT3"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) -"va" = (/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops) +"uX" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT3"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"uY" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) +"uZ" = (/obj/item/weapon/card/id/centcom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) +"va" = (/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 = "dark"},/area/centcom/creed) "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) +"vc" = (/obj/machinery/computer/security/telescreen{name = "Spec. Ops. Monitor"; network = list("ERT")},/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) "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/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vf" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vg" = (/obj/machinery/shield_capacitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/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) +"vi" = (/obj/machinery/telecomms/hub/preset_cent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"vj" = (/obj/machinery/telecomms/broadcaster/preset_cent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "vk" = (/obj/machinery/shield_gen,/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) +"vl" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"vm" = (/obj/machinery/computer/rdservercontrol{badmin = 1; name = "Master R&D Server Controller"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"vn" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"vo" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "vp" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "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) @@ -1115,99 +1115,99 @@ "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" = (/obj/machinery/shieldwallgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"vz" = (/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) -"vA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{name = "plating"},/area/centcom/control) -"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) +"vz" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) +"vA" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) +"vB" = (/obj/machinery/porta_turret/crescent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"vC" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) +"vD" = (/obj/machinery/door/airlock/centcom{name = "Teleporter Bay"; opacity = 1; req_access = list(107)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "vE" = (/obj/machinery/door/airlock/centcom{name = "Creed's Office"; opacity = 1; req_access = list(108)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/creed) "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,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) -"vI" = (/obj/mecha/medical/odysseus/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) -"vJ" = (/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) +"vH" = (/obj/mecha/medical/odysseus/loaded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"vI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) +"vJ" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT2"; name = "Launch Bay #2"; p_open = 0},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) "vK" = (/obj/machinery/vending/tool,/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/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,/obj/structure/table/rack,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "vO" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"vP" = (/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) +"vP" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT2"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "vQ" = (/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) "vR" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vS" = (/obj/machinery/vending/engivend,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"vT" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) +"vT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) "vU" = (/obj/structure/sign/nosmoking_2,/turf/unsimulated/wall,/area/centcom/living) -"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) -"vX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control) -"vY" = (/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/control) +"vV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) +"vW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) +"vX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) +"vY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "vZ" = (/obj/structure/closet/secure_closet/medical3{pixel_x = -5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "wa" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "wb" = (/obj/structure/closet/secure_closet/medical2{pixel_x = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) "wc" = (/obj/machinery/sleeper,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) -"wd" = (/obj/machinery/sleep_console,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test) +"wd" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "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" = (/obj/structure/sign/securearea,/turf/unsimulated/wall,/area/centcom/living) -"wi" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT2"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) +"wi" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "wj" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) -"wk" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet9-4"; dir = 4},/area/holodeck/source_courtroom) +"wk" = (/obj/mecha/working/ripley/firefighter,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "wl" = (/obj/structure/table/rack,/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,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/rig/light/hacker,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "wm" = (/obj/machinery/vending/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wn" = (/obj/machinery/pipedispenser/disposal/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wo" = (/obj/machinery/pipedispenser/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wp" = (/obj/machinery/power/emitter,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/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) +"wr" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"ws" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) +"wt" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "wu" = (/mob/living/silicon/decoy{name = "A.L.I.C.E."},/turf/unsimulated/floor{icon_state = "whiteshiny"},/area/centcom/control) -"wv" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"wv" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "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) +"wx" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT1"; name = "Launch Bay #1"; p_open = 0},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) "wy" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"wz" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access = list(106)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) +"wz" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "wA" = (/obj/structure/sign/securearea,/turf/unsimulated/wall,/area/centcom/control) -"wB" = (/obj/machinery/door/airlock/centcom{name = "Teleporter Bay"; opacity = 1; req_access = list(107)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control) +"wB" = (/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/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" = (/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,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"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) -"wI" = (/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/specops) +"wF" = (/obj/machinery/computer/ordercomp,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"wG" = (/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/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) +"wH" = (/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 = "steel"},/area/centcom/control) +"wI" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "wJ" = (/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"wK" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/control) -"wL" = (/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/unsimulated/floor{name = "plating"},/area/centcom/control) -"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) +"wK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"wL" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"wM" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"wN" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"wO" = (/obj/mecha/working/hoverpod,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "wP" = (/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) -"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) +"wQ" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) +"wR" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) +"wS" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) +"wT" = (/obj/machinery/door/airlock/centcom{name = "Bridge"; opacity = 1; req_access = list(109)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"wU" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "CCIAAgent"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "wV" = (/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) -"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) +"wW" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) "wX" = (/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) "wY" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/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},/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "wZ" = (/obj/machinery/porta_turret/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xa" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xb" = (/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) -"xc" = (/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) +"xc" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "xd" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xe" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xf" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) +"xf" = (/obj/machinery/camera/network/ert{c_tag = "Assault Armor South"; dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "xg" = (/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) "xh" = (/obj/machinery/door/airlock/centcom{name = "Research Facility"; opacity = 1; req_access = list(104)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/test) -"xi" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"xi" = (/obj/machinery/computer/robotics,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "xj" = (/obj/machinery/door/airlock/centcom{name = "Courthouse"; opacity = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "xk" = (/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) "xl" = (/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,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xm" = (/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,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"xn" = (/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) +"xn" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "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/recharge_station,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xq" = (/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,/obj/item/mecha_parts/mecha_equipment/tool/rcd,/obj/item/weapon/pickaxe/diamonddrill,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) @@ -1218,15 +1218,15 @@ "xv" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xw" = (/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,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xx" = (/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) -"xy" = (/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) -"xz" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) +"xy" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"xz" = (/obj/machinery/computer/med_data,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "xA" = (/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "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) +"xC" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) +"xD" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"xE" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"xF" = (/obj/structure/table/reinforced,/obj/item/weapon/card/id/captains_spare,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"xG" = (/obj/machinery/button/remote/blast_door{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint Access"; pixel_x = -6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_thunderdome"; name = "Thunderdome Access"; pixel_x = 6; pixel_y = -24; req_access = list(101)},/obj/machinery/button/remote/blast_door{id = "crescent_vip_shuttle"; name = "VIP Shuttle Access"; pixel_x = 6; pixel_y = -34; req_access = list(101)},/obj/machinery/turretid{pixel_x = 28; pixel_y = -28; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "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/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) "xJ" = (/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) @@ -1234,74 +1234,74 @@ "xL" = (/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) "xM" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xN" = (/obj/structure/sign/securearea,/turf/unsimulated/wall,/area/centcom/specops) -"xO" = (/obj/machinery/door/window{dir = 2; name = "AI Core Door"; req_access = list(109)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"xP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops) +"xO" = (/obj/machinery/door/airlock/centcom{name = "Courthouse"; opacity = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) +"xP" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "xQ" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "xR" = (/obj/structure/sign/nosmoking_2,/turf/unsimulated/wall,/area/centcom/control) -"xS" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"xS" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{icon_state = "steel"},/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/mecha/working/hoverpod,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops) +"xW" = (/obj/structure/table/reinforced,/obj/item/device/pda/captain,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"xX" = (/obj/machinery/computer/security,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "xY" = (/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,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "xZ" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "ya" = (/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) "yb" = (/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) "yc" = (/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) -"yd" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) -"ye" = (/obj/machinery/door/airlock/centcom{name = "Bridge"; opacity = 1; req_access = list(109)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"yf" = (/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) -"yg" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops) +"yd" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/evac) +"ye" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/evac) +"yf" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/evac) +"yg" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "yh" = (/turf/unsimulated/wall,/area/centcom/creed) -"yi" = (/obj/machinery/camera/network/ert{c_tag = "Assault Armor South"; dir = 1},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops) +"yi" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/evac) "yj" = (/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) "yk" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "yl" = (/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) "ym" = (/obj/structure/sign/securearea{name = "ENGINEERING ACCESS"; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/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) -"yq" = (/obj/structure/table/reinforced,/obj/item/weapon/card/id/captains_spare,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) +"yn" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) +"yo" = (/obj/item/weapon/coin/gold,/turf/space,/area/space) +"yp" = (/obj/effect/decal/remains,/turf/space,/area/space) +"yq" = (/obj/machinery/door/airlock/centcom{name = "Holding Cell"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "yr" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "ys" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "yt" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "yu" = (/turf/unsimulated/wall,/area/centcom/evac) -"yv" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/evac) -"yw" = (/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/evac) +"yv" = (/obj/machinery/light/small{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"yw" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "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) +"yy" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "yz" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "yA" = (/obj/structure/sign/nosmoking_2,/turf/unsimulated/wall,/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) +"yB" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "yC" = (/obj/structure/sign/redcross{pixel_y = -32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "yD" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "dark"},/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/structure/table/standard,/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) -"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) +"yH" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) +"yI" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "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/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) +"yK" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/control) "yL" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control) "yM" = (/obj/structure/bed/chair/office/light,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "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) +"yP" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/shuttle/specops/centcom) "yQ" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor{icon_state = "dark"},/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/computer/arcade,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"yT" = (/turf/unsimulated/floor{icon_state = "green"; dir = 1},/area/centcom/control) +"yT" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/escape/centcom) "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/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"yX" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control) +"yX" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/escape/centcom) "yY" = (/obj/machinery/camera/network/thunder{c_tag = "Court - Jury Room"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "yZ" = (/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) "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) +"zd" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/specops/centcom) "ze" = (/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) "zf" = (/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) "zg" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -1310,45 +1310,45 @@ "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/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/wall,/area/centcom/specops) "zl" = (/obj/structure/table/rack,/obj/item/device/lightreplacer,/obj/item/device/lightreplacer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"zm" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/evac) +"zm" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/simulated/floor/airless,/area/shuttle/specops/centcom) "zn" = (/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) -"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) +"zo" = (/obj/machinery/door/airlock/glass_security{name = "Holding Cell"; req_access = list(2)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"zp" = (/obj/machinery/door/blast/regular{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"zq" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"zr" = (/obj/machinery/door/airlock/centcom{name = "Arrivals Processing"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "zs" = (/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) "zt" = (/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) "zu" = (/obj/machinery/chem_master,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zv" = (/obj/machinery/chemical_dispenser/ert,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zw" = (/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) "zx" = (/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) -"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) +"zy" = (/turf/simulated/shuttle/wall{tag = "icon-swall (NORTHWEST)"; icon_state = "swall"; dir = 9},/area/shuttle/escape/centcom) "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/machinery/atmospherics/pipe/simple/visible,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"zB" = (/turf/unsimulated/floor{icon_state = "loadingarea"},/area/centcom/specops) +"zB" = (/turf/simulated/shuttle/wall{tag = "icon-swall (NORTHEAST)"; icon_state = "swall"; dir = 5},/area/shuttle/escape/centcom) "zC" = (/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) "zD" = (/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) -"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) +"zE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership{name = "\improper Raider Base"}) "zF" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zG" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"zH" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/evac) +"zH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership{name = "\improper Raider Base"}) "zI" = (/obj/structure/closet/crate{name = "mag lock crate"},/obj/item/device/magnetic_lock,/obj/item/device/magnetic_lock,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "zJ" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"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) +"zK" = (/obj/structure/sign/double/barsign,/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership{name = "\improper Raider Base"}) "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) +"zM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership{name = "\improper Raider Base"}) "zN" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/specops/centcom) "zO" = (/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) "zP" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom) -"zQ" = (/obj/machinery/door/airlock/centcom{name = "Holding Cell"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"zR" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape/centcom) +"zQ" = (/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 = "steel"},/area/centcom/holding) +"zR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership{name = "\improper Raider Base"}) "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) -"zU" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape/centcom) +"zU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership{name = "\improper Raider Base"}) "zV" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "zW" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) -"zX" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/space,/area/shuttle/specops/centcom) -"zY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops/centcom) +"zX" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"zY" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "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/standard,/obj/item/device/assembly/signaler,/obj/item/weapon/handcuffs,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) @@ -1358,10 +1358,10 @@ "Af" = (/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) "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/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) -"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) +"Ai" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Aj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/specops) +"Ak" = (/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 = "steel"},/area/centcom/holding) +"Al" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "Am" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "An" = (/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) "Ao" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) @@ -1369,10 +1369,10 @@ "Aq" = (/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) "Ar" = (/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) "As" = (/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) -"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) +"At" = (/obj/machinery/computer/secure_data,/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals North"; dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"Au" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Av" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Aw" = (/obj/structure/window/reinforced/holowindow{dir = 1},/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "carpet14-10"; dir = 4},/area/holodeck/source_courtroom) +"Aw" = (/obj/item/weapon/broken_bottle,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Ax" = (/obj/machinery/computer/communications,/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1443; listening = 1; name = "Spec Ops Intercom"; pixel_y = -28},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "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) @@ -1380,40 +1380,40 @@ "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" = (/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) +"AE" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "AF" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "AG" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/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) +"AI" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (WEST)"; icon_state = "propulsion_r"; dir = 8},/turf/space,/area/shuttle/specops/centcom) "AJ" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) "AK" = (/obj/item/weapon/stool/padded,/obj/item/weapon/stool/padded,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) -"AL" = (/obj/structure/bed/chair/holochair,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) +"AL" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "AM" = (/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) -"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/computer/secure_data,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/holding) -"AQ" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/holding) -"AR" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/escape/centcom) -"AS" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) -"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) +"AN" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "CentComPort"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"AO" = (/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 = "steel"},/area/centcom/holding) +"AP" = (/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 = "steel"},/area/centcom/holding) +"AQ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight"; icon_state = "swall_straight"},/area/shuttle/escape/centcom) +"AR" = (/turf/simulated/shuttle/wall{tag = "icon-swall"; icon_state = "swall"},/area/shuttle/escape/centcom) +"AS" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/glass/rag,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"AT" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/drinkingglasses,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"AU" = (/obj/effect/decal/mecha_wreckage/hoverpod,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "AV" = (/obj/structure/table/rack,/obj/item/weapon/grenade/empgrenade,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/grenade/spawnergrenade/manhacks,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) -"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) +"AW" = (/obj/structure/closet/crate/loot,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"AX" = (/obj/machinery/atm{pixel_x = -26},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"AY" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (NORTH)"; icon_state = "swall_t"; dir = 1},/area/shuttle/escape/centcom) "AZ" = (/turf/unsimulated/wall,/area/syndicate_mothership{name = "\improper Raider Base"}) "Ba" = (/obj/machinery/vending/cola{name = "Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "Bb" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) "Bc" = (/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) -"Bd" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/holding) -"Be" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/holding) -"Bf" = (/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/holding) -"Bg" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/holding) -"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) -"Bj" = (/turf/simulated/floor/holofloor{icon_state = "asteroid"; dir = 2},/area/holodeck/source_picnicarea) -"Bk" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/obj/structure/window/reinforced/holowindow{dir = 8},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) -"Bl" = (/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) +"Bd" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (WEST)"; icon_state = "swall_straight"; dir = 8},/area/shuttle/escape/centcom) +"Be" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t"; icon_state = "swall_t"},/area/shuttle/escape/centcom) +"Bf" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Bg" = (/obj/effect/decal/cleanable/dirt,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Bh" = (/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/ferry) +"Bi" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/ferry) +"Bj" = (/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{icon_state = "vault"; dir = 5},/area/centcom/ferry) +"Bk" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/ferry) +"Bl" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry) "Bm" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry) "Bn" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/crossbow,/obj/item/stack/rods{amount = 10},/obj/machinery/light/small{dir = 8},/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "Bo" = (/obj/structure/table/steel,/obj/machinery/recharger,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) @@ -1421,21 +1421,21 @@ "Bq" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Br" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Bs" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Bt" = (/turf/unsimulated/floor{icon_state = "green"; dir = 5},/area/centcom/holding) +"Bt" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) "Bu" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"Bv" = (/turf/simulated/floor/plating/airless/asteroid,/area/space) +"Bv" = (/turf/unsimulated/floor{tag = "icon-grass0"; icon_state = "grass0"},/area/centcom/holding) "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) +"Bx" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "By" = (/obj/structure/table/steel,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "Bz" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "BA" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "BB" = (/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) "BC" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) -"BD" = (/turf/simulated/floor/plating/airless/asteroid,/turf/unsimulated/floor{tag = "icon-asteroid8"; name = "plating"; icon_state = "asteroid8"},/area/space) +"BD" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/shuttle/transport1/centcom) "BE" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"BF" = (/obj/item/weapon/coin/gold,/turf/simulated/floor/plating/airless/asteroid,/area/space) -"BG" = (/obj/effect/decal/remains,/turf/simulated/floor/plating/airless/asteroid,/area/space) -"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) +"BF" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/shuttle/transport1/centcom) +"BG" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/shuttle/transport1/centcom) +"BH" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 4},/turf/space,/area/shuttle/transport1/centcom) "BI" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/item/weapon/crowbar,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "BJ" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "BK" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/shuttle/plating,/area/skipjack_station/start) @@ -1443,78 +1443,78 @@ "BM" = (/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) "BN" = (/obj/machinery/vending/cigarette{name = "cigarette machine"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "BO" = (/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) -"BP" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) -"BQ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/holding) -"BR" = (/turf/simulated/floor/plating/airless/asteroid,/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/space) +"BP" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (NORTH)"; icon_state = "swall_t"; dir = 1},/area/shuttle/transport1/centcom) +"BQ" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"BR" = (/obj/random/vendor,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "BS" = (/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) "BT" = (/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start) -"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) +"BU" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f (WEST)"; icon_state = "swall_f"; dir = 8},/area/shuttle/transport1/centcom) +"BV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (EAST)"; icon_state = "swall_t"; dir = 4},/area/shuttle/transport1/centcom) "BW" = (/obj/item/weapon/deck,/obj/structure/table/steel,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "BX" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) -"BY" = (/obj/machinery/door/airlock/glass_security{name = "Holding Cell"; req_access = list(2)},/turf/unsimulated/floor,/area/centcom/holding) +"BY" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f (NORTH)"; icon_state = "swall_f"; dir = 1},/area/shuttle/transport1/centcom) "BZ" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "Ca" = (/obj/machinery/body_scanconsole,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "Cb" = (/obj/machinery/bodyscanner,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "Cc" = (/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) -"Cd" = (/obj/machinery/door/blast/regular{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) -"Ce" = (/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) -"Cf" = (/obj/machinery/door/airlock/centcom{name = "Arrivals Processing"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"Cd" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/space,/area/shuttle/transport1/centcom) +"Ce" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/airless,/area/shuttle/transport1/centcom) +"Cf" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "Cg" = (/obj/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Ch" = (/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) "Ci" = (/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) "Cj" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) -"Ck" = (/obj/machinery/door/airlock/glass_security{name = "Holding Cell"; req_access = list(2)},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"Cl" = (/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/holding) -"Cm" = (/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) -"Cn" = (/obj/machinery/computer/card,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"Ck" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"Cl" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"Cm" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"Cn" = (/obj/item/weapon/cigbutt,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Co" = (/obj/structure/table/standard,/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) "Cp" = (/obj/machinery/status_display{pixel_y = 30},/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/toxin,/obj/machinery/camera/network/crescent{c_tag = "Shuttle Bridge East"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"Cq" = (/obj/structure/table/woodentable/holotable,/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_courtroom) +"Cq" = (/obj/effect/decal/cleanable/generic,/obj/effect/decal/cleanable/dirt,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Cr" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Cs" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "Ct" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Cu" = (/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Cv" = (/obj/structure/closet/crate/loot,/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "floorgrime"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Cw" = (/turf/unsimulated/floor{icon_state = "green"; dir = 10},/area/centcom/holding) -"Cx" = (/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) -"Cy" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"Cz" = (/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) +"Cv" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/shuttle/transport1/centcom) +"Cw" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f"; icon_state = "swall_f"},/area/shuttle/transport1/centcom) +"Cx" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f (EAST)"; icon_state = "swall_f"; dir = 4},/area/shuttle/transport1/centcom) +"Cy" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 4},/turf/space,/area/shuttle/transport1/centcom) +"Cz" = (/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/airless,/area/shuttle/transport1/centcom) "CA" = (/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) -"CB" = (/turf/simulated/floor/holofloor{icon_state = "carpet5-1"; dir = 4},/area/holodeck/source_theatre) +"CB" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/centcom/holding) "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) +"CD" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) "CE" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "CF" = (/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"}) "CG" = (/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/unsimulated/wall,/area/space) "CH" = (/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/simulated/mineral,/area/space) -"CI" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"CJ" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/holding) -"CK" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4},/area/centcom/holding) -"CL" = (/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) +"CI" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"CJ" = (/obj/machinery/door/airlock/glass{name = "Arrivals Processing"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"CK" = (/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals East"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"CL" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/shuttle/transport1/centcom) "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/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) +"CO" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 4},/turf/space,/area/shuttle/transport1/centcom) "CP" = (/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"CQ" = (/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) +"CQ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t"; icon_state = "swall_t"},/area/shuttle/transport1/centcom) "CR" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "CS" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"CT" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood-broken"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"CU" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor{icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_courtroom) +"CT" = (/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/centcom/holding) +"CU" = (/obj/machinery/door/airlock/glass{name = "Arrivals Bar"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "CV" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"CW" = (/obj/machinery/atm{pixel_x = -26},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) -"CX" = (/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/holding) +"CW" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"CX" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/centcom/holding) "CY" = (/obj/machinery/door/airlock/glass_command{name = "Escape Shuttle Cockpit"; req_access = list(19)},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"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/effect/decal/mecha_wreckage/hoverpod,/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "floorgrime"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"CZ" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"Da" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"Db" = (/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{icon_state = "steel"},/area/centcom/holding) "Dc" = (/obj/structure/mirror/raider{pixel_x = 0; pixel_y = 28},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Dd" = (/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) +"Dd" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) "De" = (/obj/structure/toilet{dir = 4},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Df" = (/obj/structure/window/shuttle{icon_state = "window1"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"Dg" = (/obj/machinery/computer/shuttle_control{req_access = list(101); shuttle_tag = "Centcom"},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) -"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) +"Dg" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"Dh" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"Di" = (/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{tag = "icon-plating"; icon_state = "plating"},/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) "Dk" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "Dl" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) @@ -1522,168 +1522,168 @@ "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" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/holding) -"Dq" = (/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) -"Dr" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "green"; dir = 8},/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) +"Dq" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"Dr" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/camera/network/crescent{c_tag = "Crescent Arrivals South"; dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"Ds" = (/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{tag = "icon-plating"; icon_state = "plating"},/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) "Dv" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/stuffing,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "Dw" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/soylenviridians,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"Dx" = (/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/holding) -"Dy" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/centcom/holding) -"Dz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/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) -"DA" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "green"; dir = 10},/area/centcom/holding) -"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) +"Dx" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"Dy" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) +"Dz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/centcom/holding) +"DA" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"DB" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/centcom/holding) +"DC" = (/obj/machinery/door/airlock/glass_medical{name = "Arrivals Medbay"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"DD" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (WEST)"; icon_state = "swall_t"; dir = 8},/area/shuttle/escape/centcom) "DE" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/camera/network/crescent{c_tag = "Shuttle Cell"},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) "DF" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"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) +"DG" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (EAST)"; icon_state = "swall_t"; dir = 4},/area/shuttle/escape/centcom) +"DH" = (/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{tag = "icon-lino"; icon_state = "lino"},/area/centcom/holding) "DI" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 30},/obj/structure/bed/chair{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"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) +"DJ" = (/obj/machinery/atmospherics/unary/cryo_cell,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"DK" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) "DL" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "DM" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/skipjack_station/start) "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) "DQ" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/orangecakeslice,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"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) +"DR" = (/obj/structure/bed/roller,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"DS" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 29},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"DT" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (NORTH)"; icon_state = "swall_straight"; dir = 1},/area/shuttle/escape/centcom) "DU" = (/obj/structure/shuttle/engine/heater,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "DV" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) -"DW" = (/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "floorgrime"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"DX" = (/obj/structure/bed/roller,/turf/unsimulated/floor{dir = 4; icon_state = "whitegreenfull"},/area/centcom/holding) +"DW" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"DX" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/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) +"DZ" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/centcom/holding) "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" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/syndicate_mothership{name = "\improper Raider Base"}) +"Ec" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/glass/rag,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/centcom/holding) "Ed" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "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) "Eh" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/reagent_containers/food/snacks/meatsteak,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"Ei" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/unsimulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/centcom/holding) +"Ei" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/centcom/holding) "Ej" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) -"Ek" = (/obj/structure/bed/chair/holochair{dir = 1},/turf/simulated/floor/holofloor{icon_state = "carpet7-3"; dir = 4},/area/holodeck/source_courtroom) +"Ek" = (/obj/structure/sign/nosmoking_2{pixel_x = 28; pixel_y = 0},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) "El" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) "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/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) -"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/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor,/area/syndicate_mothership{name = "\improper Raider Base"}) -"Es" = (/obj/structure/sign/double/barsign,/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/syndicate_mothership{name = "\improper Raider Base"}) -"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) -"Ew" = (/turf/unsimulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/centcom/holding) -"Ex" = (/turf/unsimulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/centcom/holding) -"Ey" = (/obj/structure/sign/nosmoking_2{pixel_x = 28; pixel_y = 0},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/centcom/holding) -"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/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor,/area/syndicate_mothership{name = "\improper Raider Base"}) -"ED" = (/obj/effect/decal/cleanable/dirt,/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "floorgrime"},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Eo" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/shuttle/escape/centcom) +"Ep" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/tdome) +"Eq" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_thunderdome"; name = "Thunderdome"},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"Er" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/tdome) +"Es" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/tdome) +"Et" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/tdome) +"Eu" = (/obj/machinery/sleeper{tag = "icon-sleeper_0 (WEST)"; icon_state = "sleeper_0"; dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"Ev" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/shuttle/escape/centcom) +"Ew" = (/obj/machinery/sleeper{icon_state = "sleeper_0-r"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) +"Ex" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/shuttle/escape/centcom) +"Ey" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"Ez" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/tdome) +"EA" = (/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"EB" = (/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/unsimulated/floor{icon_state = "steel"},/area/tdome) +"EC" = (/obj/machinery/camera/network/crescent{c_tag = "Crescent Medical"; dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"ED" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) "EE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/skipjack_station/start) "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{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/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) -"EO" = (/turf/simulated/floor/holofloor{icon_state = "carpetsymbol"; dir = 6},/area/holodeck/source_theatre) -"EP" = (/turf/unsimulated/floor{dir = 6; icon_state = "whitegreen"},/area/centcom/holding) -"EQ" = (/turf/unsimulated/floor{dir = 10; icon_state = "whitegreen"},/area/centcom/holding) -"ER" = (/obj/machinery/sleep_console{icon_state = "sleeperconsole-r"; orient = "RIGHT"},/turf/unsimulated/floor{dir = 8; icon_state = "whitehall"; tag = "icon-whitehall (EAST)"},/area/centcom/holding) -"ES" = (/obj/machinery/sleeper{icon_state = "sleeper_0-r"; orient = "RIGHT"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"ET" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape/centcom) -"EU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/escape/centcom) +"EI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/airless,/area/shuttle/escape/centcom) +"EJ" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"EK" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"EL" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"EM" = (/obj/structure/table/standard,/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"EN" = (/obj/structure/table/standard,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/scalpel,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"EO" = (/obj/structure/table/standard,/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/hemostat{pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"EP" = (/obj/structure/table/standard,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"EQ" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"ER" = (/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{tag = "icon-plating"; icon_state = "plating"},/area/tdome) +"ES" = (/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{icon_state = "steel"},/area/tdome) +"ET" = (/obj/structure/closet/secure_closet/medical2,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"EU" = (/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{icon_state = "white"},/area/centcom/holding) "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) +"EW" = (/obj/structure/table/standard,/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{icon_state = "white"},/area/centcom/holding) "EX" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) "EY" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) "EZ" = (/turf/unsimulated/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"},/area/centcom/holding) -"Fa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor,/area/syndicate_mothership{name = "\improper Raider Base"}) -"Fb" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) -"Fc" = (/obj/structure/grille,/obj/structure/window/reinforced,/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/tdome) -"Fd" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 8},/area/tdome) +"Fa" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"Fb" = (/obj/machinery/computer/operating,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"Fc" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus{pixel_x = -5; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/OMinus{pixel_x = -5; pixel_y = -1},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/holding) +"Fd" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) "Fe" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) -"Ff" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 4},/area/tdome) -"Fg" = (/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/unsimulated/floor{name = "plating"},/area/tdome) -"Fh" = (/turf/unsimulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/centcom/holding) -"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) +"Ff" = (/obj/machinery/bodyscanner,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"Fg" = (/obj/machinery/body_scanconsole,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"Fh" = (/obj/structure/table/standard,/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{icon_state = "white"},/area/centcom/holding) +"Fi" = (/obj/structure/table/standard,/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{icon_state = "white"},/area/centcom/holding) +"Fj" = (/obj/structure/table/standard,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) +"Fk" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_thunderdome"; name = "Thunderdome"},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) "Fl" = (/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)},/obj/effect/decal/cleanable/dirt,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"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) -"Fp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor,/area/syndicate_mothership{name = "\improper Raider Base"}) +"Fm" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"Fn" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"Fo" = (/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/structure/table/standard,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"Fp" = (/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) "Fq" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/skipjack_station/start) "Fr" = (/obj/structure/table/standard,/obj/item/weapon/deck,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start) "Fs" = (/obj/machinery/door/airlock/external{name = "Arrivals Bar Airlock"},/obj/machinery/door/blast/regular{id = "crescent_vip_shuttle"; name = "Crescent VIP Shuttle"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry) -"Ft" = (/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) +"Ft" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) "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/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/holding) -"Fy" = (/turf/unsimulated/floor{dir = 4; icon_state = "whitegreen"},/area/centcom/holding) +"Fv" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"Fw" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"Fx" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"Fy" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) "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) -"FB" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome) -"FC" = (/obj/structure/closet/secure_closet/medical2,/turf/unsimulated/floor{tag = "icon-escapecorner (EAST)"; icon_state = "escapecorner"; dir = 4},/area/centcom/holding) -"FD" = (/turf/unsimulated/floor{tag = "icon-whitehall (NORTHEAST)"; icon_state = "whitehall"; dir = 5},/area/centcom/holding) +"FA" = (/obj/item/device/camera,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"FB" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"FC" = (/obj/structure/disposalpipe/segment,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) +"FD" = (/obj/structure/bed/chair,/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeobserve) "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/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) -"FH" = (/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) +"FF" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"FG" = (/obj/effect/floor_decal/corner/green{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"FH" = (/obj/effect/landmark{name = "tdome2"},/turf/simulated/floor,/area/tdome/tdome2) "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) -"FK" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/tdome) -"FL" = (/turf/unsimulated/floor{icon_state = "green"},/area/tdome) -"FM" = (/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/tdome) +"FJ" = (/obj/machinery/door/blast/regular{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{tag = "icon-plating"; icon_state = "plating"},/area/tdome) +"FK" = (/obj/effect/landmark{name = "tdome1"},/turf/simulated/floor,/area/tdome/tdome1) +"FL" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/simulated/floor,/area/tdome/tdome2) +"FM" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/simulated/floor,/area/tdome/tdome1) "FN" = (/obj/structure/table/standard,/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) -"FO" = (/turf/unsimulated/floor{tag = "icon-escapecorner (EAST)"; icon_state = "escapecorner"; dir = 4},/area/centcom/holding) -"FP" = (/obj/machinery/computer/operating,/turf/unsimulated/floor{dir = 1; icon_state = "whitehall"; tag = "icon-whitehall (SOUTHEAST)"},/area/centcom/holding) -"FQ" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{tag = "icon-whitecorner (NORTH)"; icon_state = "whitecorner"; dir = 1},/area/centcom/holding) +"FO" = (/obj/effect/landmark{name = "tdome2"},/obj/machinery/camera/network/thunder{c_tag = "Thunderdome - Red Team"; invisibility = 101},/turf/simulated/floor,/area/tdome/tdome2) +"FP" = (/obj/effect/landmark{name = "tdome1"},/obj/machinery/camera/network/thunder{c_tag = "Green Team"; invisibility = 101},/turf/simulated/floor,/area/tdome/tdome1) +"FQ" = (/obj/machinery/door/blast/regular{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) "FR" = (/obj/machinery/door/airlock/glass_security{name = "Escape Shuttle Cell"; req_access = list(2)},/turf/simulated/shuttle/floor4,/area/shuttle/escape/centcom) -"FS" = (/obj/machinery/bodyscanner,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"FT" = (/obj/machinery/body_scanconsole,/turf/unsimulated/floor{tag = "icon-whitehall (EAST)"; icon_state = "whitehall"; dir = 4},/area/centcom/holding) -"FU" = (/obj/structure/bed/roller,/turf/unsimulated/floor{dir = 0; icon_state = "whitegreen"},/area/centcom/holding) -"FV" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) -"FW" = (/obj/effect/decal/cleanable/dirt,/turf/unsimulated/floor{dir = 8; icon_state = "wood-broken"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"FX" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"FS" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"FT" = (/obj/effect/floor_decal/corner/red{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"FU" = (/obj/effect/floor_decal/corner/red/full,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"FV" = (/obj/effect/floor_decal/corner/green,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"FW" = (/obj/effect/floor_decal/corner/green/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) +"FX" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) "FY" = (/obj/structure/table/standard,/obj/item/weapon/legcuffs,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start) "FZ" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "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) -"Gd" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/centcom/holding) -"Ge" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Gf" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/centcom/holding) -"Gg" = (/obj/structure/bed/chair/comfy/brown,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/centcom/holding) -"Gh" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Gi" = (/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Gj" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"Gd" = (/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Ge" = (/obj/machinery/atmospherics/valve,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gf" = (/obj/item/weapon/extinguisher,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gg" = (/obj/structure/bed/chair{dir = 1},/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gh" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gi" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/sleeping_agent{pixel_x = 1},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gj" = (/obj/item/weapon/wrench,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) "Gk" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) "Gl" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"Gm" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Gn" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Go" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Gp" = (/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) -"Gq" = (/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) +"Gm" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gn" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "steel"},/area/tdome) +"Go" = (/obj/structure/bed/chair,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gp" = (/obj/structure/table/standard,/turf/unsimulated/beach/sand,/area/beach) +"Gq" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) "Gr" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"Gs" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Gt" = (/obj/item/device/camera,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Gu" = (/obj/structure/disposalpipe/segment,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Gv" = (/obj/structure/bed/chair,/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"Gs" = (/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/structure/table/standard,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gt" = (/obj/machinery/computer/pod{id = "thunderdomegen"; name = "Thunderdome General Supply"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gu" = (/obj/machinery/computer/pod{id = "thunderdomeaxe"; name = "Thunderdome Axe Supply"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"Gv" = (/obj/machinery/computer/pod{id = "thunderdomehea"; name = "Thunderdome Heavy Supply"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) "Gw" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) "Gx" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/floor,/area/tdome) "Gy" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/tdome) @@ -1693,19 +1693,19 @@ "GC" = (/turf/simulated/floor,/area/tdome) "GD" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/tdome) "GE" = (/obj/structure/table/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"GF" = (/obj/machinery/door/blast/regular{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{name = "plating"},/area/tdome) -"GG" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) -"GH" = (/obj/machinery/door/blast/regular{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) -"GI" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome) -"GJ" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome) -"GK" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) -"GL" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/holding) -"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/network/crescent{c_tag = "Crescent Arrivals East"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) +"GF" = (/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/structure/table/standard,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"GG" = (/obj/machinery/computer/pod{id = "thunderdome"; name = "Thunderdome Blast Door Control"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"GH" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"GI" = (/obj/structure/table/standard,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"GJ" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/electrical,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"GK" = (/obj/structure/table/standard,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"GL" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/tdome/tdomeadmin) +"GM" = (/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 = 8; icon_state = "wood"},/area/wizard_station) +"GN" = (/obj/structure/table/woodentable,/obj/effect/landmark{name = "Teleport-Scroll"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"GO" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/backpack/satchel/withwallet,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "GP" = (/turf/simulated/floor/bluegrid,/area/tdome) "GQ" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome) -"GR" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/holding) +"GR" = (/obj/structure/toilet{pixel_y = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "GS" = (/obj/machinery/atmospherics/pipe/vent,/turf/simulated/floor/bluegrid,/area/tdome) "GT" = (/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) "GU" = (/turf/unsimulated/beach/sand{density = 1; opacity = 1},/area/beach) @@ -1722,38 +1722,38 @@ "Hf" = (/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) "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) +"Hi" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "Hj" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "Hk" = (/obj/machinery/camera/network/crescent{c_tag = "Shuttle Center"},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "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/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/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) -"Hq" = (/obj/item/weapon/extinguisher,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"Hr" = (/obj/machinery/atmospherics/valve,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"Hs" = (/obj/structure/bed/chair{dir = 1},/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"Hm" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Hn" = (/obj/structure/simple_door/iron,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"Ho" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) +"Hp" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/structure/closet/coffin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Hq" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) +"Hr" = (/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"Hs" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rd,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) "Ht" = (/obj/effect/overlay/palmtree_r,/turf/unsimulated/beach/sand,/area/beach) -"Hu" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"Hv" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/sleeping_agent{pixel_x = 1},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"Hw" = (/obj/item/weapon/wrench,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"Hx" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"Hy" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"Hz" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) +"Hu" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"Hv" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"Hw" = (/obj/machinery/suit_cycler/wizard,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"Hx" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"Hy" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"Hz" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) "HA" = (/obj/structure/mirror/raider{pixel_x = 0; pixel_y = 28},/obj/structure/sink{pixel_y = 11},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) "HB" = (/obj/structure/curtain/open/shower,/obj/machinery/shower,/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) "HC" = (/obj/structure/sink{pixel_y = 11},/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) -"HD" = (/obj/machinery/computer/pod{id = "thunderdomeaxe"; name = "Thunderdome Axe Supply"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"HE" = (/obj/machinery/computer/pod{id = "thunderdomegen"; name = "Thunderdome General Supply"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"HF" = (/obj/machinery/computer/pod{id = "thunderdomehea"; name = "Thunderdome Heavy Supply"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"HG" = (/obj/machinery/computer/pod{id = "thunderdome"; name = "Thunderdome Blast Door Control"},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"HD" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/monocle,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"HE" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/backpack/cultpack,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"HF" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/backpack,/turf/unsimulated/floor{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"HG" = (/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{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) "HH" = (/obj/structure/table/standard,/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/skipjack_station/start) -"HI" = (/obj/random/vendor,/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "floorgrime"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"HJ" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/centcom/holding) -"HK" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/holding) -"HL" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/holding) -"HM" = (/obj/machinery/door/airlock/glass{name = "Arrivals Bar"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"HN" = (/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) +"HI" = (/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{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"HJ" = (/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{tag = "icon-lino"; icon_state = "lino"},/area/wizard_station) +"HK" = (/obj/structure/kitchenspike,/obj/structure/table/marble,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"HL" = (/obj/structure/table/rack,/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"HM" = (/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) +"HN" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; 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) "HO" = (/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},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "HP" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/beach) "HQ" = (/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},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) @@ -1772,53 +1772,20 @@ "Id" = (/obj/machinery/librarycomp,/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "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/structure/table/woodentable,/obj/item/weapon/reagent_containers/glass/rag,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) -"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) -"Il" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station) +"Ig" = (/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/wizard_station) +"Ih" = (/mob/living/simple_animal/crab{name = "Experiment 68a"},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/wizard_station) +"Ii" = (/turf/unsimulated/floor{tag = "icon-grass0"; icon_state = "grass0"},/area/wizard_station) +"Ij" = (/obj/structure/flora/ausbushes/fullgrass,/turf/unsimulated/floor{tag = "icon-grass0"; icon_state = "grass0"},/area/wizard_station) +"Ik" = (/obj/structure/flora/ausbushes/grassybush,/turf/unsimulated/floor{tag = "icon-grass0"; icon_state = "grass0"},/area/wizard_station) +"Il" = (/mob/living/simple_animal/hostile/retaliate/goat{name = "Experiment 97d"},/turf/unsimulated/floor{tag = "icon-grass0"; icon_state = "grass0"},/area/wizard_station) "Im" = (/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/space) -"In" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station) -"Io" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/wizard_station) -"Ip" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station) -"Iq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor,/area/syndicate_mothership{name = "\improper Raider Base"}) -"Ir" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station) "Is" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"It" = (/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},/obj/structure/closet/coffin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Iu" = (/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/wizard_station) -"Iv" = (/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/wizard_station) -"Iw" = (/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},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/wizard_station) "Ix" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/bag/cash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Iy" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"Iz" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rd,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"IA" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"IB" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"IC" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) -"ID" = (/obj/machinery/suit_cycler/wizard,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "IE" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "IF" = (/obj/machinery/vending/magivend,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "IG" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"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/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"IJ" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/centcom/holding) -"IK" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/centcom/holding) -"IL" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/centcom/holding) -"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/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) -"IT" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/holding) -"IU" = (/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) -"IV" = (/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) -"IW" = (/turf/unsimulated/floor{icon_state = "warning"},/area/centcom/holding) "IX" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"IY" = (/obj/item/weapon/broken_bottle,/turf/unsimulated/floor{dir = 8; icon_state = "wood-broken"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"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/woodentable,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) "Jb" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/material/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "Jc" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/material/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) "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) @@ -1829,20 +1796,11 @@ "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/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) -"Jm" = (/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) -"Jn" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/holding) -"Jo" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"Jp" = (/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) -"Jq" = (/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) "Jr" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/wall,/area/centcom/holding) "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/machinery/porta_turret/crescent,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "Jz" = (/obj/item/organ/xenos/eggsac,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) "JA" = (/obj/item/weapon/mop,/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) "JB" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/dirt,/obj/item/pizzabox/meat,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) @@ -1852,10 +1810,6 @@ "JF" = (/obj/structure/closet/athletic_mixed,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "JG" = (/obj/structure/table/woodentable,/obj/item/device/megaphone,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "JH" = (/obj/machinery/camera/network/crescent{c_tag = "Crescent Bar Center"},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) -"JI" = (/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) -"JJ" = (/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) -"JK" = (/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "warning"},/area/centcom/holding) -"JL" = (/turf/unsimulated/floor{icon_state = "warning"; dir = 1; heat_capacity = 1},/area/centcom/holding) "JM" = (/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"}) "JN" = (/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"}) "JO" = (/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"}) @@ -1863,48 +1817,34 @@ "JQ" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash/c1,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "JR" = (/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"}) "JS" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"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" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) -"JV" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/holding) "JW" = (/obj/structure/bed/chair{dir = 4},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "JX" = (/obj/structure/bed/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 30},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "JY" = (/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"}) "JZ" = (/obj/effect/decal/cleanable/ash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Ka" = (/turf/unsimulated/beach/sand{tag = "icon-desert2"; icon_state = "desert2"},/area/centcom/holding) -"Kb" = (/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/obj/item/weapon/stool/padded,/turf/unsimulated/floor{tag = "icon-siding2"; name = "plating"; icon_state = "siding2"},/area/centcom/holding) "Kc" = (/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) "Kd" = (/obj/machinery/status_display{pixel_y = -30},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "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" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/drinkingglasses,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership{name = "\improper Raider Base"}) "Kj" = (/obj/machinery/door/airlock/external{req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/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) -"Kn" = (/turf/unsimulated/floor{tag = "icon-ironsand11"; icon_state = "ironsand11"},/turf/unsimulated/floor{tag = "icon-asteroid5"; name = "plating"; icon_state = "asteroid5"},/area/wizard_station) -"Ko" = (/turf/unsimulated/floor{tag = "icon-ironsand7"; icon_state = "ironsand7"},/mob/living/simple_animal/crab{name = "Experiment 68a"},/turf/unsimulated/floor{tag = "icon-asteroid7"; name = "plating"; icon_state = "asteroid7"},/area/wizard_station) -"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/machinery/door/airlock/hatch{req_access = list(150)},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Kt" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) "Ku" = (/obj/item/weapon/inflatable_duck,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "Kv" = (/obj/structure/sign/redcross,/turf/unsimulated/wall,/area/centcom/holding) -"Kw" = (/obj/machinery/door/airlock/glass_medical{name = "Arrivals Medbay"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) "Kx" = (/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) "Ky" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Kz" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "KA" = (/turf/unsimulated/beach/sand{tag = "icon-desert1"; icon_state = "desert1"},/area/centcom/holding) "KB" = (/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) -"KC" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 29},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/centcom/holding) "KD" = (/obj/structure/table/standard,/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) "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) -"KH" = (/obj/structure/flora/ausbushes/grassybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station) -"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" = (/mob/living/simple_animal/crab,/turf/unsimulated/beach/sand{tag = "icon-desert3"; icon_state = "desert3"},/area/centcom/holding) "KL" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand{tag = "icon-desert_dug"; icon_state = "desert_dug"},/area/centcom/holding) @@ -1917,9 +1857,6 @@ "KS" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "KT" = (/obj/structure/table/standard,/obj/item/weapon/cautery,/obj/item/weapon/retractor,/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/floor{icon_state = "floor3"},/area/skipjack_station/start) "KU" = (/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) -"KV" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) -"KW" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) -"KX" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding) "KY" = (/obj/machinery/iv_drip,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "KZ" = (/obj/structure/bed/roller,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 30},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "La" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start) @@ -1931,58 +1868,26 @@ "Lj" = (/obj/machinery/hologram/holopad,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "Lk" = (/turf/unsimulated/beach/sand{tag = "icon-beach"; icon_state = "beach"},/area/centcom/holding) "Ll" = (/turf/unsimulated/beach/sand{tag = "icon-beachcorner"; icon_state = "beachcorner"},/area/centcom/holding) -"Lm" = (/obj/machinery/door/airlock/centcom{name = "Thunderdome"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_thunderdome"; name = "Thunderdome"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "Ln" = (/obj/structure/table/standard,/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) "Lo" = (/obj/structure/table/standard,/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/skipjack_station/start) "Ls" = (/obj/structure/table/rack,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/aiupload{pixel_x = -3; pixel_y = -3},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"Lt" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/button/remote/blast_door{id = "CREED"; name = "Spec Ops Ready Room"; pixel_x = -5; pixel_y = 4; req_access = list(108)},/obj/machinery/button/remote/blast_door{icon_state = "doorctrl0"; id = "ASSAULT"; name = "Mech Storage"; pixel_x = -5; pixel_y = -4; req_access = list(108)},/obj/machinery/button/remote/blast_door{id = "ert_synth_equipment"; name = "Synth Modification Equipment"; pixel_x = 5; pixel_y = -4; req_access = list(108)},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) -"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/table/steel_reinforced,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/circuitboard/smes,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) "Lx" = (/obj/structure/sign/nosmoking_2{pixel_x = 32},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"Ly" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "CREED"; name = "Ready Room"; p_open = 0},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/specops) -"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) -"LC" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "carpet3-0"},/area/holodeck/source_theatre) "LD" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; tiles = 0},/turf/space,/area/space) -"LE" = (/turf/simulated/floor/holofloor{icon_state = "carpet11-12"; dir = 4},/area/holodeck/source_courtroom) -"LF" = (/turf/simulated/floor/holofloor{icon_state = "carpet7-3"; dir = 4},/area/holodeck/source_courtroom) -"LG" = (/obj/machinery/door/window/holowindoor{base_state = "right"; icon_state = "right"},/turf/simulated/floor/holofloor{icon_state = "grimy"; dir = 2},/area/holodeck/source_courtroom) -"LH" = (/obj/machinery/door/window/holowindoor{base_state = "right"; icon_state = "right"; name = "Green Team"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_emptycourt) -"LI" = (/turf/simulated/floor/holofloor{icon_state = "wood"; dir = 4},/area/holodeck/source_meetinghall) -"LJ" = (/obj/structure/window/reinforced/holowindow,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) -"LK" = (/obj/machinery/door/window/holowindoor{base_state = "right"; dir = 2; icon_state = "right"; name = "Red Corner"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) -"LL" = (/obj/machinery/door/window/holowindoor{name = "Red Team"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_thunderdomecourt) -"LM" = (/obj/machinery/door/window/holowindoor{name = "Red Team"},/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_basketball) -"LN" = (/obj/structure/table/woodentable/holotable,/turf/simulated/floor/holofloor{icon_state = "wood"; dir = 4},/area/holodeck/source_meetinghall) -"LO" = (/turf/unsimulated/wall{icon_state = "iron7"},/area/space) "LP" = (/turf/space/transit/east/shuttlespace_ew9,/area/shuttle/escape_pod5/transit) -"LQ" = (/obj/structure/flora/pottedplant{tag = "icon-plant-06"; icon_state = "plant-06"},/turf/simulated/floor/holofloor{icon_state = "wood"; dir = 4},/area/holodeck/source_meetinghall) -"LR" = (/obj/structure/table/holotable,/obj/item/clothing/gloves/boxing/hologlove,/turf/simulated/floor/holofloor{icon_state = "dark"},/area/holodeck/source_boxingcourt) "LS" = (/turf/space/transit/east/shuttlespace_ew2,/area/shuttle/escape_pod5/transit) "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" = (/turf/unsimulated/beach/sand{tag = "icon-beach (SOUTHEAST)"; icon_state = "beach"; dir = 6},/area/centcom/holding) -"LX" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) -"LY" = (/obj/machinery/camera/network/crescent{c_tag = "Crescent Medical"; dir = 4},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreencorner"},/area/centcom/holding) "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" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "CCIAAgent"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "Mc" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Md" = (/obj/structure/table/rack,/obj/item/device/suit_cooling_unit/improved,/obj/item/device/suit_cooling_unit/improved,/obj/item/weapon/rig/industrial/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "Me" = (/obj/machinery/door/airlock/hatch{name = "Warehouse"; req_access = list(150)},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Mi" = (/obj/effect/decal/cleanable/vomit,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Mj" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/turf/unsimulated/beach/sand{tag = "icon-coconuts"; icon_state = "coconuts"},/area/centcom/holding) -"Mk" = (/obj/structure/table/standard,/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/turf/unsimulated/floor{tag = "icon-whitecorner"; name = "plating"; icon_state = "whitecorner"},/area/centcom/holding) -"Ml" = (/obj/structure/table/standard,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/scalpel,/turf/unsimulated/floor{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (SOUTHEAST)"},/area/centcom/holding) -"Mm" = (/obj/structure/table/standard,/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/hemostat{pixel_y = 4},/turf/unsimulated/floor{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (SOUTHEAST)"},/area/centcom/holding) -"Mn" = (/obj/structure/table/standard,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw,/turf/unsimulated/floor{tag = "icon-whitecorner (WEST)"; icon_state = "whitecorner"; dir = 8},/area/centcom/holding) -"Mo" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/turf/unsimulated/floor{dir = 2; icon_state = "whitehall"; tag = "icon-whitehall (SOUTHEAST)"},/area/centcom/holding) "Mp" = (/obj/effect/decal/cleanable/dirt,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Mr" = (/obj/effect/decal/cleanable/generic,/obj/effect/decal/cleanable/dirt,/turf/unsimulated/floor{dir = 5; heat_capacity = 1; icon_state = "floorgrime"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Ms" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{dir = 8; icon_state = "wood-broken"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Mu" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access = list(45)},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding) "Mv" = (/turf/simulated/mineral,/area/syndicate_mothership{name = "\improper Raider Base"}) "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) @@ -1990,24 +1895,15 @@ "MD" = (/obj/effect/decal/cleanable/generic,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "ME" = (/obj/item/weapon/stool/padded,/obj/effect/landmark{name = "voxstart"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "MF" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"MG" = (/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) -"MH" = (/obj/structure/table/standard,/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) "MN" = (/obj/item/clothing/head/philosopher_wig,/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) "MO" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -6},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "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/structure/table/woodentable,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/deck,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"MT" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"MU" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus{pixel_x = -5; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/OMinus{pixel_x = -5; pixel_y = -1},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) -"MV" = (/obj/structure/table/standard,/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) -"MW" = (/obj/structure/table/standard,/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) -"MX" = (/obj/structure/table/standard,/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) "MY" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Na" = (/obj/structure/window/shuttle{icon_state = "window12"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) -"Nb" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/obj/machinery/door/blast/regular{id = "crescent_thunderdome"; name = "Thunderdome"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "Nc" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) -"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) "Nh" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) @@ -2018,15 +1914,10 @@ "Nm" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "No" = (/obj/structure/table/rack,/obj/item/clothing/under/vox/vox_casual,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/clothing/suit/space/vox/stealth,/obj/item/clothing/head/helmet/space/vox/stealth,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Np" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/dice,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Nq" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{dir = 9; icon_state = "whitegreen"},/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/vending/sovietsoda,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"Nv" = (/obj/item/weapon/cigbutt,/turf/unsimulated/floor{dir = 8; icon_state = "wood-broken"},/area/syndicate_mothership{name = "\improper Raider Base"}) "Nw" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) "Ny" = (/obj/machinery/hologram/holopad,/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding) "NC" = (/obj/structure/table/rack,/obj/item/clothing/under/vox/vox_casual,/obj/item/clothing/shoes/magboots/vox,/obj/item/clothing/gloves/yellow/vox,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"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) "NF" = (/obj/structure/closet/hydrant{pixel_x = 30; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) "NG" = (/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) @@ -2051,39 +1942,17 @@ "Oa" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) "Ob" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) "Oc" = (/obj/item/weapon/wrench,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Od" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Oe" = (/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/structure/table/standard,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) "Oo" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) "Op" = (/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"OE" = (/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) -"OF" = (/obj/effect/landmark{name = "tdome1"},/obj/machinery/camera/network/thunder{c_tag = "Green Team"; invisibility = 101},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) "OG" = (/obj/machinery/camera/network/thunder{c_tag = "Thunderdome Arena"; invisibility = 101},/turf/simulated/floor/bluegrid,/area/tdome) -"OH" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "OI" = (/obj/machinery/door/airlock/command{name = "Thunderdome Administration"; req_access = list(102)},/turf/simulated/floor,/area/tdome) "OJ" = (/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach) -"OK" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access = list(101)},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) -"OL" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/unsimulated/beach/sand,/area/beach) "OM" = (/obj/structure/table/standard,/obj/item/clothing/under/rainbow,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/head/collectable/petehat{pixel_y = 5},/turf/unsimulated/beach/sand,/area/beach) -"ON" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"OO" = (/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"OP" = (/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"OQ" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"OR" = (/obj/structure/table/standard,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"OS" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/electrical,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"OT" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"OU" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) "OV" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/beach/sand,/area/beach) "OW" = (/obj/structure/table/standard,/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) "OX" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach) -"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) "OZ" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Pa" = (/obj/structure/simple_door/iron,/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station) -"Pb" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station) "Pc" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) -"Pd" = (/obj/structure/kitchenspike,/obj/structure/table/marble,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) -"Pe" = (/obj/structure/table/rack,/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) -"Pf" = (/obj/structure/table/rack,/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station) -"Pg" = (/obj/structure/kitchenspike,/obj/structure/table/marble,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station) "Ph" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "Pi" = (/obj/item/weapon/book/manual/robotics_cyborgs,/obj/structure/table/glass,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) "Pj" = (/obj/item/robot_parts/head,/obj/structure/table/glass,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) @@ -2091,29 +1960,29 @@ "Pl" = (/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station) (1,1,1) = {" -aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoalahajeEapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwtwtwtwtwtwtwtwtwtwtwtwtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaNaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaPaOaOaOaOaOaOaOaOaOaOaQ -ajaRaSaTaUaVaWaXaYaZbabbbcbdbebfaWaVbaaSaTaXbbaUbdaZbfbcaXbaabatauavbgbhbibjaAbkblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasataJaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwtItJtwtItKtwtLtMtwtItJtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbpbCbpbpbpbpbpbpbrbsbtbsbtbsbsbtbsbtbsbrbubqbqbqbqbqbqbqbqbqbreVeUeSeSeSeSeSeSeSeSbrbwbwbwbwbwbwbwbwbwbwbrbxbxbxbxbxbxbxbxbxbxbreReQePbybzbzbzbzbzbAbB -amaUaZbcaXbeaSaWbaaVbdaYbfaTbbaRaSbebdaZbcaWaYaXaTaVaRbfaWbdaeaqarasatauavbgaxbibjbnbkblbmapaqararasataubgbhbibjbnbkblbmapaqaGaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwubtMtwubuctwubtJtwubudtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbpbpbpbpbpbpbvbpbrbEbFbEbFbEbFbEbFbEbFbrbGbGbGbGbGbGbGbGbGbGbreVfdeWeWeWeWeWeWeWeWbrbwbHbwbwbwbwbwbwbHbwbrbxbxbxbxbxbxbxbxbxbxbreReQePbIbJbJbJbJbJbKbB -adaXaVbfaWbbaZaSbdaSaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeaUaRaSaTahbgbhbibjbnbkblaDapaqarasatauavbgbhavbgbhbiblbmapaqarasatauavbgaxaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwtwtwtwtwtwtwtwtwtwtwtwtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbvbpbpbpbpbpbpbpbpbrbFbEbFbNbMbNbMbEbFbEbrbGbGbGbGbGbGbGbGbGbGbreVffeWeSALeSeWANAwAubrbwbwbwbwbwbwbwbwbwbwbrbxbxbxbxbxbxbxbxbxbxbreReRAObIbJbJbJbJbJbKbB -alaWbeaRaSaYaVaZaTaZbcbdaUbfbaaXaVaYbcbeaRaZbdaSbfbbaXaUaZbcagblbmapaqarasataJavbgbhbibjbnbkblbmasatauavatauavbgbhbibjbnbkblaDaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwuBudtwtIudtwuCtJtwtItMtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbpbpbpbCbpbpbpbpbrbNbMBiBjbVbVbQBhbEbFbrbGbGbGbGbGbGbGbGbGbGbreVffBxBkCqBUBHftfCfvbrbwbwbwbHbwbwbHbwbwbwbrbxbxbxbxbxbxbxbxbxbxbreReQePbIbJbJbJbJbJbKbB -aoaSbbaUaZbabeaVbcaVbfcxfKcccqiZjgbUiLhZaUaVaTaZaRaYaWaXaVbfacbgbhbibjbnbkblaDapaqarasatauavbgbhbibjbnbkblbmapaqarasatauavbgaxaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwubtJvhubtJtwubvitwubvjtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbCbpbpbpbCbpbpbpbrbQbQbQbQfEfEbQgebFbEbrbRbRbRbRbRbRbRbRbRfebreVfffjfgfgfgfuftfCfvbrbwbwbwbwbwbwbwbwbwbwbrbxbxbxbxbxbxbxbxbxbxbreReQePbIbJbJbJbJbJbKbB -abaZaYaXaVbdbbbebfbecqcEbSbSbSbSbSbSbSiLbUaUbcaVaUbaaSaWbeaRaiarasatauavbgbhaybjbnbkblbmapaqarasapaqarasbhbibjbnbkblbmapaqaraHaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwtwtwtwtwtwtwtwtwtwtwtwtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbpbpbpbpbpbpbpbpbrbQbQbQbQfEfEbQgebFbEbrbYbZiQiQiQiQiQiQcbosbreVffzopGAkpGAjftfCfvbrbwbwbwbwbwbwbwbwbwbwbrbxbxbxbxbxbxbxbxbxbxbreReQePcobJbJbJbJbJcpbB -aeaVbaaWbeaTaYbbaRebczbSbSbSbSbSbSbSbSbSjgLDbfbeaXbdaZaSbbaUafbnbkblbmapaqaraHatauavbgbhbibjbnbiavaraqbhauasatauavbgbhbibjbnaBaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbpbpbpbvbpbpbpbCbrcMcLLABjbVbVbQBhbEbFbrbYLzcmcmcmcmcmcmLBLCbreVffEkCDAkCDCUftfCfvbrbwbwbwbHbwbwbHbwbwbwbrbxbxbxbxbxbxbxbxbxbxbreReQePcobJbJbJbJbJcpbB -ahbebdaSbbbcbaaYaUcxbSbSbSbSbSbSbSbSbSbSbSiyaRbbaWaTaVaZaYaXanbmapaqarasatauaKbgbhbibjbnbkblbmcFcGcHcIcJcKavbgbhbibjbnbkblbmaEaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbvbpbpbpbpbpbpbpbrbFbEbFcMcLcMcLbEbFbEbrbYLzcmcmcmcmcmcmLBLCbreVLGLFAkAkAkLEftfCfvbrbwbwbwbwbwbwbwbwbwbwbrbxbxbxbxbxbxbxbxbxbxbreReRLHcobJbJbJbJbJcpbB -agbbaTaZaYbfbdbaaXcEbSbSbSbSbSbSbSbSbSbSbShZaUaYaSbcbeaVbaaWakbibjbnbkblbmapaFarasatauavbgbhbicKcUKFLPEncYaqarasatauavbgbhbiazaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobpbpbpbpbpbpbpbpbpbpbrbEbFbEbFbEbFbEbFbFbEbrbYCBdmdmdmdmdmdmDJDKbreVffEkCDCDCDCUftfCfvbrbwbHbwbwbwbwbwbwbHbwbrbxbxbxbxbxbxbxbxbxbxbreReQePcobJbJbJbJbJcpbB -acaYbcaVbaaRaTbdaWcqbSbSbSbSbSbSbSbSbSbSbSigaXbaaZbfbbbebdaSaaasatauavbgbhbiazbnbkblbmapaqarasddLSLTdgdhdibhbnbkblbmapaqarasaIaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobCbpbpbpbvbpbpbpbpbvbrbsbtbsbtbsbsbtbsbtbsbrIZbYbYbYbYbYbYbYbYEObreVeUFjEzEzEzEvEuENwkbrbwbwbwbwbwbwbwbwbwbwbrbxbxbxbxbxbxbxbxbxbxbreReQePdodpdpdpdpdpdqbB -aibabfbebdaUbcaTaSczbSbSbSbSbSbSbSbSbSbSbSbUaWbdaVaRaYbbaTaZajbhbibjbnbkblbmaEaqarasatauavbgbheGdwdxdyLSdzapaqarasatauavbgbhayaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMLOdBdBdBdBdBdBdBdBdBdBdCdBdBdBdBdBdBdBdBdBdBdCdBdBdBdBdBdBdBdBdBdBdCdDdDdDdDdDdDdDdDdDdDdCdDdDdDdDdDdDdDdDdDdDdCdDdDdDdDdDdDdDdDdDdDdCdDdDdDdDdDdDdDdDdDdDdE -afbdaRbbaTaXbfbcaZcTbSbSbSbSbSbSbSbSbSbSbSdYaSaTbeaUbaaYbcaVamaqarasatauavbgaxbibjbnbkblbmapaqdHdddIcGcHcIbhbibjbnbkblbmapaqaGaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbWbWbWbWbWbWbWbWbWbrdMdMdMdMdMdMdMdMdMdMbrLILILILILILILILILILQbrcncrcldOevdOdPdQevdQbrdRdSdTdRdUdRdSdTdRdUbrctcscudVdWdWdWdWdWdXbrLRLRcBcBcBcBcBcBcBcBbB -anaTaUaYbcaWaRbfdGfsbSbSbSbSbSbSbSbSbSbSbSidiKbcbbaXbdbabfbeadauavbgbhbibjbnaBblbmapaqarasatauarbibjbnbkbgbkblbmapaqarasatauaKaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbWbWbXbWbWbWbWbXbWbrdMecdMdMdMdMecdMdMdMbrLILIedefeeedefLILILIbrcncrclegehegeheieheibrdUekejdUdRdUdRekekdRbrctcscueneoeoeoeoeoepbrcBcBcBcBcAcAcAcBcBcBbB -akbcaXbabfaSaUaRebbSbSbSbSbSbSbSbSbSbSbSbSbSiebfaYaWaRaTaUaYaobjbnbkblbmapaqaGasatauavbgbhbibjcFcGcHcIcJcKarasatauavbgbhbibjaAaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbWbWbWbWbWbWbWbWbWbrdMdMdMdMdMdMdMdMetdMbrLILILNLNLNLNLNLILILIbrcncnLMegeheveveveheibrdRdUdRdSdRdReweldSdRbrctctLLeneoeoeoeoeoepbrcBcBcBLKLJLJLJcBcBcBbB -aabfaWbdaRaZaXaUdcbSbSbSbSbSbSbSbSbSbSbSbSbSjgaRbaaSbcbcaXbaabbkblbmapaqarasaIauavbgbhbibjbnbkcKexeyezeAcYatauavbgbhbibjbnbkaCaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbXbWbWbWbWbXbWbWbWbrdMdMeTdMetdMdMdMdMdMbrdvdvdvdvdvdvdvdvdvdAbrcncrclegeheheheheheibrdSdRdUekdsdSdRdUekdUbrctcscueneoeoeoeoeoepbrcBcAcCdrdZdZercycAcBbB -ajaRaSaTaUaVaWaXcxbSbSbSbSbSbSbSbSbSbSbSbSbShZaUbdaZbfbfaWbdaeavbgbhbibjbnbkaCbmapaqarasatauavddeBeCeDeHdiblbmapaqarasatauavawaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbWbWbWbWbWbWbWbWbWbrdMdMdMeFdMdMdMdMeFdMbreedfdedededededldNcjbrcncrcleJeKeKdkeKeKeLbrdRdTdRdSdTdRdTcXdSfabrctcscucVcWcWcWcWcWdabrcBcAcCeqcNcNfhcycAcBbB -amaUaZbcaXbeaSaWcEbSbSbSbSbSbSbSbSbSbSbSbSbSigaXaTaVaRaRaSaTahbnbkblbmapaqaraHatauavbgbhbibjbneGdncScDeBdzasatauavbgbhbibjbnaBaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbWbWbWbWbWbWbWbWbWbrdMdMdMdMdMdMdMdMdMdMbreececacacacacackdNcjbrcncrcleXeYeYeYeYeYeZbrdUfafbfbfcdTfafbfbflbrctcscucRcPcPcPcPcPcQbrcBcAcCeqcNcNfhcycAcBbB -adaXaVbfaWbbaZaScqbSbSbSbSbSbSbSbSbSbSbSbSbSbUaWbcbeaUaUaZbcagarasatauavbgbhaybjbnbkblbmapaqardHdddIcGcHcIbibjbnbkblbmapaqaraHaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbWbWbXbWbWbWbWbXbWbrdMdMdMdMecdMeTdMdMecbrdNcecacacacacackdNcjbrcncrclfiehehehehehfkbrfaflfmfmfnfbflfmfmfmbrctcscufoeoeoeoeoeofpbrcBcAcCerfDfDcvcycAcBbB -alaWbeaRaSaYaVaZczbSbSbSbSbSbSbSbSbSbSbSbSbSdYaSbfbbaXaXaVbfacbibjbnbkblbmapaFarasatauavbgbhbibjbnbkblbmapaqarasatauavbgbhbiazaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbWbWbWbWbWbWbWbWbWbrfqdMdMdMdMfqdMdMdMdMbrdNcecacacacacackdNcjbrcncneufiehfrfrfrehfkbrflfmfmfmfmfmfmfmfmfmbrctctesfoeoeoeoeoeofpbrcBcBcBeaeaeaemcBcBcBbB -aoaSbbaUaZbabeaVcTbSbSbSbSbSbSbSbSbSbSbSbSbSidaZaRaYaWaWbeaRaiatauavbgbhbibjaAbkblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasataJaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbXbWbWbWbWbXbWbWbWbrdMeFdMeTdMdMeFdMeTdMbrdNdKdJdJdJdJdJdLdNcjbrcncrclfiehfiehfkehfkbrfmfmfmfmfmfmfmfmfmfmbrctcscufoeoeoeoeoeofpbrcBcBcBcAcAcAcBcBcBcBbB -abaZaYaXaVbdbbbefsbSbSbSbSbSbSbSbSbSbSbSbSbSiuaVaUbaaSaSbbaUafbmapaqarasatauaKbgbhbibjbnbkblbmapaqarasatauavbgbhbibjbnbkblbmaEaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbobWbWbWbWbWbWbWbWbWbWbrdMdMdMdMfqdMdMdMdMfqbrdNdNdNdNdNdNdNdNdNcjbrcncrclfwfrfwfxfyfrfybrfmfmfmfmfmfmfmfmfmfmbrctcscufzfAfAfAfAfAfBbrcBcBcBcBcBcBcBcBdFdFbB -aeaVbaaWbeaTaYbbccbSbSbSbSbSbSbSbSbSbSbSbSbSiLbeaXbdaZaZaYaXanbkblbmapaqarasaIauavbgbhbibjbnbkblbmapaqarasatauavbgbhbibjbnbkaCaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfGfHfHfHfHfHfHfHfHfHfHfIfHfHfHfHfHfHfHfHfHfHfIfHfHfHfHfHfHfHfHfHfHfIfHfHfHfHfHfHfHfHfHfHfIfHfHfHfHfHfHfHfHfHfHfIfHfHfHfHfHfHfHfHfHfHfIfHfHfHfHfHfHfHfHfHfHfJ +aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoalahajeEapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwtwtwtwtwtwtwtwtwtwtwtwtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMdCaNaNaNaNaNaNaNaNaNaNdCaNaNaNaNaNaNaNaNaNaNdCaNaNaNaNaNaNaNaNaNaNdCaNaNaNaNaNaNaNaNaNaNdCaNaNaNaNaNaNaNaNaNaNdCaNaNaNaNaNaNaNaNaNaNdCaNaNaNaNaNaNaNaNaNaNdC +ajaRaSaTaUaVaWaXaYaZbabbbcbdbebfaWaVbaaSaTaXbbaUbdaZbfbcaXbaabatauavbgbhbibjaAbkblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasataJaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwaPaOtwaPaQtwaPbotwaPaOtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbpbpbCbpbpbpbpbpbpbrbsbtbsbtbsbsbtbsbtbsbrbubwbwbwbwbwbwbwbwbwbrbybxbzbzbzbzbzbzbzbzbrbAbAbAbAbAbAbAbAbAbAbrbBbBbBbBbBbBbBbBbBbBbrbGbIbHbKbJbJbJbJbJbNbM +amaUaZbcaXbeaSaWbaaVbdaYbfaTbbaRaSbebdaZbcaWaYaXaTaVaRbfaWbdaeaqarasatauavbgaxbibjbnbkblbmapaqararasataubgbhbibjbnbkblbmapaqaGaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwbQbotwbQaOtwbQaOtwbQaOtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbpbpbpbpbpbpbpbvbpbrbEbFbEbFbEbFbEbFbEbFbrbRbRbRbRbRbRbRbRbRbRbrbybVbYbYbYbYbYbYbYbYbrbAbZbAbAbAbAbAbAbZbAbrbBbBbBbBbBbBbBbBbBbBbrbGbIbHcbcacacacacacebM +adaXaVbfaWbbaZaSbdaSaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeaUaRaSaTahbgbhbibjbnbkblaDapaqarasatauavbgbhavbgbhbiblbmapaqarasatauavbgaxaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwtwtwtwtwtwtwtwtwtwtwtwtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbvbpbpbpbpbpbpbpbpbrbFbEckcjclcjclcmbFbEbrbRbRbRbRbRbRbRbRbRbRbrbycnbYbzcobzbYcpcscrbrbAbAbAbAbAbAbAbAbAbAbrbBbBbBbBbBbBbBbBbBbBbrbGbGctcbcacacacacacebM +alaWbeaRaSaYaVaZaTaZbcbdaUbfbaaXaVaYbcbeaRaZbdaSbfbbaXaUaZbcagblbmapaqarasataJavbgbhbibjbnbkblbmasatauavatauavbgbhbibjbnbkblaDaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwaPaOtwaPaOtwcuaOtwaPbotwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbpbpbpbpbCbpbpbpbpbrcjclcycvcAcAcCcBbEbFbrcLcLcLcLcLcLcLcLcLcMbrbycncPcNcRcQcWcVdedabrbAbAbAbZbAbAbZbAbAbAbrbBbBbBbBbBbBbBbBbBbBbrbGbIbHcbcacacacacacebM +aoaSbbaUaZbabeaVbcaVbfcxfKcccqiZjgbUiLhZaUaVaTaZaRaYaWaXaVbfacbgbhbibjbnbkblaDapaqarasatauavbgbhbibjbnbkblbmapaqarasatauavbgaxaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwbQaOvhbQaOtwbQaOtwbQaOtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbpbCbpbpbpbCbpbpbpbrcCcCcCcCdfdfcCdkbFbEbrdldldmdododododpdldqbrbycndvdrdrdrdAcVdDdBbrbAbAbAbAbAbAbAbAbAbAbrbBbBbBbBbBbBbBbBbBbBbrbGbIbHcbcacacacacacebM +abaZaYaXaVbdbbbebfbecqcEbSbSbSbSbSbSbSiLbUaUbcaVaUbaaSaWbeaRaiarasatauavbgbhaybjbnbkblbmapaqarasapaqarasbhbibjbnbkblbmapaqaraHaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtwtwtwtwtwtwtwtwtwtwtwtwtwaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbpbpbpbpbpbpbpbpbpbrcCcCcCcCdfdfcCdkbFbEbrdldldEdFdFdFdFdJdldqbrbycndLdKdMdKdNcVdDdBbrbAbAbAbAbAbAbAbAbAbAbrbBbBbBbBbBbBbBbBbBbBbrbGbIbHdOcacacacacadPbM +aeaVbaaWbeaTaYbbaRebczbSbSbSbSbSbSbSbSbSjgLDbfbeaXbdaZaSbbaUafbnbkblbmapaqaraHatauavbgbhbibjbnbiavaraqbhauasatauavbgbhbibjbnaBaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbpbpbpbpbvbpbpbpbCbrdVdQdWcvcAcAcCcBbEbFbrdldldEdFdFdFdFdJdldqbrbycndZdXdMdXeacVdDdBbrbAbAbAbZbAbAbZbAbAbAbrbBbBbBbBbBbBbBbBbBbBbrbGbIbHdOcacacacacadPbM +ahbebdaSbbbcbaaYaUcxbSbSbSbSbSbSbSbSbSbSbSiyaRbbaWaTaVaZaYaXanbmapaqarasatauaKbgbhbibjbnbkblbmcFcGcHcIcJcKavbgbhbibjbnbkblbmaEaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbpbvbpbpbpbpbpbpbpbrbFbEecdVdQdVdQedbFbEbrdldldEdFdFdFdFdJdldqbrbyeeefdMdMdMegcVdDdBbrbAbAbAbAbAbAbAbAbAbAbrbBbBbBbBbBbBbBbBbBbBbrbGbGehdOcacacacacadPbM +agbbaTaZaYbfbdbaaXcEbSbSbSbSbSbSbSbSbSbSbShZaUaYaSbcbeaVbaaWakbibjbnbkblbmapaFarasatauavbgbhbicKcUKFLPEncYaqarasatauavbgbhbiazaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbpbpbpbpbpbpbpbpbpbpbrbEbFbEbFbEbFbEbFbFbEbrdldleiememememendldqbrbycndZdXdXdXeacVepeobrbAbZbAbAbAbAbAbAbZbAbrbBbBbBbBbBbBbBbBbBbBbrbGbIbHdOcacacacacadPbM +acaYbcaVbaaRaTbdaWcqbSbSbSbSbSbSbSbSbSbSbSigaXbaaZbfbbbebdaSaaasatauavbgbhbiazbnbkblbmapaqarasddLSLTdgdhdibhbnbkblbmapaqarasaIaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbCbpbpbpbvbpbpbpbpbvbrbsbtbsbtbsbsbtbsbtbsbreqdldldldldldldldlerbrbybxeteseseseucVbzbzbrbAbAbAbAbAbAbAbAbAbAbrbBbBbBbBbBbBbBbBbBbBbrbGbIbHeFeveveveveveJbM +aibabfbebdaUbcaTaSczbSbSbSbSbSbSbSbSbSbSbSbUaWbdaVaRaYbbaTaZajbhbibjbnbkblbmaEaqarasatauavbgbheGdwdxdyLSdzapaqarasatauavbgbhayaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMdCeKeKeKeKeKeKeKeKeKeKdCeKeKeKeKeKeKeKeKeKeKdCeKeKeKeKeKeKeKeKeKeKdCeLeLeLeLeLeLeLeLeLeLdCeLeLeLeLeLeLeLeLeLeLdCeLeLeLeLeLeLeLeLeLeLdCeLeLeLeLeLeLeLeLeLeLdC +afbdaRbbaTaXbfbcaZcTbSbSbSbSbSbSbSbSbSbSbSdYaSaTbeaUbaaYbcaVamaqarasatauavbgaxbibjbnbkblbmapaqdHdddIcGcHcIbhbibjbnbkblbmapaqaGaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbWbWbWbWbWbWbWbrePePePePePePePePePePbreQeQeQeQeQeQeQeQeQeRbreTeSeVeUeWeUeYeXeWeXbrdRdSdTdRdUdRdSdTdRdUbrfdeZfffefgfgfgfgfgfhbrfififjfjfjfjfjfjfjfjbM +anaTaUaYbcaWaRbfdGfsbSbSbSbSbSbSbSbSbSbSbSidiKbcbbaXbdbabfbeadauavbgbhbibjbnaBblbmapaqarasatauarbibjbnbkbgbkblbmapaqarasatauaKaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbXbWbWbWbWbXbWbrePfkePePePePfkePePePbreQeQfofpfpfpfqeQeQeQbreTeSeVfrftfrftfuftfubrdUekejdUdRdUdRekekdRbrfdeZfffvfwfwfwfwfwfxbrfjfjfjfjfyfyfyfjfjfjbM +akbcaXbabfaSaUaRebbSbSbSbSbSbSbSbSbSbSbSbSbSiebfaYaWaRaTaUaYaobjbnbkblbmapaqaGasatauavbgbhbibjcFcGcHcIcJcKarasatauavbgbhbibjaAaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbWbWbWbWbWbWbWbrePePePePePePePePfzePbreQeQfAfAfAfAfAeQeQeQbreTeTfBfrfteWeWeWftfubrdRdUdRdSdRdReweldSdRbrfdfdfCfvfwfwfwfwfwfxbrfjfjfjfEfDfDfDfjfjfjbM +aabfaWbdaRaZaXaUdcbSbSbSbSbSbSbSbSbSbSbSbSbSjgaRbaaSbcbcaXbaabbkblbmapaqarasaIauavbgbhbibjbnbkcKexeyezeAcYatauavbgbhbibjbnbkaCaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbXbWbWbWbWbXbWbWbWbrePePfGePfzePePePePePbrfHfHfHfHfHfHfHfHfHfIbreTeSeVfrftftftftftfubrdSdRdUekdsdSdRdUekdUbrfdeZfffvfwfwfwfwfwfxbrfjfyfJgbfVfVgcgefyfjbM +ajaRaSaTaUaVaWaXcxbSbSbSbSbSbSbSbSbSbSbSbSbShZaUbdaZbfbfaWbdaeavbgbhbibjbnbkaCbmapaqarasatauavddeBeCeDeHdiblbmapaqarasatauavawaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbWbWbWbWbWbWbWbrePePePgBePePePePgBePbrgCgEgDgDgDgDgDgFfHfIbreTeSeVgGgHgHgPgHgHgXbrdRdTdRdSdTdRdTcXdSfabrfdeZffgYhihihihihihwbrfjfyfJhBhxhFhEgefyfjbM +amaUaZbcaXbeaSaWcEbSbSbSbSbSbSbSbSbSbSbSbSbSigaXaTaVaRaRaSaTahbnbkblbmapaqaraHatauavbgbhbibjbneGdncScDeBdzasatauavbgbhbibjbnaBaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbWbWbWbWbWbWbWbrePePePePePePePePePePbrgChHhGhGhGhGhGhJfHfIbreTeSeVhKhNhNhNhNhNhObrdUfafbfbfcdTfafbfbflbrfdeZffhQhVhVhVhVhVhWbrfjfyfJhBijiEhEgefyfjbM +adaXaVbfaWbbaZaScqbSbSbSbSbSbSbSbSbSbSbSbSbSbUaWbcbeaUaUaZbcagarasatauavbgbhaybjbnbkblbmapaqardHdddIcGcHcIbibjbnbkblbmapaqaraHaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbXbWbWbWbWbXbWbrePePePePfkePfGePePfkbrfHhHhGhGhGhGhGhJfHfIbreTeSeViGftftftftftiQbrfaflfmfmfnfbflfmfmfmbrfdeZffjnfwfwfwfwfwjybrfjfyfJgcjBjBjRgefyfjbM +alaWbeaRaSaYaVaZczbSbSbSbSbSbSbSbSbSbSbSbSbSdYaSbfbbaXaXaVbfacbibjbnbkblbmapaFarasatauavbgbhbibjbnbkblbmapaqarasatauavbgbhbiazaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbWbWbWbWbWbWbWbrkaePePePePkaePePePePbrfHhHhGhGhGhGhGhJfHfIbreTeTkbiGftkdkdkdftiQbrflfmfmfmfmfmfmfmfmfmbrfdfdkejnfwfwfwfwfwjybrfjfjfjkfkfkfkjfjfjfjbM +aoaSbbaUaZbabeaVcTbSbSbSbSbSbSbSbSbSbSbSbSbSidaZaRaYaWaWbeaRaiatauavbgbhbibjaAbkblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasataJaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbXbWbWbWbWbXbWbWbWbrePgBePfGePePgBePfGePbrfHkqkokokokokokrfHfIbreTeSeViGftiGftiQftiQbrfmfmfmfmfmfmfmfmfmfmbrfdeZffjnfwfwfwfwfwjybrfjfjfjfyfyfyfjfjfjfjbM +abaZaYaXaVbdbbbefsbSbSbSbSbSbSbSbSbSbSbSbSbSiuaVaUbaaSaSbbaUafbmapaqarasatauaKbgbhbibjbnbkblbmapaqarasatauavbgbhbibjbnbkblbmaEaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMbqbWbWbWbWbWbWbWbWbWbWbrePePePePkaePePePePkabrfHfHfHfHfHfHfHfHfHfIbreTeSeVktkdktkwkvkdkvbrfmfmfmfmfmfmfmfmfmfmbrfdeZffkAkBkBkBkBkBkKbrfjfjfjfjfjfjfjfjkNkNbM +aeaVbaaWbeaTaYbbccbSbSbSbSbSbSbSbSbSbSbSbSbSiLbeaXbdaZaZaYaXanbkblbmapaqarasaIauavbgbhbibjbnbkblbmapaqarasatauavbgbhbibjbnbkaCaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMdCkOkOkOkOkOkOkOkOkOkOdCkOkOkOkOkOkOkOkOkOkOdCkOkOkOkOkOkOkOkOkOkOdCkOkOkOkOkOkOkOkOkOkOdCkOkOkOkOkOkOkOkOkOkOdCkOkOkOkOkOkOkOkOkOkOdCkOkOkOkOkOkOkOkOkOkOdC ahbebdaSbbbcbaaYfFbSbSbSbSbSbSbSbSbSbSbSbSbSipbbaWaTaVaTaUaYeEauavbgbhbibjbnaBblbmapaqarasatauavbgbhbibjbnbkblbmapaqarasatauaKaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM agbbaTaZaYbfbdbafKbSbSbSbSbSbSbSbSbSbSbSbSbSiyaYaSbcbeaTaUaYaobhbibjbnbkblbmaEaqarasatauavbgbhbibjbnbkblbmapaqarasatauavbgbhayaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM acaYbcaVbaaRaTbdcObSbSbSbSbSbSbSbSbSbSbSbSbSiPbaaZbfbbbcaXbaabasatauavbgbhbiazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaGaHaIaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2124,36 +1993,36 @@ akbcaXbabfaSaUaRbeaWbbiedYeIeMeOeNEmhZiPbaaRaVbfaYaWaTaXaVbfacaXamaUaZbcaXbeaSaW aabfaWbdaRaZaXaUbbaSaYbeidbUieiuiPiKigaWbdaUbeaRbaaSbcaWbeaRaiaWadaXaVbfaWbbaZaSbdbeaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeahaWbdaLfLbeaXbdbebeaXbdbeaXbdbeaXbdbeaXbdbebeaXbdbeaXbdbeaXbdbeaXbdbeaXbdbebeaXaMfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM ajaRaSaTaUaVaWaXaYaZbabbbcbdbebfaWaVbaaSaTaXbbaUbdaZbfaSbbaUafaSalaWbeaRaSaYaVaZaTbbbcbdaUbfbaaXaVaYbcbeaRaZbdaSbfbbagaSaTaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfMfNfNfNfNfNfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM amaUaZbcaXbeaSaWbaaVbdaYbfaTbbaRaSbebdaZbcaWaYaXaTaVaRaZaYaXanaZaoaSbbaUaZbabeaVbcaYbfaTaXaRbdaWbebabfbbaUaVaTaZaRaYacaZbcaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfPfQfRfSfTfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -adaXaVbfaWbbaZaSbdbeaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeaUaVbaaWakaVabaZaYaXaVbdbbbebfbaaRbcaWaUaTaSbbbdaRaYaXbebcaVaUbaaiaVbfaLfLbfbabaaZbfbaaZbfbaaZbfbaaZbfbaaZbfbfbabaaZbfbaaZbfbaaZbfbaaZbfbaaZbfaTbafLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUfVfVfVfUfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -alaWbeaRaSaYaVaZaTbbbcbdaUbfbaaXaVaYbcbeaRaZbdaSbfbbaXbebdaSaabeaeaVbaaWbeaTaYbbaRfWcfdbfXfYfZcwdtcgaUbaaWbbbfbeaXbdafbeaRaLfLaRbdbdaVaRbdaVaRbdaVaRbdaVaRbdaVaRaRbdbdaVaRbdaVaRbdaVaRbdaVaRbdaVaRbdbdfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgagagafUfOgbgcfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +adaXaVbfaWbbaZaSbdbeaTbaaRbcaYaUaZbbaTaVbfaSbaaWbcbeaUaVbaaWakaVabaZaYaXaVbdbbbebfbaaRbcaWaUaTaSbbbdaRaYaXbebcaVaUbaaiaVbfaLfLbfbabaaZbfbaaZbfbaaZbfbaaZbfbaaZbfbfbabaaZbfbaaZbfbaaZbfbaaZbfbaaZbfaTbafLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUkPkPkPfUfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +alaWbeaRaSaYaVaZaTbbbcbdaUbfbaaXaVaYbcbeaRaZbdaSbfbbaXbebdaSaabeaeaVbaaWbeaTaYbbaRfWcfdbfXfYfZcwdtcgaUbaaWbbbfbeaXbdafbeaRaLfLaRbdbdaVaRbdaVaRbdaVaRbdaVaRbdaVaRaRbdbdaVaRbdaVaRbdaVaRbdaVaRbdaVaRbdbdfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgagagafUfOkYkRfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aoaSbbaUaZbabeaVbcaYbfaTaXaRbdaWbebabfbbaUaVaTaZaRaYaWbbaTaZajbbahbebdaSbbbcbaaYgdLVgfggghgigjgkglfZgmbdaSaYaRbbaWaTanbbaUaLfLaUaTaTbeaUaTbeaUaTbeaUaTbeaUaTbeaUaUaTaTbeaUaTbeaUaTbeaUaTbeaUaTbeaUaTaTfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -abaZaYaXaVbdbbbebfbaaRbcaWaUaTaSbbbdaRaYaXbebcaVaUbaaSaYbcaVamaYagbbaTaZaYbfbdbagmgigqghglgrgsgtgugvgwaTaZbaaUaYaSbcakaYaXaLfLaXbcbcbbaXaZgQgQgQgQgQgQaZgQgQgQaZaZaZgQgQgQaZgQgQgxgygmgxbbaXbcbbaXbcbcfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUgzgAgBgCgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aeanamacakalajaaaeadahabaiagaoafajalahamacaaabakagadafamabakMAbaacaYbcaVbaaRaTbdgwgtgugkgIgfglghgjgJgKbcaVbdaXbaaZbfaabaaWaLfLaWbfbfaYaWaZgQhdgQgQhdgQaZgQhdgQgQgQgQgQhdgQaZgQhdjQjQjPjQaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUgPgAgEgEgDgEgAgEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -ahbdaSaYaRbbaWaTbbbdaSaYaRbbaWaTbbaWaTbdaSaYaRbbaWaTanaMaMaMaMbdaibabfbebdaUbcaTgKghgjgvgqgigIgkgggsgQbfbeaTaWbdaVaRajbdaSaLfLaSaRaRbaaSaZgQhdhdhdhdgQgQgQhdhdhdhphkhkhjgQgQgQhphkhkhjjQbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogogVgXgYgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -agaTaZbaaUaYaSbcaYaTaZbaaUaYaSbcaYaSbcaTaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbaTaXbfbcgQgkgggJgugtgqgvgrglgZaRbbbcaSaTbeaUamaTaZaLfLaZaUaUbdaZaZgQhdhdhdhdgQgQhdhdhdhdhthrhrhqhdgQgQhthrhrhqjQbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogogVgXgYgEgEgEgEhigEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -acbcaVbdaXbaaZbfbabcaVbdaXbaaZbfbaaZbfbcaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYbcaWaRbfgZgvgrgsgjghgugJgfgIhhaUaYbfaZbcbbaXadbcbeaLfLaVaXaXaTaVaZgQhdhdhdhdgQgQhdhdhdhdhIgTgTgMhdgQgQhIgTgTgMjQaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUhmgohnfUgPgAgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aibfbeaTaWbdaVaRbdbfbeaTaWbdaVaRbdaVaRbfbeaTaWbdaVaRajaMaMaMaMbfakbcaXbabfaSaUaRhhhogfglgggkgjgsgicggyaXbaaRaVbfaYaWalbfbbaLfLbeaWaWbcbeaZgQhdhdhphkhkhjhdhdhdhdhdgUcZhdhdhdhdhdgUcZhdjQbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNhsfUhvfUhugzgAgEgEgDgEgAgEgHgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -afaRbbbcaSaTbeaUaTaRbbbcaSaTbeaUaTbeaUaRbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdaRaZaXaUhodtgrgvgrgvgggrgvfZgOaWbdaUbeaRbaaSaoaRaYaLfLbbaSaSbfbbaZgQhdhdhthrhrhqhdhdhdhdhphcgNhphdhdhdhphcgNhpjQbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNbDhshwhubDgzgAgEgEgDgEgAgFgGgHgHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhxhyhzhAhBhfhfhfaMhghghghxhyhzhAhBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -anaUaYbfaZbcbbaXbcaUaYbfaZbcbbaXbcbbaXaUaYbfaZbcbbaXadaMaMaMaMaUajaRaSaTaXicfXhChDgrgigsgigsgfgigsgkfZfZgxhCaYaUbdaZabaUbaaLfLaZaRaYaZaYaZgQhdhdhIgTgTgMhdhdhdhdhthkhahthdhdhphthkhahtjQaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEhFhFhFhGhHhJhHhHhHhQhHhKhFhFhFhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -akaXbaaRaVbfaYaWbfaXbaaRaVbfaYaWbfaYaWaXbaaRaVbfaYaWalaMaMaMaMaXamaUaZbcaWgygkgtgIgigsgjgrgvgigugvgrgqgkgkfXbaaXaTaVaeaXbdaLfLaVaUbaaVbaaZgQhphkhkhjcZhdhdhdhdhdhdhdhdhdhdhdhthrhrhqjPjQaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEhLhMhNhOhPhShRhUhTikhPhVhWhXhYhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aaaWbdaUbbaSaYbeaTaUhZiaibicidbaiecdifcwigaUbeaRbaaSaoaMaMaMaMaWadaXaVbfaSgOgkghgqgugvgggigsgtgjgkgfgugvggcwbdaWbcbeahaWaTaLfLbeaXbdbebdaZgQhthrhrhqgNhphphkhkhjhkhkhjhdhdhdhIgTgTgMjPjQaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEiiiiijioilimilinilimiliFijiiiihEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -ajbaaTaXaRbdaUbfaSaXipiqirisitaXiuiviwixiyaXbbaUbdaZabaMaMaMaMaSalaWbeaRaZgSgvgkgugjgJgrgkgqghgggsgigjgJgrizaTaSbfbbagaSbcaLfLbeaXbdbebdgQgQhIgTgTgMhahththrhrhqhrhrhqhdhdhdhdgUcZhdjPjQgmbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhWiijbimimimimimimimimimjbiihNiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -ambdbcaWaUaTaXaRaZaWiyiHiIiJiKaWiLiMiNiOiPaWaYaXaTaVaeaMaMaMaMaZaoaSbbaUaVLUgJgvgjgggsgfgvgugkgrglgtgggsgficbcaZaRaYacaZbfaLfLbeaXbdbebdgQhdhdgUcZhdhdhdhIgTgTgMgTgTgMhdhdhdhphcgNhpjPjPgmbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhHhKiRilimiliSiSilimiThGhHiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -adaTbfaSaXbcaWaUaVaSiPiUiVirieaSipiWiXiYiZaSbaaWbcbeahaMaMaMaMaVabaZaYaXbecggsgJgggrglgigJgjgvgfgIghgrglgihobfaVaUbaaibeaRaLfLbbaWaTbbaTgQhdhphcgNhphphkhkhjcZhdgUcZhdhdhdhdhthkhahtjPjPgwaTbbaWaTaMbbfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEjkinimjcjkjkjdimjehEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -albcaRaZaWbfaSaXbeaZiZisjfiIjgaZiyjhixjiitaZbdaSbfbbagaMaMaMaMbeaeaVbaaWbbfZglgsgrgfgIgtgsgggJgigqgkgfgIgtdtaRbeaXbdafaMaUaLfLbfbabaaZbfgQgQhthkhahththrhrhqgNhphcgNhphdhdhdhdhdjPjPjPjQgQbfbaaZbfaTbafLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjhEjmilimjcjkjkjdimhPhEjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aobfaUaVaSaRaZaWbbaVitipiKiZhZaViPigiuiyiKaVaTaZaRaYacaMaMaMaMbbahbebdaSgOdbgIglgfgigqghglgrgsgtgugvgigqghhDgdbbaWaTanbbaXaLfLaRbdbdaVaRaZgQgQgQgQgQhIgTgTgMhahthkhahthdhdhdhdgQjQjQjQjQaVaRbdaVaRbdbdfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjjnjpimimiljojoilimjujqjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -abaRaXbebcaVaUbaaVaRaXbebcaVaUbaaVaUbaaRaXbebcaVaUbaaiaMaMaMaMaYagbbaTaZgSgggqgIgigtgugkgIgfglghgjgJgtgugkgIgmaYaSbcakaYaWaLfLaUaTaTbeaUaZaZaZaZaZgQhdgUcZhdhdhdhdhdhdhdhdhdhdgQaMaMaMaMbeaUaTbeaUaTaTfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjhEhPjsimimimimimimilhEjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aebaaWbbbfbeaXbdbebaaWbbbfbeaXbdbeaXbdbaaWbbbfbeaXbdafaMaMaMaMbaacaYbcaVhbgrgugqgtghgjgvgqgigIgkgggsghgjgvgqgwbaaZbfaabaaSaLfLaXbcbcbbaXaZaZaZaZaZgQhphcgNhphdhdhdhdhdhdhdhdhdgQaMaMaMaMbbaXbcbbaXbcbcfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhGhHhHhHjyimilimimjzhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -ahaSaSaYaRbbaWaTbbaSaSaYaRbbaWaTbbaWaTaSaSaYaRbbaWaTanaMaMaMaMbdaibabfbehlgfgjgughgkgggJgugtgqgvgrglgkgggJgugKbdaVaRajbdaZaLfLaWbfbfaYaWaZaZaZaZaZgQhthkhahthdhdhdhdhdhdhdhdhdgQaMaMaMaMaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEjJjJjKjLimilimimiljMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -agaZaZbaaUaYaSbcaYaZaZbaaUaYaSbcaYaSbcaZaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbgxgigggjgkgvgrgsgjghgugJgfgIgvgrgsgjgQaTbeaUamaTbeaLfLaSaRaRbaaSaZaZaZaZaZgQgQgQhdhdhdhdhdhdhdhdhdgQgQgQaMaMaMaMbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjTjUjUjUjVimjWjXjYjXhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -acaVaVbdaXbaaZbfbaaVaVbdaXbaaZbfbaaZbfaVaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYgLgtgrgggvgigJgkgIgsghgqgrgtgJgfglgggZbcbbaXadbcbbaLfLaZaUaUbdaZaUaMaMaMaMaMaMjQjQjPjPjPjPjPjPjPjQjQaMaMaMaMaMaMbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkikjjUkhimklkmknkohEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aibebeaTaWbdaVaRbdbebeaTaWbdaVaRbdaVaRbebeaTaWbdaVaRajaMaMaMaMbfakbcaXbagRghgfgrgJgtgsgvgqglgkgugfghgsgigIgrhhbfaYaWalbfaYaLfLaVaXaXaTaVaXaTaVaXaTaVaXaTgZgmhlgZgZgmgmhlgZaXaTaVaXaTaVaXaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkujUjUjLimjXkykykzhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -afbbbbbcaSaTbeaUaTbbbbbcaSaTbeaUaTbeaUbbbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdfFgkgigfgsghglgJgugIgvgjgigkglgtgqgfdcaRbaaSaoaRbaaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkikjjUjVimkFkykykIhEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -analahajaoacaeabanagakafamaafLfLfLfLfLahajabafaoaaagadaMaMaMaMaUajaRaSaTfYgvgtgiglgkgIgsgjgqgJgggtgvgIghgugidtaUbdaZabaUbdaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEkNkNhHkOkMhHhHkNkNiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -bebcaXbabfaSaUaRbeaWbbaVbdaYaZaTaUaSbbaXbaaRaVbfaYaWaTaMaMaMaMaXamaUaZbchCgJghgtgIgvcgglgggugsgrcwgJgqgkgjgthDaXaTbeaeaXaTaLfLaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiEhKkVjdimkWkXhGiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -bbaWbdaUbeaRaUbeaRaWbdaUbeaRaWbdaUbeaRaWbdaUbeaRbaaSbcaMaMaMaMaWadaXaVbffXgsgkghgqgJfZgIgrgjglgfizgsgugvggghfWaWbcbeahaWbcaLfLaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhEkSiliSillchEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aYaSaTaXbbaUaXbbaUaSaTaXbbaUaSaTaXbbaUaSaTaXbbaUbdaZbfaMaMaMaMaSalaWbeaRcwglgvgkgugsdbcgfYldfWhCicglgjgJgrgkcgaSbfbbagaSbfaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhElmlllnlolphEaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -baaZbcaWaYaXaWaYaXaZbcaWaYaXaZbcaWaYaXaZbcaWaYaXaTaVaRaMaMaMaMaZaoaSbbaUizfWhoicdbhDldbcaWaUaTaShofWlddtfYicfZaZaRaYacaZaRaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMiElzlAlAlAlBiGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +abaZaYaXaVbdbbbebfbaaRbcaWaUaTaSbbbdaRaYaXbebcaVaUbaaSaYbcaVamaYagbbaTaZaYbfbdbagmgigqghglgrgsgtgugvgwaTaZbaaUaYaSbcakaYaXaLfLaXbcbcbbaXaZgQgQgQgQgQgQaZgQgQgQaZaZaZgQgQgQaZgQgQgxgygmgxbbaXbcbbaXbcbcfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUgzgAkZlelblfgAmvmrmHmHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aeanamacakalajaaaeadahabaiagaoafajalahamacaaabakagadafamabakMAbaacaYbcaVbaaRaTbdgwgtgugkgIgfglghgjgJgKbcaVbdaXbaaZbfaabaaWaLfLaWbfbfaYaWaZgQhdgQgQhdgQaZgQhdgQgQgQgQgQhdgQaZgQhdjQjQjPjQaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgngogpfUmQgAlflflblfgAlfmHmHmHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +ahbdaSaYaRbbaWaTbbbdaSaYaRbbaWaTbbaWaTbdaSaYaRbbaWaTanaMaMaMaMbdaibabfbebdaUbcaTgKghgjgvgqgigIgkgggsgQbfbeaTaWbdaVaRajbdaSaLfLaSaRaRbaaSaZgQhdhdhdhdgQgQgQhdhdhdhphkhkhjgQgQgQhphkhkhjjQbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogogVlfmRlflflblfgAmvmrmHmHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +agaTaZbaaUaYaSbcaYaTaZbaaUaYaSbcaYaSbcaTaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbaTaXbfbcgQgkgggJgugtgqgvgrglgZaRbbbcaSaTbeaUamaTaZaLfLaZaUaUbdaZaZgQhdhdhdhdgQgQhdhdhdhdhthrhrhqhdgQgQhthrhrhqjQbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUgogogogVlfmRlflflflfmSlfmHmHmHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +acbcaVbdaXbaaZbfbabcaVbdaXbaaZbfbaaZbfbcaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYbcaWaRbfgZgvgrgsgjghgugJgfgIhhaUaYbfaZbcbbaXadbcbeaLfLaVaXaXaTaVaZgQhdhdhdhdgQgQhdhdhdhdhIgTgTgMhdgQgQhIgTgTgMjQaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNfUhmgohnfUmQgAlflflblfgAmvmrmHmHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aibfbeaTaWbdaVaRbdbfbeaTaWbdaVaRbdaVaRbfbeaTaWbdaVaRajaMaMaMaMbfakbcaXbabfaSaUaRhhhogfglgggkgjgsgicggyaXbaaRaVbfaYaWalbfbbaLfLbeaWaWbcbeaZgQhdhdhphkhkhjhdhdhdhdhdgUcZhdhdhdhdhdgUcZhdjQbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNhsfUhvfUhugzgAlflflblfgAlfmHmHmHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhfhfhfaMhghghgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +afaRbbbcaSaTbeaUaTaRbbbcaSaTbeaUaTbeaUaRbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdaRaZaXaUhodtgrgvgrgvgggrgvfZgOaWbdaUbeaRbaaSaoaRaYaLfLbbaSaSbfbbaZgQhdhdhthrhrhqhdhdhdhdhphcgNhphdhdhdhphcgNhpjQbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfNbDhsmUhubDgzgAlflflblfgAmvmrmHmHfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmVhyhzhAmWhfhfhfaMhghghgmVhyhzhAmWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +anaUaYbfaZbcbbaXbcaUaYbfaZbcbbaXbcbbaXaUaYbfaZbcbbaXadaMaMaMaMaUajaRaSaTaXicfXhChDgrgigsgigsgfgigsgkfZfZgxhCaYaUbdaZabaUbaaLfLaZaRaYaZaYaZgQhdhdhIgTgTgMhdhdhdhdhthkhahthdhdhphthkhahtjQaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOfOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZmYmYmYnbnancnananandnanPmYmYmYmZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +akaXbaaRaVbfaYaWbfaXbaaRaVbfaYaWbfaYaWaXbaaRaVbfaYaWalaMaMaMaMaXamaUaZbcaWgygkgtgIgigsgjgrgvgigugvgrgqgkgkfXbaaXaTaVaeaXbdaLfLaVaUbaaVbaaZgQhphkhkhjcZhdhdhdhdhdhdhdhdhdhdhdhthrhrhqjPjQaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZhLhMnTnUhPhShRhUhTikhPohobhXhYmZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aaaWbdaUbbaSaYbeaTaUhZiaibicidbaiecdifcwigaUbeaRbaaSaoaMaMaMaMaWadaXaVbfaSgOgkghgqgugvgggigsgtgjgkgfgugvggcwbdaWbcbeahaWaTaLfLbeaXbdbebdaZgQhthrhrhqgNhphphkhkhjhkhkhjhdhdhdhIgTgTgMjPjQaXbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZiiiioiioilimilinilimiliFoiiiiimZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +ajbaaTaXaRbdaUbfaSaXipiqirisitaXiuiviwixiyaXbbaUbdaZabaMaMaMaMaSalaWbeaRaZgSgvgkgugjgJgrgkgqghgggsgigjgJgrizaTaSbfbbagaSbcaLfLbeaXbdbebdgQgQhIgTgTgMhahththrhrhqhrhrhqhdhdhdhdgUcZhdjPjQgmbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZiiiijbimimimimimimimimimjbiiiimZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +ambdbcaWaUaTaXaRaZaWiyiHiIiJiKaWiLiMiNiOiPaWaYaXaTaVaeaMaMaMaMaZaoaSbbaUaVLUgJgvgjgggsgfgvgugkgrglgtgggsgficbcaZaRaYacaZbfaLfLbeaXbdbebdgQhdhdgUcZhdhdhdhIgTgTgMgTgTgMhdhdhdhphcgNhpjPjPgmbdbeaXbdaMbefLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoknananPiRilimiliSiSilimiTnbnanaosaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +adaTbfaSaXbcaWaUaVaSiPiUiVirieaSipiWiXiYiZaSbaaWbcbeahaMaMaMaMaVabaZaYaXbecggsgJgggrglgigJgjgvgfgIghgrglgihobfaVaUbaaibeaRaLfLbbaWaTbbaTgQhdhphcgNhphphkhkhjcZhdgUcZhdhdhdhdhthkhahtjPjPgwaTbbaWaTaMbbfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZjkinimjcjkjkjdimjemZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +albcaRaZaWbfaSaXbeaZiZisjfiIjgaZiyjhixjiitaZbdaSbfbbagaMaMaMaMbeaeaVbaaWbbfZglgsgrgfgIgtgsgggJgigqgkgfgIgtdtaRbeaXbdafaMaUaLfLbfbabaaZbfgQgQhthkhahththrhrhqgNhphcgNhphdhdhdhdhdjPjPjPjQgQbfbaaZbfaTbafLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjmZjmilimjcjkjkjdimhPmZjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aobfaUaVaSaRaZaWbbaVitipiKiZhZaViPigiuiyiKaVaTaZaRaYacaMaMaMaMbbahbebdaSgOdbgIglgfgigqghglgrgsgtgugvgigqghhDgdbbaWaTanbbaXaLfLaRbdbdaVaRaZgQgQgQgQgQhIgTgTgMhahthkhahthdhdhdhdgQjQjQjQjQaVaRbdaVaRbdbdfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjoHjpimimiljojoilimjujqjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +abaRaXbebcaVaUbaaVaRaXbebcaVaUbaaVaUbaaRaXbebcaVaUbaaiaMaMaMaMaYagbbaTaZgSgggqgIgigtgugkgIgfglghgjgJgtgugkgIgmaYaSbcakaYaWaLfLaUaTaTbeaUaZaZaZaZaZgQhdgUcZhdhdhdhdhdhdhdhdhdhdgQaMaMaMaMbeaUaTbeaUaTaTfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjjjjjjjjmZhPjsimimimimimimilmZjljljljlaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aebaaWbbbfbeaXbdbebaaWbbbfbeaXbdbeaXbdbaaWbbbfbeaXbdafaMaMaMaMbaacaYbcaVhbgrgugqgtghgjgvgqgigIgkgggsghgjgvgqgwbaaZbfaabaaSaLfLaXbcbcbbaXaZaZaZaZaZgQhphcgNhphdhdhdhdhdhdhdhdhdgQaMaMaMaMbbaXbcbbaXbcbcfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnbnananaoPimilimimjzmZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +ahaSaSaYaRbbaWaTbbaSaSaYaRbbaWaTbbaWaTaSaSaYaRbbaWaTanaMaMaMaMbdaibabfbehlgfgjgughgkgggJgugtgqgvgrglgkgggJgugKbdaVaRajbdaZaLfLaWbfbfaYaWaZaZaZaZaZgQhthkhahthdhdhdhdhdhdhdhdhdgQaMaMaMaMaYaWbfaYaWbfbffLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZjJjJjKjLimilimimiljMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +agaZaZbaaUaYaSbcaYaZaZbaaUaYaSbcaYaSbcaZaZbaaUaYaSbcakaMaMaMaMaTafbdaRbbgxgigggjgkgvgrgsgjghgugJgfgIgvgrgsgjgQaTbeaUamaTbeaLfLaSaRaRbaaSaZaZaZaZaZgQgQgQhdhdhdhdhdhdhdhdhdgQgQgQaMaMaMaMbaaSaRbaaSaRaRfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjTjUjUjUjVimjWjXjYjXmZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +acaVaVbdaXbaaZbfbaaVaVbdaXbaaZbfbaaZbfaVaVbdaXbaaZbfaaaMaMaMaMbcanaTaUaYgLgtgrgggvgigJgkgIgsghgqgrgtgJgfglgggZbcbbaXadbcbbaLfLaZaUaUbdaZaUaMaMaMaMaMaMjQjQjPjPjPjPjPjPjPjQjQaMaMaMaMaMaMbdaZaUbdaZaUaUfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZkijUjUkhimklkmknoRmZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aibebeaTaWbdaVaRbdbebeaTaWbdaVaRbdaVaRbebeaTaWbdaVaRajaMaMaMaMbfakbcaXbagRghgfgrgJgtgsgvgqglgkgugfghgsgigIgrhhbfaYaWalbfaYaLfLaVaXaXaTaVaXaTaVaXaTaVaXaTgZgmhlgZgZgmgmhlgZaXaTaVaXaTaVaXaTaVaXaTaVaXaXfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZkujUjUjLimjXkykykzmZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +afbbbbbcaSaTbeaUaTbbbbbcaSaTbeaUaTbeaUbbbbbcaSaTbeaUamaMaMaMaMaRaabfaWbdfFgkgigfgsghglgJgugIgvgjgigkglgtgqgfdcaRbaaSaoaRbaaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZkijUjUjVimkFkykykImZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +analahajaoacaeabanagakafamaafLfLfLfLfLahajabafaoaaagadaMaMaMaMaUajaRaSaTfYgvgtgiglgkgIgsgjgqgJgggtgvgIghgugidtaUbdaZabaUbdaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoUoVoVnapdkMnanaoVoVpgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +bebcaXbabfaSaUaRbeaWbbaVbdaYaZaTaUaSbbaXbaaRaVbfaYaWaTaMaMaMaMaXamaUaZbchCgJghgtgIgvcgglgggugsgrcwgJgqgkgjgthDaXaTbeaeaXaTaLfLaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoUnPkVjdimkWkXnbpgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +bbaWbdaUbeaRaUbeaRaWbdaUbeaRaWbdaUbeaRaWbdaUbeaRbaaSbcaMaMaMaMaWadaXaVbffXgsgkghgqgJfZgIgrgjglgfizgsgugvggghfWaWbcbeahaWbcaLfLaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZkSiliSillcmZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aYaSaTaXbbaUaXbbaUaSaTaXbbaUaSaTaXbbaUaSaTaXbbaUbdaZbfaMaMaMaMaSalaWbeaRcwglgvgkgugsdbcgfYldfWhCicglgjgJgrgkcgaSbfbbagaSbfaLfLbeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbebeaWaWbcbeaWbcbeaWbcbeaWbcbeaWbcbeaWaWfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZlmlllnlolpmZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +baaZbcaWaYaXaWaYaXaZbcaWaYaXaZbcaWaYaXaZbcaWaYaXaTaVaRaMaMaMaMaZaoaSbbaUizfWhoicdbhDldbcaWaUaTaShofWlddtfYicfZaZaRaYacaZaRaLfLbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbbbaSaSbfbbaSbfbbaSbfbbaSbfbbaSbfbbaSaSfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoUlzlAlAlAlBpgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM bdaVbfaSbaaWaSbaaWaVbfaSbaaWaVbfaSbaaWaVbfaSbaaWbcbeaUaMaMaMaMaVaeaVbaaWbeaTaYbbaRbdaUbfaSaXbcaZaYaTaUbaaWbbbfbeaXbdafaVaXaLfLaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaRaYaZaYaZaRaYaZaRaYaZaRaYaZaRaYaZaZfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aTbeaRaZbdaSaZbdaSbeaRaZbdaSbeaRaZbdaSbeaRaZbdaSbfbbaXaMaMaMaMbeahakadaiaaaoamajahalagaeafacabanamaoagadacaiaeaaacalanbeaWaLfLaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaVaUbaaVbaaVaUbaaVaUbaaVaUbaaVaUbaaMaVfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM bcbbaUaVaTaZaVaTaZbbaUaVaTaZbbaUaVaTaZbbaUaVaTaZaRaYaWaMaMaMaMaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMdjhegWheiAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM @@ -2163,128 +2032,128 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjtiBiBiBjtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjviBiBiBjvaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhejxjwjAheaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhejBjBjBheaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMhephphphheaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjCjEjDjGjFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmsmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu -mrmrmrmrmrmrmrmvmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMmumumuaMaMaMaMaMmumumumumumumu -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMmumumumumumumumumuaMmumumumumumumumu -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMmumumumumumumumumumumumumumumumumumumumumumumumumumumu -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmwmxmxmxmymxmxmzaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMmAaMmBmumumumumumumumumumumumumumumumumumumumumumumumumumu -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmDmDmDmEmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMmAmBmumumumumumumumumumumumumumumumumumumumumumumumumumumu -mrmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmDmFmDmGmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMmAaMmumumumumumumumumumumumumumumumumumumumumumumumumumumu -mHmrmrmrmrmrmrmrmrmrmrmrmrmrmraMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmImImImJmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumuaMaMaMaMaMaMmKmBmumumumumumumumumumumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmsmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMmumumuaMaMaMaMaMmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMmumumumumumumumumuaMmumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMmumumumumumumumumumumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmwmxmxmxmymxmxmzaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMmAaMmBmumumumumumumumumumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmDmDmDmEmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMmAmBmumumumumumumumumumumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmDmFmDmGmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMmAaMmumumumumumumumumumumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmImImImJmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumuaMaMaMaMaMaMmKmBmumumumumumumumumumumumumumumumumumumumumumumumumumumu aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLmMmNmxmxmxmOmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumuaMaMaMaMaMaMmPaMmBmumuihihihihihmumumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLmGmDmGmDmDmDmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMihihmQmSmRihihmumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLmMmxmxmzmDmDmDmTmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMlEmUmVmWmVmUihmumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmImDmDmTmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMkcmUmVmWmVmUihmumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmImDmDmTmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMkDmUmVmWmVmUihmumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXmxmxmxmxmOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMihihmWmWmYihihmumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihmWmWmWihmumumumumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmZnananbihihncihihihihihihihmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMnvrPrIrIrIrBnzaMaMndnenfngnenenerlihninjnknlihmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMnvnHnnnJnrnLnsnHnzaMndnenmnmnenenenenCnonononpihihihihihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMnHnInRnRnSnRnRnLnHaMndnqnMnKntneneneihnonononuihbOkQbTihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMnHnQnRnRnRnRoanZnHaMndnenAnAnenenepaihofnonDnEihbLkQmkihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHognRnRohnRnRonnHaMndneneneneneneriihihihihihihbPkQnGihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMomnHoCnHnHnHnHnHooaMnTnananUihkdkdkdihkTkTnVnWihcikQrcihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoGoyoLounFnHaMaMaMaMaMaMobkdkdkdoclalaododihcikQrcihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoBoAoanRornHaMaMaMaMaMaMoikdkdkdihojlaihihihokolokihihihihmumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHoOoyoanRoQnHnzaMaMmPmKoFihkdkdkdihihihihnOnOkQkQkQnPnPpKihihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHnHnHnHvLoyoanRLZnHnHnHnHnzototihoRkdkdkdihnYnXkQkQkQkQkQkQkQkQqKihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHpioSoYnHnRoHnRoJnHnHoZoXpfpbpkpnpkkdkdkdkdpmkQkQkQkQkQoDkQkQkQkQoxihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMphoWpjoWnHnHnHponHnHptoZplpxpbpkpLpkkdkdkdkdihoqopkQkQkQkQkQkQkQkQoMihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMnHnHphpynHnHpAnRpCnHnHpzpDpznHoIoIihoPnanUihihihihowovkQkQkQozozoeihihmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHManRnRpHnHnRnRnRnHrbsopJpInHmBaMmBaMaMaMaMmumuihihihokpcokihihihihmumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVoVoVpdpepepepepRpRpepepepepgoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHpSnRnRnRpTnRnRnRqanRnRnRqbnHmKmKmKmKaMaMaMaMmumumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVoVpdpppqprkspeqcpupelgkLpepepepgoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMnHqCnRnRnRqdnRnRnRqpnRnRnRqtnHaMaMaMaMaMaMaMaMaMmumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVpdpepBpBpBpBpeququpepBpBqDlhpepepgoVpFpFpFpFpFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnvnHnHnHnHnHnHnRnRnRnHnHnHnHnHnHnzaMaMaMaMaMmAaMmBmumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUpdpepepMlilkljpepBpBpQpBpBpBpBqFqEpeoVpFqIpUpVpFpFpFpFpFpWpXpXpYpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqJraserdqZnHrfnRrgnHrkrqrqrArtnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUqeqfqgpBqhqhqhpepBpBpeqiqjqkqlqmqnpeoVpFqopUpUrEqqqrqsrGrFqsqvqwqxpFpFpFpFpFpFpFpFpFpFqyqzqzqzqzqzqzqzqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMnxrjrjrjrjrjnHnRnRnRnHrenRnRnRrHnwaMaMaMaMaMmPaMmumumuihihyxihihmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUqGqfpBpBpBpBpBpQpBpBpepepepepepepeqHrKpFpFpFpFpFqqqvqsrQrOqsqvqvqvqLqMqMqMqMqMqMqMqMjNqyqOqPqPqPqPqPqQqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMnhrCrDrjrjrjrRnRnRnRrSnRnRnRrXrTmiaMaMaMaMaMmAmBmBmumumuihihihmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUqRpeqSpBqSpBqSpepBpBpBqTqUoVoVoVoVoVqVqWqMqMqMqLqvqvqvqvqvqvqvqvqvqLqMqMqMqMqMqMqMqMjNqyqXqYqYqYqYqYqXqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnyrjrjrjrjrjrYnRnRnRrZnRnRnRnRsanBaMaMaMaMaMmAaMaMmBmumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVpepepepepepepepBpBrhpBqUoVoVoVoVoVqVqWqMqMqMqLqvqvqvqvqvqvqvqqqqpFpFpFpFpFpFpFpFpFpZqyqXsbqYqYqYscqXpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsdrjrjrjsfnHpzshpznHsioKslnRspnHaMaMaMaMaMaMaMaMaMmumumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUpdpermrnrormrppepBpBpBsqqUoVoVoVoVoVoVpFpFpFpFpFqvqvqsrQrFqsqvrrrspFsrrururvpFrwrxrypZqzqXqYqYqYqYrzsspZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHstsusHswsvnHsxnRsDnHsFnHnHnNnHnHaMaMaMaMaMaMaMmAaMmBmumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUqeqfrJrJrJrJrJpQpBpBpepepepepepepepgoVpFqIpUpVpFqvqvqsrQsGqsqvqqqqpFrLrLrLrLpFrMrxrNpZqzqXqYqYqYqYqYsIpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsNrjsSnHnHnHnRsJsKnHnHnHsVnRLxnHaMaMaMaMaMaMaMmAmBmBmumumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUqGqfrUrJrJrJrJpepBpBpBpBpBpepBrVrWpeoVpFqopUpUrEqvqvqvqvqvqvqvqvqvpFrLsYsWsWpFpFtqpFpZqzqXqYqYqYqYtDqXpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHlvsXtFnHaMnHsZsZsZnHaMnHnLtatbnHaMaMaMaMaMaMaMmAaMmBaMmumumumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUqRpepesgtGtGtGpepBtHtHtHpBpQpBsjskpeoVpFpFpFpFpFpFpFtNpFpFpFqvqvqvsmrLsnsnrLrLrLrLsWpZqzqXqYqYqYqYqYsIpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsZsZsZnHaMomtmtntoooaMnHsZsZsZnHaMaMaMaMaMaMaMmAmBmBmBmBmBmumumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVqRperJrJrJrJpepBtHtHtHpBpeqSpepeqHoVpFtXsyszpFsAsBsBsBsCpFqvqvqvqvrLrLrLrLtYrLrLsWpZqzqXqYqYqYqYsEtZpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMomtmtntoooaMaMaMaMaMaMaMomtmtntoooaMaMaMaMaMaMaMmAaMmBaMmBaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVoVqRpesLsMuapepBpBpBpBpBpepepeqHoVoVpFsOsPsQsRsBsBsBsBuipFqvqvqvsmsTrLrLrLujrLrLulpZqzqXsbqYqYqYscqXpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVoVoVqRpepepepepepepepepepeqHoVoVoVoVpFpFtctdpFpFpFtctetdpFqvqvqvpFtftgtgtgtgtgthpFpZqztitjqYqYqYtktlqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHoUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpFtptptptptptptptptppFpFumpFpFtptptptptptptppFpZqztrtstttttttstuqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvyhyhyhyhyhyhyhtptptptxtxtxtxtxtxpFtytztypFtxtxtxtxtxtxtxtxpZqzqztAtBtBtBtCqzqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuntvupuxuuuzuyuAtvvMuWuhwyvkvgvfvfvyvyyhzdyIyIyIyIvzvAvHvAvJtOtPtQtRtSpFtytztypFtTtUtVtWtWtxaMaMpZqzqzqzqzqzqzqzqzqAjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvAgtvuhuhuhuhuhuhtvLsuWuhuhuhuhuhuhuhuhyhyByILtyIyIvEurururvOueufufufufpFtytztypFtWtWtWtWtWtxaMaMugugugugugugugugugugugtxtxtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvPvbuvuwvQuhuhuhuhuhuhuhvRtvtvtvuhuhuhuhuhuhuhuhyhyHvTzqyIyIvzvAvHvAvJueufufufufpFvUumwhpFtWtWtWtWtWtxuguguguguguguowjuqtxurururtxururururururururtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVAIuXuVuVuVuYAIuZvavbvbvctvmcuhuhuhuhuhuhuhtvveuhuhuhvpvpwownwpwpyhzrzpzEyIyIyhwqwqwqtvuDuEuFuGuHtxuIuIuItxtWtWtWtWtWtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvQtvtvtvuhuhuhuhuhuhuhuhtvvKuhuhuhLwtvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtvwzwAvlvmvntxufJyuftxvlvmvowAwBtxvqvrvqvrvqugtxtxtxtxurururtxvsvtuPvuvsvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutvIvbvbwEtvvxwPukxowVwXuhuhtvvSuhuhuhwYtvxawZwZxaxcxbxexdxQxQxQxQxQxgtvufufvBvCvCvCvCvCvCvCvCvCvDufufxhvqvqvqvqvqugvFuNuotxurururtxvGvGxkvGvGvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVwWuXuVuVuVuYwWwivavbvbxltvwFwGwGwGwItvuhuhtvwmuhuhuhxmtvuhxQxQxQxnxQxQxQxQxQxQxQxQxptvufJyvVvWvXvXvXvXvXvXvXvYueJyufugvZwawbwcwdugweuNwjtxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutwxvbvbxqxcxrxtxsxvxuxcuhuhxcuhuhuhuhxwxcuhxQxQuwxxxQxQxQxexetvtvtvtvtvufufvVwrwsufwtwuwvufwswrueufufugugugugugugugweuNwjtxurururtxwwwwuNwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVxyuXuVuVuVuYxyxzvavbvbxAxnxHuhuhuhxIxnuhuhxnuhuhxKxJxLxnxMxQxQxQtvwFwGwHwGwItvwJwJwJxNufufwKwLwMwNwOxOwQwRwSwLwTufufxRwUwUwUwUwUtxtxuOtxtxtxuOtxtxuNuNuNuNuNvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumu -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvutxXvbvbxYtvyauhuhuhuhtvybybtvycyctvtvtvtvxMxQxQuwyWxfxfxfxfxfydxfxfxfLyufufufyeufufMbufMbufufyeufufufxjurururururxjurururururururxjwwwwwwwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu -aMaMaMaMmumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuVuVuVuVuVuVuVuVuVuVuVuVuVyfuXuVuVuVuYyfygyivbvbuwyjuhuhuhuhuhyjuhuhykuhuhymylyzyzuhxQxQvdtvwFwGwHwGwItvxBxBxByAufufvBxCxDwNxEufxFwRxGxCvDufufxjurururururxjurururururururxjwwwwwwwwwwtxuOuOtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -mumumumumudCdCdCdCdCdCmumumumumumumumumumumumumumumumumumumumumumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvbvbuwyjuhuhuhuhuhyjuhuhyCuhuhxQyDyDyDxQxQxQzcyKyGyMxQySyQtvtvtvtvtvufufvVwLxSufxiufxikayqwLueufufwAxTxUxUxUxVtxtxxWtxtxtxuOtxtxtxyXyXyXtxtxurururyYurxZtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCdCdCdCdCdCmumumumudCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvvbvbyZtvwFwGwGwGwItvzezetvzfuhxQzgzizhxQxQxQyRzkyMxQxQxQxQxxxQxKzltvufufvVtxtxynyoufypxStxtxueufuftxaMaMaMaMaMtxyrystxuNytuNuNyuyvywywywzmtxururuQuQururyyaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumuBDBvmumumumumumumumumumumumumumumumumumumumumumumumumumumumumudCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvznztzszvzuuhuhuhxczwuhxQzizCzxxQxQxQxQxxxQxQxQzFzDxcxQxQzGtvufJyvVtxtxvlvmvmvmvotxtxueJyuftxaMaMaMaMaMtxysystxyLyLyLuNyuywywywywzHtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumuBFBvBGmumumumumumumumumumumumumumumumumumumumumumumumumumumumudCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuhuhuhuhuhuhuhuhxnzIuhxQzJzJzJxQxQxQxQxxxQxQxQzFzDxnyJyEyFtvufufwKyTyTyTyTyTyTyTyTyTwTufuftxaMaMaMaMaMtxyUystxyLyVyLuNyuyuyuyuyuyutxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumuBRBvaMaMaMaMmumumumumumumumumuaMaMmumumumumumumumumumumumumudCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuhuhuhuhuhuhuhuhtvwCuhuhzOuhuhuhxQxQwCzkxQxQxQzFzDtvtvtvtvtvtxwAzQxRtxufufJyufuftxtxtxtxtxtxaMaMaMaMaMtxAbystxvFuNuNuNyuaMaMaMaMaMtxuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -CGCHCHCHCHCHmtmtmtmtmtmtmtmtCHCHCHmtmtmtmtmtmtmtmtmtCHCHCHCHCHCHCHCHCHCHCHCHCGCHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvAfAfAhAoAnAqApwDtvAsArwqtvzBjRtvwqArAsyKAFxQxQzFzDtvAGAKAJAGAMAPDCAQCNtxwAASxRtxtxaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxyuaMaMaMaMaMzyuryNuPuPyOuryPaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt -dCmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvABABtvtvtvtvtvBaxQxQzFzDtvAGBbBbAGBcBdDCAQCNBfBeDCBgBtCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzKururzLzLururzKaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzMzNzNzNzNBMBMzNzNzPaMtvBNxQxQzFzDtvAGAJAJAGBOBdDCAQCNBPDCDCDCBQCNaMaMaMaMaMaMaMaMaMaMaMaMzRzSNaNaNazTzUaMaMaMaMaMtxzVururururzWtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYzZAaBSAcAcAdjZzNzPtvtvxxxxtvtvtvlqAGAGAGBYBdDCAQCNCeCdCeCfCeCNaMaMaMaMaMaMaMaMaMaMaMzRAiNiNjNkNlNmAlzUaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuaMaMaMaMaMaMaMErEcEcEsEcEcEcECAZAZAZAZAZaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYAmAcAcAcAcAcAcCiChxcxQxQxQxQxQxNAGCjAGCjAMBdDCClCkBPDCCmDCCnCNaMaMaMaMaMaMaMaMaMaMzRAiCoAvADAvADAvCpAlzUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuImaMaMaMaMaMFaFpFlFWFVFVFXHzHmAZHAHCHBAZaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzXzYAxAyAzjSAzAzAzzNAAxPxQxQxQxQxQyWAGCjAGCjBcBdDCClCkCwDCCyCxCzCNaMaMaMaMaMaMaMaMaMaMACADADADCANcCEADADADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuImImaMaMaMaMIqIYIXIXJaFVFVFVFVAZEYEXJAAZaMaMaMaMAZAZAZAZAZAZmumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAEzNzNzNzNzNzNzNzNAAaMxnxQxQxQxQxQtvAGCjAGCjBOCJCICKCNCeCLCQCOCeCNaMaMaMaMaMaMaMaMaMaMAtCRBuNhNeNgNeNfCrCSAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuImImaMaMaMIqJSIXJZJaIhJaJaKiAZAZKsAZAZaMaMaMaMAZCvDbDWDWCvmumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHCNCNCWDCDCCXBQCNCNCNaMaMaMaMaMaMaMaMAtCYACATARAUARATACCYAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMIqLbIXIXJSJSJSJSJSCTMiMpMsAZAZAZAZAZAZDWEDDWDWDWDWmumumumudCdCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOAWAWAWAWAWAWAWAWAWAWAWAWAWAXAYDdDgBlBmBmBmBmBmAHDyDqDrDCDCDxBQDqDyCNaMaMaMaMaMaMaMaMAtADCrAtDFDEDIAtBuADAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumuaMIqJSCTIXIXIXIXIXIXIXIXIXMpAZBzBzBzBzAZDWEDCvDWDWCvmumumumudCaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOAWAWkekbkfkekbkbkkkgkpkbkrkqAYAWAWBBBmBmBmBmBmAHDyEpDrDCDCDCBQEpDyCNCNCNCNCNCNaMaMaMACADCrCCMQMRMPCCBuADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumuMBmumuAZMpIXIXMDIXMECVMFMEIXIXIXCgBzBzBzBzAZCvDWEDEDDWHIAZdCdCdCdCaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOAWkektlrkwkvkxlskxkxkxlskBkAAYAWAWBlBmBmBmBmBmAHDyEpDrDCDCDCEKEpDyDyDyDyDyDyCNaMaMzRAiCRCrDfMQBwMPDfBuCSAlzUaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuJzCuDcMNAZAZMpIXIXIXMEMSMOMEIXIXMYAZBzBzBzBzMeEDEDEDDWDWCvAZmumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOAWkCkGkEkGkHkGkGkGkGkGkGkGkJAWAWAWAHAHAHAHCcFsAHDyEpDrDCDCDCFxFtFGFGFGFGFGFGFGFGFHAtFNADCrAlACFRACAiBuADFNAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuNoCuCuCuCuCuCFIXFWFWMpMEJBNpMEIXNvNuAZBzBzBzBzAZCvEDDWEDMrDWAZmumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOAWkKkPltkRkvkUlukUkUkUlukZkYAYAWAWAHGfGdGgCPCPCNGqGpGLDCDCDCDCDDDCDCGODCDCGRGTDpGTHfADADADHjHkADADHjADADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuNCCuCuCuNKCuCFIXAZAZAZAZAZAZAZAZAZAZAZAZAZCgAZAZAZAZMeAZAZAZAZAZmumuaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOAWAWkKkblbkKkbkbkkkgkpkblekqAYAWAWAHHKHJHLCPCPHMDCDDDCDCDCDCDCDDDCDCDCDCDCGRHNFGFHAtHOADCrCCBuADCrCCBuADHQAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuNMCuNOCuCuNQMvAZAZmumuAZBzBzBzBzBzBzAZIGIGIGIGIIAZBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOAWAWAWAWAWAWAWAWAWAWAWAWAWAXAYAWAWAHIKIJILCPCPHMDCDDDCDCDCDCITISFGIUDCDCIWIVCNaMaMCCBuADCrCMBuADCrCMBuADCrCCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuNSCuCuCuNTmumumumumuAZBzBzBzBzBzBzAZIGIGIGIGIGAZBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHJcJbJbCPCPCNJmJlJnDCJoDCEKJpDyJqDCGRlfJrCNaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumuNSCuCuNTmumuaMaMmuAZBzBzBzBzBzBzCgIGIGJCIGIGCgBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJEJDJDJDJFCZDaCPCPCPJHCPCPCPCPCPCPCPCPCPCPNyCPCNDyEpJIDCDCDCFxFtFGJJDCDCJLJKCNaMaMDfBuADCrCMBuADCrCMBuADCrDfaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuNUJYmumumumAaMmBAZBzBzAZNXNZNYAZIGIGJRIGIGAZJMJOJNAZBzBzAZmBaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJUJUJUDhDiDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNDyEpJVDCDCDCDCDDDCDCDCDCDCGRHNFGFHAtJWADCrDfBuADCrDfBuADJXAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumumumumBmAaMmBAZBzBzAZmBmBmBAZAZJMJOJNAZAZmBmBmBAZBzBzAZmBaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKaJUJUJUDsDiDtDuDlCPDmDvDwDlCPCPKbKbKbKbKbKbCNDyDzDADBDCDCDCDDDCDCDCDCDCGRGTDpGTKcADADKdADADADADADKdADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumumuaMaMaMaMmBOaKjKjObmBaMmBmBmBmBmBmBmBmBmBaMmBOaKjKjObmBaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKuJUJUJUDsDaCPCPCPNyCPCPCPCPCPDGDHDHDHDHDHDHCNCNCNCNKvKwKwCNCNCNCNHNFGFGFGFGFGFHEAACNNATzSzTKxzSzTATNNACBVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumumumuaMaMaMaMOaKzKyObaMaMaMaMaMaMaMaMaMaMaMaMaMOaKzKyObaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUKAJUKBDsDiDNDODlCPDmDPDQDlCPDGDRDSDSDSDSDSCNDTDTDTNDDVDVKCDXDXCNDyDyDyDyCNaMaMAtNENFAtNHNIEaKDNJAtNLNGAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumumuaMaMaMaMaMOaKzKyObaMaMaMaMaMaMaMaMaMaMaMaMaMOaKzKyObaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKKJUJUKLJUDsDiEeEfDlCPDmEgEhDlCPDGDSDSDSDSDSDSCNEiEjEjElDVDVDVDXDXCNCNCNCNCNCNaMaMAtKNKMAtKONVEaEaKPAtKQKRAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumumuaMaMaMaMaMlwKjKjlxaMaMaMlwaMaMaMaMaMlxaMaMaMlwKjKjlxaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKUJUJUJUJUEoDaCPCPCPCPCPCPCPCPCPDGDSDSKVEqKWKXCNEtDVDVDVEwExDVDVEyCNaMaMaMaMaMaMaMEAEBEBAtKYEaNREbKZAtEBEBBVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMaMaMaMaMlylDlClyaMaMaMlylFlGlGlGlHlyaMaMaMlylIlJlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULiLjKaLlLkEFEGEGEGEHEHEHEIEJLmELEMEHEHEHCNCNCNLnDVDVEwEPEQExERESCNaMaMaMaMaMaMaMETEVEVBVDYDZEaNtNsEAEVEVEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMaMaMaMaMlylLlKlyaMaMlwlylylNlMlPlOlylxaMaMlylQlRlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJULlLWEZEZEZEZEZEHLXFbFcFdFeFfFgFbLXEHCNCNCNCNCNCNLYFiNqFkERESCNaMaMaMaMaMaMaMaMaMaMETATEUEUEUATEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMaMaMaMaMlylTlSlyaMaMlylylUlWlVlWlXlylyaMaMlylYlZlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMjJULlLWEZEZEZEZEZEZEHFbFmFnFdFeFfFnFoFbEHMkMmMlMoMnCNDVFhFkDVDVEwFuaMaMaMaMaMaMaMaMaMaMaMETEVEVEVEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMaMaMaMaMlymalylylylylymdmbmbmbmbmbmmlylylylylymelyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULlLWEZEZEZEZEZEZEZEHFvFbFvFdFeFfFvFbFvEHFwDVDVDVDVMuDVDVDVDVDVFyFzaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMaMaMaMaMlymgmfmjmhmllymombmbmbmbmbmmlympmnmqwloTlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNLlLWEZEZEZEZEZEZEZEZEHFAFbFbFdFeFfFbFbFBEHFCFDFEFFMGCNDVDVDVDVDVMHFIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuaMaMaMaMaMaMaMaMaMaMaMlypvpspspspwlypNpEpPpOpNpEpPlyqBpspsqNpvlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHCNCNCNCNCNCNCNCNCNCNCNEHFJFKFKFdFeFfFLFLFMEHMTFOFPFQMUCNFSFTFUMWMVMXCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumuaMaMaMaMaMaMaMaMaMaMaMsUpvpspspspspOmbmbmbmbmbmbmbpOpspstEpspvsUaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeFeFeFeFeFeFeFeFeFeFeEHEHNbEHEHFeEHEHNbEHEHEHEHEHEHEHCNCNCNCNCNCNCNCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLmGmDmGmDmDmDmDmDmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMihihpypWpGihihmumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmLmLmLmLmMmxmxmzmDmDmDmTmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMlEpYpXkQpXpYihmumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmImDmDmTmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMkcpYpXkQpXpYihmumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmCmImDmDmTmCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMkDpYpXkQpXpYihmumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmXmxmxmxmxmOaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMihihkQkQqeihihmumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMihkQkQkQihmumumumumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMqrqqqqqsihihqvihihihihihihihmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMnvrPrIrIrIrBnzaMaMqwnenfngnenenerlihninjnknlihmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMnvnHnnnJnrnLnsnHnzaMqwnenmnmnenenenenCnonononpihihihihihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMnHnInRnRnSnRnRnLnHaMqwnqnMnKntneneneihnonononuihbOkQbTihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMnHnQnRnRnRnRoanZnHaMqwnenAnAnenenepaihofnonDnEihbLkQmkihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHognRnRqxnRnRonnHaMqwneneneneneneriihihihihihihbPkQnGihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMomnHoCnHnHnHnHnHooaMqyqqqqqzihkQkQkQihkTkTnVnWihcikQqAihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoGoyoLounFnHaMaMaMaMaMaMqGkQkQkQoclalaododihcikQqAihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoBoAoanRornHaMaMaMaMaMaMqHkQkQkQihojlaihihihqLolqLihihihihmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHoOoyoanRoQnHnzaMaMmPmKoFihkQkQkQihihihihnOnOkQkQkQqMqMpKihihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnvnHnHnHnHvLoyoanRLZnHnHnHnHnzototihqOkQkQkQihnYnXkQkQkQkQkQkQkQkQqKihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHpioSoYnHnRqPnRoJnHnHoZoXpfpbpkpnpkkQkQkQkQpmkQkQkQkQkQoDkQkQkQkQoxihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMqQoWpjoWnHnHnHponHnHptoZplpxpbpkpLpkkQkQkQkQihoqopkQkQkQkQkQkQkQkQoMihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMnHnHqQqRnHnHpAnRpCnHnHqSpDqSnHoIoIihqVqqqzihihihihowovkQkQkQozozoeihihmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHManRnRpHnHnRnRnRnHrbsopJpInHmBaMmBaMaMaMaMmumuihihihqLpcqLihihihihmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWqWqWqXpepepepepRpRpepepeperaqWqWqWqWoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHpSnRnRnRpTnRnRnRqanRnRnRqbnHmKmKmKmKaMaMaMaMmumumuihoEkQoEihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWqWqXpppqprkspeqcpupelgkLpepeperaqWqWoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMnHqCnRnRnRqdnRnRnRqpnRnRnRqtnHaMaMaMaMaMaMaMaMaMmumuihoEkQoEihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWqXpepBpBpBpBpeququpepBpBqDlhpeperaqWpFpFpFpFpFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnvnHnHnHnHnHnHnRnRnRnHnHnHnHnHnHnzaMaMaMaMaMmAaMmBmumuihoEkQoEihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqXpepepMlilkljpepBpBpQpBpBpBpBqFqEpeqWpFqIpUpVpFpFpFpFpFrcrererfpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqJrjserdqZnHrrnRrgnHrkrqrqrArtnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWrsqfqgpBqhqhqhpepBpBpeqiqjqkqlqmqnpeqWpFqopUpUrutyrErvrGrFrvtyrLrKpFpFpFpFpFpFpFpFpFpFrOrOrOrOrOrOrOrOrOjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMnxrjrjrjrjrjnHnRnRnRnHrQnRnRnRrHnwaMaMaMaMaMmPaMmumumuihihyxihihmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWrVqfpBpBpBpBpBpQpBpBpepepepepepepesfrWpFpFpFpFpFtytyrvsjsjrvtytytysmskskskskskskskskjNrOsnsrsrsrsrsrsyrOjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMnhrCrDrjrjrjrRnRnRnRrSnRnRnRrXrTmiaMaMaMaMaMmAmBmBmumumuihihihmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWszpesCpBsCpBsCpepBpBpBqTqUqWqWqWqWqWqWsGsksksksmtytytytytytytytytysmskskskskskskskskjNrOsOqYqYqYqYqYsOrOjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnyrjrjrjrjrjrYnRnRnRrZnRnRnRnRsanBaMaMaMaMaMmAaMaMmBmumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWpepepepepepepepBpBrhpBqUqWqWqWqWqWqWsGsksksksmtytytytytytytysBsBpFpFpFpFpFpFpFpFpFpZrOsOsbqYqYqYscsOpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsdrjrjrjsPnHpzshpznHsioKslnRspnHaMaMaMaMaMaMaMaMaMmumumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqXpermrnrormrppepBpBpBsqqUqWqWqWqWqWqWpFpFpFpFpFtytyrvsjrFrvtysRsQpFsTsWsWsYpFrwrxrypZrOsOqYqYqYqYrzsspZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHstsusHswsvnHsxnRsDnHsFnHnHnNnHnHaMaMaMaMaMaMaMmAaMmBmumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWrsqfrJrJrJrJrJpQpBpBpepepepepepeperaqWpFqIpUpVpFtytyrvsjsZrvtysBsBpFtctctctcpFrMrxrNpZrOsOqYqYqYqYqYsIpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsNrjsSnHnHnHnRsJsKnHnHnHsVnRLxnHaMaMaMaMaMaMaMmAmBmBmumumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWrVqfrUrJrJrJrJpepBpBpBpBpBpepBtetdpeqWpFqopUpUrutytytytytytytytytypFtctgtftfpFpFtqpFpZrOsOqYqYqYqYtDsOpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHlvsXthnHaMnHtititinHaMnHnLtatbnHaMaMaMaMaMaMaMmAaMmBaMmumumumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWszpepesgtGtGtGpepBtHtHtHpBpQpBpBpBpeqWpFpFpFpFpFpFpFtjpFpFpFtytytytktctltltctctctctfpZrOsOqYqYqYqYqYsIpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHtititinHaMomtmtntoooaMnHtititinHaMaMaMaMaMaMaMmAmBmBmBmBmBmumumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWszperJrJrJrJpepBtHtHtHpBpesCpepesfqWpFtftctppFsAsBsBsBsBpFtytytytctctctctctrtctctfpZrOsOqYqYqYqYsEtZpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMomtmtntoooaMaMaMaMaMaMaMomtmtntoooaMaMaMaMaMaMaMmAaMmBaMmBaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWqWszpesLsMuapepBpBpBpBpBpepepesfqWqWpFtttctctcsBsBsBsBuipFtytytytktutctctctztctctFpZrOsOsbqYqYqYscsOpZjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWqWqWszpepepepepepepepepepesfqWqWqWqWpFpFtJtIpFpFpFtJtKtIpFtytytypFtLrerererererfpFpZrOsOtMqYqYqYtNsOrOjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjHqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWqWpFtOtOtOtOtOtOtOtOtOpFpFtPpFpFtOtOtOtOtOtOtOpFpZrOtQtstRtRtRtstSrOjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvyhyhyhyhyhyhyhtOtOtOtxtxtxtxtxtxpFtytTtypFtxtxtxtxtxtxtxtxpZrOrOtAtBtBtBtCrOrOjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuntvupuxuuuzuyuAtvvMuWuhwyvkvgvfvfvyvyyhtUtVtVtVtVtXtWtYtWucubueudujufpFtytTtypFulutumuBuBtxaMaMpZrOrOrOrOrOrOrOrOrOjIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvAgtvuhuhuhuhuhuhtvLsuWuhuhuhuhuhuhuhuhyhuCtVuDtVtVvEurururvOuBuBuBuBuBpFtytTtypFuBuBuBuBuBtxaMaMugugugugugugugugugugugtxtxtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvbuEvbuvuwvQuhuhuhuhuhuhuhvRtvtvtvuhuhuhuhuhuhuhuhyhuFuHuGtVtVtXtWtYtWucuBuBuBuBuBpFvUtPwhpFuBuBuBuBuBtxuguguguguguguowjuqtxurururtxururururururururtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuIuIuIuIuIuIuIuIuIuIuIuIuIuVuIuIuIuIuIuVuXvbvbvbuYtvmcuhuhuhuhuhuhuhtvveuhuhuhvpvpwownwpwpyhuZvcvatVtVyhwqwqwqtvuBvjvivmvltxuBuBuBtxuBuBuBuBuBtxuJuKuJuLuMuguNuNuNuOurururuOuruPuQuPuruRuSuTtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvQtvtvtvuhuhuhuhuhuhuhuhtvvKuhuhuhLwtvtvtvtvtvyhyhyhyhyhyhyhxQxQxQtvvnwAvovAvztxuBvBuBtxvovAvCwAvDtxvqvrvqvrvqugtxtxtxtxurururtxvsvtuPvuvsvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvxQvHvbvbwEtvvxwPukxowVwXuhuhtvvSuhuhuhwYtvxawZwZxavIxbxexdxQxQxQxQxQxgtvuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBxhvqvqvqvqvqugvFuNuotxurururtxvGvGxkvGvGvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuIuIuIuIuIuIuIuIuIuIuIuIuIvJuIuIuIuIuIvJvPxQvbvbxltvvTvVvVvVvWtvuhuhtvwmuhuhuhxmtvuhxQxQxQvXxQxQxQxQxQxQxQxQxptvuBvBuBwdvYvYvYvYvYvYvYwiuBvBuBugvZwawbwcvqugweuNwjtxurururtxwfwfuNwfwfvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMwgaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvxQwkvbvbxqvIxrxtxsxvxuvIuhuhvIuhuhuhuhxwvIuhxQxQuwxxxQxQxQxexetvtvtvtvtvuBuBuBwswruBwtwuwvuBwrwsuBuBuBugugugugugugugweuNwjtxurururtxwwwwuNwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuIuIuIuIuIuIuIuIuIuIuIuIuIwxuIuIuIuIuIwxwzxQvbvbxAvXxHuhuhuhxIvXuhuhvXuhuhxKxJxLvXxMxQxQxQtvvTvVwBvVvWtvwJwJwJxNuBuBuBwGwFwIwHwLwKwNwMwGuBuBuBxRuQuQuQuQuQtxtxuOtxtxtxuOtxtxuNuNuNuNuNvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumu +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvxQwOvbvbxYtvyauhuhuhuhtvybybtvycyctvtvtvtvxMxQxQuwwRwQwQwQwQwQwSwQwQwQwRuBuBuBwTuBuBwUuBwUuBuBwTuBuBuBxjurururururxjurururururururxjwwwwwwwwwwvvvwvwtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMmu +aMaMaMaMmumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMuUuIuIuIuIuIuIuIuIuIuIuIuIuIwWuIuIuIuIuIwWxcxfvbvbuwyjuhuhuhuhuhyjuhuhykuhuhymylyzyzuhxQxQvdtvvTvVwBvVvWtvxBxBxByAuBuBuBxnxiwIxyuBuBwNxzxnuBuBuBxjurururururxjurururururururxjwwwwwwwwwwtxuOuOtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +mumumumumudCdCdCdCdCdCmumumumumumumumumumumumumumumumumumumumumumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMustvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvtvvbvbuwyjuhuhuhuhuhyjuhuhyCuhuhxQyDyDyDxQxQxQzcxCyGyMxQySyQtvtvtvtvtvuBuBuBwGxDuBxEuBxExGxFwGuBuBuBwAxTxUxUxUxVtxtxxOtxtxtxuOtxtxtxxPxPxPtxtxurururyYurxZtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCdCdCdCdCdCmumumumudCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvvbvbyZtvvTvVvVvVvWtvzezetvzfuhxQzgzizhxQxQxQyRzkyMxQxQxQxQxxxQxKzltvuBuBuBtxtxxWxSuBxXxDtxtxuBuBuBtxaMaMaMaMaMtxyrystxuNytuNuNyuydyeyeyeyftxururuQuQururygaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumuaMaMmumumumumumumumumumumumumumumumumumumumumumumumumumumumumudCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvznztzszvzuuhuhuhvIzwuhxQzizCzxxQxQxQxQxxxQxQxQzFzDvIxQxQzGtvuBvBuBtxtxvovAvAvAvCtxtxuBvBuBtxaMaMaMaMaMtxysystxyLyLyLuNyuyeyeyeyeyitxuryNuPuPyOurynaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumuyoaMypmumumumumumumumumumumumumumumumumumumumumumumumumumumumudCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuhuhuhuhuhuhuhuhvXzIuhxQzJzJzJxQxQxQxQxxxQxQxQzFzDvXyJyEyFtvuBuBuBuBuBuBuBuBuBuBuBuBuBuBuBtxaMaMaMaMaMtxyUystxyLyVyLuNyuyuyuyuyuyutxuryNuPuPyOurynaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumuaMaMaMaMaMaMmumumumumumumumumuaMaMmumumumumumumumumumumumumudCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvuhuhuhuhuhuhuhuhtvwCuhuhzOuhuhuhxQxQwCzkxQxQxQzFzDtvtvtvtvtvtxwAyqxRtxuBuBvBuBuBtxtxtxtxtxtxaMaMaMaMaMtxAbystxvFuNuNuNyuaMaMaMaMaMtxuryNuPuPyOurynaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +CGCHCHCHCHCHmtmtmtmtmtmtmtmtCHCHCHmtmtmtmtmtmtmtmtmtCHCHCHCHCHCHCHCHCHCHCHCHCGCHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvAfAfAhAoAnAqApwDtvAsArwqtvxQyvtvwqArAsxCAFxQxQzFzDtvAGAKAJAGAMyyywyBCNtxwAyHxRtxtxaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxyuaMaMaMaMaMyIuryNuPuPyOurynaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt +dCmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvABABtvtvtvtvtvBaxQxQzFzDtvAGBbBbAGBcywywyBCNywywywywywCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMyKururzLzLururyKaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMyPzNzNzNzNBMBMzNzNzPaMtvBNxQxQzFzDtvAGAJAJAGBOywywyBCNywywywywywCNaMaMaMaMaMaMaMaMaMaMaMaMyTzSNaNaNazTyXaMaMaMaMaMtxzVururururzWtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzdzmzZAaBSAcAcAdjZzNzPtvtvxxxxtvtvtvlqAGAGAGzoywywyBCNzqzpzqzrzqCNaMaMaMaMaMaMaMaMaMaMaMyTzyNiNjNkNlNmzByXaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuaMaMaMaMaMaMaMzHzEzEzKzEzEzEzMAZAZAZAZAZaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzdzmAmAcAcAcAcAcAcCiChvIxQxQxQxQxQxNAGCjAGCjAMywywywzoywywzQywywCNaMaMaMaMaMaMaMaMaMaMyTzyCoAvADAvADAvCpzByXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuImaMaMaMaMaMzRzUFlMpIXIXzXAizYAZHAHCHBAZaMaMaMaMaMaMaMmumumumumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzdzmAxAyAzjSAzAzAzzNAAAjxQxQxQxQxQyWAGCjAGCjBcywywywzoywywAlAkAtCNaMaMaMaMaMaMaMaMaMaMACADADADCANcCEADADADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuImImaMaMaMaMAuAwIXIXAEIXIXIXIXAZEYEXJAAZaMaMaMaMAZAZAZAZAZAZmumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAIzNzNzNzNzNzNzNzNAAaMvXxQxQxQxQxQtvAGCjAGCjBOALALALCNzqANAPAOzqCNaMaMaMaMaMaMaMaMaMaMAQCRBuNhARNgARNfCrCSAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuImImaMaMaMAuJSIXJZAEASAEAEATAZAZKsAZAZaMaMaMaMAZAWAUBzBzAWmumumumumumudCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHCNCNAXywywywywCNCNCNaMaMaMaMaMaMaMaMAQCYACAYBeBdBeAYACCYAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMAuLbIXIXJSJSJSJSJSIXMiMpBfAZAZAZAZAZAZBzBgBzBzBzBzmumumumudCdCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBhBhBhBhBhBhBhBhBhBhBhBiBmBjBlBkBmBmBmBmBmAHBvBtBxywywywywBtBvCNaMaMaMaMaMaMaMaMAQADCrAQDFDEDIAQBuADAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumuaMAuJSIXIXIXIXIXIXIXIXIXIXMpAZBzBzBzBzAZBzBgAWBzBzAWmumumumudCaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBFBDBGBFBDBDkkkgkpBDBPBHBmBmBmBBBmBmBmBmBmAHBvBQBxywywywywBQBvCNCNCNCNCNCNaMaMaMACADCrCCMQMRMPCCBuADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumuMBmumuAZMpIXIXMDIXMECVMFMEIXIXIXCgBzBzBzBzAZAWBzBgBgBzBRAZdCdCdCdCaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBFBUlrBYBVkxlskxkxkxlsCeCdBmBmBmBkBmBmBmBmBmAHBvBQBxywywywCfBQBvBvBvBvBvBvCNaMaMyTzyCRCrDfMQBwMPDfBuCSzByXaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuJzCuDcMNAZAZMpIXIXIXMEMSMOMEIXIXMYAZBzBzBzBzMeBgBgBgBzBzAWAZmumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhkCkGkEkGkHkGkGkGkGkGkGkGkJBmBmBmAHAHAHAHCcFsAHBvBQBxywywywCfCkClClClClClClClClCmAQFNADCrzBACFRACzyBuADFNAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuNoCuCuCuCuCuCFIXMpMpMpMEJBNpMEIXCnNuAZBzBzBzBzAZAWBgBzBgCqBzAZmumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhCvCwltCxBVkUlukUkUkUluCzCyBmBmBmAHCBCBCBCPCPCNCICDBxywywywywCJywywCKywywywGTDpGTHfADADADHjHkADADHjADADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuNCCuCuCuNKCuCFIXAZAZAZAZAZAZAZAZAZAZAZAZAZCgAZAZAZAZMeAZAZAZAZAZmumuaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhCvBDCLCvBDBDkkkgkpBDCQCOBmBmBmAHCTCTCTCPCPCUywCJywywywywywCJywywywywywywCWClCmAQHOADCrCCBuADCrCCBuADHQAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuNMCuNOCuCuNQMvAZAZmumuAZBzBzBzBzBzBzAZIGIGIGIGIIAZBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBhBhBhBhBhBhBhBhBhBhBhBiBmBmBmAHCXCXCXCPCPCUywCJywywywywCfCZClDaywywywDbCNaMaMCCBuADCrCMBuADCrCMBuADCrCCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuNSCuCuCuNTmumumumumuAZBzBzBzBzBzBzAZIGIGIGIGIGAZBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHJcJbJbCPCPCNDgDdBxywDhywCfDiBvDqywywvBJrCNaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumuNSCuCuNTmumuaMaMmuAZBzBzBzBzBzBzCgIGIGJCIGIGCgBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJEJDJDJDJFJFCPCPCPCPJHCPCPCPCPCPCPCPCPCPCPNyCPCNBvBQDrywywywCfCkClDsywywywywCNaMaMDfBuADCrCMBuADCrCMBuADCrDfaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuNUJYmumumumAaMmBAZBzBzAZNXNZNYAZIGIGJRIGIGAZJMJOJNAZBzBzAZmBaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJUJUJUJUDmDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNBvBQDxywywywywCJywywywywywywCWClCmAQJWADCrDfBuADCrDfBuADJXAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumumumumBmAaMmBAZBzBzAZmBmBmBAZAZJMJOJNAZAZmBmBmBAZBzBzAZmBaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKaJUJUJUJUDmDtDuDlCPDmDvDwDlCPCPDyDyDyDyDyDyCNBvDzDAywywywywCJywywywywywywGTDpGTKcADADKdADADADADADKdADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumumuaMaMaMaMmBOaKjKjObmBaMmBmBmBmBmBmBmBmBmBaMmBOaKjKjObmBaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKuJUJUJUJUCPCPCPCPNyCPCPCPCPCPCPDBDBDBDBDBDBCNCNCNCNKvDCDCCNCNCNCNCWClClClClClCmDDACNNAYzSzTKxzSzTAYNNACDGaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumumumuaMaMaMaMOaKzKyObaMaMaMaMaMaMaMaMaMaMaMaMaMOaKzKyObaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUKAJUKBJUDmDNDODlCPDmDPDQDlCPCPDHCTCTCTCTCTCNDJDJDJDKDVDVDSDRDRCNBvBvBvBvCNaMaMAQNENFDTNHNIEaKDNJAQNLNGAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumumuaMaMaMaMaMOaKzKyObaMaMaMaMaMaMaMaMaMaMaMaMaMOaKzKyObaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKKJUJUKLJUJUDmEeEfDlCPDmEgEhDlCPCPCTCTCTCTCTCTCNDWEjEjElDVDVDVDRDRCNCNCNCNCNCNaMaMAQKNKMDTKONVEaEaKPAQKQKRAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumumuaMaMaMaMaMlwKjKjlxaMaMaMlwaMaMaMaMaMlxaMaMaMlwKjKjlxaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKUJUJUJUJUKuCPCPCPCPCPCPCPCPCPCPCPCTCTDXEcDZEiCNDVDVDVDVDVDVDVDVEkCNaMaMaMaMaMaMaMAQEoEoDTKYEaNREbKZAQEoEoAQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMaMaMaMaMlylDlClyaMaMaMlylFlGlGlGlHlyaMaMaMlylIlJlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULiLjKaLlLkEFEGEGEGEHEHEHEpErEqEtEsEHEHEHCNCNCNLnDVDVDVDVDVDVDVEuCNaMaMaMaMaMaMaMEvEVEVDGDYEaEaEaEwDDEVEVExaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMaMaMaMaMlylLlKlyaMaMlwlylylNlMlPlOlylxaMaMlylQlRlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJULlLWEZEZEZEZEZEHEyEAEzEAFeEAEBEAEyEHCNCNCNCNCNCNECDVEDDVDVEuCNaMaMaMaMaMaMaMaMaMaMEvAYEIEIEIAYExaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMaMaMaMaMlylTlSlyaMaMlylylUlWlVlWlXlylyaMaMlylYlZlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMjJULlLWEZEZEZEZEZEZEHEAEKEJEAFeEAEJELEAEHEMEOENEQEPCNDVDVDVDVDVDVFuaMaMaMaMaMaMaMaMaMaMaMEvEVEVEVExaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMaMaMaMaMlymalylylylylymdmbmbmbmbmbmmlylylylylymelyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULlLWEZEZEZEZEZEZEZEHEREAEREAFeEAESEAESEHDVDVDVDVDVMuDVDVDVDVDVDVFzaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMaMaMaMaMlymgmfmjmhmllymombmbmbmbmbmmlympmnmqwloTlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNLlLWEZEZEZEZEZEZEZEZEHEAEAEAEAFeEAEAEAEAEHETDVFEDVEUCNDVDVDVDVDVEWFIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuaMaMaMaMaMaMaMaMaMaMaMlypvpspspspwlypNpEpPpOpNpEpPlyqBpspsqNpvlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHCNCNCNCNCNCNCNCNCNCNCNEHEAEAEAEAFeEAEAEAEAEHFaDVFbFdFcCNFfFgDRFiFhFjCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumuaMaMaMaMaMaMaMaMaMaMaMsUpvpspspspspOmbmbmbmbmbmbmbpOpspstEpspvsUaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeFeFeFeFeFeFeFeFeFeFeEHEHFkEHEHFeEHEHFkEHEHEHEHEHEHEHCNCNCNCNCNCNCNCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuaMaMaMaMaMaMaMaMaMaMvNzApsAepspslyBnAVmbmbmbMdBolypsBppsBqpvvNaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHEHEHEHNwEHEHEHFeFeFeFeFeFeEHFeEHFeFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuaMaMaMaMaMaMaMaMaMaMBrzApspslyBslylylyBAByBClylylyBslyBEOcBIBraMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHEHEHEHEHEHEHEHNPEHEHEHEHEHEHEHEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMaMaMaMaMaMlwlyBKBJMclyBTBLBTsUBXBWBZsUCbCaCslyDeCtDLlylxaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHGeOdOeOdGhGiGiGiGiGiGhGiGhGiGjEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMmumuaMaMaMDMlyDUDUlylyBTBTBTvNBXByBZvNCsCsEdlylyDUDUlyEEaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGbGbGbGbGlEHGiGmGmGmGmGmGiGiGiGmGmGmGmGnGoEHFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMmumuaMaMaMaMDMFqFqEElyFYFrBTBrFZmbFZBrCsCsHHlyDMFqFqEEaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkOpOoOoGbGbGrGiGiGsGtGsGiGiGiGiGiGsGtGsGuGiEHFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMlyBTBTBTlylypOlylyKSCsKTlyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHFeEHEHEHEHEHEHEHEHGiGmGmGmGmGmGiGiGiGmGmGmGmGvGiEHEHEHEHEHEHEHFeEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMlyBTBTLalymbmbmblyCsCsLdlyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAFeEHEHzazazazazaEHGxGxGxGxGxGxGxGxGxGxGxGxGxGyGxEHzbzbzbzbzbEHFeFeFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMlylyLeBTlylUmblXlyLoLhlylyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHEHEHHgHgHgHgHgEHGBGCGCGCGCGCGCGCGCGCGCGCGCGDGBEHHgHgHgHgHgEHEHEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMDMlylylylymbmbmblylylylyEEaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGGGGGGGGFGIGCGCGCGCGCGCGCGCGCGCGCGCGDGJGFGKGKGKGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMDMlyDUDUDUDUDUlyEEaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGMGGGMGGGFGIGCGCGCGCGCGCGCGCGCGCGCGCGDGJGFGKGNGKGNGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMmumumuaMaMaMaMaMaMaMaMDMFqFqFqFqFqEEaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGOEGGGGGFGIGCGCGCGCGCGPGQGPGCGCGCGCGDGJGFGKGKOFGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGGGGGGGGGFGIGCGCGCGCGCGSOGGSGCGCGCGCGDGJGFGKGKGKGKGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGU -dCmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHzjGAGGGMGGGMGGGFGIGCGCGCGCGCGVGWGXGCGCGCGCGDGJGFGKGNGKGNGKGAGwEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGZGYGYGYHaHaHaGYGYHaHaHaGYGYGYGYGYGU -dCmumumuaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHFbGHGGGGGGGGGGGFGIGCGCGCGCGCGCHcGCGCGCGCGCGDGJGFGKGKGKGKGKGHFbEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUHdGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYHeGU -dCmumumuaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFAEHOHEHHbHbHbHbHbEHGBGCGCGCGCGCGCHcGCGCGCGCGCGDGBEHHbHbHbHbHbEHOHEHFBEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYHhGYGYGYGYGYGU -dCmumumuaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFJHiFbEHGzGzGzGzGzEHGxGxGxGxGxGxOIHlOIGxGxGxGxGyGxEHGEGEGEGEGEEHFbHnFMEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYHdGYGYGYGYGYGU -dCmuaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHFbEHEHEHEHEHEHEHHoHpHpHpHpHpHqHrHoHpHpHpHpHsHoEHEHEHEHEHEHEHFbEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYHtHhGYGYGYGYGYGYGYGYGYGYGYGYGYGU -dCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFbFbFeFeFeFeFeEHHoHoHuHoHuHoHoHvHwHoHuHoHuHxHoEHFeFeFeFeFeFbFbEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYOJOJGYGYGYGYGYGYGYGYGYGYGYGYGU -mtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHEHEHEHEHFeOKHoHoHoHyHyHyHoHoHoHyHyHyHyHyHoOKFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYOJOLOMOJGYGYGYGYGYGYGYGYGYGYGYGU -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHONONONOOHDHEHFHoHGOPOROQOTOSOUEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYOJOVOWOJGYGYHtGYHPGYGYGYGYGYGYGU +dCmumumuaMaMaMaMaMaMaMaMaMlwlyBKBJMclyBTBLBTsUBXBWBZsUCbCaCslyDeCtDLlylxaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHFnFmFoFmFtFpFpFpFpFpFtFpFtFpFvEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMmumuaMaMaMDMlyDUDUlylyBTBTBTvNBXByBZvNCsCsEdlylyDUDUlyEEaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGbGbGbGbGlEHFpFwFwFwFwFwFpFpFpFwFwFwFwFxFyEHFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMmumuaMaMaMaMDMFqFqEElyFYFrBTBrFZmbFZBrCsCsHHlyDMFqFqEEaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkOpOoOoGbGbGrFpFpFBFAFBFpFpFpFpFpFBFAFBFCFpEHFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMlyBTBTBTlylypOlylyKSCsKTlyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHFeEHEHEHEHEHEHEHEHFpFwFwFwFwFwFpFpFpFwFwFwFwFDFpEHEHEHEHEHEHEHFeEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMlyBTBTLalymbmbmblyCsCsLdlyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFFeEHEHzazazazazaEHGxGxGxGxGxGxGxGxGxGxGxGxGxGyGxEHzbzbzbzbzbEHFeFeFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMlylyLeBTlylUmblXlyLoLhlylyaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFEHEHEHHgHgHgHgHgEHGBGCGCGCGCGCGCGCGCGCGCGCGCGDGBEHHgHgHgHgHgEHEHEHFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMDMlylylylymbmbmblylylylyEEaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFEHzjGAFHFHFHFHFHFJGCGCGCGCGCGCGCGCGCGCGCGCGCGDGCFJFKFKFKFKFKGAGwEHFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMmumuaMaMaMaMaMaMaMaMDMlyDUDUDUDUDUlyEEaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFEHzjGAFHFLFHFLFHFJGCGCGCGCGCGCGCGCGCGCGCGCGCGDGCFJFKFMFKFMFKGAGwEHFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMmumumuaMaMaMaMaMaMaMaMDMFqFqFqFqFqEEaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFEHzjGAFHFHFOFHFHFJGCGCGCGCGCGCGPGQGPGCGCGCGCGDGCFJFKFKFPFKFKGAGwEHFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFEHzjGAFHFHFHFHFHFJGCGCGCGCGCGCGSOGGSGCGCGCGCGDGCFJFKFKFKFKFKGAGwEHFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGUGU +dCmumumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFEHzjGAFHFLFHFLFHFJGCGCGCGCGCGCGVGWGXGCGCGCGCGDGCFJFKFMFKFMFKGAGwEHFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGZGYGYGYHaHaHaGYGYHaHaHaGYGYGYGYGYGU +dCmumumuaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFEHEAFQFHFHFHFHFHFJGCGCGCGCGCGCGCHcGCGCGCGCGCGDGCFJFKFKFKFKFKFQEAEHFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUHdGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYGYHeGU +dCmumumuaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFFEHFSEHHbHbHbHbHbEHGBGCGCGCGCGCGCHcGCGCGCGCGCGDGBEHHbHbHbHbHbEHFSEHFGEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYHhGYGYGYGYGYGU +dCmumumuaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFUFTFeEHGzGzGzGzGzEHGxGxGxGxGxGxOIHlOIGxGxGxGxGyGxEHGEGEGEGEGEEHFeFVFWEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYGYGYGYGYGYGYGYGYHdGYGYGYGYGYGU +dCmuaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHFeEHEHEHEHEHEHEHGdFXFXFXFXFXGfGeGdFXFXFXFXGgGdEHEHEHEHEHEHEHFeEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYHtHhGYGYGYGYGYGYGYGYGYGYGYGYGYGU +dCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeFeFeFeFeFeFeEHGdGdGhGdGhGdGdGiGjGdGhGdGhGmGdEHFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYOJOJGYGYGYGYGYGYGYGYGYGYGYGYGU +mtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHEHEHEHEHFeGnGdGdGdGoGoGoGdGdGdGoGoGoGoGoGdGnFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYOJGpOMOJGYGYGYGYGYGYGYGYGYGYGYGU +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHGqGqGqGsGuGtGvGdGGGFGIGHGKGJGLEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYOJOVOWOJGYGYHtGYHPGYGYGYGYGYGYGU aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYGYGYGYOJOJGYGYGYGYGYGYGYGYGYGYGYGYGU aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYHhGYGYGYGYGYGYGYGYGYGYGYGYGYHdGYGYGU aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMGUGYGYHtHhGYGYGYGYGYGYGYGYGYGYGYGYHhGYGYGU @@ -2321,21 +2190,21 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHZHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIaIbIcIdIeIfHYIgOYIiHYIjIkIlHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcOZInIoIpPaIkIkIrHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIsIsIcIcIcItHYIuIvIwHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIxHYIyIyIzHYIAIBICIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIEIEIcIcIcIFHYIyIyIyPbIyIyIyIHHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcPcHYIMINIOHYIPIQIRIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcItHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJeJfJgIcJhJiJjJhJkPePdPgPfHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJsJtJgIcJuJuJuJuJvJwJxJwJxHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIaIbIcIdIeIfHYGNGMGOHYGRKtHiHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcOZIcHmIcHnKtKtHoHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIsIsIcIcIcHpHYIcIcHqHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIxHYHrHrHsHYHvHuHxHwHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIEIEIcIcIcIFHYHrHrHrHyHrHrHrHzHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcPcHYHEHDHFHYHIHGHJHwHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcHpHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJeJfJgIcJhJiJjJhJkHLHKHKHLHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJsJtJgIcJuJuJuJuJvHMHMHMHMHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJGPhJgIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJPJQJgIcJuJuJuJuJuJuPiPjJTHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJPJQJgIcJuJuJuJuJuJuPiPjHNHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKeKfKfKgKfKfKfKgKfKfKfKgKfKfKhHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKkKlKlJkKmKoKnJkKpKpKqJkKrPkKtHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKGLvLuJvKHKIKpJvKJKtPlHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKkKlKlJkIgIhIgJkIiIiIjJkKrPkKtHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvIgIgIgJvIkIlIiJvKJKtPlHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM diff --git a/maps/exodus-3.dmm b/maps/exodus-3.dmm index 7b0377eef34..ed87a219590 100644 --- a/maps/exodus-3.dmm +++ b/maps/exodus-3.dmm @@ -1,25 +1,25 @@ "aa" = (/turf/space,/area/space) -"ab" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/derelict/ship) -"ac" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/derelict/ship) -"ad" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/derelict/ship) -"ae" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/derelict/ship) -"af" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/derelict/ship) +"ab" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/derelict/ship) +"ac" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/derelict/ship) +"ad" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/derelict/ship) +"ae" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (NORTH)"; icon_state = "swall_t"; dir = 1},/area/derelict/ship) +"af" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_c (WEST)"; icon_state = "swall_c"; dir = 8},/area/derelict/ship) "ag" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "ah" = (/obj/machinery/sleeper,/obj/machinery/light{dir = 1},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"ai" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"aj" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/derelict/ship) -"ak" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/derelict/ship) -"al" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area/derelict/ship) -"am" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/derelict/ship) +"ai" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t"; icon_state = "swall_t"},/area/derelict/ship) +"aj" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_c (NORTH)"; icon_state = "swall_c"; dir = 1},/area/derelict/ship) +"ak" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (EAST)"; icon_state = "propulsion_r"; dir = 4},/turf/space,/area/derelict/ship) +"al" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (EAST)"; icon_state = "swall_t"; dir = 4},/area/derelict/ship) +"am" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/derelict/ship) "an" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "ao" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "ap" = (/turf/simulated/shuttle/wall{icon_state = "swall15"; dir = 2},/area/derelict/ship) -"aq" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/derelict/ship) -"ar" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/ship) -"as" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/derelict/ship) -"at" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/derelict/ship) +"aq" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_c (WEST)"; icon_state = "swall_c"; dir = 8},/area/derelict/ship) +"ar" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/derelict/ship) +"as" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_c"; icon_state = "swall_c"},/area/derelict/ship) +"at" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (WEST)"; icon_state = "swall_t"; dir = 8},/area/derelict/ship) "au" = (/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"av" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/derelict/ship) +"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight"; icon_state = "swall_straight"},/area/derelict/ship) "aw" = (/turf/simulated/shuttle/plating,/area/derelict/ship) "ax" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "ay" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship) @@ -28,15 +28,15 @@ "aB" = (/obj/machinery/door/airlock/glass{name = "Hibernation Pods"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "aC" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "aD" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"aE" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/derelict/ship) +"aE" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_c (EAST)"; icon_state = "swall_c"; dir = 4},/area/derelict/ship) "aF" = (/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "aG" = (/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "aH" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/derelict/ship) -"aI" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/derelict/ship) -"aJ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/space,/area/derelict/ship) +"aI" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (EAST)"; icon_state = "propulsion_l"; dir = 4},/turf/space,/area/derelict/ship) +"aJ" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_c (EAST)"; icon_state = "swall_c"; dir = 4},/area/derelict/ship) "aK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/derelict/ship) "aL" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"aM" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/derelict/ship) +"aM" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (NORTH)"; icon_state = "swall_t"; dir = 1},/area/space) "aN" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "aO" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "aP" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) @@ -51,33 +51,33 @@ "aY" = (/obj/structure/table/standard,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "aZ" = (/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,/turf/simulated/shuttle/plating,/area/derelict/ship) "ba" = (/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bb" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/space) -"bc" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/space) -"bd" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/space) -"be" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/space) +"bb" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/space) +"bc" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (EAST)"; icon_state = "swall_straight"; dir = 4},/area/space) +"bd" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s"; icon_state = "swall_s"},/area/space) +"be" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_c (WEST)"; icon_state = "swall_c"; dir = 8},/area/space) "bf" = (/obj/structure/table/standard,/obj/item/device/analyzer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bg" = (/obj/structure/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bh" = (/obj/machinery/door/airlock/glass{name = "Living Module"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bi" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bj" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/space) -"bk" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/space) +"bj" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (WEST)"; icon_state = "swall_t"; dir = 8},/area/space) +"bk" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_c (NORTH)"; icon_state = "swall_c"; dir = 1},/area/space) "bl" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) -"bm" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space) -"bn" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/space) +"bm" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t (EAST)"; icon_state = "swall_t"; dir = 4},/area/space) +"bn" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/derelict/ship) "bo" = (/obj/machinery/door/window/northright,/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bp" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "br" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) -"bs" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/derelict/ship) -"bt" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/derelict/ship) -"bu" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/space) +"bs" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/derelict/ship) +"bt" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{tag = "icon-swall_c (EAST)"; icon_state = "swall_c"; dir = 4},/area/space) +"bu" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t"; icon_state = "swall_t"},/area/space) "bv" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space) -"bw" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space) +"bw" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (NORTH)"; icon_state = "swall_s"; dir = 1},/area/space) "bx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/derelict/ship) "by" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bz" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/space) -"bA" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/space) -"bB" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/space) +"bz" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (WEST)"; icon_state = "swall_s"; dir = 8},/area/space) +"bA" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_c (NORTH)"; icon_state = "swall_c"; dir = 1},/area/derelict/ship) +"bB" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_c"; icon_state = "swall_c"},/area/derelict/ship) "bC" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bD" = (/obj/item/weapon/material/shard,/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bE" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) @@ -89,41 +89,41 @@ "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) -"bN" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/derelict/ship) +"bN" = (/obj/machinery/power/solar/fake,/turf/simulated/floor/airless,/area/space) "bO" = (/obj/item/trash/cheesie,/turf/space,/area/space) "bP" = (/obj/machinery/door/blast/regular{id = "oldship_gun"; name = "Pod Bay Door"},/turf/simulated/shuttle/plating,/area/derelict/ship) "bQ" = (/obj/machinery/mass_driver{dir = 8; icon_state = "mass_driver"; id = "oldship_gun"},/turf/simulated/shuttle/plating,/area/derelict/ship) "bR" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/plating,/area/derelict/ship) "bS" = (/obj/machinery/door/airlock/glass{name = "Pod Bay"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bT" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bU" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/derelict/ship) +"bU" = (/turf/simulated/floor/airless,/area/space) "bV" = (/obj/machinery/computer/pod{id = "oldship_gun"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bW" = (/obj/structure/table/standard,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bX" = (/obj/structure/table/standard,/obj/item/device/radio/off,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "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/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash/c1,/turf/simulated/floor/engine,/area/tcommsat/computer) -"cc" = (/obj/structure/table/standard,/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) +"bZ" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/space) +"ca" = (/turf/simulated/floor/reinforced,/area/tcommsat/computer) +"cb" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cc" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cd" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Lounge"},/turf/simulated/floor/tiled,/area/tcommsat/computer) "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/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) +"cj" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/tiled,/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) "cn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "co" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) -"cp" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"cq" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/tcommsat/computer) -"cr" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"cs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/tcommsat/computer) +"cp" = (/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cq" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cr" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cs" = (/obj/structure/table/standard,/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/tiled,/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/chair{dir = 8},/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor,/area/tcommsat/computer) -"cv" = (/turf/simulated/floor,/area/tcommsat/computer) +"cu" = (/obj/structure/filingcabinet,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cv" = (/obj/machinery/computer/telecomms/traffic,/turf/simulated/floor/tiled,/area/tcommsat/computer) "cw" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/turret_protected/tcomsat) "cx" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cy" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) @@ -131,12 +131,12 @@ "cA" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "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) +"cD" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor/tiled,/area/tcommsat/computer) "cE" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Solars"; dir = 8},/turf/space,/area/space) -"cF" = (/obj/structure/table/standard,/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/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor,/area/tcommsat/computer) -"cH" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor,/area/tcommsat/computer) -"cI" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/tcommsat/computer) +"cF" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cG" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/turf/simulated/floor/reinforced,/area/tcommsat/computer) +"cH" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -29; pixel_y = 0},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cI" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled,/area/tcommsat/computer) "cJ" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/turret_protected/tcomsat) "cK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cL" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) @@ -144,10 +144,10 @@ "cN" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cO" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/closet,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "cP" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat) -"cQ" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/turf/simulated/floor/engine,/area/tcommsat/computer) -"cR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor,/area/tcommsat/computer) -"cS" = (/obj/machinery/computer/telecomms/monitor{network = "tcommsat"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; name = "General Listening Channel"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/computer) -"cT" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/tcommsat/computer) +"cQ" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"cT" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) "cU" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "cV" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) "cW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) @@ -155,141 +155,141 @@ "cY" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/turret_protected/tcomsat) "cZ" = (/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat) "da" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"db" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/tcommsat/computer) -"dc" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/tcommsat/computer) -"dd" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor,/area/tcommsat/computer) -"de" = (/obj/machinery/computer/telecomms/server{network = "tcommsat"},/turf/simulated/floor,/area/tcommsat/computer) -"df" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor,/area/tcommsat/computer) -"dg" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor,/area/tcommsat/computer) -"dh" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/machinery/airlock_sensor/airlock_exterior{frequency = 1381; id_tag = "server_access_ex_sensor"; master_tag = "server_access_airlock"; pixel_x = 25; pixel_y = 22},/turf/simulated/floor,/area/tcommsat/computer) -"di" = (/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "server_access_sensor"; pixel_x = 12; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1381; id_tag = "server_access_pump"},/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller{frequency = 1381; id_tag = "server_access_airlock"; name = "Server Access Airlock"; pixel_x = 0; pixel_y = 25; tag_airpump = "server_access_pump"; tag_chamber_sensor = "server_access_sensor"; tag_exterior_door = "server_access_outer"; tag_exterior_sensor = "server_access_ex_sensor"; tag_interior_door = "server_access_inner"; tag_interior_sensor = "server_access_in_sensor"; tag_secure = 1},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"dj" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1381; icon_state = "door_locked"; id_tag = "server_access_outer"; locked = 1; name = "Telecoms Server Access"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/tcommsat/chamber) -"dk" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"dl" = (/obj/machinery/door/airlock/hatch{name = "Telecoms Lounge"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "vault"; dir = 5},/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) -"dp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/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{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) -"dq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/hatch{name = "Telecoms Control Room"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) +"db" = (/obj/machinery/computer/telecomms/monitor{network = "tcommsat"},/obj/item/device/radio/intercom{name = "General Listening Channel"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dc" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"de" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"df" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dg" = (/obj/machinery/computer/telecomms/server{network = "tcommsat"},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dh" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash/c1,/turf/simulated/floor/reinforced,/area/tcommsat/computer) +"di" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dj" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dk" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dm" = (/obj/structure/bed/chair{dir = 8},/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dn" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"do" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"dp" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"dq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/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/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "dr" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space) -"ds" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; set_temperature = 73; use_power = 1},/turf/simulated/floor,/area/tcommsat/computer) -"dt" = (/obj/machinery/light{dir = 8},/obj/structure/table/standard,/obj/item/device/multitool,/obj/structure/sign/electricshock{pixel_x = -32},/turf/simulated/floor,/area/tcommsat/computer) -"du" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/tcommsat/computer) -"dv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/tcommsat/computer) +"ds" = (/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/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"dt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"du" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/hatch{name = "Telecoms Control Room"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/tcommsat/computer) +"dv" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/tcommsat/computer) "dw" = (/turf/simulated/wall/r_wall,/area/tcommsat/chamber) -"dx" = (/obj/machinery/vending/cola,/turf/simulated/floor,/area/tcommsat/computer) -"dy" = (/obj/machinery/vending/snack,/turf/simulated/floor,/area/tcommsat/computer) -"dz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) -"dA" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/tcommsat/computer) -"dB" = (/obj/item/weapon/cigbutt,/obj/machinery/light,/turf/simulated/floor,/area/tcommsat/computer) -"dC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/computer) +"dx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dy" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dz" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dA" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dB" = (/obj/item/weapon/cigbutt,/obj/machinery/light,/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tcommsat/computer) "dD" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer) "dE" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/space) -"dF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) -"dG" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"dH" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/space) -"dI" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"dF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dG" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/grille,/turf/simulated/floor/airless,/area/space) +"dI" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/airless,/area/space) "dJ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/turret_protected/tcomsat) "dK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/light,/turf/space,/area/turret_protected/tcomsat) "dL" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area/turret_protected/tcomsat) -"dM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/computer) -"dN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/tcommsat/computer) -"dO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/tcommsat/computer) -"dP" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -29; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/computer) -"dQ" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/tcommsat/computer) -"dR" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor,/area/tcommsat/computer) -"dS" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Lounge"},/turf/simulated/floor,/area/tcommsat/computer) -"dT" = (/obj/machinery/porta_turret/stationary,/turf/simulated/floor/plating/airless,/area/turret_protected/tcomsat) +"dM" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/airless,/area/space) +"dN" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"dO" = (/obj/machinery/light{dir = 8},/obj/structure/table/standard,/obj/item/device/multitool,/obj/structure/sign/electricshock{pixel_x = -32},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dQ" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; set_temperature = 73; use_power = 1},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/machinery/airlock_sensor/airlock_exterior{frequency = 1381; id_tag = "server_access_ex_sensor"; master_tag = "server_access_airlock"; pixel_x = 25; pixel_y = 22},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) +"dS" = (/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "server_access_sensor"; pixel_x = 12; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1381; id_tag = "server_access_pump"},/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller{frequency = 1381; id_tag = "server_access_airlock"; name = "Server Access Airlock"; pixel_x = 0; pixel_y = 25; tag_airpump = "server_access_pump"; tag_chamber_sensor = "server_access_sensor"; tag_exterior_door = "server_access_outer"; tag_exterior_sensor = "server_access_ex_sensor"; tag_interior_door = "server_access_inner"; tag_interior_sensor = "server_access_in_sensor"; tag_secure = 1},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (WEST)"; icon_state = "warningcee"; dir = 8},/turf/simulated/floor/plating,/area/tcommsat/chamber) +"dT" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1381; icon_state = "door_locked"; id_tag = "server_access_outer"; locked = 1; name = "Telecoms Server Access"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber) "dU" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) -"dV" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor,/area/tcommsat/computer) -"dW" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/tcommsat/computer) -"dX" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor,/area/tcommsat/computer) -"dY" = (/turf/simulated/floor/engine,/area/tcommsat/computer) -"dZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ea" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) -"eb" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) -"ec" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ed" = (/obj/structure/window/reinforced{dir = 4},/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) +"dV" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/industrial/warning/cee{tag = "icon-warningcee (EAST)"; icon_state = "warningcee"; dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber) +"dW" = (/obj/machinery/door/airlock/hatch{name = "Telecoms Lounge"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/tcommsat/computer) +"dX" = (/obj/machinery/porta_turret/stationary,/turf/simulated/floor/airless,/area/turret_protected/tcomsat) +"dY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/chamber) +"dZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber) +"ea" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/yellow,/turf/simulated/floor/plating,/area/tcommsat/chamber) +"eb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor/plating,/area/tcommsat/chamber) +"ec" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber) +"ed" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1381; icon_state = "door_locked"; id_tag = "server_access_inner"; locked = 1; name = "Telecoms Server Access"; req_access = list(61)},/turf/simulated/floor/plating,/area/tcommsat/chamber) "ee" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/space,/area/turret_protected/tcomsat) "ef" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "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/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"eh" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "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/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/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/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) +"ek" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"el" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"em" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "en" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/space,/area/turret_protected/tcomsat) "eo" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ep" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"ep" = (/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) "eq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "er" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) "es" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) -"et" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"et" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "eu" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/space,/area/turret_protected/tcomsat) -"ev" = (/obj/machinery/telecomms/server/presets/supply,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ew" = (/obj/machinery/telecomms/server/presets/service,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"ev" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"ew" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) "ex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ey" = (/obj/machinery/telecomms/server/presets/common,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"ez" = (/obj/machinery/telecomms/server/presets/engineering,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"ey" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"ez" = (/obj/machinery/telecomms/server/presets/service,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) "eA" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/space,/area/turret_protected/tcomsat) "eB" = (/obj/machinery/airlock_sensor/airlock_interior{frequency = 1381; id_tag = "server_access_in_sensor"; name = "interior sensor"; pixel_y = 25},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "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/standard,/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) +"eD" = (/obj/machinery/telecomms/server/presets/supply,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) "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) +"eF" = (/obj/machinery/telecomms/server/presets/unused,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) "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/server/presets/unused,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"eH" = (/obj/machinery/telecomms/server/presets/common,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"eI" = (/obj/machinery/telecomms/server/presets/engineering,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) "eJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/telecomms/broadcaster/preset_right,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; 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) "eL" = (/obj/machinery/airlock_sensor/airlock_interior{frequency = 1381; id_tag = "server_access_in_sensor"; master_tag = "server_access_airlock"; name = "interior sensor"; pixel_x = 8; pixel_y = 25},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eM" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat) "eN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat) -"eO" = (/obj/structure/table/standard,/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/standard,/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) +"eO" = (/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/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"eP" = (/obj/structure/table/standard,/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/tiled,/area/turret_protected/tcomsat) +"eQ" = (/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/tiled,/area/turret_protected/tcomsat) "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) -"eV" = (/obj/machinery/telecomms/processor/preset_two,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"eW" = (/obj/machinery/telecomms/bus/preset_two,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"eX" = (/obj/machinery/telecomms/relay/preset/telecomms,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"eV" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Storage"},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"eW" = (/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"eX" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "eY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/telecomms/hub/preset,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"eZ" = (/obj/machinery/telecomms/relay/preset/station,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fa" = (/obj/machinery/telecomms/bus/preset_four,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fb" = (/obj/machinery/telecomms/processor/preset_four,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"eZ" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fa" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) "fc" = (/obj/structure/sign/nosmoking_2{pixel_x = 32; pixel_y = 0},/obj/machinery/light{dir = 4},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "fd" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/space,/area/turret_protected/tcomsat) -"fe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"ff" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Telecoms Storage"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) -"fg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/turret_protected/tcomsat) -"fh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/turret_protected/tcomsat) -"fi" = (/obj/structure/table/standard,/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/bluespacerelay,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fm" = (/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"fn" = (/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) +"fe" = (/obj/machinery/telecomms/bus/preset_two,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"ff" = (/obj/machinery/telecomms/processor/preset_two,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fg" = (/obj/machinery/telecomms/relay/preset/telecomms,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fh" = (/obj/machinery/telecomms/bus/preset_four,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fi" = (/obj/machinery/telecomms/relay/preset/station,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fj" = (/obj/machinery/telecomms/processor/preset_four,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fk" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"fl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fm" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Telecoms Storage"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"fn" = (/obj/structure/table/standard,/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/tiled,/area/turret_protected/tcomsat) +"fo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fp" = (/obj/machinery/telecomms/processor/preset_one,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/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/standard,/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/standard,/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/standard,/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/standard,/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/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"fB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/purple,/turf/simulated/floor/plating,/area/tcommsat/chamber) +"fs" = (/obj/machinery/telecomms/bus/preset_one,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"ft" = (/obj/machinery/bluespacerelay,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fu" = (/obj/machinery/telecomms/processor/preset_three,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fv" = (/obj/machinery/telecomms/bus/preset_three,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fw" = (/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fx" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fy" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fz" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/item/weapon/stock_parts/subspace/transmitter,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fA" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor/tiled,/area/turret_protected/tcomsat) +"fB" = (/obj/structure/table/standard,/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/tiled,/area/turret_protected/tcomsat) "fC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat) -"fD" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1381; icon_state = "door_locked"; id_tag = "server_access_inner"; locked = 1; name = "Telecoms Server Access"; req_access = list(61)},/turf/simulated/floor{icon_state = "vault"; dir = 5},/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) +"fD" = (/obj/machinery/telecomms/server/presets/medical,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fE" = (/obj/machinery/telecomms/server/presets/science,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fF" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 9},/turf/simulated/floor/tiled/dark,/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) @@ -298,110 +298,104 @@ "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/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) +"fO" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6},/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fP" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 5},/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fQ" = (/obj/machinery/telecomms/server/presets/command,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fR" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fS" = (/obj/machinery/telecomms/server/presets/security,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"fT" = (/obj/machinery/porta_turret{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"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},/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/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/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/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"gc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"gd" = (/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) -"ge" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/tcommsat/entrance) -"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) +"fX" = (/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"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"fY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"fZ" = (/obj/machinery/porta_turret{dir = 10},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"ga" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gb" = (/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/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gc" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"gd" = (/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/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomfoyer) +"ge" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) "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) +"gi" = (/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/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomfoyer) +"gj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gk" = (/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/tiled{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) +"gl" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/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},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/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) +"gp" = (/turf/simulated/floor/tiled,/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" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/tcommsat/entrance) -"gs" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"gt" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"gu" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 5},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"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/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"gr" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gs" = (/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/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer) +"gt" = (/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/tiled,/area/turret_protected/tcomfoyer) +"gu" = (/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/tiled,/area/tcommsat/entrance) +"gv" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Telecommunications Main Breaker"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gx" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gy" = (/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/tiled,/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" = (/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) -"gB" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Telecommunications Main Breaker"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/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) +"gA" = (/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/tiled,/area/tcommsat/entrance) +"gB" = (/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gC" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gD" = (/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/tiled,/area/tcommsat/entrance) +"gE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/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) +"gG" = (/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/tiled,/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) +"gI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gJ" = (/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/tiled,/area/tcommsat/entrance) +"gK" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gL" = (/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/tiled,/area/tcommsat/entrance) +"gM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gN" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gO" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance North"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gP" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/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/tiled,/area/tcommsat/entrance) +"gR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/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) +"gT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gU" = (/obj/item/weapon/cell,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gV" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"gW" = (/obj/structure/closet/malf/suits,/turf/simulated/floor/tiled,/area/tcommsat/entrance) "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) +"ha" = (/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/airless,/area/space) +"hb" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hc" = (/obj/machinery/bluespace_beacon,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hd" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"he" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/airless,/area/space) +"hf" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/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) +"hh" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance South"; dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hi" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hj" = (/obj/machinery/light{dir = 4},/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hk" = (/obj/machinery/teleport/station,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hl" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/tiled,/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/material/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) +"hp" = (/obj/machinery/teleport/hub,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"hq" = (/obj/machinery/teleport/station,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele) +"hr" = (/obj/structure/computerframe,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele) +"hs" = (/turf/simulated/floor/airless,/area/AIsattele) +"ht" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/airless,/area/AIsattele) +"hu" = (/obj/structure/cable,/turf/simulated/floor/airless,/area/AIsattele) +"hv" = (/obj/structure/table/rack,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/airless,/area/AIsattele) +"hw" = (/obj/structure/girder,/turf/simulated/floor/airless,/area/AIsattele) "hx" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) "hy" = (/turf/space,/area/AIsattele) -"hz" = (/obj/structure/table,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hz" = (/obj/item/weapon/cell,/turf/simulated/floor/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/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) -"hE" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating/airless,/area/AIsattele) -"hF" = (/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) -"hG" = (/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) -"hH" = (/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) -"hI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/turret_protected/tcomfoyer) -"hJ" = (/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) -"hK" = (/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/AIsattele) +"hB" = (/obj/structure/grille/broken,/turf/simulated/floor/airless,/area/AIsattele) +"hC" = (/obj/structure/table,/turf/simulated/floor/airless,/area/AIsattele) +"hD" = (/obj/structure/closet,/turf/simulated/floor/airless,/area/AIsattele) +"hE" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/airless,/area/AIsattele) +"hF" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/airless,/area/AIsattele) "hL" = (/obj/structure/grille/broken,/turf/space,/area/AIsattele) "hM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/telecomms/receiver/preset_right,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"hN" = (/obj/machinery/computer/telecomms/traffic,/turf/simulated/floor,/area/tcommsat/computer) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -428,27 +422,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacadaeaaaaaaaaaaaaaaabaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacafagagahaiajakadaeaaaaaaaaabakalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabamanagagagagagagaoajapaeaaaaabaqarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabapakatagagagagauagagagavapaeabaqawarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabapafaxajacadayazaAacacaBakakakamawawarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavafagaCagaDaEaFagaGagagagagagagaHawaIacaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEagagagagaDaEagagagagagagagagagavacapaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKagagagagaLaEagagaMaNacacatagaOaEaPajakadaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQagagagagagaEagagaEagaRaSaEagagaEaTagagajapaeaaabadacacacacacacacadaeaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQaVaDagagagaWagagaEaXaYaOaEagagaZagagagagajapacapafagagagbaagagagajamaUaaaabbbcbdbdbdbdbdbdbdbcbeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQbfbgagagagaNagagaEagagagaEagagbhagagagagagbiagbiagagagagagagagagagbiaUaaaUbjbkblblblblblblblbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQaDaDagagagaWagagaEbobpagaEagagaZagagagagaMapacapatagagagagagagbqaMamaUaUaUbrblblblblblblblblblbraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQagagagagagaEagagajacacaNafagagaEagagagaMapbsaabtakacacacacacacacakbsaaaaaUbjbublblblblbvblblbwbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxagagagagbyavatagagagagagagagagaEagagadakbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaabzbAbdbdbdbdbdbdbdbAbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEbCbDbEagaMapakacacadatagagagagavacapbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavatbFbGaMapafbHbIbJajambKbLaGbMaHawbNacalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtakadacapafagagagagagaEagagaMadamawawarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbRagagagagagagbSbTaMapbsbtbUawarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtacambVagagagagagavadapbsaaaabtbUarasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtadatagbWbXaMapakbsaaaaaaaabtadaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtakacacacakbsaaaaaaaaaaaaaabtbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacaeadaaaaaaaaaaaaaaabadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacafagagahagajaiaeadaaaaaaaaabapakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabalanagagagagagagaoajapadaaaaabaqamaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabapaiasagagagagauagagagatapadabaqawamaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabapafaxajacaeayazaAacacaBaiaiaialawawamaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatafagaCagaDavaFagaGagagagagagagaHawaEaiaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavagagagagaDavagagagagagagagagagatacapadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKagagagagaLavagagaJaNacacasagaOavaPajaiaeadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQagagagagagavagagavagaRaSavagagavaTagagajapadaaabaeacacacacacacacaeadaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQaVaDagagagaWagagavaXaYaOavagagaZagagagagajapacapafagagagbaagagagajalaUaaaabbaMbcbcbcbcbcbcbcaMbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQbfbgagagagaNagagavagagagavagagbhagagagagagbiagbiagagagagagagagagagbiaUaaaUbjbeblblblblblblblbkbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQaDaDagagagaWagagavbobpagavagagaZagagagagaJapacapagagagagagagagbqaJalaUaUaUbrblblblblblblblblblbraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQagagagagagavagagajacacaNafagagavagagagaJapbnaabsaiacacacacacacacaibnaaaaaUbjblblblblblbvblblbtbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxagagagagbyatasagagagagagagagagavagagaeaibnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaabwbubcbcbcbcbcbcbcbubzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavbCbDbEagaJapaiacacaeasagagagagatacapbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatasbFbGaJapafbHbIbJajalbKbLaGbMaHawbAaeakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsaiaeacapafagagagagagavagagaJaealawawamaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbRagagagagagagbSbTaJapbnbsbBawamaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsacalbVagagagagagataeapbnaaaabsbBamaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsaeasagbWbXaJapaibnaaaaaaaabsapaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsaiacacacaibnaaaaaaaaaaaaaabsbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -496,79 +490,79 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaaaaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaUaUaUbZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaadraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaUaUaUbZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadraabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZeRbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUaUcacacacacacacaaUaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaacaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYbYbYcdbYbYbYbYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaUaUaUbNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaadraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaUaUaUbNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadraabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNeRbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUaUbUbUbUbUbUbUbUaUaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaabUaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYbYbYbZbYbYbYbYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececececececececececececececececececececececececececebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececfcfcfcfcfcfcfcfcfcecececececececececgcgcgcgcgcgcgcgcebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcictckclcmcncocfcgcgcgcgcgcgcgcgdYcgdXdWdVdSdRcvcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchcwcxcyczcAcBcCcgdQcDcccFhNcGcgcQcgdPcvcvcvcvcvcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJcKcLcMcNcOcPcgdddgdfcTcRcScgcQcgcIcvcvcvcvcvcgceceaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicUcVcWcXcYcZdadbdccvcvcqdecgcbcgcpcjcscrcHcucgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJdmdndodpdpdpdqdMdvdNdvdudwdwdwcgdydxdCdBdAdzdDdEdEdFdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYbYbYbYcecfcichcicJdIdJdKdLdLdLcgdtdsdOcvdhdjdidkcgcgcgdlcgcgcgcgcecebYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYdrbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUbYcecfchdTchdUdIcCdwdwdwdwdwfefBfAgcgbdwdwfDdwdwdUebfCchdTchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaaaabYcecfcichcicJedeedwefefefegekeieGefdZeLeBeleodwdUebcPcichcicfcebYbYaaaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacacacacacacacacacacacacacacacacacaaabYcecfcichcicJemendwefelelelecelepelecelelelefdwdUebcPeqerescfcecebYaUcacacacacacacacacacacacacacacacacaaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcaaabYcecfcichcicJeteudwefeveweIeceleJeleceleyezefdweAgdcPeCeDeHeFcfcebYaacabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacacEbYcecfcichcicJebejdwefelelelecfmexfnecelelelefdweKeheMeNeOePeQcfcebYeEcaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacaeScdcecfchchchdUdIeTdweUeVeWeXdZefeYefdZeZfafbfcdwfdeadnfffgfhficfcecdeScaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacaaabYcecfcichcicJdIcPdweffjfkflecfmexfnecflfofpefdwcJebfqfrfsftfucfcebYaacaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcaaabYcecfcichcicJebcPdwefelelelecelhMelecelelelefdwcJebcPeCfvfwfxcfcebYaacabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacacacacacacacacacacacacacacacacacaaabYcecfcichcicJdIcPdweffyfzgsgtelepelgugyfEfFefdwcJebcPfGerescfcecebYaUcacacacacacacacacacacacacacacacacaaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaaaabYcecfcichcicJdIcPdwefefeffHefefgFefeffJefefefdwcJebcPcichcicfcebYbYaaaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcecfchdTchdUebcCdwdwdwdwdwdwdwfKdwdwdwdwdwdwdwdUebcCchdTchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYcecfcichcicJebfLfMcZcZfNfOfPfQgLfSfTfUfNcZcZfVfWebcPcichcicfcebYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYbYbYdrbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJfXdndndndnfYfZgagahGgagahIhJdndndndnhHcPcichhmcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfgYchcicidLdLghdLdLfNgigjgkglgkgmgnfNdLdLdLdLdLcicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicicichcigofNfNfNfNgpfNfNfNfNgocicicicicicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchchchchchchgqgAgBhxhDgvgwhxgxhFgzchchchchchchchchcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcicicicicicfgogrgegCgDgEgDgggDgGgocfcicicicicichcfcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececfcfcfcfcfcfcfgogogogogHgIgHgogogogocfcfcfcfcfcfcfcecebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececececececececececegogJgKgfgocececececececececececebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYgogogMgvgNgogobYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcacabYbYgogogOgPgQgDgRgogobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacagogogSgTgUgxgxgxgxgVgobYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacagWgXhggZhagxgxhbgxgxhcgobYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacahdgHgogohehfgxgxgxgxgVgobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcacabYbYgogofRhhhhhhhigogobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYgogohjhkhlgogobYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcictckclcmcncocfcgcgcgcgcgcgcgcgcacgcccbcjcdcqcpcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchcwcxcyczcAcBcCcgcrcucscDcvcFcgcGcgcHcpcpcpcpcpcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJcKcLcMcNcOcPcgcIcRcQcTcSdbcgcGcgdccpcpcpcpcpcgceceaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicUcVcWcXcYcZdadddecpcpdfdgcgdhcgdjdidldkdndmcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJdpdodsdqdqdqdudtdxdvdxdydwdwdwcgdAdzdCdBdGdFdDdEdEdHdMdIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYbYbYbYcecfcichcicJdNdJdKdLdLdLcgdOdQdPcpdRdTdSdVcgcgcgdWcgcgcgcgcecebYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYdrbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUbYcecfchdXchdUdNcCdwdwdwdwdwdYeadZecebdwdweddwdwdUehfCchdXchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNaaaabYcecfcichcicJekeedwefefefegeleieGefemeLeBepeodwdUehcPcichcicfcebYbYaaaUbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUaabYcecfcichcicJetendwefepepepevepewepevepepepefdwdUehcPeqerescfcecebYaUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbUaabYcecfcichcicJeyeudwefeDezeFevepeJepevepeHeIefdweAeOcPeCePeVeQcfcebYaabUbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaabUcEbYcecfcichcicJehejdwefepepepeveWexeWevepepepefdweKeXeMeNeZfbfacfcebYeEbUaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaabUeSbZcecfchchchdUdNeTdweUfffefgemefeYefemfifhfjfcdwfdfkdofmflfofncfcebZeSbUaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaabUaabYcecfcichcicJdNcPdweffsfpfteveWexeWevftfufvefdwcJehfqfrfwfyfxcfcebYaabUaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbUaabYcecfcichcicJehcPdwefepepepevephMepevepepepefdwcJehcPeCfzfBfAcfcebYaabUbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUaabYcecfcichcicJdNcPdweffEfDfOfFepewepfPfRfQfSefdwcJehcPfGerescfcecebYaUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUbUaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNaaaabYcecfcichcicJdNcPdwefefeffHefefgFefeffJefefefdwcJehcPcichcicfcebYbYaaaUbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcecfchdXchdUehcCdwdwdwdwdwdwdwfKdwdwdwdwdwdwdwdUehcCchdXchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYcecfcichcicJehfLfMcZcZfNfUfTfYfXgafZgbfNcZcZfVfWehcPcichcicfcebYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYbYbYdrbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJgcdodododogdgfgegegggegegjgidodododogkcPcichhmcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfgYchcicidLdLghdLdLfNgmglgpgngpgrgsfNdLdLdLdLdLcicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicicichcigofNfNfNfNgtfNfNfNfNgocicicicicicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchchchchchchgqgugvhxgxgwgyhxgBgAgzchchchchchchchchcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcicicicicicfgogCgEgDgIgGgIgJgIgKgocfcicicicicichcfcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececfcfcfcfcfcfcfgogogogogHgLgHgogogogocfcfcfcfcfcfcfcecebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececececececececececegogNgMgOgocececececececececececebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYgogogBgwgBgogobYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbUbUbYbYgogogPgRgQgIgTgogobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUgogogSgVgUgBgBgBgBgWgobYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUhagXhggZhbgBgBhcgBgBhdgobYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUhegHgogohfgBgBgBgBgBgWgobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbUbUbYbYgogohhhihihihjgogobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYgogohlhkhpgogobYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYgogogogogobYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaabYbYbYcdbYbYbYaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaacaaaaaaUaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaUcacacacacacacaaUaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYfIbZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadraabZcabZaUaUaUbZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaUaUaUbZcabZaadraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaabYbYbYbZbYbYbYaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaabUaaaaaUaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaUbUbUbUbUbUbUbUaUaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYfIbNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadraabNbUbNaUaUaUbNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaUaUaUbNbUbNaadraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabNbUbNaaaaaabNbUbNaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaaaaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYdrbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -589,14 +583,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohohohohoaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUhohohphqhrhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUhohohshrhthrhuhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahvhwhrhKhyhrhrhzhoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahrhrhrhAhAhAhrhrhoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohrhAhAhyhAhyhBhoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUhohohChLhyhAhEhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUhohohrhAhrhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohohrhohoaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUhohohrhqhshohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUhohohthshuhshvhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahwhzhshBhyhshshChoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahshshshAhAhAhshshoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohshAhAhyhAhyhDhoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUhohohEhLhyhAhFhohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUhohohshAhshohoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohohshohoaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaUaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaUaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnhnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-4.dmm b/maps/exodus-4.dmm index bce4896cbbd..a16652b6190 100644 --- a/maps/exodus-4.dmm +++ b/maps/exodus-4.dmm @@ -1,177 +1,173 @@ "aa" = (/turf/space,/area/space) "ab" = (/obj/structure/lattice,/turf/space,/area/space) "ac" = (/turf/simulated/wall,/area/constructionsite/maintenance) -"ad" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/maintenance) -"ae" = (/turf/simulated/floor/plating/airless,/area/constructionsite/maintenance) +"ad" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite/maintenance) +"ae" = (/turf/simulated/floor/airless,/area/constructionsite/maintenance) "af" = (/turf/simulated/wall,/area/constructionsite/bridge) -"ag" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/bridge) +"ag" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite/bridge) "ah" = (/turf/simulated/floor/airless,/area/constructionsite/bridge) -"ai" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating/airless,/area/constructionsite/maintenance) -"aj" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating/airless,/area/constructionsite/bridge) +"ai" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite/maintenance) +"aj" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite/bridge) "ak" = (/turf/simulated/floor/airless,/area/space) -"al" = (/turf/simulated/floor/plating/airless,/area/space) +"al" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) "am" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access = list(19)},/turf/simulated/floor/airless,/area/constructionsite/bridge) -"an" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) +"an" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) "ao" = (/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) "ap" = (/turf/simulated/wall,/area/constructionsite/hallway/fore) -"aq" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) +"aq" = (/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) "ar" = (/obj/machinery/door/airlock/glass{name = "Library"},/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) "as" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access = list(19)},/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) -"at" = (/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) -"au" = (/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) +"at" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"au" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "av" = (/turf/simulated/wall,/area/space) "aw" = (/turf/simulated/wall,/area/constructionsite/storage) "ax" = (/turf/simulated/floor/airless,/area/constructionsite/storage) "ay" = (/obj/machinery/door/airlock/glass_science,/turf/simulated/floor/airless,/area/constructionsite/storage) "az" = (/obj/machinery/door/airlock/glass_science,/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) "aA" = (/turf/simulated/wall,/area/constructionsite/teleporter) -"aB" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"aC" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating/airless,/area/constructionsite/storage) +"aB" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "aD" = (/turf/simulated/wall,/area/solar/constructionsite) -"aE" = (/turf/simulated/floor/plating/airless,/area/solar/constructionsite) +"aE" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/motion/engineering_outpost{c_tag = "Construction Site Teleporter"},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "aF" = (/obj/structure/lattice,/turf/space,/area/solar/constructionsite) "aG" = (/turf/space,/area/solar/constructionsite) -"aH" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/solar/constructionsite) -"aI" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"aJ" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"aK" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"aL" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/motion/engineering_outpost{c_tag = "Construction Site Teleporter"},/turf/simulated/floor,/area/constructionsite/teleporter) -"aM" = (/obj/structure/table/reinforced,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) -"aN" = (/obj/structure/table/reinforced,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) -"aO" = (/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 50},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) -"aP" = (/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) -"aQ" = (/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) -"aR" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"aS" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"aT" = (/turf/simulated/floor,/area/constructionsite/teleporter) -"aU" = (/obj/structure/table/reinforced,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/glasses/meson,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/weapon/tank/oxygen,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) -"aV" = (/obj/structure/table/reinforced,/obj/item/stack/material/phoron{amount = 10},/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter) +"aH" = (/obj/structure/table/reinforced,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aI" = (/obj/structure/table/reinforced,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aJ" = (/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 50},/obj/random/tech_supply,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aK" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aL" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aM" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aN" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aO" = (/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aP" = (/obj/structure/table/reinforced,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/glasses/meson,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/weapon/tank/oxygen,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aQ" = (/obj/structure/table/reinforced,/obj/item/stack/material/phoron{amount = 10},/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aR" = (/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"aS" = (/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/machinery/access_button/airlock_interior{master_tag = "constructionsite_airlock"; pixel_x = -20; pixel_y = 0; req_access = list(10)},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aT" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/port_gen/pacman,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"aU" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1379; id_tag = "constructionsite_vent"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor,/area/constructionsite/teleporter) +"aV" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1379; id_tag = "constructionsite_vent"},/obj/machinery/camera/network/engineering_outpost{c_tag = "Construction Site Teleporter Airlock"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor,/area/constructionsite/teleporter) "aW" = (/turf/simulated/wall,/area/constructionsite/ai) -"aX" = (/turf/simulated/floor/plating/airless,/area/constructionsite/ai) -"aY" = (/turf/simulated/floor/airless{tag = "icon-bcircuit"; icon_state = "bcircuit"},/area/constructionsite/ai) +"aX" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"aY" = (/obj/structure/cable/blue,/obj/machinery/power/port_gen/pacman,/obj/machinery/power/terminal,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "aZ" = (/obj/machinery/access_button/airlock_exterior{master_tag = "constructionsite_airlock"; pixel_x = 20; pixel_y = 0; req_access = list(10)},/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) -"ba" = (/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/machinery/access_button/airlock_interior{master_tag = "constructionsite_airlock"; pixel_x = -20; pixel_y = 0; req_access = list(10)},/turf/simulated/floor,/area/constructionsite/teleporter) -"bb" = (/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) -"bc" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1379; id_tag = "constructionsite_vent"},/turf/simulated/floor,/area/constructionsite/teleporter) +"ba" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite/storage) +"bb" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/machinery/light/small,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "constructionsite_airlock"; pixel_x = 0; pixel_y = -25; req_access = list(10); tag_airpump = "constructionsite_vent"; tag_chamber_sensor = "constructionsite_sensor"; tag_exterior_door = "constructionsite_outer"; tag_interior_door = "constructionsite_inner"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor,/area/constructionsite/teleporter) +"bc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/blue,/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "constructionsite_sensor"; pixel_x = 0; pixel_y = -25},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 6},/turf/simulated/floor,/area/constructionsite/teleporter) "bd" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "constructionsite_outer"; locked = 1; req_access = list(10)},/turf/simulated/floor,/area/constructionsite/teleporter) "be" = (/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) -"bf" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1379; id_tag = "constructionsite_vent"},/obj/machinery/camera/network/engineering_outpost{c_tag = "Construction Site Teleporter Airlock"},/turf/simulated/floor,/area/constructionsite/teleporter) -"bg" = (/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) -"bh" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/machinery/light/small,/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "constructionsite_airlock"; pixel_x = 0; pixel_y = -25; req_access = list(10); tag_airpump = "constructionsite_vent"; tag_chamber_sensor = "constructionsite_sensor"; tag_exterior_door = "constructionsite_outer"; tag_interior_door = "constructionsite_inner"},/turf/simulated/floor,/area/constructionsite/teleporter) +"bf" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"bg" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"bh" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/constructionsite/teleporter) "bi" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/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) -"bj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/blue,/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "constructionsite_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor,/area/constructionsite/teleporter) -"bk" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/constructionsite/teleporter) -"bl" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/constructionsite/teleporter) -"bm" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/constructionsite/teleporter) -"bn" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/constructionsite/teleporter) -"bo" = (/obj/item/device/radio/beacon,/turf/simulated/floor,/area/constructionsite/teleporter) -"bp" = (/obj/machinery/power/smes/batteryrack{should_be_mapped = 1},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/constructionsite/teleporter) -"bq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/blue{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor,/area/constructionsite/teleporter) -"br" = (/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{tag = "icon-map_connector (EAST)"; icon_state = "map_connector"; dir = 4},/turf/simulated/floor,/area/constructionsite/teleporter) -"bs" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/constructionsite/teleporter) -"bt" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/constructionsite/teleporter) -"bu" = (/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/autolathe,/turf/simulated/floor,/area/constructionsite/teleporter) -"bv" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/constructionsite/teleporter) -"bw" = (/obj/structure/window/basic,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{tag = "icon-map_connector (EAST)"; icon_state = "map_connector"; dir = 4},/turf/simulated/floor,/area/constructionsite/teleporter) -"bx" = (/obj/structure/cable/blue,/obj/machinery/power/apc/high{dir = 2; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "south bump"; pixel_y = -24},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/constructionsite/teleporter) -"by" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor,/area/constructionsite/teleporter) -"bz" = (/obj/machinery/pipedispenser,/turf/simulated/floor,/area/constructionsite/teleporter) -"bA" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"bB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"bC" = (/obj/machinery/computer/teleporter,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/constructionsite/teleporter) -"bD" = (/obj/machinery/light,/obj/structure/closet/crate/solar,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter) -"bE" = (/obj/machinery/teleport/hub,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/constructionsite/teleporter) -"bF" = (/obj/machinery/teleport/station,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/constructionsite/teleporter) -"bG" = (/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) -"bH" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload"; req_access = list(16)},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) -"bI" = (/obj/machinery/drone_fabricator/derelict,/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/power/apc/high{dir = 1; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "north bump"; pixel_y = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) -"bM" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) -"bN" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) -"bO" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor/plating/airless,/area/constructionsite/ai) -"bP" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{tag = "icon-bcircuit"; icon_state = "bcircuit"},/area/constructionsite/ai) -"bQ" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless{tag = "icon-bcircuit"; icon_state = "bcircuit"},/area/constructionsite/ai) -"bR" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/fore) -"bS" = (/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/aft) -"bT" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_one_access = list(65,5)},/turf/simulated/wall,/area/constructionsite/medical) +"bj" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"bk" = (/obj/item/device/radio/beacon,/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"bl" = (/obj/machinery/power/smes/batteryrack{should_be_mapped = 1},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bm" = (/obj/machinery/atmospherics/pipe/manifold/hidden/blue{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"bn" = (/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{tag = "icon-map_connector (EAST)"; icon_state = "map_connector"; dir = 4},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bo" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"bp" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/constructionsite/teleporter) +"bq" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"br" = (/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/autolathe,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bs" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bt" = (/obj/structure/window/basic,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{tag = "icon-map_connector (EAST)"; icon_state = "map_connector"; dir = 4},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bu" = (/obj/structure/cable/blue,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/power/apc/high/inactive{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bv" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bw" = (/obj/machinery/pipedispenser,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bx" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"by" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bz" = (/obj/machinery/computer/teleporter,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bA" = (/obj/machinery/light,/obj/structure/closet/crate/solar,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bB" = (/obj/machinery/teleport/hub,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bC" = (/obj/machinery/teleport/station,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bD" = (/turf/simulated/floor/airless,/area/solar/constructionsite) +"bE" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/solar/constructionsite) +"bF" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload Access"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/hallway/fore) +"bG" = (/turf/simulated/floor/airless,/area/constructionsite/ai) +"bH" = (/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) +"bI" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) +"bJ" = (/obj/machinery/drone_fabricator/derelict,/turf/simulated/floor/airless,/area/constructionsite/ai) +"bK" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/airless,/area/constructionsite/ai) +"bL" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/high/inactive{name = "north bump"; pixel_y = 24},/turf/simulated/floor/airless,/area/constructionsite/ai) +"bM" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) +"bN" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/airless,/area/constructionsite/ai) +"bO" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) +"bP" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) +"bQ" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) +"bR" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/hallway/fore) +"bS" = (/obj/machinery/recharge_station,/turf/simulated/floor/airless,/area/constructionsite/ai) +"bT" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) "bU" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_one_access = list(65,5)},/turf/simulated/wall,/area/constructionsite/hallway/aft) -"bV" = (/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics"; req_access = list(24)},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/aft) -"bW" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_one_access = list(65,5)},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/aft) +"bV" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload Access"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/hallway/aft) +"bW" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) "bX" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) "bY" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) -"bZ" = (/obj/machinery/power/apc/high{dir = 2; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "south bump"; pixel_y = -24},/obj/structure/cable/blue,/turf/simulated/floor/airless,/area/constructionsite/atmospherics) -"ca" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11,24)},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"cb" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"cc" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"cd" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"ce" = (/obj/machinery/power/smes/buildable,/obj/structure/cable/blue,/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"cf" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"cg" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"ch" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"ci" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) +"bZ" = (/obj/structure/cable/blue,/obj/machinery/power/apc/high/inactive{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) +"ca" = (/turf/simulated/floor/tiled/white/airless,/area/constructionsite/medical) +"cb" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite/medical) +"cc" = (/obj/machinery/sleeper,/turf/simulated/floor/tiled/white/airless,/area/constructionsite/medical) +"cd" = (/turf/simulated/floor/airless,/area/constructionsite/medical) +"ce" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_one_access = list(65,5)},/turf/simulated/floor/tiled/white/airless,/area/constructionsite/medical) +"cf" = (/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics"; req_access = list(24)},/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) +"cg" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "d_air_in"; name = "Mixed Air Supply Control"; output_tag = "d_air_out"; pressure_setting = 2000; sensors = list("d_air_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) +"ch" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1443; icon_state = "map_vent_in"; id_tag = "d_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/reinforced/airmix,/area/constructionsite/atmospherics) +"ci" = (/obj/machinery/light/small{dir = 1},/obj/machinery/air_sensor{frequency = 1443; id_tag = "d_air_sensor"; output = 7},/turf/simulated/floor/reinforced/airmix,/area/constructionsite/atmospherics) "cj" = (/obj/structure/lattice,/turf/space,/area/constructionsite/maintenance) -"ck" = (/obj/machinery/power/smes/buildable,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"cl" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"cm" = (/obj/structure/cable/blue,/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"cn" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/plating/airless,/area/space) -"co" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; id = null; state = 2},/turf/simulated/floor/plating/airless,/area/space) -"cs" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating/airless,/area/constructionsite/ai) +"ck" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) +"cl" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "map_injector"; id = "d_air_in"; use_power = 1},/turf/simulated/floor/reinforced/airmix,/area/constructionsite/atmospherics) +"cm" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/reinforced/airmix,/area/constructionsite/atmospherics) +"cn" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_one_access = list(65,5)},/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) +"co" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "d_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/reinforced/oxygen,/area/constructionsite/atmospherics) +"cp" = (/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,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/constructionsite/atmospherics) +"cq" = (/obj/machinery/light/small{dir = 1},/obj/machinery/air_sensor{frequency = 1441; id_tag = "d_o2_sensor"},/turf/simulated/floor/reinforced/oxygen,/area/constructionsite/atmospherics) +"cr" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "map_injector"; id = "d_o2_in"; use_power = 1},/turf/simulated/floor/reinforced/oxygen,/area/constructionsite/atmospherics) +"cs" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/reinforced/oxygen,/area/constructionsite/atmospherics) +"ct" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite) +"cu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "d_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/reinforced/nitrogen,/area/constructionsite/atmospherics) +"cv" = (/obj/machinery/light/small{dir = 1},/obj/machinery/air_sensor{frequency = 1441; id_tag = "d_n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/constructionsite/atmospherics) +"cw" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "map_injector"; id = "d_n2_in"; use_power = 1},/turf/simulated/floor/reinforced/nitrogen,/area/constructionsite/atmospherics) +"cx" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/reinforced/nitrogen,/area/constructionsite/atmospherics) +"cy" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite) +"cz" = (/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11,24)},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cA" = (/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cB" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cC" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cD" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cE" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cF" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cG" = (/obj/machinery/power/smes/buildable,/obj/structure/cable/blue,/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cH" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/constructionsite/engineering) "cI" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/wall,/area/constructionsite/hallway/fore) "cJ" = (/obj/structure/lattice,/turf/space,/area/constructionsite/hallway/fore) +"cK" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cL" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cM" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cN" = (/obj/machinery/power/smes/buildable,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cO" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cP" = (/obj/structure/cable/blue,/turf/simulated/floor/airless,/area/constructionsite/engineering) +"cQ" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/airless,/area/space) +"cR" = (/obj/machinery/field_generator,/turf/simulated/floor/airless,/area/space) +"cS" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/turf/simulated/floor/airless,/area/space) "cV" = (/turf/simulated/wall,/area/constructionsite/hallway/aft) "cW" = (/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) -"cX" = (/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/aft) "dm" = (/obj/structure/lattice,/turf/space,/area/constructionsite/hallway/aft) -"dy" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/aft) "eb" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/wall,/area/constructionsite/hallway/aft) -"ed" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/aft) -"eZ" = (/turf/simulated/floor/airless{icon_state = "white"},/area/constructionsite/medical) -"fa" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/medical) -"fb" = (/obj/machinery/sleeper,/turf/simulated/floor/airless{icon_state = "white"},/area/constructionsite/medical) -"fc" = (/turf/simulated/floor/plating/airless,/area/constructionsite/atmospherics) "fd" = (/turf/simulated/floor/airless,/area/constructionsite/atmospherics) -"fe" = (/turf/simulated/floor/plating/airless,/area/constructionsite/medical) "fg" = (/obj/structure/lattice,/turf/space,/area/constructionsite/medical) "fh" = (/turf/space,/area/constructionsite/medical) "fk" = (/turf/space,/area/constructionsite/hallway/aft) "fl" = (/turf/simulated/wall,/area/constructionsite/atmospherics) -"fm" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating/airless,/area/constructionsite/atmospherics) -"fn" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1443; input_tag = "d_air_in"; name = "Mixed Air Supply Control"; output_tag = "d_air_out"; pressure_setting = 2000; sensors = list("d_air_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating/airless,/area/constructionsite/atmospherics) -"fo" = (/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/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/constructionsite/atmospherics) -"fp" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "map_injector"; id = "d_o2_in"; use_power = 1},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/constructionsite/atmospherics) -"fq" = (/obj/machinery/light/small{dir = 1},/obj/machinery/air_sensor{frequency = 1443; id_tag = "d_air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/constructionsite/atmospherics) -"fr" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/floor/plating/airless,/area/constructionsite/atmospherics) "fs" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/wall,/area/constructionsite/atmospherics) -"ft" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "d_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/constructionsite/atmospherics) -"fu" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/constructionsite/atmospherics) "fw" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) "fx" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "d_o2_in"; name = "Oxygen Supply Control"; output_tag = "d_o2_out"; sensors = list("d_o2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) -"fy" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "map_injector"; id = "d_air_in"; use_power = 1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/constructionsite/atmospherics) -"fz" = (/obj/machinery/light/small{dir = 1},/obj/machinery/air_sensor{frequency = 1441; id_tag = "d_o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/constructionsite/atmospherics) -"fA" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "map_injector"; id = "d_n2_in"; use_power = 1},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/constructionsite/atmospherics) -"fB" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/constructionsite/atmospherics) "fC" = (/turf/simulated/wall,/area/constructionsite) -"fD" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite) "fE" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "d_n2_in"; name = "Nitrogen Supply Control"; output_tag = "d_n2_out"; sensors = list("d_n2_sensor" = "Tank")},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) -"fF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "d_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/constructionsite/atmospherics) -"fG" = (/obj/machinery/light/small{dir = 1},/obj/machinery/air_sensor{frequency = 1441; id_tag = "d_n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/constructionsite/atmospherics) -"fH" = (/turf/simulated/floor/plating/airless,/area/constructionsite) "fI" = (/obj/structure/lattice,/turf/space,/area/constructionsite) "fL" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) -"fM" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1443; icon_state = "map_vent_in"; id_tag = "d_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/constructionsite/atmospherics) -"fN" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/constructionsite/atmospherics) "fO" = (/turf/simulated/floor/airless,/area/constructionsite) "fP" = (/turf/space,/area/constructionsite) -"fQ" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating/airless,/area/constructionsite) "fR" = (/turf/simulated/wall,/area/constructionsite/engineering) -"fT" = (/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"fU" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) "fV" = (/obj/structure/lattice,/turf/space,/area/constructionsite/engineering) "fW" = (/turf/space,/area/constructionsite/engineering) -"fX" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/engineering) -"ge" = (/obj/machinery/field_generator,/turf/simulated/floor/plating/airless,/area/space) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -230,159 +226,159 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacaiacacacacafahahahahahahahahahahahafacacacacaiacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacaeaeaeaeaeaeaeaeaeaeajahahahahahahahahahahahajaeaeaeaeaeaeaeaeaeaeacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeaeaeaeacacacacacacacafafahahahahahahahahahafafacacacacacacacaeaeaeaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeaeaeacacakakakakakakakafafahahahahahahahafafakakakakalakalacacaeaeaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeaeacacakakakakakakakakakafafahahahahahafafakakakalakalakalakacacaeaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeacacakakakakakakakakakakakafafamamamafafakakakakakakakakalakalacacaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeacakakakakakakakakakakakakakanaoaoaoanakakakakakakakakakakakakakacaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeacakakakakakakakakakakakakakanaoaoaoanakakakakakakakakakakakalakacaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacaeaiakakakakakakakakakakakakakanaoaoaoanakakakakakakakakakakakakakaiaeacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaabapapapapaqapapaparapanananananaparapapapasasasapapapatapanananananapauapapacaiacapapapabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaabanaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoauaoauauaoauauaeaeaeauauanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababaaaaaaabanaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoauauaoaoauauauauanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaabanaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoauauauaoaoaoauauauauauauanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababaaaaaaabanaoaoaoaoapapapapaqapapapapapapapapapapaoaoaoapapapapapapapapapapaqapapapapauauauauanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaabapapaoaoapapaeaeaeaeaeaeaeaeaeaeaeaeaeapaoaoaoapaeaeaeaeaeaeaeaeaeaeaeaeaeapapauauapapabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaabababanaoaoapaeaeawawawawawawawawawawaeaeapaoaoaoapaeaeaAaAaAaAaAaAaAaAaAaAaeaeapauaoanabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaaaabanaoaoapaeawawaxaxaxaxaxaxaxaxawaeaeapaoaoaoapaeaeaAaIaBaKaJaMaLaOaNaAaAaeapauaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaabanaoaoapaeawaxaxaxaxaxaxaxaxaxawaeaeapaoaoaoapaeaeaAaQaPaSaRaTaTaTaUaVaAaeapauaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaabababanaoaoapaeawaxaxaxaxaxaxaxaxaxawawawapaoaoaZaAaAaAaAbaaTaTaTaTaTaTaTbbaAaeapaoaoanabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababavaaaaaaabanaoaoapaeawaxaxaxaxaxaxaxaxaxayaxaxazaoaoaobdbcbfbeaTaTaTaTaTaTaTaTbgaAaeapaoaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaaaabanaoaoapaeaCaxaxaxaxaxaxaxaxaxayaxaxazaoaoaobdbhbjbiblbkbnbmaTboaTaTbpaAaeapaoaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababaaaaabababanaoaoapaeawaxaxaxaxaxaxaxaxaxawawawapaoaoaoaAaAaAaAbrbqaTbsbtbtbtbtbuaAaeapaoaoanabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaababavababavaaaaaaabanaoaoapaeawaxaxaxaxaxaxaxaxaxawaeaeaqaoaoaoaqaeaeaAbwbvaTaTaTaTaTaTbxaAaeapaoaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababavababavaaaaaaabanaoaoapaeawawaxaxaxaxaxaxaxaxawaeapapaoaoaoapapaeaAbzbybBbAbDbCbFbEaAaAaeapaoaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabaaavababavaaabababanaoaoapaeaeawawawawawawawawawawaeapaoaoaoaoaoapaeaAaAaAaAaAaAaAaAaAaAaeaeapaoaoanabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeaeaeacacakakakakakakakafafahahahahahahahafafakakakakakakakacacaeaeaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeaeacacakakakakakakakakakafafahahahahahafafakakakakakakakakakacacaeaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeacacakakakakakakakakakakakafafamamamafafakakakakakakakakakakakacacaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeacakakakakakakakakakakakakakalaoaoaoalakakakakakakakakakakakakakacaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeacakakakakakakakakakakakakakalaoaoaoalakakakakakakakakakakakakakacaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacaeaiakakakakakakakakakakakakakalaoaoaoalakakakakakakakakakakakakakaiaeacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaabapapapapanapapaparapalalalalalaparapapapasasasapapapaqapalalalalalapaoapapacaiacapapapabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaabalaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaeaeaeaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababaaaaaaabalaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaabalaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababaaaaaaabalaoaoaoaoapapapapanapapapapapapapapapapaoaoaoapapapapapapapapapapanapapapapaoaoaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaabapapaoaoapapaeaeaeaeaeaeaeaeaeaeaeaeaeapaoaoaoapaeaeaeaeaeaeaeaeaeaeaeaeaeapapaoaoapapabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaabababalaoaoapaeaeawawawawawawawawawawaeaeapaoaoaoapaeaeaAaAaAaAaAaAaAaAaAaAaeaeapaoaoalabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaaaabalaoaoapaeawawaxaxaxaxaxaxaxaxawaeaeapaoaoaoapaeaeaAauataCaBaHaEaJaIaAaAaeapaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaabalaoaoapaeawaxaxaxaxaxaxaxaxaxawaeaeapaoaoaoapaeaeaAaLaKaNaMaOaOaOaPaQaAaeapaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaabababalaoaoapaeawaxaxaxaxaxaxaxaxaxawawawapaoaoaZaAaAaAaAaSaRaRaRaRaRaRaOaTaAaeapaoaoalabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababavaaaaaaabalaoaoapaeawaxaxaxaxaxaxaxaxaxayaxaxazaoaoaobdaUaVbeaXaRaRaRaRaRaRaRaYaAaeapaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaaaabalaoaoapaebaaxaxaxaxaxaxaxaxaxayaxaxazaoaoaobdbbbcbibgbfbjbhaRbkaRaRblaAaeapaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababaaaaabababalaoaoapaeawaxaxaxaxaxaxaxaxaxawawawapaoaoaoaAaAaAaAbnbmaRbobpbpbpbqbraAaeapaoaoalabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaababavababavaaaaaaabalaoaoapaeawaxaxaxaxaxaxaxaxaxawaeaeanaoaoaoanaeaeaAbtbsaOaOaOaOaOaObuaAaeapaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababavababavaaaaaaabalaoaoapaeawawaxaxaxaxaxaxaxaxawaeapapaoaoaoapapaeaAbwbvbybxbAbzbCbBaAaAaeapaoaoalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabaaavababavaaabababalaoaoapaeaeawawawawawawawawawawaeapaoaoaoaoaoapaeaAaAaAaAaAaAaAaAaAaAaeaeapaoaoalabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababavababavaaacacapapaoaoapapaeaeaeaeaeaeaeaeaeaeaeaeapaoaoaoaoaoapaeaeaeaeaeaeaeaeaeaeaeaeapapaoaoapapacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabaDaDaDaDaDacacaeapauaoaoauapapapapapapapapapapapapapapaoaoaoaoaoapapapapapapapapapapapapapapauaoaoauapaeacacaDaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababaEaEaEaEaFaEaEabababababaDaEaEaEaEaeaeaeauaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoauaoauauaoauaoaoaoaoaoapaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaEaEaEaEaeaeaeauaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoauauauaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaEaFaFaFaEaFaFaFaEaFaEaFaEaFaEaEaEaEaEaEaDaEaEaEaEacaeaeapaoaoaoaoapanananananananananananapapapaoaoaoapapapanananananananananananapauauaoauapaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaFaFaFaFaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaDaEaEaEaEacaeaeapapauauapapabababababababababababacaeaqaoaoaoaqaeacabababababababababababapapauaoapapaeaeacaEaFaEaFaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaFaFaFaDaFaFaFaDaDaDaFaFaDaDaDaDaDaDaEaEaEaEacaeaeaeapaoaoanabaaabaaabaaabacacacacacacaeapaoaoaoapaeacacacacacacabaaabaaabaaabanauaoapaeaeaeacaEaEaEaEaFaEaFababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababaDaHaHaHaHacacacaeapaoaoanabaaabaaabaaabacaeaeaeaeaeaeapaoaoaoapaeaeaeaeaeaeacabaaabaaabaaabanauaoapaeacacacaDaDaDaDaEaEaEaaabaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababacaeapaoaoanabababababababacaeaeaeaeapapapaoaoaoapapapaeaeaeaeacabababababababanauauapaeacaEaEaEaEaEaEaEaEaEaEaEaFaEaFaFaFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanabaaabaaabaaabacaeapapapapauauaoaoaoauauapapapapaeacabaaabaaabaaabanauauapaeacaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoanabaaabaaabababapaqapauauauauauaoaoaoauauauauauapaqapabababaaabaaabanaoauapaeacaFaEaFaEaFaEaFaEaFaFaEaEaEaFaFaFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanababababababapapauauauaoaoaoaoaoaoaoaoaoaoauauauauapapababababababanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoanabacacacacapapauauauaoaoaoaoaoaoaoaoaoaoaoaoaoaoauauapapacacacacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanabacaeaeaeaqauauaoaoaoaoaoapapapbGapapapaoaoaoaoauauauaqaeaeaeacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoanabacaeaeapapauauaoaoaoapapapaWaXaYaXaWapapapaoaoaoauauapapaeaeacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoanabacaeaeapauauauaoaoapapababaWaXaYaXaWababapapaoaoaoauauapaeaeacabanauauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaababalabalalababalababalacaeapaoaoanabacaeaeapauaoaoaoapapabababaWaXaYaXaWabababapapauaoauauapaeaeacabanaoauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababalababalalalalalalalalalalalacaeapaoaoapacacaeapapauaoaoaoapabababaWaWaWbHaWaWaWabababapauauaoauapapaeacacapauaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabalalalalalalalalalalalalalalalalalalacaeapaoaoapaeaeaeapauauaoaoapapababaWaWbJbJaXbJbJaWaWababapapauaoauauapaeaeaeapauauapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababababavavavavavabalabalabalabalabalacacacacacacacacacacacaeapaoaoapaqapapapauauauauapaWaWaWaWaXbJaXaXaXbJaXaWaWaWaWapauauaoauapapapaqapauauapacacavavavababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalabalalalalalalalalalalalalalaeaeaeaeaeaeaeaeaeaeaeaeaoaoaoauauauauauauaoauauapaXaXaXaWbJbJaXaYaXbJbJaWbIbLbKapauauaoauauauauaoauauaoaoaeaealalalalalalalalalalalalaaaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababalalalalalababalalabalabalabalabalabalcjaecjaeaeaeaeaeaeaeaeaeauauauauauauauauaoauauaubMaYaYaYbNaXaXaXaYaXaXaXbOaYbQbPbRaoauaoaoaoaoaoaoauauauauaeaealalalalalalalalalabalabalabalalalabalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababalalalalalalalabalabalalalalalaeaeaecjaeaeaeaeaeaeaeaeaoaoaoauaoaoaoaoaoaoaoaoapaXaXaXaWbJbJaXaYaXbJbJaWcscscsapauauaoauauauauauauaoaoaoaeaealalalalalalalalalalalalalalalalabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavavavabababababavavavavavavavavavavavacacacacacacacacacacacacapaoaoapcIapapapcJaucJauapaWaWaWaWaXbJaXaXaXbJaXaWaWaWaWapauauaoauapapapaqapauaoapacacavavavavavababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababaccjcVcWcWcVaeaeaecVcXcXcXcXcVcVababaWaWbJbJaXbJbJaWaWababcVcVcXcXcXcXcVaeaeaecVcWcWcXaeacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWcVacacaecVcVcXdmcXdmcVabababaWaWaWbHaWaWaWabababcVcXcXcWcXcVcVaeacaccVcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWdyabacaeaecVcXcXcXcXcVcVabababaWaXaYaXaWabababcVcVcXcXcWcXcVaeaeacabdycWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaccjcVcWcWdyabacaeaecVcXdmcXdmcXcVcVababaWaXaYaXaWababcVcVcXcXcXcXcXcVaeaeacabdycXcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcXdyabacaeaecVcVcXcXcXcXcXcVcVcVaWaXaYaXaWcVcVcVcXcWcWcWcXcVcVaeaeacabdycXcXcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcXdyabacaeaeaeebdmcXdmcXdmcXcWcVcVcVbScVcVcVcXcXcWcWcWcXcXedaeaeaeacabdycWcXcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaccjcVcWcXdyabacacacaccVcVcXcXcXcXcWcWcWcWcWcWcWcWcWcWcWcWcWcXcXcVcVacacacacabdycWcXcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcXdyababababababcVcVdmcXdmcXcWcWcWcWcWcWcWcWcWcWcWcXcXcVcVababababababdycWcXcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcXdyabaaabaaabababcVedcVcXcWcWcWcWcWcWcWcWcWcWcWcWcVedcVabababaaabaaabdycWcXcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaccjcVcWcWdyabaaabaaabaaabacaecVcVcVcVcWcWcWcWcWcWcWcVcVcVcVaeacabaaabaaabaaabdycWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcXdyabababababababacaeaeaeaecVcVcVcWcWcWcVcVcVaeaeaeaeacabababababababdycWcXcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcXcXdyabaaabaaabaaabacaeaeaeaeaeaecVcWcWcWcVaeaeaeaeaeaeacabaaabaaabaaabdycWcXcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaccjcVcXcXdyabaaabaaabaaabacacacacacacaecVcWcWcWcVaeacacacacacacabaaabaaabaaabdycXcXcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccVcVcXcXcVcVabababababababababababacaeedcWcWcWedaeacabababababababababababcVcVcXcXcVcVacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcXcXcXcXcVdydydydydydydydydydydycVcVcVcWcWcWcVcVcVdydydydydydydydydydydycVcWcWcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcXcXcWcXcXcXcXcXcXcXcXcXcWcWcWcXcWcWcXcWcWcWcXcXcXcWcWcWcWcXcWcXcXcWcWcWcXcWcWcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcXcXcXcXcXcWcWcWcWcWcWcXcWcWcWcWcXcXcWcWcWcWcXcXcWcWcXcXcXcWcWcWcWcWcWcWcWcWcWcWcWdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcXcXcXcXcVdydydydydydydydydydydydycVcWcWcXcXcWcVdydydydydydydydydydydydycVcWcWcWcWdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcVcVcVcVcVeZeZeZeZfaeZfbeZfbeZfbeZcVcWcWcWcWcXcVfcfcfdfdfdfdfdfdfdfdfcfccVcVcWcWcVcVabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVfefefeeZeZfaeZeZeZeZeZeZeZcVcXcXcXcXcXcVfdfdfcfcfcfdfdfdfdfdfcfcfccVcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVfefeeZfefefafafafafafabTbTcVcVcXcXcXcVcVfdfdfcfcfcfdfdfdfdfdfcfdfccVcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVfefefefefefaeZeZfefefeeZeZeZdycXcXcXdyfcfcfdfdfdfdfdfdfdfcfcfcfdfccVcWcWdyababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfefefefefefeeZfefefefeeZfefedycXcXcXdyfcfcfdfdfdfdfdfdfdfcfcfcfdfccVcWcWdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgfefefefefefefefefefefedycXcXcXdyfcfcfdfdfdfdfdfdfdfdfdfdfdfccVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgfgfgfefefefefefefefefedycXcXcXdyfcfcfcfdfdfcfcfcfcfdfdfdfdfccVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfhfgfhfgfgfefgfefgfefgfefgfebUcXcXcXbVfcfdfdfdfdfdfdfdfdfdfdfdfdfccVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfefgfgfgfefgfefefefefefedycXcXcXdyfcfdfdfdfdfdfdfdfdfdfdfdfdfccVdmdmdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfhfgfhfgfgfefgfefgfefgfefgfedycXcXcXdyfcfdfdfdfdfdfdfdfcfdfdfdfdfccVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgfgfefgfefgfefefefefefedycXcXcXdyfcfdfcfcfdfdfdfdfdfcfdfcfcfccVdmdmdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfhfgfhfgfhfgfgfefgfefgfefgfedycWcWcWdyfcfcfcfcfdfdfdfdfcfcfcfcfcfccVcXcXcVabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgfgfgfgfgfgfefefefecVcVcVcWcWcWcVcVcVfcfcfdfdfdfdfcfcfcfcfcfccVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmdmdmfkfhfgfhfgfhfgfhfhfhfgfgcVcVcWcWcWcWcWcWcWcVcVfdfdfdfdfdfcfcfcflflflcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkdmdmdmfgfgfgfgfgfgfgfgfgfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdfdfdfdfmfnfofMfqcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkdmdmfkfhfhfhfhfhfhfhfhfhfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdfcfcfcfrfmfsfyfucVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfhfhfefhfhfefefefefefebWcWcWcWcWcWcWcWcWcWbVfdfdfdfcfcfcfcfcflflflcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfefhfefhfefgfefgfefgfebWcWcWcWcWcWcWcWcWcWbVfdfdfdfdfdfdfwfxfoftfzcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfhfhfhfhfhfefefefefefebWcWcWcWcWcWcWcWcWcWbVfdfdfdfdfdfdfdfwfsfpfBcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfhfhfhfhfhfhfhfhfhfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdbXfdfdfdfdflflflcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfDfDfDfDfDfDfDfDfDfDfDfCfgfgfgfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdbYfdfdfwfEfofFfGcVcXcXdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfIfHfIfHfHfHfHfHfHfIfDfhfgfhfefecVcVcWcWcWcWcWcWcWcVcVflflfdbZfLfwfdfwfsfAfNcVdmdmdyabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfHfHfHfHfIfHfIfCfIfIfDaaabaafIfHfIcVcVcVcWcWcWcVcVcVababflflflflflflflflflflcVcXcXdyalabalabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfIfHfIfHfHfHfHfHfHfOfDabababfHfHfHfHfHcVcWcWcWcVfIfIfHfHfIfHfIfHfHfHfHfIfHfIcXdmdmcXabababalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfHfHfHfHfOfHfHfOfOfOfDaaabaafIfHfIfHfIcVcXcWcWcVfIfHfHfHfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfIfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfHfIfHfIfHfHfHfOfOfOfOfDaaabaafHfHfHfHfHcVcXcXcWcVfIfHfHfHfCfHfHfHfHfHfHfIfIfIfIfIfIfIfIfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfHfHfHfHfHfHfHfOfOfOfOfDabababfIfHfIfHfIcVdmcXcWcVfHfHfHfHfCfIfHfIfHfIfHfIfIfPfPfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfIfHfIfHfHfOfOfOfOfOfDaaabaafHfHfHfHfHcXcXcXcWcVfHfHfIfIfCfHfHfHfHfHfHfHfHfHfHfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfHfHfHfHfHfHfHfOfOfOfOfDaaabaafIfHfIfHfIcXdmcXcWcVfIfIfIfIfCfIfHfIfHfIfHfIfHfIfHfIfHfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfHfIfHfIfHfHfOfOfOfOfOfDabababfHfHfHfHfHcXcXcXcWcVfIfIfHfHfCfHfHfHfHfHfHfHfHfHfCfCfCfCfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfHfCfHfHfHfOfOfOfOfOfOfDaaabaafIfHfIfHfIcXcXcWcXcVfIfIfHfHfCfIfHfIfHfIfHfIfIfIfHfIfHfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfIfHfHfOfOfOfOfOfOfOfOfDaaabaafHfHfHfHfHcVcWcXcXcVfIfIfHfHfCfHfHfHfHfHfHfHfCfPfPfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfCfDfDfDfDfDfDfDfDfDfDfCabababfIfHfIfHfIcVcWcXcXdmfIfIfHfHfCfIfHfIfHfIfHfIfIfIfIfIfIfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfHfHfHfHcVcWcXcXdmfIfIfHfHfCfHfHfHfHfHfHfHfHfHfHfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfHfIfHfIcVcWcWcXcVfIfIfHfHfCfIfHfIfHfIfHfIfIfIfIfIfIfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPfPfCfCfCfCfPfPfPfPfPfPfPfPfPaaaaaaabcVcWcWcWcVfIfIfHfHfCfHfHfCfHfIfHfPfIfPfPfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPfPfHfHfIfCfCfCfCfPfPfPfPfPfPaaaaaaaacVcWcWcWcVfIfIfIfHfCfHfHfIfHfHfHfHfIfHfIfHfIfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaafPfPfHfIfHfIfHfIfCfCfCfCfPfPfPaaaaaaaacVcWcWcWcVfIfIfIfHfCfHfHfHfHfHfHfHfHfHfHfHfHfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPfCfCfIfHfIfHfHfIfIfHfCfHfHfCaaaaaaabcVcWcWcWcVfPfPfIfHfCfCfCfCfCfCfHfCfCfCfCfCfCfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaafPfCfHfHfHfHfIfHfIfHfIfIfHfHfCaaaaaaaacVcWcWcWcVfIfIfIfHfHfHfHfHfHfHfHfHfHfHfHfHfHfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaafPfCfHfHfHfHfHfHfHfHfHfHfHfHfCaaaaaaaacVcWcWcWcVfPfPfIfHfHfHfHfIfHfHfIfHfIfHfIfHfIfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfCfHfHfHfHfHfHfHfHfHfHfHfCfCaaaaaaabcVcWcWcXcVfIfIfIfHfHfPfIfPfPfIfPfPfIfPaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfHfHfHfHfHfHfHfHfHfHfHfHfCfPaaaaaaaacVcWcWcXdmfPfPfPfHfIfIfIfIfIfIfIfIfIfIababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfHfHfHfHfHfHfHfHfHfHfHfHfCfPaaaaaaaacVcWcWcWdmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaafCfCfCfCfIfHfIfHfIfHfHfHfCfCfPaaaaaaabcVcWcWcXdmabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababfIfIfPfCfCfCfCfIfHfIfHfIfCfPfPaaaaaaaacVcWcWcWdmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababfIfIfIfPfPfPfCfCfCfCfIfHfCfPfPaaaaaaaacVcWcWcXdmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPfPfPfPfPfPfPfPfPfCfCfCfCfPfPaaaaaaabcVcWcWcXdmabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVcWcWcXdmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVcWcWcXcVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababcVcWcWcXcVabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababfIfIfIfCfIfIfCfCfCfCfCfCfCcVcWcWcXcVfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfIababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfHfHfHfHfHfHfHfHfHfHfHfQcXcWcWcXcXfQfHfHfHfHfHfIfIfIfHfIfIfHfIfHfIfIalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababfIfIfIfIfCfCfCfCfCfCfCfCfCcVcWcWcXcVfCfCfCfCfCfCfCfCfCfCfCfCfIfIfIfIfIababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababcVfRcafRcVababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfRfTfRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfCfCfIfIfIfCfCfCfCfCfCfCfCfCfCfCfRfRfRcafRfRfRfCfCfCfCfCfCfCfCfCfCavavababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababfIfIfIfIfHfHfHfHfHfHfHfHfHfHfHfHfHfUfTfTfTfTfTfUfHfHfHfHfHfHfHfHfHfHalalalaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfCfCfCfCfCfCfCfCfCfRfRfRfRfRfRfRfRcafRfRfRfRfRfRfRfRfCfCfCfCfCabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababfVfVfRfTfRfTfTfUfTfTfTfTfTfUfTfTfRfTfRfVfVabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfRfTfTfTfTfRfRfRcafRfRfRfTfTfTfTfRfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRfRfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfRfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRfTfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfTfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRfTfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfTfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRfRfTfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfTfRfRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafXfTfTfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfTfTfXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafXfTfTfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfTfTfXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafXfTfTfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfTfTfXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafXfTfTfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfTfTfXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafXfTfTfTfTfTfTfXfVfRfTfRfVfXfTfTfTfTfTfTfXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRfRfTfTfTfTfTfRfRfRcafRfRfRfTfTfTfTfTfRfRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRfRfRcbfRfRfRfTfTccfTfTfRfRfRcafRfRfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXccfTfTcdfTfTccfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXcecgcfchcfcicefXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXckcgcfclcfcickfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfXfTfTfTfXcmfTfTfTfTfTcmfXfTfTfTfXfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfRfRfRfRfRfRfTfTfTfTfTfRfRfRfRfRfRfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfWfTfTfTfTfRfRfXfXfXfRfRfTfTfTfTfWfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabababalabababalabababalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalcnalgealalalgealalalgealcoalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabababalabababalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabaaabalabaaabalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabababalabababalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalalgealalalalalalalgealalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabababalabababalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalabalabaaabalabaaabalabalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalalalabababalabababalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalcnalgealalalgealalalgealcoalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalalalalalalalalalalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabaDaDaDaDaDacacaeapaoaoaoaoapapapapapapapapapapapapapapaoaoaoaoaoapapapapapapapapapapapapapapaoaoaoaoapaeacacaDaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababbDbDbDbDaFbDbDabababababaDbDbDbDbDaeaeaeaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDbDbDbDbDaeaeaeaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGbDaFaFaFbDaFaFaFbDaFbDaFbDaFbDbDbDbDbDbDaDbDbDbDbDacaeaeapaoaoaoaoapalalalalalalalalalalalapapapaoaoaoapapapalalalalalalalalalalalapaoaoaoaoapaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaFaFaFaFbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDaDbDbDbDbDacaeaeapapaoaoapapabababababababababababacaeanaoaoaoanaeacabababababababababababapapaoaoapapaeaeacbDaFbDaFaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaFaFaFaDaFaFaFaDaDaDaFaFaDaDaDaDaDaDbDbDbDbDacaeaeaeapaoaoalabaaabaaabaaabacacacacacacaeapaoaoaoapaeacacacacacacabaaabaaabaaabalaoaoapaeaeaeacbDbDbDbDaFbDaFababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababaDbEbEbEbEacacacaeapaoaoalabaaabaaabaaabacaeaeaeaeaeaeapaoaoaoapaeaeaeaeaeaeacabaaabaaabaaabalaoaoapaeacacacaDaDaDaDbDbDbDaaabaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababacaeapaoaoalabababababababacaeaeaeaeapapapaoaoaoapapapaeaeaeaeacabababababababalaoaoapaeacbDbDbDbDbDbDbDbDbDbDbDaFbDaFaFaFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoalabaaabaaabaaabacaeapapapapaoaoaoaoaoaoaoapapapapaeacabaaabaaabaaabalaoaoapaeacbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoalabaaabaaabababapanapaoaoaoaoaoaoaoaoaoaoaoaoaoapanapabababaaabaaabalaoaoapaeacaFbDaFbDaFbDaFbDaFaFbDbDbDaFaFaFabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoalababababababapapaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapapababababababalaoaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoalabacacacacapapaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapapacacacacabalaoaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoalabacaeaeaeanaoaoaoaoaoaoaoapapapbFapapapaoaoaoaoaoaoaoanaeaeaeacabalaoaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababacaeapaoaoalabacaeaeapapaoaoaoaoaoapapapaWbGbHbGaWapapapaoaoaoaoaoapapaeaeacabalaoaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabaaabacaeapaoaoalabacaeaeapaoaoaoaoaoapapababaWbGbHbGaWababapapaoaoaoaoaoapaeaeacabalaoaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaababakabakakababakababakacaeapaoaoalabacaeaeapaoaoaoaoapapabababaWbGbHbGaWabababapapaoaoaoaoapaeaeacabalaoaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababakababakakakakakakakakakakakacaeapaoaoapacacaeapapaoaoaoaoapabababaWaWaWbIaWaWaWabababapaoaoaoaoapapaeacacapaoaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabakakakakakakakakakakakakakakakakakakacaeapaoaoapaeaeaeapaoaoaoaoapapababaWaWbHbHbGbHbHaWaWababapapaoaoaoaoapaeaeaeapaoaoapaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababababavavavavavabakabakabakabakabakacacacacacacacacacacacaeapaoaoapanapapapaoaoaoaoapaWaWaWaWbGbHbGbGbGbHbGaWaWaWaWapaoaoaoaoapapapanapaoaoapacacavavavababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakabakakakakakakakakakakakakakaeaeaeaeaeaeaeaeaeaeaeaeaoaoaoaoaoaoaoaoaoaoaoaoapbGbGbGaWbHbHbGbHbGbHbHaWbJbLbKapaoaoaoaoaoaoaoaoaoaoaoaoaeaeakakakakakakakakakakakakaaaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababakakakakakababakakabakabakabakabakabakcjaecjaeaeaeaeaeaeaeaeaeaoaoaoaoaoaoaoaoaoaoaoaobMbHbHbHbNbGbGbGbHbGbGbGbObHbQbPbRaoaoaoaoaoaoaoaoaoaoaoaoaeaeakakakakakakakakakabakabakabakakakabakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababakakakakakakakabakabakakakakakaeaeaecjaeaeaeaeaeaeaeaeaoaoaoaoaoaoaoaoaoaoaoaoapbGbGbGaWbHbHbGbHbGbHbHaWbSbSbSapaoaoaoaoaoaoaoaoaoaoaoaoaeaeakakakakakakakakakakakakakakakakabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavavavabababababavavavavavavavavavavavacacacacacacacacacacacacapaoaoapcIapapapcJaocJaoapaWaWaWaWbGbHbGbGbGbHbGaWaWaWaWapaoaoaoaoapapapanapaoaoapacacavavavavavababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababaccjcVcWcWcVaeaeaecVcWcWcWcWcVcVababaWaWbHbHbGbHbHaWaWababcVcVcWcWcWcWcVaeaeaecVcWcWcWaeacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWcVacacaecVcVcWdmcWdmcVabababaWaWaWbIaWaWaWabababcVcWcWcWcWcVcVaeacaccVcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWbTabacaeaecVcWcWcWcWcVcVabababaWbGbHbGaWabababcVcVcWcWcWcWcVaeaeacabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaccjcVcWcWbTabacaeaecVcWdmcWdmcWcVcVababaWbGbHbGaWababcVcVcWcWcWcWcWcVaeaeacabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWbTabacaeaecVcVcWcWcWcWcWcVcVcVaWbGbHbGaWcVcVcVcWcWcWcWcWcVcVaeaeacabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWbTabacaeaeaeebdmcWdmcWdmcWcWcVcVcVbVcVcVcVcWcWcWcWcWcWcWbWaeaeaeacabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaccjcVcWcWbTabacacacaccVcVcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcVcVacacacacabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWbTababababababcVcVdmcWdmcWcWcWcWcWcWcWcWcWcWcWcWcWcWcVcVababababababbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWbTabaaabaaabababcVbWcVcWcWcWcWcWcWcWcWcWcWcWcWcWcVbWcVabababaaabaaabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaccjcVcWcWbTabaaabaaabaaabacaecVcVcVcVcWcWcWcWcWcWcWcVcVcVcVaeacabaaabaaabaaabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWbTabababababababacaeaeaeaecVcVcVcWcWcWcVcVcVaeaeaeaeacabababababababbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaababaccjcVcWcWbTabaaabaaabaaabacaeaeaeaeaeaecVcWcWcWcVaeaeaeaeaeaeacabaaabaaabaaabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaccjcVcWcWbTabaaabaaabaaabacacacacacacaecVcWcWcWcVaeacacacacacacabaaabaaabaaabbTcWcWcVaeacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccVcVcWcWcVcVabababababababababababacaebWcWcWcWbWaeacabababababababababababcVcVcWcWcVcVacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcWcWcWcWcVbTbTbTbTbTbTbTbTbTbTbTcVcVcVcWcWcWcVcVcVbTbTbTbTbTbTbTbTbTbTbTcVcWcWcWcWbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcWcWcWcWcVbTbTbTbTbTbTbTbTbTbTbTbTcVcWcWcWcWcWcVbTbTbTbTbTbTbTbTbTbTbTbTcVcWcWcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVcVcVcVcVcVcacacacacbcacccacccacccacVcWcWcWcWcWcVfdfdfdfdfdfdfdfdfdfdfdfdcVcVcWcWcVcVabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVcdcdcdcacacbcacacacacacacacVcWcWcWcWcWcVfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVcdcdcacdcdcbcbcbcbcbcbcececVcVcWcWcWcVcVfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcVdmdmcVcdcdcdcdcdcbcacacdcdcdcacacabTcWcWcWbTfdfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVcdcdcdcdcdcdcacdcdcdcdcacdcdbTcWcWcWbTfdfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgcdcdcdcdcdcdcdcdcdcdcdbTcWcWcWbTfdfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgfgfgcdcdcdcdcdcdcdcdcdbTcWcWcWbTfdfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfhfgfhfgfgcdfgcdfgcdfgcdfgcdbUcWcWcWcffdfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgcdfgfgfgcdfgcdcdcdcdcdcdbTcWcWcWbTfdfdfdfdfdfdfdfdfdfdfdfdfdfdcVdmdmbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfhfgfhfgfgcdfgcdfgcdfgcdfgcdbTcWcWcWbTfdfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgfgcdfgcdfgcdcdcdcdcdcdbTcWcWcWbTfdfdfdfdfdfdfdfdfdfdfdfdfdfdcVdmdmbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfhfgfhfgfhfgfgcdfgcdfgcdfgcdbTcWcWcWbTfdfdfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWcVabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcVdmdmcVfgfgfgfgfgfgfgfgcdcdcdcdcVcVcVcWcWcWcVcVcVfdfdfdfdfdfdfdfdfdfdfdfdcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmdmdmfkfhfgfhfgfhfgfhfhfhfgfgcVcVcWcWcWcWcWcWcWcVcVfdfdfdfdfdfdfdfdflflflcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkdmdmdmfgfgfgfgfgfgfgfgfgfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdfdfdfdfwcgcpchcicVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkdmdmfkfhfhfhfhfhfhfhfhfhfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdfdfdfdckfwfsclcmcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfhfhcdfhfhcdcdcdcdcdcdcncWcWcWcWcWcWcWcWcWcffdfdfdfdfdfdfdfdflflflcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkcdfhcdfhcdfgcdfgcdfgcdcncWcWcWcWcWcWcWcWcWcffdfdfdfdfdfdfwfxcpcocqcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfhfhfhfhfhcdcdcdcdcdcdcncWcWcWcWcWcWcWcWcWcffdfdfdfdfdfdfdfwfscrcscVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafkfkfkfkfhfhfhfhfhfhfhfhfhfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdbXfdfdfdfdflflflcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCctctctctctctctctctctctfCfgfgfgfgfgcVcWcWcWcWcWcWcWcWcWcVfdfdfdbYfdfdfwfEcpcucvcVcWcWbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfOfIfOfIfOfOfOfOfOfOfIctfhfgfhcdcdcVcVcWcWcWcWcWcWcWcVcVflflfdbZfLfwfdfwfscwcxcVdmdmbTabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfOfOfOfOfOfIfOfIfCfIfIctaaabaafIfOfIcVcVcVcWcWcWcVcVcVababflflflflflflflflflflcVcWcWbTakabakabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfOfIfOfIfOfOfOfOfOfOfOctabababfOfOfOfOfOcVcWcWcWcVfIfIfOfOfIfOfIfOfOfOfOfIfOfIcWdmdmcWabababakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfOfOfOfOfOfOfOfOfOfOfOctaaabaafIfOfIfOfIcVcWcWcWcVfIfOfOfOfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfIfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfOfIfOfIfOfOfOfOfOfOfOctaaabaafOfOfOfOfOcVcWcWcWcVfIfOfOfOfCfOfOfOfOfOfOfIfIfIfIfIfIfIfIfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfOfOfOfOfOfOfOfOfOfOfOctabababfIfOfIfOfIcVdmcWcWcVfOfOfOfOfCfIfOfIfOfIfOfIfIfPfPfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfOfIfOfIfOfOfOfOfOfOfOctaaabaafOfOfOfOfOcWcWcWcWcVfOfOfIfIfCfOfOfOfOfOfOfOfOfOfOfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfOfOfOfOfOfOfOfOfOfOfOctaaabaafIfOfIfOfIcWdmcWcWcVfIfIfIfIfCfIfOfIfOfIfOfIfOfIfOfIfOfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfOfIfOfIfOfOfOfOfOfOfOctabababfOfOfOfOfOcWcWcWcWcVfIfIfOfOfCfOfOfOfOfOfOfOfOfOfCfCfCfCfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfOfCfOfOfOfOfOfOfOfOfOctaaabaafIfOfIfOfIcWcWcWcWcVfIfIfOfOfCfIfOfIfOfIfOfIfIfIfOfIfOfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfIfOfOfOfOfOfOfOfOfOfOctaaabaafOfOfOfOfOcVcWcWcWcVfIfIfOfOfCfOfOfOfOfOfOfOfCfPfPfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfCctctctctctctctctctctfCabababfIfOfIfOfIcVcWcWcWdmfIfIfOfOfCfIfOfIfOfIfOfIfIfIfIfIfIfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOfOfOcVcWcWcWdmfIfIfOfOfCfOfOfOfOfOfOfOfOfOfOfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIfOfIfOfIcVcWcWcWcVfIfIfOfOfCfIfOfIfOfIfOfIfIfIfIfIfIfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPfPfCfCfCfCfPfPfPfPfPfPfPfPfPaaaaaaabcVcWcWcWcVfIfIfOfOfCfOfOfCfOfIfOfPfIfPfPfIfPfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPfPfOfOfIfCfCfCfCfPfPfPfPfPfPaaaaaaaacVcWcWcWcVfIfIfIfOfCfOfOfIfOfOfOfOfIfOfIfOfIfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaafPfPfOfIfOfIfOfIfCfCfCfCfPfPfPaaaaaaaacVcWcWcWcVfIfIfIfOfCfOfOfOfOfOfOfOfOfOfOfOfOfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPfCfCfIfOfIfOfOfIfIfOfCfOfOfCaaaaaaabcVcWcWcWcVfPfPfIfOfCfCfCfCfCfCfOfCfCfCfCfCfCfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaafPfCfOfOfOfOfIfOfIfOfIfIfOfOfCaaaaaaaacVcWcWcWcVfIfIfIfOfOfOfOfOfOfOfOfOfOfOfOfOfOfPfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaafPfCfOfOfOfOfOfOfOfOfOfOfOfOfCaaaaaaaacVcWcWcWcVfPfPfIfOfOfOfOfIfOfOfIfOfIfOfIfOfIfIfPfPfPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfCfOfOfOfOfOfOfOfOfOfOfOfCfCaaaaaaabcVcWcWcWcVfIfIfIfOfOfPfIfPfPfIfPfPfIfPaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOfOfOfOfOfOfOfOfOfOfOfCfPaaaaaaaacVcWcWcWdmfPfPfPfOfIfIfIfIfIfIfIfIfIfIababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOfOfOfOfOfOfOfOfOfOfOfCfPaaaaaaaacVcWcWcWdmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaafCfCfCfCfIfOfIfOfIfOfOfOfCfCfPaaaaaaabcVcWcWcWdmabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababfIfIfPfCfCfCfCfIfOfIfOfIfCfPfPaaaaaaaacVcWcWcWdmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababfIfIfIfPfPfPfCfCfCfCfIfOfCfPfPaaaaaaaacVcWcWcWdmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafPfPfPfPfPfPfPfPfPfCfCfCfCfPfPaaaaaaabcVcWcWcWdmabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVcWcWcWdmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVcWcWcWcVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababcVcWcWcWcVabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababfIfIfIfCfIfIfCfCfCfCfCfCfCcVcWcWcWcVfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfIababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafOfOfOfOfOfOfOfOfOfOfOfOcycWcWcWcWcWcyfOfOfOfOfOfIfIfIfOfIfIfOfIfOfIfIakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababfIfIfIfIfCfCfCfCfCfCfCfCfCcVcWcWcWcVfCfCfCfCfCfCfCfCfCfCfCfCfIfIfIfIfIababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababcVfRczfRcVababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfRcAfRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfCfCfIfIfIfCfCfCfCfCfCfCfCfCfCfCfRfRfRczfRfRfRfCfCfCfCfCfCfCfCfCfCavavababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababfIfIfIfIfOfOfOfOfOfOfOfOfOfOfOfOfOcBcAcAcAcAcAcBfOfOfOfOfOfOfOfOfOfOakakakaaabaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafCfCfCfCfCfCfCfCfCfCfRfRfRfRfRfRfRfRczfRfRfRfRfRfRfRfRfCfCfCfCfCabababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababfVfVfRcAfRcAcAcBcAcAcAcAcAcBcAcAfRcAfRfVfVabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfRcAcAcAcAfRfRfRczfRfRfRcAcAcAcAfRfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRfRcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAfRfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRcAcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAcAfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRcAcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAcAfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRfRcAcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAcAfRfRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCcAcAcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAcAcAcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCcAcAcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAcAcAcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCcAcAcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAcAcAcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCcAcAcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAcAcAcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCcAcAcAcAcAcAcCfVfRcAfRfVcCcAcAcAcAcAcAcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafRfRcAcAcAcAcAfRfRfRczfRfRfRcAcAcAcAcAfRfRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfRfRfRcDfRfRfRcAcAcEcAcAfRfRfRczfRfRfRfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWcCcAcAcAcCcEcAcAcFcAcAcEcCcAcAcAcCfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWcCcAcAcAcCcGcKcHcLcHcMcGcCcAcAcAcCfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWcCcAcAcAcCcNcKcHcOcHcMcNcCcAcAcAcCfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWcCcAcAcAcCcPcAcAcAcAcAcPcCcAcAcAcCfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfRfRfRfRfRfRcAcAcAcAcAfRfRfRfRfRfRfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafWfWfWcAcAcAcAfRfRcCcCcCfRfRcAcAcAcAfWfWfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakabababakabababakabababakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakcQakcRakakakcRakakakcRakcSakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakabakabababakabababakabakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakabakabaaabakabaaabakabakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakabakabababakabababakabakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakakcRakakakakakakakcRakakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakabakabababakabababakabakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakabakabaaabakabaaabakabakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakakakabababakabababakakakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakcQakcRakakakcRakakakcRakcSakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakakakakakakakakakakakakakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index 49e21dc47db..26b272a8ae4 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -1,1636 +1,1579 @@ "aa" = (/turf/space,/area/space) "ab" = (/turf/unsimulated/mask,/area/mine/unexplored) -"ac" = (/turf/space,/area/syndicate_station/mining) -"ad" = (/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) -"ae" = (/obj/structure/lattice,/turf/space,/area/space) -"af" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) -"ag" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating/airless/asteroid,/area/mine/unexplored) -"ah" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/hallway) -"ai" = (/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/research/hallway) -"aj" = (/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/outpost/research/hallway) +"ac" = (/turf/simulated/floor/asteroid,/area/mine/explored) +"ad" = (/turf/simulated/floor/airless{icon_state = "asteroidplating"},/area/mine/explored) +"ae" = (/turf/space,/area/syndicate_station/mining) +"af" = (/obj/structure/lattice,/turf/space,/area/space) +"ag" = (/obj/structure/ore_box,/turf/simulated/floor/asteroid,/area/mine/explored) +"ah" = (/turf/simulated/floor/asteroid,/area/mine/unexplored) +"ai" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/hallway) +"aj" = (/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/research/hallway) "ak" = (/turf/simulated/wall/r_wall,/area/outpost/research/chemistry) -"al" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/hallway) -"am" = (/turf/simulated/floor,/area/outpost/research/hallway) -"an" = (/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/hallway) +"al" = (/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/outpost/research/hallway) +"am" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/asteroid,/area/mine/unexplored) +"an" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/hallway) "ao" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/outpost/research/chemistry) "ap" = (/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/cell,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light/small{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/plating,/area/outpost/research/chemistry) "aq" = (/obj/structure/closet/hydrant{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/outpost/research/chemistry) "ar" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/outpost/research/chemistry) "as" = (/turf/simulated/wall/r_wall,/area/outpost/research/hallway) -"at" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/outpost/research/hallway) -"au" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/outpost/research/hallway) +"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/research/hallway) +"au" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/asteroid,/area/mine/unexplored) "av" = (/obj/structure/table/rack,/obj/item/stack/material/steel{amount = 50; pixel_x = 5; pixel_y = 5},/obj/item/stack/material/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) "aw" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/outpost/research/chemistry) "ax" = (/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor/plating,/area/outpost/research/chemistry) -"ay" = (/obj/structure/table/standard,/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/outpost/research/chemistry) +"ay" = (/turf/simulated/floor/tiled,/area/outpost/research/hallway) "az" = (/turf/simulated/wall,/area/outpost/research/chemistry) -"aA" = (/turf/simulated/floor,/area/outpost/research/chemistry) -"aB" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_y = 32},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/outpost/research/chemistry) -"aC" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/outpost/research/chemistry) +"aA" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"aB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"aC" = (/obj/structure/table/standard,/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/research/chemistry) "aD" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/carpet,/area/outpost/research/hallway) "aE" = (/turf/simulated/wall,/area/outpost/research/hallway) "aF" = (/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) -"aG" = (/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) +"aG" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Auxiliary Storage"; req_one_access = list(65,12)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) "aH" = (/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) "aI" = (/turf/simulated/wall/r_wall,/area/outpost/research/analysis) "aJ" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/material/minihoe,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weedkiller/triclopyr,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/turf/simulated/floor/plating,/area/outpost/research/chemistry) "aK" = (/turf/simulated/floor/plating,/area/outpost/research/chemistry) "aL" = (/obj/machinery/light/small,/obj/structure/closet/walllocker/emerglocker/north{dir = 1; pixel_y = -32},/turf/simulated/floor/plating,/area/outpost/research/chemistry) -"aM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/outpost/research/chemistry) -"aN" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Auxiliary Storage"; req_one_access = list(65,12)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"aO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/chemistry) -"aP" = (/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) +"aM" = (/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_y = 32},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"aN" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rddorm1"; name = "Dorm 1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"aO" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"aP" = (/turf/simulated/floor/tiled,/area/outpost/research/chemistry) "aQ" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/carpet,/area/outpost/research/hallway) -"aR" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rddorm1"; name = "Dorm 1"},/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) +"aR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Hallway Fore"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/hallway) "aS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/outpost/research/hallway) -"aT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/hallway) -"aU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/outpost/research/hallway) +"aT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"aU" = (/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/tiled,/area/outpost/research/hallway) "aV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/outpost/research/hallway) -"aW" = (/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) +"aW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/chemistry) "aX" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/carpet,/area/outpost/research/hallway) -"aY" = (/obj/structure/reagent_dispensers/coolanttank,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/outpost/research/analysis) -"aZ" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/standard,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/analysis) -"ba" = (/turf/simulated/floor{icon_state = "warning"},/area/outpost/research/chemistry) -"bb" = (/obj/structure/sign/botany{pixel_x = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/outpost/research/chemistry) -"bc" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/outpost/research/hallway) +"aY" = (/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/tiled,/area/outpost/research/chemistry) +"aZ" = (/obj/structure/sign/botany{pixel_x = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"ba" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"bb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"bc" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/outpost/research/hallway) "bd" = (/turf/unsimulated/mask,/area/mine/explored) -"be" = (/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,/area/outpost/research/hallway) +"be" = (/obj/structure/reagent_dispensers/coolanttank,/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "bf" = (/turf/simulated/wall/r_wall,/area/outpost/research/kitchen) -"bg" = (/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/airless,/area/outpost/abandoned) +"bg" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "bh" = (/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/outpost/abandoned) "bi" = (/obj/machinery/door/airlock/external,/turf/simulated/floor,/area/outpost/abandoned) -"bj" = (/obj/machinery/light/small{dir = 1},/obj/item/stack/nanopaste,/obj/item/stack/nanopaste,/obj/item/stack/nanopaste,/obj/structure/table/standard,/turf/simulated/floor{icon_state = "dark"},/area/outpost/research/analysis) -"bk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/outpost/research/analysis) -"bl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/analysis) -"bm" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"bn" = (/obj/machinery/door/airlock/research{name = "Spectrometry Lab Sample Preparation"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/analysis) -"bo" = (/obj/machinery/light{dir = 1},/obj/machinery/reagentgrinder,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"bp" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"bq" = (/obj/machinery/door/window/westleft{dir = 1; name = "Sample Preparation Loading"; req_access = list(65)},/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/outpost/research/chemistry) -"br" = (/obj/item/weapon/storage/box/solution_trays,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/table/glass,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/outpost/research/chemistry) +"bj" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"bk" = (/obj/machinery/light/small{dir = 1},/obj/item/stack/nanopaste,/obj/item/stack/nanopaste,/obj/item/stack/nanopaste,/obj/structure/table/standard,/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/outpost/research/analysis) +"bl" = (/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"bm" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (NORTH)"; icon_state = "corner_white_diagonal"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"bn" = (/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/tiled,/area/outpost/research/hallway) +"bo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/outpost/abandoned) +"bp" = (/obj/structure/closet/walllocker/emerglocker/west,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/white,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"bq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"br" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "bs" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/grass,/area/outpost/research/chemistry) -"bt" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/outpost/research/chemistry) -"bu" = (/obj/machinery/light/small{dir = 4},/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) +"bt" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"bu" = (/obj/machinery/door/airlock/research{name = "Spectrometry Lab Sample Preparation"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "bv" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/outpost/research/chemistry) -"bw" = (/obj/structure/sink{pixel_y = 30},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/research/hallway) -"bx" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/research/hallway) -"by" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) -"bz" = (/obj/structure/closet/walllocker/emerglocker/west,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/outpost/research/hallway) -"bA" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"bB" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/structure/bed/chair,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"bC" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"bD" = (/obj/structure/bed/chair,/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"bE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) +"bw" = (/obj/machinery/light{dir = 1},/obj/machinery/reagentgrinder,/obj/structure/table/glass,/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"bx" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"by" = (/obj/machinery/door/window/westleft{dir = 1; name = "Sample Preparation Loading"; req_access = list(65)},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"bz" = (/obj/item/weapon/storage/box/solution_trays,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/table/glass,/obj/effect/floor_decal/corner/blue{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"bA" = (/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"bB" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"bC" = (/obj/structure/sink{pixel_y = 30},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/freezer,/area/outpost/research/hallway) +"bD" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/freezer,/area/outpost/research/hallway) +"bE" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/structure/bed/chair,/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) "bF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/abandoned) "bG" = (/turf/simulated/floor,/area/outpost/abandoned) -"bH" = (/obj/machinery/radiocarbon_spectrometer,/turf/simulated/floor{icon_state = "dark"},/area/outpost/research/analysis) -"bI" = (/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) -"bJ" = (/turf/simulated/floor{icon_state = "white"},/area/outpost/research/analysis) -"bK" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"bL" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"bM" = (/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"bN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/glass,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) +"bH" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"bI" = (/obj/structure/bed/chair,/obj/machinery/status_display{pixel_y = 32},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"bJ" = (/obj/machinery/radiocarbon_spectrometer,/turf/simulated/floor/tiled{icon_state = "vault"; dir = 5},/area/outpost/research/analysis) +"bK" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"bL" = (/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/tiled/freezer,/area/outpost/research/hallway) +"bM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/outpost/abandoned) +"bN" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (NORTH)"; icon_state = "corner_white_diagonal"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway) "bO" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 2},/turf/simulated/wall/r_wall,/area/outpost/research/chemistry) -"bP" = (/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/outpost/research/chemistry) -"bQ" = (/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) -"bR" = (/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) -"bS" = (/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) -"bT" = (/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) -"bU" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) -"bV" = (/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) -"bW" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"bX" = (/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) -"bY" = (/obj/structure/table/standard,/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"bZ" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"ca" = (/obj/structure/bed/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"cb" = (/obj/structure/table/standard,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"cc" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) +"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},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Sample Analysis"; dir = 8},/obj/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"bQ" = (/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"bR" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"bS" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"bT" = (/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"bU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/glass,/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"bV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/chemistry) +"bW" = (/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/tiled/freezer,/area/outpost/research/hallway) +"bX" = (/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"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (NORTH)"; icon_state = "corner_white_diagonal"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"bY" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"bZ" = (/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/tiled/freezer,/area/outpost/research/hallway) +"ca" = (/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/tiled,/area/outpost/research/hallway) +"cb" = (/obj/structure/table/standard,/obj/effect/landmark{name = "bluespacerift"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"cc" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) "cd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/abandoned) "ce" = (/obj/item/stack/rods,/obj/structure/door_assembly/door_assembly_ext{name = "Broken External Airlock"},/turf/simulated/floor,/area/outpost/abandoned) "cf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/outpost/abandoned) -"cg" = (/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) -"ch" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/analysis) -"ci" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"cj" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry) -"ck" = (/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) -"cl" = (/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) -"cm" = (/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) -"cn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) -"co" = (/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) -"cp" = (/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) -"cq" = (/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) -"cr" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"cs" = (/obj/item/stack/rods,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"ct" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/outpost/research/analysis) -"cu" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/outpost/research/analysis) -"cv" = (/obj/machinery/chem_master,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) -"cw" = (/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},/obj/structure/table/glass,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) -"cx" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/structure/table/glass,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) -"cy" = (/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry) -"cz" = (/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) -"cA" = (/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) -"cB" = (/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) -"cC" = (/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) -"cD" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/lab) -"cE" = (/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) -"cF" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/lab) -"cG" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/research/lab) -"cH" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) -"cI" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/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 = "cafeteria"; dir = 2},/area/outpost/research/hallway) -"cJ" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/hallway) -"cK" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen) -"cL" = (/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) -"cM" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"cN" = (/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) -"cO" = (/obj/item/weapon/material/shard{icon_state = "medium"},/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) +"cg" = (/obj/structure/bed/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"ch" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"ci" = (/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/tiled,/area/outpost/research/chemistry) +"cj" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (NORTH)"; icon_state = "corner_white_diagonal"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"ck" = (/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"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (NORTH)"; icon_state = "corner_white_diagonal"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"cl" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/airless,/area/outpost/abandoned) +"cm" = (/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/effect/floor_decal/corner/lime{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"cn" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"co" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"cp" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"cq" = (/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/tiled/white,/area/outpost/research/chemistry) +"cr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"cs" = (/obj/structure/cable/blue,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"ct" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"cu" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 9},/area/shuttle/alien/mine) +"cv" = (/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 10},/area/shuttle/alien/mine) +"cw" = (/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"cx" = (/obj/item/stack/rods,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"cy" = (/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},/obj/structure/table/glass,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"cz" = (/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/tiled/white,/area/outpost/research/chemistry) +"cA" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"cB" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/lab) +"cC" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (NORTH)"; icon_state = "corner_white_diagonal"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"cD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/lime/full{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"cE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"cF" = (/obj/machinery/chem_master,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"cG" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/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/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (NORTH)"; icon_state = "corner_white_diagonal"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"cH" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/structure/table/glass,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"cI" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/hallway) +"cJ" = (/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"cK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/chemistry) +"cL" = (/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},/obj/effect/floor_decal/corner/purple,/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"cM" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"cN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"cO" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) "cP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/abandoned) -"cQ" = (/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},/obj/structure/lattice,/turf/space,/area/space) -"cR" = (/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) -"cS" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Sample Preparation"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"cT" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/outpost/research/lab) -"cU" = (/obj/machinery/artifact_analyser,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid,/area/outpost/research/lab) -"cV" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"cW" = (/obj/machinery/conveyor_switch{id = "anolaser"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"cX" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/bluegrid,/area/outpost/research/lab) -"cY" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/obj/structure/plasticflaps,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/research/lab) -"cZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"},/area/outpost/research/hallway) -"da" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/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) +"cQ" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Kitchen"; dir = 8},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/outpost/research/kitchen) +"cR" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"cS" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/turf/space,/area/shuttle/alien/mine) +"cT" = (/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken0"; icon_state = "steel_broken0"},/area/outpost/abandoned) +"cU" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken0"; icon_state = "steel_broken0"},/area/outpost/abandoned) +"cV" = (/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},/obj/structure/lattice,/turf/space,/area/space) +"cW" = (/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/tiled/white,/area/outpost/research/hallway) +"cX" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/asteroid,/area/mine/explored) +"cY" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/alien/mine) +"cZ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Sample Preparation"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"da" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) "db" = (/turf/simulated/floor/wood,/area/outpost/research/kitchen) -"dc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/hallway) -"dd" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/wood,/area/outpost/research/kitchen) +"dc" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/obj/structure/plasticflaps,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/lab) +"dd" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/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"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (NORTH)"; icon_state = "corner_white_diagonal"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway) "de" = (/obj/structure/table/standard,/turf/simulated/floor/wood,/area/outpost/research/kitchen) "df" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor/wood,/area/outpost/research/kitchen) "dg" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/wood,/area/outpost/research/kitchen) -"dh" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) +"dh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/hallway) "di" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/research/kitchen) -"dj" = (/obj/item/weapon/material/shard,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"dk" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 9},/area/shuttle/alien/mine) +"dj" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 5},/area/shuttle/alien/mine) +"dk" = (/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 6},/area/shuttle/alien/mine) "dl" = (/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 1},/area/shuttle/alien/mine) "dm" = (/turf/simulated/wall,/area/outpost/abandoned) -"dn" = (/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) -"do" = (/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) -"dp" = (/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) -"dq" = (/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) -"dr" = (/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) -"ds" = (/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) -"dt" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/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) -"du" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/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) -"dv" = (/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) -"dw" = (/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) -"dx" = (/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) -"dy" = (/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) -"dz" = (/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) -"dA" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"dB" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"dC" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{icon_state = "delivery"},/area/outpost/research/lab) -"dD" = (/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"dE" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/obj/machinery/door/window/westleft{dir = 2; layer = 3.1; name = "laser testing"; req_access = list(65)},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/outpost/research/lab) -"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) -"dH" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"dI" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) -"dJ" = (/obj/item/stack/rods,/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"dK" = (/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/outpost/research/hallway) -"dL" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"dM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"dN" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"dO" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"dP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"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) +"dn" = (/obj/item/weapon/material/shard,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"do" = (/obj/machinery/artifact_analyser,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"dp" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"dq" = (/obj/machinery/conveyor_switch{id = "anolaser"},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"dr" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"ds" = (/turf/space,/area/shuttle/research/outpost) +"dt" = (/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/tiled/white,/area/outpost/research/hallway) +"du" = (/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/tiled/white,/area/outpost/research/hallway) +"dv" = (/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"},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dw" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/asteroid,/area/mine/explored) +"dx" = (/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"},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dy" = (/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},/obj/effect/floor_decal/corner/lime{tag = "icon-corner_white (NORTH)"; icon_state = "corner_white"; dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dz" = (/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},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dA" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/outpost/research/lab) +"dB" = (/obj/machinery/conveyor{dir = 1; id = "anolaser"},/obj/machinery/door/window/westleft{dir = 2; layer = 3.1; name = "laser testing"; req_access = list(65)},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/outpost/research/lab) +"dC" = (/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"},/obj/effect/floor_decal/corner/purple{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dE" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"dF" = (/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/outpost/research/hallway) +"dG" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dH" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dI" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/blue{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dJ" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/effect/floor_decal/corner/blue{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dK" = (/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"},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dL" = (/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"},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dM" = (/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"},/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"dN" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"dO" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"dP" = (/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/tiled/white,/area/outpost/research/hallway) +"dQ" = (/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"dR" = (/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/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"dS" = (/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) "dT" = (/obj/machinery/door/airlock/hatch,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/alien/mine) -"dU" = (/obj/machinery/hologram/holopad,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"dV" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/outpost/research/hallway) -"dW" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/research/hallway) -"dX" = (/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/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/research/hallway) -"dY" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 4; icon_state = "whitepurplecorner"},/area/outpost/research/lab) -"dZ" = (/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/hallway) -"ea" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/outpost/research/lab) -"eb" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/outpost/research/lab) -"ec" = (/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{dir = 1; icon_state = "whitepurple"},/area/outpost/research/lab) -"ed" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"ee" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/outpost/research/lab) -"ef" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"},/area/outpost/research/hallway) -"eg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 8; icon_state = "whitepurple"},/area/outpost/research/hallway) +"dU" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dV" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/hallway) +"dW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"dX" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"dZ" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ea" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eb" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ec" = (/obj/machinery/hologram/holopad,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ed" = (/obj/structure/lattice,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/space,/area/space) +"ee" = (/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ef" = (/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/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eg" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/corner/purple{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) "eh" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/outpost/research/kitchen) -"ei" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/hallway) +"ei" = (/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/research/hallway) "ej" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/light,/turf/simulated/floor/wood,/area/outpost/research/kitchen) "ek" = (/obj/machinery/vending/snack,/turf/simulated/floor/wood,/area/outpost/research/kitchen) "el" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/outpost/research/kitchen) -"em" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"en" = (/obj/structure/lattice,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/space,/area/space) -"eo" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) -"ep" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) -"eq" = (/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/research/hallway) -"er" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"em" = (/obj/machinery/vending/cola,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/wood,/area/outpost/research/hallway) +"en" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"eo" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"ep" = (/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/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"eq" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/outpost/research/disposal) +"er" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) "es" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/wood,/area/outpost/research/hallway) -"et" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 5},/area/shuttle/alien/mine) -"eu" = (/turf/simulated/floor/plating/airless,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 10},/area/shuttle/alien/mine) +"et" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/purple{dir = 9},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) "ev" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/wood,/area/outpost/research/hallway) "ew" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/simulated/floor/wood,/area/outpost/research/hallway) -"ex" = (/turf/space,/area/shuttle/research/outpost) +"ex" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/asteroid,/area/outpost/research/disposal) "ey" = (/obj/structure/table/standard,/turf/simulated/floor/wood,/area/outpost/research/hallway) "ez" = (/turf/simulated/floor/wood,/area/outpost/research/hallway) "eA" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/wood,/area/outpost/research/hallway) -"eB" = (/obj/machinery/vending/cola,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/wood,/area/outpost/research/hallway) -"eC" = (/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = 32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/research/hallway) -"eD" = (/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{dir = 4; icon_state = "whitebluecorner"},/area/outpost/research/hallway) -"eE" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"eF" = (/obj/structure/table/rack,/obj/item/clothing/head/welding,/obj/item/weapon/weldingtool,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"eG" = (/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"eH" = (/obj/machinery/light/small,/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/lab) -"eI" = (/obj/structure/table/standard,/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) -"eJ" = (/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) -"eK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"},/area/outpost/research/hallway) -"eL" = (/turf/unsimulated/mask,/area/space) -"eM" = (/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/outpost/research/hallway) +"eB" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/asteroid,/area/outpost/research/disposal) +"eC" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"eE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"eF" = (/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = 32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eG" = (/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"},/obj/effect/floor_decal/corner/blue{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eH" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"eI" = (/obj/structure/table/rack,/obj/item/clothing/head/welding,/obj/item/weapon/weldingtool,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"eJ" = (/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"eK" = (/obj/machinery/light/small,/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/outpost/research/lab) +"eL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"eM" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/item/weapon/melee/baton/loaded,/turf/simulated/floor/tiled/white,/area/outpost/research/lab) "eN" = (/turf/simulated/wall,/area/outpost/research/disposal) -"eO" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/outpost/research/disposal) -"eP" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/outpost/research/disposal) -"eQ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/outpost/research/disposal) -"eR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"eS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"eT" = (/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) -"eU" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) -"eV" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) +"eO" = (/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/tiled/white,/area/outpost/research/lab) +"eP" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"eQ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eR" = (/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/purple{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/effect/floor_decal/corner/blue{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"eT" = (/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/tiled/white,/area/outpost/research/hallway) +"eU" = (/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/tiled/white,/area/outpost/research/hallway) +"eV" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/outpost/research/disposal) "eW" = (/obj/structure/table/standard,/obj/item/device/camera,/obj/item/weapon/stamp,/obj/item/weapon/folder,/turf/simulated/floor/wood,/area/outpost/research/hallway) "eX" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/clipboard,/obj/item/weapon/pen,/obj/item/weapon/tape_roll,/turf/simulated/floor/wood,/area/outpost/research/hallway) "eY" = (/obj/machinery/vending/snack,/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/outpost/research/hallway) -"eZ" = (/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) -"fa" = (/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) -"fb" = (/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) -"fc" = (/turf/simulated/floor{dir = 4; icon_state = "whiteyellowcorner"},/area/outpost/research/hallway) -"fd" = (/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) +"eZ" = (/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,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/disposal) +"fa" = (/obj/machinery/mass_driver{dir = 4; id = "research"},/turf/simulated/floor/asteroid,/area/outpost/research/disposal) +"fb" = (/turf/simulated/floor/asteroid,/area/outpost/research/disposal) +"fc" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space) +"fd" = (/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) "fe" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plating,/area/outpost/research/disposal) "ff" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/plating,/area/outpost/research/disposal) -"fg" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/outpost/research/disposal) -"fh" = (/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,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/disposal) +"fg" = (/obj/item/weapon/material/shard,/obj/item/stack/rods,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"fh" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) "fi" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/outpost/research/disposal) -"fj" = (/obj/machinery/mass_driver{dir = 4; id = "research"},/turf/simulated/floor/plating/airless/asteroid,/area/outpost/research/disposal) -"fk" = (/turf/simulated/floor/plating/airless/asteroid,/area/outpost/research/disposal) -"fl" = (/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"fm" = (/obj/item/weapon/material/shard,/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"fn" = (/obj/structure/table/standard,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned) -"fo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"fp" = (/obj/structure/table/standard,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"fq" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor,/area/outpost/abandoned) -"fr" = (/obj/effect/alien/weeds,/turf/simulated/floor/plating,/area/outpost/abandoned) -"fs" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating,/area/outpost/abandoned) -"ft" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"fu" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"fj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"fk" = (/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/tiled/white,/area/outpost/research/hallway) +"fl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"fm" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/washing_machine,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"fn" = (/obj/machinery/conveyor_switch{id = "archgunc"},/turf/simulated/floor/plating,/area/outpost/research/disposal) +"fo" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/outpost/research/disposal) +"fp" = (/turf/simulated/floor/plating,/area/outpost/abandoned) +"fq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"fr" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"fs" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ft" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/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"},/obj/effect/floor_decal/corner/grey{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"fu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/hallway) "fv" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/wood,/area/outpost/research/hallway) "fw" = (/obj/structure/bookcase/manuals/xenoarchaeology,/turf/simulated/floor/wood,/area/outpost/research/hallway) "fx" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/wood,/area/outpost/research/hallway) -"fy" = (/turf/simulated/floor/plating/airless,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 6},/area/shuttle/alien/mine) +"fy" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/hallway) "fz" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/outpost/research/hallway) -"fA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"fB" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/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{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway) -"fC" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/research/hallway) -"fD" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/outpost/research/hallway) -"fE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/hallway) -"fF" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/washing_machine,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway) -"fG" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/outpost/research/hallway) -"fH" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"fI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"fJ" = (/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"fK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) +"fA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"fB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/disposal) +"fC" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"fD" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/mob/living/carbon/human/monkey,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"fE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/mob/living/carbon/human/monkey,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"fF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"fG" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/outpost/research/disposal) +"fH" = (/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/clothing/suit/space/syndicate,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"fI" = (/obj/item/stack/rods,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"fJ" = (/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken1"; icon_state = "steel_broken1"},/area/outpost/abandoned) +"fK" = (/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken2"; icon_state = "steel_broken2"},/area/outpost/abandoned) "fL" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/research/disposal) -"fM" = (/obj/machinery/conveyor_switch{id = "archgunc"},/turf/simulated/floor/plating,/area/outpost/research/disposal) -"fN" = (/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/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/outpost/research/lab) -"fO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/disposal) -"fP" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/outpost/research/disposal) -"fQ" = (/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/clothing/suit/space/syndicate,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"fR" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"fS" = (/turf/simulated/floor/airless{icon_state = "damaged3"},/area/outpost/abandoned) -"fT" = (/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned) -"fU" = (/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"fV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/abandoned) -"fW" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned) -"fX" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged3"},/area/outpost/abandoned) -"fY" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/plating,/area/outpost/abandoned) +"fM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"fN" = (/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/research/dock) +"fO" = (/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/outpost/research/dock) +"fP" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_outpost_hatch"; locked = 1; name = "Research Outpost Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/outpost/research/dock) +"fQ" = (/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/outpost/research/dock) +"fR" = (/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/outpost/research/dock) +"fS" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) +"fT" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/outpost/research/dock) +"fU" = (/obj/structure/window/reinforced{dir = 5},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/wood,/area/outpost/research/medical) +"fV" = (/obj/machinery/conveyor{dir = 4; id = "archgunc"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/outpost/research/disposal) +"fW" = (/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"},/obj/effect/floor_decal/corner/grey{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"fX" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"fY" = (/obj/machinery/door/window/westleft{dir = 8; name = "Locker room"; opacity = 0; req_access = list(65)},/turf/simulated/floor/tiled,/area/outpost/research/hallway) "fZ" = (/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/outpost/research/dock) -"ga" = (/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/research/dock) -"gb" = (/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/outpost/research/dock) -"gc" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_outpost_hatch"; locked = 1; name = "Research Outpost Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/outpost/research/dock) -"gd" = (/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/outpost/research/dock) +"ga" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"gb" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/outpost/research/disposal) +"gc" = (/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},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/outpost/research/disposal) +"gd" = (/obj/item/weapon/material/shard,/obj/structure/lattice,/turf/space,/area/space) "ge" = (/obj/structure/sign/science,/turf/simulated/wall,/area/outpost/research/dock) -"gf" = (/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/outpost/research/dock) -"gg" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/dock) -"gh" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/research/dock) -"gi" = (/obj/structure/window/reinforced{dir = 5},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/wood,/area/outpost/research/medical) +"gf" = (/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"gg" = (/obj/effect/gibspawner/robot,/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken0"; icon_state = "steel_broken0"},/area/outpost/abandoned) +"gh" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"gi" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/carbon/human/monkey,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) "gj" = (/turf/simulated/wall/r_wall,/area/outpost/research/eva) -"gk" = (/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 = 5; icon_state = "whitehall"},/area/outpost/research/hallway) -"gl" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/outpost/research/hallway) -"gm" = (/obj/machinery/door/window/westleft{dir = 8; name = "Locker room"; opacity = 0; req_access = list(65)},/turf/simulated/floor,/area/outpost/research/hallway) -"gn" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/hallway) -"go" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/outpost/research/hallway) -"gp" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"gq" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/human/monkey,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"gr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"gs" = (/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{icon_state = "white"},/area/outpost/research/hallway) -"gt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/outpost/research/disposal) -"gu" = (/obj/machinery/conveyor{dir = 4; id = "archgunc"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/outpost/research/disposal) +"gk" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/human/monkey,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"gl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"gm" = (/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/tiled/white,/area/outpost/research/hallway) +"gn" = (/obj/effect/gibspawner/human,/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken1"; icon_state = "steel_broken1"},/area/outpost/abandoned) +"go" = (/turf/unsimulated/mask,/area/space) +"gp" = (/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/outpost/research/dock) +"gq" = (/turf/simulated/floor/tiled,/area/outpost/research/dock) +"gr" = (/obj/machinery/computer/shuttle_control/research,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/research/dock) +"gs" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/plating,/area/outpost/abandoned) +"gt" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"gu" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "research_outpost_dock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13,65); tag_door = "research_outpost_hatch"},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/dock) "gv" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/outpost/research/disposal) "gw" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/outpost/research/disposal) -"gx" = (/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) -"gy" = (/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"gz" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space) +"gx" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"gy" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"gz" = (/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/outpost/research/dock) "gA" = (/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) "gB" = (/turf/simulated/wall/r_wall,/area/outpost/research/anomaly_analysis) -"gC" = (/obj/item/weapon/material/shard,/obj/structure/lattice,/turf/space,/area/space) -"gD" = (/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"gE" = (/obj/effect/gibspawner/robot,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"gF" = (/obj/effect/gibspawner/human,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) -"gG" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/remains/xeno,/turf/simulated/floor/plating,/area/outpost/abandoned) -"gH" = (/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/outpost/research/dock) -"gI" = (/turf/simulated/floor,/area/outpost/research/dock) -"gJ" = (/obj/machinery/computer/shuttle_control/research,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/outpost/research/dock) -"gK" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/outpost/research/dock) -"gL" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "research_outpost_dock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13,65); tag_door = "research_outpost_hatch"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/outpost/research/dock) -"gM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/outpost/research/dock) -"gN" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/research/dock) -"gO" = (/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/outpost/research/dock) -"gP" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/dock) -"gQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/research/dock) -"gR" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) -"gS" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) -"gT" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/fire,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) -"gU" = (/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/outpost/research/eva) -"gV" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/eva) -"gW" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/eva) -"gX" = (/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) -"gY" = (/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) -"gZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/secure_closet/xenoarchaeologist{req_access = list(47)},/obj/structure/window/reinforced,/turf/simulated/floor,/area/outpost/research/hallway) -"ha" = (/obj/machinery/door/window/westleft{dir = 2; name = "Locker room"; opacity = 0; req_access = list(65)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/hallway) -"hb" = (/obj/structure/closet/secure_closet/scientist,/obj/structure/window/reinforced,/turf/simulated/floor,/area/outpost/research/hallway) -"hc" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/structure/window/reinforced,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/outpost/research/hallway) -"hd" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"he" = (/obj/machinery/door/window/westleft{dir = 2; name = "Monkey Pen"; req_access = list(47)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"hf" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"hg" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/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) -"hh" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/outpost/research/disposal) -"hi" = (/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/outpost/research/hallway) -"hj" = (/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},/turf/simulated/floor/plating,/area/outpost/research/anomaly_analysis) -"hk" = (/obj/item/weapon/material/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"hl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"hm" = (/obj/structure/lattice,/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/space,/area/outpost/abandoned) -"hn" = (/obj/structure/lattice,/turf/space,/area/outpost/abandoned) -"ho" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned) +"gC" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"gD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/dock) +"gE" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/tiled,/area/outpost/research/medical) +"gF" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) +"gG" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/fire,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/research/medical) +"gH" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"gI" = (/obj/machinery/door/firedoor/border_only{name = "\improper Firelock South"},/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/tiled/white,/area/outpost/research/hallway) +"gJ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Maintenance Storage"; req_one_access = list(12,65)},/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/plating,/area/outpost/research/hallway) +"gK" = (/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) +"gL" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) +"gM" = (/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},/obj/effect/floor_decal/corner/grey{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"gN" = (/obj/structure/closet/secure_closet/xenoarchaeologist{req_access = list(47)},/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"gO" = (/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},/turf/simulated/floor/plating,/area/outpost/research/anomaly_analysis) +"gP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/secure_closet/xenoarchaeologist{req_access = list(47)},/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"gQ" = (/obj/machinery/door/window/westleft{dir = 2; name = "Locker room"; opacity = 0; req_access = list(65)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"gR" = (/obj/structure/closet/secure_closet/scientist,/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"gS" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/latex,/obj/structure/window/reinforced,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/outpost/research/hallway) +"gT" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"gU" = (/obj/machinery/door/window/westleft{dir = 2; name = "Monkey Pen"; req_access = list(47)},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"gV" = (/obj/item/weapon/material/shard,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"gW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"gX" = (/obj/structure/lattice,/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"gY" = (/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"gZ" = (/obj/structure/lattice,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"ha" = (/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/research/dock) +"hb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"hc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"hd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"he" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"hf" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; 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/tiled,/area/outpost/research/dock) +"hg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"hh" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/dock) +"hi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/medical) +"hj" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_one_access = list(65,5)},/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/tiled,/area/outpost/research/medical) +"hk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/outpost/research/medical) +"hl" = (/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) +"hm" = (/obj/machinery/conveyor_switch{id = "anotempload"; name = "conveyor switch"; pixel_x = 12; pixel_y = -12},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) +"hn" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Temporary Storage"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"ho" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) "hp" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/outpost/abandoned) -"hq" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) -"hr" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) -"hs" = (/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/research/dock) -"ht" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/dock) -"hu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/outpost/research/dock) -"hv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/dock) -"hw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/dock) -"hx" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Research Shuttle Dock"; 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/dock) -"hy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/outpost/research/dock) -"hz" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/outpost/research/dock) -"hA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) -"hB" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_one_access = list(65,5)},/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{icon_state = "white"},/area/outpost/research/medical) -"hC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) -"hD" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/eva) -"hE" = (/obj/machinery/conveyor_switch{id = "anotempload"; name = "conveyor switch"; pixel_x = 12; pixel_y = -12},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/eva) -"hF" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Temporary Storage"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/eva) -"hG" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/eva) -"hH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway) -"hI" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"hJ" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"hK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"hL" = (/obj/machinery/light{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = -8; pixel_y = 28},/turf/simulated/floor{dir = 4; icon_state = "whiteyellowcorner"},/area/outpost/research/hallway) -"hM" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"hN" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{dir = 1; icon_state = "whiteyellowcorner"},/area/outpost/research/hallway) -"hO" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Maintenance Storage"; req_one_access = list(12,65)},/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/plating,/area/outpost/research/hallway) -"hP" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/alarm{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) -"hQ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"hR" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/outpost/research/hallway) -"hS" = (/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,/area/outpost/research/anomaly_analysis) -"hT" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/outpost/research/anomaly_analysis) -"hU" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/anomaly_analysis) +"hq" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hr" = (/obj/machinery/light{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = -8; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hs" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ht" = (/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/tiled/white,/area/outpost/research/hallway) +"hu" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/grey{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hy" = (/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/tiled,/area/outpost/research/anomaly_analysis) +"hz" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hA" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"hB" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"hC" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/alarm{pixel_y = 22},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Hallway Starboard"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hE" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_analysis) +"hF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"hG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"hH" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken2"; icon_state = "steel_broken2"},/area/outpost/abandoned) +"hI" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/outpost/research/dock) +"hJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Shuttle Dock"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"hK" = (/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) +"hL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/dock) +"hM" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/medical) +"hN" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/sign/greencross,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) +"hO" = (/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/tiled,/area/outpost/research/medical) +"hP" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/westleft{base_state = "right"; icon_state = "right"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/outpost/research/eva) +"hQ" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8; name = "disposal inlet"},/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/plating,/area/outpost/research/eva) +"hR" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/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/effect/floor_decal/corner/grey{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hS" = (/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},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/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/effect/floor_decal/corner/purple{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) "hV" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/bluegrid,/area/outpost/research/anomaly_analysis) -"hW" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/anomaly_analysis) +"hW" = (/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{d2 = 8; icon_state = "0-8"},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/effect/floor_decal/corner/grey{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) "hX" = (/obj/machinery/artifact_harvester,/turf/simulated/floor/bluegrid,/area/outpost/research/anomaly_analysis) -"hY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"hZ" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/outpost/abandoned) -"ia" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"ib" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"ic" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned) +"hY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/corner/grey{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"hZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/grey{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ia" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/biohazard{pixel_y = -32},/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/effect/floor_decal/corner/purple,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ib" = (/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/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ic" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/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/effect/floor_decal/corner/purple,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) "id" = (/turf/simulated/floor/airless,/area/outpost/abandoned) -"ie" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/airless{icon_state = "damaged3"},/area/outpost/abandoned) -"if" = (/obj/effect/alien/weeds,/turf/simulated/floor,/area/outpost/abandoned) +"ie" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Exotic Particles Collection"; req_access = list(65)},/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/tiled,/area/outpost/research/anomaly_analysis) +"if" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) "ig" = (/obj/structure/table/standard,/turf/simulated/floor/airless,/area/outpost/abandoned) -"ih" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) +"ih" = (/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},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) "ii" = (/obj/structure/table/rack,/turf/simulated/floor/airless,/area/outpost/abandoned) -"ij" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/outpost/research/dock) -"ik" = (/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) -"il" = (/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) -"im" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/research/dock) -"in" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) -"io" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/sign/greencross,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical) -"ip" = (/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) -"iq" = (/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) +"ij" = (/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/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"ik" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"il" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"im" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"in" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"io" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"ip" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"iq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{pixel_y = -24},/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/tiled/white,/area/outpost/research/hallway) "ir" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/research/eva) -"is" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8; name = "disposal inlet"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/outpost/research/eva) -"it" = (/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{d2 = 8; icon_state = "0-8"},/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{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway) -"iu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway) -"iv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway) -"iw" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/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"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway) -"ix" = (/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"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/hallway) -"iy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/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{dir = 2; icon_state = "whitepurplecorner"},/area/outpost/research/hallway) -"iz" = (/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) -"iA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/blue{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{dir = 2; icon_state = "whitepurple"},/area/outpost/research/hallway) -"iB" = (/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) -"iC" = (/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/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/hallway) -"iD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/hallway) -"iE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/hallway) -"iF" = (/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{dir = 1; icon_state = "whiteyellow"},/area/outpost/research/hallway) -"iG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway) -"iH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/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{dir = 8; icon_state = "whitepurplecorner"},/area/outpost/research/hallway) -"iI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/biohazard{pixel_y = -32},/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{dir = 2; icon_state = "whitepurplecorner"},/area/outpost/research/hallway) -"iJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{pixel_y = -24},/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{icon_state = "white"},/area/outpost/research/hallway) -"iK" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Exotic Particles Collection"; req_access = list(65)},/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,/area/outpost/research/anomaly_analysis) -"iL" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 6; icon_state = "whitepurple"},/area/outpost/research/hallway) -"iM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/anomaly_analysis) -"iN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/research/anomaly_analysis) -"iO" = (/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 = "warning"},/area/outpost/research/anomaly_analysis) -"iP" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{name = "Access Airlock"; 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/anomaly_analysis) -"iQ" = (/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_analysis) -"iR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_analysis) -"iS" = (/obj/item/weapon/anodevice{pixel_x = 3; pixel_y = 3},/obj/item/weapon/anodevice,/obj/structure/table/steel,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_analysis) -"iT" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) -"iU" = (/obj/effect/alien/weeds,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"iV" = (/obj/effect/decal/remains/human,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) -"iW" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"iX" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"iY" = (/obj/structure/table/rack,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) -"iZ" = (/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) -"ja" = (/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) -"jb" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "bluecorner"},/area/outpost/research/dock) -"jc" = (/obj/structure/table/standard,/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) -"jd" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor{dir = 2; icon_state = "arrival"},/area/outpost/research/dock) -"je" = (/obj/structure/closet/emcloset,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor,/area/outpost/research/dock) -"jf" = (/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) -"jg" = (/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) -"jh" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/outpost/research/medical) -"ji" = (/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) -"jj" = (/obj/machinery/sleep_console,/obj/machinery/light/small,/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/outpost/research/medical) -"jk" = (/obj/machinery/door/window/westleft,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/eva) -"jl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/eva) -"jm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/outpost/research/hallway) +"is" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/external{name = "Access Airlock"; 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/tiled,/area/outpost/research/anomaly_analysis) +"it" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/corner/purple/full{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway) +"iu" = (/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_analysis) +"iv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_analysis) +"iw" = (/obj/item/weapon/anodevice{pixel_x = 3; pixel_y = 3},/obj/item/weapon/anodevice,/obj/structure/table/steel,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_analysis) +"ix" = (/obj/effect/decal/remains/human,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"iy" = (/obj/structure/table/rack,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"iz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'INTERNALS REQUIRED'."; name = "INTERNALS REQUIRED"; pixel_x = -32; pixel_y = 0},/turf/space,/area/space) +"iA" = (/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) +"iB" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"iC" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/dock) +"iD" = (/obj/structure/table/standard,/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/tiled,/area/outpost/research/dock) +"iE" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"iF" = (/obj/structure/closet/emcloset,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"iG" = (/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/tiled,/area/outpost/research/dock) +"iH" = (/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/tiled,/area/outpost/research/dock) +"iI" = (/obj/machinery/sleeper{dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/outpost/research/medical) +"iJ" = (/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) +"iK" = (/obj/machinery/light/small,/turf/simulated/floor/tiled,/area/outpost/research/medical) +"iL" = (/obj/machinery/door/window/westleft,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) +"iM" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) +"iN" = (/obj/machinery/conveyor{dir = 9; id = "anotempload"},/obj/structure/plasticflaps,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"iO" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/isolation_monitoring) +"iP" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/isolation_monitoring) +"iQ" = (/obj/machinery/door/airlock/research{name = "Anomaly Isolation"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"iR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/isolation_monitoring) +"iS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/isolation_monitoring) +"iT" = (/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/tiled/dark,/area/outpost/research/anomaly_storage) +"iU" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"iV" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"iW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"iX" = (/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_analysis) +"iY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_analysis) +"iZ" = (/obj/item/weapon/anobattery{pixel_x = -6; pixel_y = 2},/obj/item/weapon/anobattery{pixel_x = -2; pixel_y = -2},/obj/item/weapon/anobattery{pixel_x = 2; pixel_y = 2},/obj/item/weapon/anobattery{pixel_x = 6; pixel_y = 6},/obj/machinery/light/small{dir = 4},/obj/structure/table/steel,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_analysis) +"ja" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/asteroid,/area/mine/explored) +"jb" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/asteroid,/area/mine/explored) +"jc" = (/obj/item/weapon/material/shard,/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken0"; icon_state = "steel_broken0"},/area/outpost/abandoned) +"jd" = (/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) +"je" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) +"jf" = (/obj/machinery/conveyor{dir = 5; id = "anosample"},/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor/plating,/area/outpost/research/eva) +"jg" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"jh" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"ji" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/outpost/research/eva) +"jj" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"jk" = (/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/tiled,/area/outpost/research/isolation_monitoring) +"jl" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"jm" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/tape_roll,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) "jn" = (/turf/simulated/wall/r_wall,/area/outpost/research/power) "jo" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/research{name = "Gas filtering"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/power) -"jp" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/isolation_monitoring) +"jp" = (/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 = -32; pixel_y = 0},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/plating,/area/outpost/research/power) "jq" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_monitoring) -"jr" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/isolation_monitoring) -"js" = (/obj/machinery/door/airlock/research{name = "Anomaly Isolation"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"jt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/isolation_monitoring) -"ju" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/research/isolation_monitoring) +"jr" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"js" = (/obj/structure/sign/nosmoking_2{pixel_y = -32},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Anomaly Analysis"; dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_analysis) +"jt" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"ju" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_analysis) "jv" = (/obj/machinery/door/airlock/maintenance{name = "Maintenance Storage"; req_one_access = list(12,65)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "jw" = (/turf/simulated/wall/r_wall,/area/outpost/research/emergency_storage) -"jx" = (/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) -"jy" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/outpost/research/anomaly_analysis) -"jz" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor,/area/outpost/research/anomaly_analysis) -"jA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/anomaly_analysis) -"jB" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_analysis) -"jC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_analysis) -"jD" = (/obj/item/weapon/anobattery{pixel_x = -6; pixel_y = 2},/obj/item/weapon/anobattery{pixel_x = -2; pixel_y = -2},/obj/item/weapon/anobattery{pixel_x = 2; pixel_y = 2},/obj/item/weapon/anobattery{pixel_x = 6; pixel_y = 6},/obj/machinery/light/small{dir = 4},/obj/structure/table/steel,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_analysis) -"jE" = (/obj/item/weapon/material/shard,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned) +"jx" = (/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"jy" = (/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned1"; icon_state = "steel_burned1"},/area/outpost/abandoned) +"jz" = (/obj/structure/disposalpipe/segment,/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/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_storage) +"jA" = (/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned1"; icon_state = "steel_burned1"},/area/outpost/abandoned) +"jB" = (/obj/structure/table/standard,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned1"; icon_state = "steel_burned1"},/area/outpost/abandoned) +"jC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"jD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"jE" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) "jF" = (/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/airless,/area/outpost/abandoned) -"jG" = (/obj/structure/table/rack,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) +"jG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) "jH" = (/turf/simulated/wall,/area/outpost/research/dock) -"jI" = (/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) +"jI" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) "jJ" = (/turf/simulated/wall,/area/outpost/research/medical) -"jK" = (/obj/machinery/conveyor{dir = 9; id = "anotempload"},/obj/structure/plasticflaps,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/outpost/research/eva) -"jL" = (/obj/machinery/conveyor{dir = 5; id = "anosample"},/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor/plating,/area/outpost/research/eva) -"jM" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/outpost/research/eva) +"jK" = (/obj/structure/closet/excavation,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"jL" = (/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) +"jM" = (/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/tiled,/area/outpost/research/eva) "jN" = (/obj/machinery/disposal/deliveryChute{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/outpost/research/eva) "jO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/power) -"jP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/eva) -"jQ" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"jR" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"jS" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"jT" = (/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/research/isolation_monitoring) -"jU" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"jV" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/tape_roll,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"jW" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"jX" = (/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"jY" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"jP" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"jQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"jR" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Loading area"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"jS" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 22},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Expedition Prep"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"jT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"jU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"jV" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/outpost/research/eva) +"jW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"jX" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/outpost/research/eva) +"jY" = (/obj/machinery/conveyor_switch{id = "anosample"; pixel_x = -8; pixel_y = 8},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/plating,/area/outpost/research/eva) "jZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "ka" = (/obj/structure/bed,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "kb" = (/turf/simulated/wall/r_wall,/area/outpost/research/anomaly_storage) -"kc" = (/obj/structure/disposalpipe/segment,/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/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) -"kd" = (/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) +"kc" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly_storage) +"kd" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken2"; icon_state = "steel_broken2"},/area/outpost/abandoned) "ke" = (/obj/machinery/artifact_scanpad,/obj/machinery/light/small,/turf/simulated/floor/bluegrid,/area/outpost/research/anomaly_analysis) -"kf" = (/obj/machinery/alarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/anomaly_analysis) -"kg" = (/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "dark"},/area/outpost/abandoned) -"kh" = (/obj/structure/table/standard,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"ki" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"kj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"kk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"kl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"km" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor,/area/outpost/abandoned) -"kn" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless,/area/outpost/abandoned) +"kf" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor,/area/outpost/abandoned) +"kg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_one_access = list(12,65)},/turf/simulated/floor/plating,/area/outpost/research/power) +"kh" = (/turf/simulated/floor/tiled,/area/outpost/research/eva) +"ki" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/plating,/area/outpost/research/power) +"kj" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kk" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kl" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"km" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kn" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) "ko" = (/turf/simulated/wall,/area/outpost/research/eva) -"kp" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/research/eva) -"kq" = (/obj/structure/closet/excavation,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/research/eva) -"kr" = (/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) -"ks" = (/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) -"kt" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/research/eva) -"ku" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor,/area/outpost/research/eva) -"kv" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_mining{name = "Loading area"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/eva) -"kw" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 22},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Expedition Prep"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/outpost/research/eva) -"kx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/eva) -"ky" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor,/area/outpost/research/eva) -"kz" = (/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 = -32; pixel_y = 0},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/outpost/research/power) -"kA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/outpost/research/eva) +"kp" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kq" = (/obj/structure/closet/excavation,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"kr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/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/tiled/dark,/area/outpost/research/anomaly_storage) +"ks" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_storage) +"kt" = (/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) +"ku" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_storage) +"kv" = (/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,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"kw" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"kx" = (/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/tiled,/area/outpost/research/eva) +"ky" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"kz" = (/obj/machinery/conveyor_switch/oneway{dir = 2; id = "anominerals"; pixel_y = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = -32},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"kA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/plating,/area/outpost/research/power) "kB" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/turf/simulated/floor/plating,/area/outpost/research/eva) -"kC" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/outpost/research/eva) +"kC" = (/obj/structure/closet/medical_wall{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) "kD" = (/turf/simulated/wall,/area/mine/unexplored) -"kE" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'INTERNALS REQUIRED'."; name = "INTERNALS REQUIRED"; pixel_x = -32; pixel_y = 0},/turf/space,/area/space) -"kF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_one_access = list(12,65)},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"; nitrogen = 0.01; oxygen = 0.01},/area/outpost/research/power) -"kG" = (/obj/machinery/conveyor_switch{id = "anosample"; pixel_x = -8; pixel_y = 8},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/outpost/research/eva) +"kE" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly_storage) +"kF" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned1"; icon_state = "steel_burned1"},/area/outpost/abandoned) +"kG" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) "kH" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/outpost/research/power) -"kI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/outpost/research/power) -"kJ" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"kK" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"kL" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"kM" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"kN" = (/obj/structure/table/standard,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"kO" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"kP" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"kI" = (/obj/machinery/door/airlock,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) +"kJ" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kK" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kL" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kM" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kN" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold/visible/supply,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kO" = (/obj/structure/table/standard,/obj/machinery/computer/atmoscontrol/laptop{monitored_alarm_ids = list("isolation_one","isolation_two","isolation_three"); req_one_access = list(47,24,11)},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kP" = (/obj/structure/table/standard,/obj/item/clothing/gloves/latex,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) "kQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/walllocker/emerglocker/west,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "kR" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) -"kS" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/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{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) -"kT" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) -"kU" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/outpost/research/anomaly_storage) -"kV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) -"kW" = (/obj/machinery/door/airlock,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) -"kX" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) -"kY" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned) -"kZ" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor,/area/outpost/abandoned) -"la" = (/turf/simulated/floor,/area/outpost/research/eva) -"lb" = (/obj/structure/closet/excavation,/turf/simulated/floor,/area/outpost/research/eva) -"lc" = (/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) -"ld" = (/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,/turf/simulated/floor,/area/outpost/research/eva) -"le" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/research/eva) -"lf" = (/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) -"lg" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor,/area/outpost/research/eva) -"lh" = (/obj/machinery/conveyor_switch/oneway{dir = 2; id = "anominerals"; pixel_y = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = -32},/turf/simulated/floor,/area/outpost/research/eva) +"kS" = (/obj/effect/gibspawner/human,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned1"; icon_state = "steel_burned1"},/area/outpost/abandoned) +"kT" = (/obj/structure/table/standard,/obj/item/weapon/folder,/obj/item/device/camera,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"kU" = (/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_storage) +"kV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_storage) +"kW" = (/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/tiled,/area/outpost/research/eva) +"kX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"kY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/asteroid,/area/mine/explored) +"kZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"la" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"lb" = (/obj/machinery/recharge_station,/turf/simulated/floor,/area/outpost/research/eva) +"lc" = (/obj/machinery/atmospherics/binary/pump/on{dir = 2; target_pressure = 200},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"ld" = (/obj/machinery/mineral/input,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"le" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHEAST)"; icon_state = "warning_dust"; dir = 5},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"lf" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHWEST)"; icon_state = "warning_dust"; dir = 9},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"lg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lh" = (/obj/effect/decal/remains/human,/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken2"; icon_state = "steel_broken2"},/area/outpost/abandoned) "li" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/outpost/research/eva) "lj" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/plating,/area/outpost/research/eva) "lk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/outpost/research/power) -"ll" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/meter,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/outpost/research/power) -"lm" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"ln" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lo" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lp" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lq" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lr" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"ls" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold/visible/supply,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lt" = (/obj/structure/table/standard,/obj/machinery/computer/atmoscontrol/laptop{monitored_alarm_ids = list("isolation_one","isolation_two","isolation_three"); req_one_access = list(47,24,11)},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lu" = (/obj/structure/table/standard,/obj/item/clothing/gloves/latex,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lv" = (/obj/structure/closet/medical_wall{pixel_x = 28; pixel_y = 0},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lw" = (/obj/structure/table/standard,/obj/item/weapon/folder,/obj/item/device/camera,/obj/item/weapon/pen,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"ll" = (/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/tiled,/area/outpost/research/isolation_monitoring) +"lm" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"ln" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lo" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lp" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lq" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned1"; icon_state = "steel_burned1"},/area/outpost/abandoned) +"lr" = (/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"ls" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_south = 2; tag_west = 3},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lt" = (/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/tiled,/area/outpost/research/isolation_monitoring) +"lu" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lv" = (/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly_storage) +"lw" = (/obj/structure/ore_box,/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/asteroid,/area/mine/explored) "lx" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "ly" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) -"lz" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) -"lA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage) -"lB" = (/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/outpost/research/anomaly_storage) -"lC" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor{icon_state = "dark"},/area/outpost/abandoned) -"lD" = (/obj/machinery/door/airlock,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"lE" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged3"},/area/outpost/abandoned) -"lF" = (/obj/effect/gibspawner/human,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) -"lG" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor,/area/outpost/abandoned) -"lH" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"lI" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless,/area/outpost/abandoned) -"lJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"lK" = (/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) -"lL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/outpost/research/eva) -"lM" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/outpost/research/eva) -"lN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/research/eva) -"lO" = (/obj/machinery/recharge_station,/turf/simulated/floor,/area/outpost/research/eva) -"lP" = (/obj/machinery/mineral/input,/turf/simulated/floor{dir = 2; icon_state = "loadingarea"},/area/outpost/research/eva) +"lz" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"lA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/floodlight,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"lB" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"lC" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/door/window{dir = 4; name = "Air Tank Access"; req_one_access = list(47,10,24)},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"lD" = (/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/research/eva) +"lE" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"lF" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"lG" = (/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"lH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/outpost/research/power) +"lI" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"lJ" = (/obj/machinery/atmospherics/unary/heater{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lK" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lL" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lM" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"lN" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lO" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/plating,/area/outpost/research/power) +"lP" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) "lQ" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/outpost/research/power) "lR" = (/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) "lS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/outpost/research/power) -"lT" = (/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) -"lU" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lV" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lW" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/outpost/research/isolation_monitoring) -"lX" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"lY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/outpost/research/isolation_monitoring) -"lZ" = (/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers,/turf/simulated/floor{icon_state = "warning"},/area/outpost/research/isolation_monitoring) -"ma" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_south = 2; tag_west = 3},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"mb" = (/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) -"mc" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"lT" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lU" = (/obj/machinery/power/emitter{anchored = 1},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"lV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"lW" = (/obj/machinery/door/airlock/glass{name = "Glass Airlock"},/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"lX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"lY" = (/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/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"lZ" = (/obj/machinery/suspension_gen,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"ma" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"mb" = (/obj/machinery/floodlight,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"mc" = (/obj/machinery/door/window{dir = 4; name = "Air Tank Access"; req_one_access = list(47,10,24)},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/research/eva) "md" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "me" = (/obj/structure/dispenser,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) -"mf" = (/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/outpost/research/anomaly_storage) -"mg" = (/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/outpost/research/anomaly_storage) -"mh" = (/obj/effect/decal/remains/human,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"mi" = (/obj/effect/alien/resin,/turf/simulated/floor/airless{icon_state = "floorgrime"},/area/outpost/abandoned) +"mf" = (/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/green,/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/research/eva) +"mg" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "research_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_one_access = list(13,65)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"mh" = (/obj/machinery/atmospherics/unary/freezer{dir = 4; icon_state = "freezer"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mi" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) "mj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/outpost/abandoned) "mk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/abandoned) -"ml" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless,/area/outpost/abandoned) -"mm" = (/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) -"mn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/floodlight,/turf/simulated/floor,/area/outpost/research/eva) -"mo" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor,/area/outpost/research/eva) -"mp" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/door/window{dir = 4; name = "Air Tank Access"; req_one_access = list(47,10,24)},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/research/eva) -"mq" = (/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/research/eva) -"mr" = (/obj/machinery/atmospherics/binary/pump/on{dir = 2; target_pressure = 200},/turf/simulated/floor,/area/outpost/research/eva) -"ms" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/research/eva) -"mt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/outpost/research/power) +"ml" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mm" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mn" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mo" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mp" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mq" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mr" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"ms" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"mt" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) "mu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/plating,/area/outpost/research/power) -"mv" = (/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/plating{dir = 1; icon_state = "warnplatecorner"},/area/outpost/research/power) -"mw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/obj/machinery/conveyor_switch{id = "mining_north"; pixel_x = -5},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) -"mx" = (/obj/machinery/atmospherics/unary/heater{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"my" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"mz" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"mA" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/outpost/research/eva) -"mB" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/research/isolation_monitoring) -"mC" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/isolation_monitoring) -"mD" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"mv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Power & Atmosphere Maintenance"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/power) +"mw" = (/obj/effect/decal/remains/human,/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned1"; icon_state = "steel_burned1"},/area/outpost/abandoned) +"mx" = (/obj/structure/table/rack,/turf/simulated/floor/tiled/airless{tag = "icon-steel_broken2"; icon_state = "steel_broken2"},/area/outpost/abandoned) +"my" = (/obj/structure/closet,/turf/simulated/floor/asteroid,/area/mine/explored) +"mz" = (/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/outpost/research/eva) +"mA" = (/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/outpost/research/eva) +"mB" = (/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/tiled,/area/outpost/research/isolation_monitoring) +"mC" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mD" = (/obj/machinery/atmospherics/valve/digital/open,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) "mE" = (/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) "mF" = (/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) -"mG" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged4"},/area/outpost/abandoned) -"mH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"mI" = (/obj/machinery/door/airlock/glass{name = "Glass Airlock"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/abandoned) -"mJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"mK" = (/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/outpost/abandoned) -"mL" = (/obj/machinery/suspension_gen,/turf/simulated/floor,/area/outpost/research/eva) -"mM" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/outpost/research/eva) -"mN" = (/obj/machinery/floodlight,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/research/eva) -"mO" = (/obj/machinery/door/window{dir = 4; name = "Air Tank Access"; req_one_access = list(47,10,24)},/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/research/eva) -"mP" = (/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/green,/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/research/eva) -"mQ" = (/obj/structure/ore_box,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) +"mG" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mH" = (/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/tiled,/area/outpost/research/isolation_monitoring) +"mI" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mJ" = (/obj/machinery/atmospherics/valve/digital/open,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mK" = (/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},/turf/simulated/floor/plating,/area/outpost/research/eva) +"mL" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mM" = (/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/tiled,/area/outpost/research/isolation_monitoring) +"mN" = (/obj/machinery/atmospherics/valve/digital/open,/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) +"mO" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "research_inner"; locked = 1; name = "Research Outpost External Access"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"mP" = (/obj/machinery/disposal/deliveryChute{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"mQ" = (/obj/structure/table/steel,/turf/simulated/floor/asteroid,/area/mine/explored) "mR" = (/turf/simulated/wall,/area/mine/explored) -"mS" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "research_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_one_access = list(13,65)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor,/area/outpost/research/eva) -"mT" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/research/eva) -"mU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/research{name = "Power & Atmosphere Maintenance"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/power) +"mS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (SOUTHEAST)"; icon_state = "warning_dust"; dir = 6},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"mT" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (SOUTHWEST)"; icon_state = "warning_dust"; dir = 10},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"mU" = (/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/tiled,/area/outpost/research/power) "mV" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/outpost/research/power) -"mW" = (/obj/machinery/atmospherics/unary/freezer{dir = 4; icon_state = "freezer"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"mX" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"mY" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/isolation_monitoring) -"mZ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"na" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/research/isolation_monitoring) -"nb" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor{icon_state = "delivery"},/area/outpost/research/isolation_monitoring) -"nc" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) +"mW" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (SOUTHWEST)"; icon_state = "intact-scrubbers"; dir = 10},/turf/simulated/floor/tiled,/area/outpost/research/power) +"mX" = (/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/tiled,/area/outpost/research/power) +"mY" = (/obj/structure/girder/displaced,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"mZ" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/asteroid,/area/mine/explored) +"na" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/asteroid,/area/mine/explored) +"nb" = (/obj/structure/table/rack,/turf/simulated/floor/asteroid,/area/mine/explored) +"nc" = (/obj/machinery/door/airlock/external{id_tag = "riso1"; name = "Access Airlock"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_a) "nd" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) "ne" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/lights/bulbs{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/lights/tubes{pixel_x = -5; pixel_y = 5},/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage) -"nf" = (/obj/effect/decal/remains/human,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned) -"ng" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged4"},/area/outpost/abandoned) +"nf" = (/obj/structure/lattice,/turf/space,/area/mine/explored) +"ng" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/mech_recharger,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) "nh" = (/obj/structure/table,/turf/simulated/floor/airless,/area/outpost/abandoned) -"ni" = (/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/abandoned) -"nj" = (/obj/structure/table/rack,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/abandoned) -"nk" = (/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/outpost/research/eva) -"nl" = (/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/outpost/research/eva) -"nm" = (/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},/turf/simulated/floor/plating,/area/outpost/research/eva) -"nn" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "research_inner"; locked = 1; name = "Research Outpost External Access"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/outpost/research/eva) -"no" = (/obj/machinery/disposal/deliveryChute{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/research/eva) -"np" = (/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) -"nq" = (/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) -"nr" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (SOUTHWEST)"; icon_state = "intact-scrubbers"; dir = 10},/turf/simulated/floor,/area/outpost/research/power) -"ns" = (/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) -"nt" = (/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) -"nu" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"nv" = (/obj/machinery/atmospherics/valve/digital/open,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"nw" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/outpost/research/isolation_monitoring) -"nx" = (/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) -"ny" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/outpost/research/isolation_monitoring) -"nz" = (/obj/machinery/atmospherics/valve/digital/open,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "delivery"},/area/outpost/research/isolation_monitoring) -"nA" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"nB" = (/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) -"nC" = (/obj/machinery/atmospherics/valve/digital/open,/turf/simulated/floor,/area/outpost/research/isolation_monitoring) -"nD" = (/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"nE" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "damaged4"},/area/outpost/abandoned) -"nF" = (/obj/structure/girder/displaced,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned) -"nG" = (/obj/structure/table/steel,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"nH" = (/obj/machinery/light/small{dir = 8},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "research_pump"; tag_exterior_door = "research_outer"; frequency = 1379; id_tag = "research_airlock"; tag_interior_door = "research_inner"; pixel_x = -25; pixel_y = 0; tag_chamber_sensor = "research_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor,/area/outpost/research/eva) -"nI" = (/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) -"nJ" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor,/area/outpost/research/eva) -"nK" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/research/eva) -"nL" = (/obj/machinery/conveyor_switch{id = "anosample"; req_access = list(65)},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"nM" = (/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) -"nN" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) -"nO" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/explored) -"nP" = (/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) -"nQ" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/outpost/research/power) -"nR" = (/obj/machinery/door/airlock/external{id_tag = "riso1"; name = "Access Airlock"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/isolation_a) +"ni" = (/obj/machinery/door/airlock/external{id_tag = "riso2"; name = "Access Airlock"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_b) +"nj" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"nk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "research_pump"; tag_exterior_door = "research_outer"; frequency = 1379; id_tag = "research_airlock"; tag_interior_door = "research_inner"; pixel_x = -25; pixel_y = 0; tag_chamber_sensor = "research_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor/tiled,/area/outpost/research/eva) +"nl" = (/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/tiled,/area/outpost/research/eva) +"nm" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"nn" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/research/eva) +"no" = (/obj/machinery/door/airlock/external{id_tag = "riso3"; name = "Access Airlock"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_c) +"np" = (/obj/machinery/conveyor_switch{id = "anosample"; req_access = list(65)},/turf/simulated/floor/asteroid,/area/mine/explored) +"nq" = (/obj/machinery/conveyor_switch{id = "anotempload"; name = "conveyor switch"; pixel_x = 0; pixel_y = 0; req_access = list(65)},/turf/simulated/floor/asteroid,/area/mine/explored) +"nr" = (/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/tiled,/area/outpost/research/power) +"ns" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/outpost/research/power) +"nt" = (/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) +"nu" = (/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) +"nv" = (/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) +"nw" = (/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) +"nx" = (/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) +"ny" = (/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) +"nz" = (/obj/structure/girder,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"nA" = (/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) +"nB" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/explored) +"nC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/explored) +"nD" = (/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/mine/explored) +"nE" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/space,/area/mine/explored) +"nF" = (/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"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"nG" = (/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},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"nH" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"nI" = (/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) +"nJ" = (/obj/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Research"},/obj/structure/cable/blue,/turf/simulated/floor,/area/outpost/research/power) +"nK" = (/obj/machinery/atmospherics/valve/digital/open,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/power) +"nL" = (/obj/machinery/atmospherics/valve/digital/open,/turf/simulated/floor/tiled,/area/outpost/research/power) +"nM" = (/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/tiled,/area/outpost/research/isolation_a) +"nN" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_one"; dir = 8; pixel_x = 22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_a) +"nO" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled,/area/outpost/research/isolation_a) +"nP" = (/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/tiled,/area/outpost/research/isolation_b) +"nQ" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_two"; dir = 8; pixel_x = 22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_b) +"nR" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled,/area/outpost/research/isolation_b) "nS" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_a) -"nT" = (/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) -"nU" = (/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) -"nV" = (/obj/machinery/door/airlock/external{id_tag = "riso2"; name = "Access Airlock"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/isolation_b) -"nW" = (/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) -"nX" = (/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) -"nY" = (/obj/machinery/door/airlock/external{id_tag = "riso3"; name = "Access Airlock"; req_access = list(65)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/research/isolation_c) +"nT" = (/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/tiled,/area/outpost/research/isolation_c) +"nU" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_three"; dir = 8; pixel_x = 22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/isolation_c) +"nV" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled,/area/outpost/research/isolation_c) +"nW" = (/turf/space,/area/mine/unexplored) +"nX" = (/obj/machinery/floodlight,/turf/simulated/floor/asteroid,/area/mine/explored) +"nY" = (/obj/structure/closet/crate,/turf/simulated/floor/asteroid,/area/mine/explored) "nZ" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_c) -"oa" = (/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) -"ob" = (/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) -"oc" = (/obj/structure/table/standard,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned) -"od" = (/obj/structure/girder,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned) -"oe" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/explored) -"of" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/space,/area/mine/explored) -"og" = (/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) -"oh" = (/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) -"oi" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/outpost/research/eva) -"oj" = (/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) -"ok" = (/obj/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Research"},/obj/structure/cable/blue,/turf/simulated/floor,/area/outpost/research/power) -"ol" = (/obj/machinery/atmospherics/valve/digital/open,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/outpost/research/power) -"om" = (/obj/structure/ore_box,/obj/machinery/light_construct/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"on" = (/obj/machinery/atmospherics/valve/digital/open,/turf/simulated/floor,/area/outpost/research/power) -"oo" = (/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_a) -"op" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_one"; dir = 8; pixel_x = 22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/outpost/research/isolation_a) -"oq" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/outpost/research/isolation_a) -"or" = (/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_b) -"os" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_two"; dir = 8; pixel_x = 22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/outpost/research/isolation_b) -"ot" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/outpost/research/isolation_b) -"ou" = (/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) -"ov" = (/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_three"; dir = 8; pixel_x = 22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/outpost/research/isolation_c) -"ow" = (/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"ox" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) -"oy" = (/obj/machinery/conveyor{dir = 1; id = "anosample"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) -"oz" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/outpost/research/isolation_c) -"oA" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/machinery/light/small{dir = 1},/obj/structure/curtain/open/shower/engineering,/obj/machinery/door/window/northright{dir = 8; name = "Shower"; req_access = list()},/turf/simulated/floor{icon_state = "freezerfloor"},/area/outpost/engineering/meeting) -"oB" = (/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) -"oC" = (/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) -"oD" = (/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) -"oE" = (/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) -"oF" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/floor,/area/outpost/research/power) +"oa" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored) +"ob" = (/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) +"oc" = (/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) +"od" = (/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) +"oe" = (/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) +"of" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHEAST)"; icon_state = "warning_dust"; dir = 5},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"og" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/power) +"oh" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"oi" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell A"; dir = 8},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"oj" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"ok" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"ol" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell B"; dir = 8},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"om" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"on" = (/obj/effect/landmark{name = "bluespacerift"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"oo" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"op" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"oq" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell C"; dir = 8},/obj/machinery/light{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"or" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"os" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"ot" = (/obj/structure/bed,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"ou" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"ov" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"ow" = (/obj/machinery/door/airlock/external{name = "External Airlock"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/abandoned) +"ox" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/explored) +"oy" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/explored) +"oz" = (/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/asteroid,/area/mine/explored) +"oA" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (SOUTHEAST)"; icon_state = "warning_dust"; dir = 6},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"oB" = (/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)},/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"oC" = (/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/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"oD" = (/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},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"oE" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/asteroid,/area/mine/explored) +"oF" = (/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/asteroid,/area/mine/explored) "oG" = (/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) -"oH" = (/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_a) -"oI" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell A"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a) -"oJ" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a) -"oK" = (/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) -"oL" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell B"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) -"oM" = (/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) -"oN" = (/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) -"oO" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell C"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) -"oP" = (/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) -"oQ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned) -"oR" = (/obj/machinery/door/airlock/external{name = "External Airlock"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/abandoned) -"oS" = (/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) -"oT" = (/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) -"oU" = (/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) -"oV" = (/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) -"oW" = (/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) -"oX" = (/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) -"oY" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"oZ" = (/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) +"oH" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"oI" = (/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/tiled,/area/outpost/research/power) +"oJ" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (NORTHWEST)"; icon_state = "intact-scrubbers"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/research/power) +"oK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"oL" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{tag = "icon-intact-supply (NORTHWEST)"; icon_state = "intact-supply"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/research/power) +"oM" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a) +"oN" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a) +"oO" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b) +"oP" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b) +"oQ" = (/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"},/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"oR" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"oS" = (/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/asteroid,/area/mine/explored) +"oT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/material/shard,/turf/simulated/floor/airless{tag = "icon-dmg2"; icon_state = "dmg2"},/area/outpost/abandoned) +"oU" = (/obj/machinery/door/airlock/external{name = "External Airlock"},/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/outpost/abandoned) +"oV" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/asteroid,/area/mine/explored) +"oW" = (/obj/machinery/light_construct/small,/obj/structure/table/rack,/obj/item/stack/material/steel{amount = 10},/turf/simulated/floor/asteroid,/area/mine/explored) +"oX" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/turf/simulated/floor/asteroid,/area/mine/explored) +"oY" = (/turf/simulated/floor/tiled/airless{tag = "icon-steel_burned0"; icon_state = "steel_burned0"},/area/mine/unexplored) +"oZ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/asteroid,/area/mine/explored) "pa" = (/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) -"pb" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (NORTHWEST)"; icon_state = "intact-scrubbers"; dir = 9},/turf/simulated/floor,/area/outpost/research/power) -"pc" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{tag = "icon-intact-supply (NORTHWEST)"; icon_state = "intact-supply"; dir = 9},/turf/simulated/floor,/area/outpost/research/power) -"pd" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a) -"pe" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a) -"pf" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a) -"pg" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b) -"ph" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b) -"pi" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b) -"pj" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) -"pk" = (/obj/structure/bed,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) -"pl" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c) -"pm" = (/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) +"pb" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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"},/turf/simulated/floor/asteroid,/area/mine/explored) +"pc" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHWEST)"; icon_state = "warning_dust"; dir = 9},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"pd" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "mining_north_outpost_airlock"; pixel_x = 0; pixel_y = 25; tag_airpump = "mining_north_outpost_pump"; tag_chamber_sensor = "mining_north_outpost_sensor"; tag_exterior_door = "mining_north_outpost_outer"; tag_interior_door = "mining_north_outpost_inner"},/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/tiled,/area/outpost/mining_north) +"pe" = (/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) +"pf" = (/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) +"pg" = (/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/tiled,/area/outpost/mining_north) +"ph" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pi" = (/obj/structure/table/standard,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/microwave{pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pj" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pk" = (/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/asteroid,/area/mine/explored) +"pl" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{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 = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/asteroid,/area/mine/explored) +"pm" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_north_outpost_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_one_access = list(13,54)},/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},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) "pn" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_b) -"po" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/outpost/abandoned) -"pp" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/outpost/abandoned) -"pq" = (/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) -"pr" = (/obj/structure/closet,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"ps" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/material/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned) -"pt" = (/obj/machinery/light_construct/small,/obj/structure/table/rack,/obj/item/stack/material/steel{amount = 10},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"pu" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"pv" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) +"po" = (/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/tiled,/area/outpost/mining_north) +"pp" = (/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/tiled,/area/outpost/mining_north) +"pq" = (/obj/structure/table,/obj/structure/table/rack,/obj/item/stack/material/glass/reinforced{amount = 8},/obj/item/stack/rods{amount = 6},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pr" = (/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{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/tiled,/area/outpost/mining_north) +"ps" = (/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/tiled,/area/outpost/mining_north) +"pt" = (/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 = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pu" = (/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/effect/decal/cleanable/dirt,/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/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pv" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_north) "pw" = (/turf/simulated/wall,/area/outpost/mining_north) -"px" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "mining_north_outpost_airlock"; pixel_x = 0; pixel_y = 25; tag_airpump = "mining_north_outpost_pump"; tag_chamber_sensor = "mining_north_outpost_sensor"; tag_exterior_door = "mining_north_outpost_outer"; tag_interior_door = "mining_north_outpost_inner"},/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) -"py" = (/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) +"px" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"py" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/plating,/area/outpost/mining_north) "pz" = (/turf/simulated/wall/r_wall,/area/mine/explored) -"pA" = (/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) -"pB" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/explored) -"pC" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/explored) -"pD" = (/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) -"pE" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor,/area/outpost/research/eva) -"pF" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"pG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/outpost/mining_north) -"pH" = (/obj/structure/table/standard,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/microwave{pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) +"pA" = (/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access = list(54)},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pB" = (/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/asteroid,/area/mine/explored) +"pC" = (/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/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pD" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pF" = (/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/asteroid,/area/mine/explored) +"pG" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/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/asteroid,/area/mine/explored) +"pH" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/asteroid,/area/mine/explored) "pI" = (/obj/effect/decal/cleanable/cobweb,/obj/item/stack/material/steel{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) "pJ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/outpost/mining_north) -"pK" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"pL" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"pM" = (/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) -"pN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{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 = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"pO" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_north_outpost_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_one_access = list(13,54)},/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/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) -"pP" = (/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) -"pQ" = (/obj/structure/table/rack,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"pR" = (/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) -"pS" = (/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{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) -"pT" = (/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) -"pU" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"pV" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"pW" = (/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 = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"pX" = (/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/effect/decal/cleanable/dirt,/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/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"pY" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"pZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"qa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/plating,/area/outpost/mining_north) -"qb" = (/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access = list(54)},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_north) -"qc" = (/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/airless{icon_state = "asteroidplating"},/area/mine/explored) -"qd" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"qe" = (/turf/simulated/floor/mech_bay_recharge_floor{icon_state = "recharge_floor_asteroid"},/area/mine/explored) -"qf" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) +"pK" = (/obj/structure/disposalpipe/junction/yjunction,/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/asteroid,/area/mine/explored) +"pL" = (/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_north) +"pM" = (/obj/machinery/mineral/output,/obj/machinery/conveyor{dir = 4; id = "mining_north"},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pN" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal/deliveryChute{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pO" = (/obj/machinery/mineral/input,/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_north"},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pP" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/machinery/light/small{dir = 1},/obj/structure/curtain/open/shower/engineering,/obj/machinery/door/window/northright{dir = 8; name = "Shower"; req_access = list()},/turf/simulated/floor/tiled/freezer,/area/outpost/engineering/meeting) +"pQ" = (/obj/machinery/light/small,/turf/simulated/floor/asteroid,/area/mine/explored) +"pR" = (/obj/machinery/mineral/unloading_machine{icon_state = "unloader-corner"},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pS" = (/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/tiled,/area/outpost/mining_north) +"pT" = (/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/tiled,/area/outpost/mining_north) +"pU" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pV" = (/obj/structure/girder,/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pW" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_north"},/turf/simulated/floor/tiled,/area/outpost/mining_north) +"pX" = (/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"pY" = (/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/tiled,/area/outpost/engineering/storage) +"pZ" = (/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/tiled,/area/outpost/engineering/storage) +"qa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"qb" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/obj/machinery/conveyor_switch{id = "mining_north"; pixel_x = -5},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (SOUTHWEST)"; icon_state = "warning_dust"; dir = 10},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"qc" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"qd" = (/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/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"qe" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/asteroid,/area/mine/explored) +"qf" = (/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/tiled,/area/outpost/engineering/storage) "qg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/mining_north) -"qh" = (/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/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"qi" = (/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},/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/outpost/mining_north) -"qj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) +"qh" = (/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/tiled,/area/outpost/engineering/storage) +"qi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"qj" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) "qk" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_north) -"ql" = (/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/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"qm" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/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/airless{icon_state = "asteroidplating"},/area/mine/explored) -"qn" = (/obj/structure/disposalpipe/junction/yjunction,/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{icon_state = "asteroidplating"},/area/mine/explored) -"qo" = (/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_north) -"qp" = (/obj/machinery/mineral/output,/obj/machinery/conveyor{dir = 4; id = "mining_north"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"qq" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal/deliveryChute{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"qr" = (/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) -"qs" = (/obj/machinery/mineral/unloading_machine{icon_state = "unloader-corner"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"qt" = (/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) -"qu" = (/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) -"qv" = (/obj/structure/table,/obj/structure/table/rack,/obj/item/stack/material/glass/reinforced{amount = 8},/obj/item/stack/rods{amount = 6},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"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) +"ql" = (/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/wood{amount = 30},/obj/item/stack/material/plastic{amount = 10},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"qm" = (/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"qn" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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/asteroid,/area/mine/explored) +"qo" = (/turf/simulated/floor/airless,/area/space) +"qp" = (/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/light{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"qq" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"qr" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/asteroid,/area/mine/explored) +"qs" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/terminal,/turf/simulated/floor/tiled,/area/outpost/engineering/power) +"qt" = (/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/tiled,/area/outpost/engineering/power) +"qu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/sensor{long_range = 1; name_tag = "Asteroid Main Grid"},/turf/simulated/floor/tiled,/area/outpost/engineering/power) +"qv" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/asteroid,/area/mine/explored) +"qw" = (/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/asteroid,/area/mine/explored) "qx" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/outpost/mining_north) "qy" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/outpost/mining_north) -"qz" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/outpost/mining_north) +"qz" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space) "qA" = (/obj/item/weapon/shovel,/obj/item/weapon/pickaxe,/turf/simulated/floor/plating,/area/outpost/mining_north) -"qB" = (/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) -"qC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/explored) -"qD" = (/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/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) -"qE" = (/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/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) -"qF" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"qG" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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{icon_state = "asteroidplating"},/area/mine/explored) -"qH" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"qI" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"qJ" = (/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space) -"qK" = (/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) -"qL" = (/turf/space,/area/mine/unexplored) -"qM" = (/obj/structure/closet/crate,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"qN" = (/obj/machinery/floodlight,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"qO" = (/obj/machinery/power/solar,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space) -"qP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored) -"qQ" = (/obj/machinery/power/solar,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space) -"qR" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space) -"qS" = (/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/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) -"qT" = (/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/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) +"qB" = (/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/airless,/area/space) +"qC" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"qD" = (/obj/machinery/power/solar,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/space) +"qE" = (/obj/machinery/power/solar,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/space) +"qF" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/space) +"qG" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"qH" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"qI" = (/obj/machinery/telecomms/relay/preset/mining,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/telecomms) +"qJ" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"qK" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) +"qL" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) +"qM" = (/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"qN" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) +"qO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/outpost/engineering/power) +"qP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/outpost/engineering/power) +"qQ" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/power) +"qR" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) +"qS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) +"qT" = (/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) "qU" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/meeting) -"qV" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) -"qW" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) -"qX" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) -"qY" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) -"qZ" = (/obj/machinery/door/airlock/engineering{name = "Restrooms"; req_access = list(10)},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) -"ra" = (/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) -"rb" = (/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) -"rc" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting) -"rd" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/explored) -"re" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/explored) -"rf" = (/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) -"rg" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) +"qV" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/cyan,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"qW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) +"qX" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) +"qY" = (/obj/machinery/door/airlock/engineering{name = "Restrooms"; req_access = list(10)},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/engineering/meeting) +"qZ" = (/obj/machinery/door/airlock/engineering{name = "Restrooms"; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/meeting) +"ra" = (/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/tiled,/area/outpost/engineering/storage) +"rb" = (/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/airless,/area/outpost/engineering/hallway) +"rc" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/table/standard,/obj/random/tech_supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) +"rd" = (/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"},/obj/machinery/computer/station_alert,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) +"re" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rf" = (/obj/structure/bed/chair,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rg" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) "rh" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/storage) -"ri" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/explored) +"ri" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) "rj" = (/turf/simulated/wall,/area/outpost/engineering/meeting) -"rk" = (/obj/machinery/door/airlock/engineering{name = "Restrooms"; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/meeting) -"rl" = (/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) -"rm" = (/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) -"rn" = (/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) +"rk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/telecomms) +"rl" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"rm" = (/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/tiled,/area/outpost/engineering/storage) +"rn" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) "ro" = (/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) -"rp" = (/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) +"rp" = (/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/tiled,/area/outpost/engineering/power) "rq" = (/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) "rr" = (/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) -"rs" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/table/standard,/obj/random/tech_supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"rt" = (/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"},/obj/machinery/computer/station_alert,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) +"rs" = (/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/tiled,/area/outpost/engineering/power) +"rt" = (/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/tiled,/area/outpost/engineering/power) "ru" = (/obj/structure/table/standard,/obj/random/tech_supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"rv" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"rw" = (/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) -"rx" = (/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) -"ry" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"rz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/storage) +"rv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/power) +"rw" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/storage) +"rx" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"ry" = (/obj/machinery/computer/shuttle_control/engineering,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"rz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "rA" = (/obj/machinery/floodlight,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"rB" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/unexplored) -"rC" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/unexplored) -"rD" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/unexplored) +"rB" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"rC" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rD" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) "rE" = (/turf/simulated/wall,/area/outpost/engineering/storage) -"rF" = (/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rF" = (/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) "rG" = (/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"rH" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"rI" = (/obj/structure/bed/chair,/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) -"rJ" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) -"rK" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rH" = (/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) +"rI" = (/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) +"rJ" = (/obj/machinery/light_construct/small,/turf/simulated/floor/asteroid,/area/mine/explored) +"rK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/storage) "rL" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"rM" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) +"rM" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) "rN" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/engineering/meeting) -"rO" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/outpost/engineering/storage) -"rP" = (/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/wood{amount = 30},/obj/item/stack/material/plastic{amount = 10},/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/engineering/storage) -"rQ" = (/turf/simulated/floor,/area/outpost/engineering/storage) +"rO" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/power) +"rQ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 1.5e+007; cur_coils = 3; input_attempt = 1; input_level = 750000; input_level_max = 750000; output_level = 750000; output_level_max = 750000; RCon_tag = "Outpost - Main"},/turf/simulated/floor/tiled,/area/outpost/engineering/power) "rR" = (/obj/machinery/vending/snack,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"rS" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/storage) -"rT" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rS" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/port_gen/pacman{anchored = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"rT" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "rU" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) -"rV" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rV" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "rW" = (/obj/structure/flora/pottedplant{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"rX" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"rX" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "rY" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/power) -"rZ" = (/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) -"sa" = (/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) -"sb" = (/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) +"rZ" = (/obj/structure/cable/yellow,/turf/simulated/floor/airless,/area/space) +"sa" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"sb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "sc" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/hallway) "sd" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/telecomms) -"se" = (/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/light{dir = 8},/turf/simulated/floor,/area/outpost/engineering/storage) -"sf" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/engineering/storage) +"se" = (/obj/machinery/cell_charger,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"sf" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc/super{dir = 1; pixel_y = 24},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) "sg" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"sh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/storage) +"sh" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/storage) "si" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "sj" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) -"sk" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) -"sl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) +"sk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sl" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "sm" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/pipedispenser,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"sn" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/terminal,/turf/simulated/floor,/area/outpost/engineering/power) -"so" = (/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) -"sp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/sensor{long_range = 1; name_tag = "Asteroid Main Grid"},/turf/simulated/floor,/area/outpost/engineering/power) -"sq" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/power) -"sr" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 1.5e+007; cur_coils = 3; input_attempt = 1; input_level = 750000; input_level_max = 750000; output_level = 750000; output_level_max = 750000; RCon_tag = "Outpost - Main"},/turf/simulated/floor,/area/outpost/engineering/power) -"ss" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "edock_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10)},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/outpost/engineering/hallway) -"st" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "edock_sensor"; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "edock_pump"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"su" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/engineering/hallway) -"sv" = (/turf/simulated/floor,/area/outpost/engineering/hallway) -"sw" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/outpost/engineering/hallway) -"sx" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"sy" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/outpost/engineering/hallway) -"sz" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/space) -"sA" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) +"sn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/vacuum{pixel_x = 32},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"so" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"sp" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/carpet,/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"sq" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/effect/floor_decal/carpet,/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"sr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"ss" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) +"st" = (/obj/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Engineering"},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/power) +"su" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/power) +"sv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sw" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sx" = (/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/tiled,/area/outpost/engineering/hallway) +"sy" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sz" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"sA" = (/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/tiled,/area/outpost/engineering/hallway) "sB" = (/obj/structure/disposalpipe/segment,/turf/unsimulated/mask,/area/mine/unexplored) -"sC" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) -"sD" = (/obj/machinery/cell_charger,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"sE" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"sF" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc/super{dir = 1; pixel_y = 24},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) +"sC" = (/obj/machinery/light{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sD" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sE" = (/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) +"sF" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "sG" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) -"sH" = (/turf/simulated/floor/airless,/area/space) +"sH" = (/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)"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "sI" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) -"sJ" = (/obj/machinery/telecomms/relay/preset/mining,/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) -"sK" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/outpost/engineering/storage) -"sL" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"sM" = (/obj/machinery/light_construct/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"sN" = (/turf/simulated/floor/plating/airless,/area/space) -"sO" = (/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/mine/explored) -"sP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/explored) -"sQ" = (/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/engineering/storage) -"sR" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) -"sS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/mine/explored) -"sT" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light{dir = 1},/turf/space,/area/mine/explored) -"sU" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/mine/explored) -"sV" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/explored) -"sW" = (/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/mine/explored) -"sX" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) +"sJ" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sK" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sL" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{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/tiled,/area/outpost/engineering/hallway) +"sM" = (/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/tiled,/area/outpost/engineering/hallway) +"sN" = (/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) +"sO" = (/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) +"sP" = (/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/tiled,/area/outpost/engineering/hallway) +"sQ" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/space) +"sR" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/space) +"sS" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/space) +"sT" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless,/area/space) +"sU" = (/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"sV" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"sX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) "sY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"sZ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/airless,/area/mine/explored) -"ta" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored) -"tb" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/mine/explored) -"tc" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/storage) -"td" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) -"te" = (/obj/structure/cable/blue{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/carpet,/area/outpost/engineering/meeting) +"sZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"ta" = (/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/manifold/hidden/cyan{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tb" = (/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"},/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"td" = (/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) +"te" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "tf" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"tg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/explored) -"th" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) -"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/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Engineering"},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/outpost/engineering/power) -"tl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/outpost/engineering/power) -"tm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/outpost/engineering/power) -"tn" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/power) -"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) -"tp" = (/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"tq" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/power) -"tr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"ts" = (/obj/item/clothing/under/rank/miner,/obj/effect/decal/remains/human,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"tt" = (/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"tu" = (/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,/area/outpost/engineering/hallway) -"tv" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/cyan,/turf/simulated/floor,/area/outpost/engineering/hallway) -"tw" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"tx" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/space,/area/mine/explored) -"ty" = (/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) -"tz" = (/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) -"tA" = (/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) -"tB" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"tC" = (/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) -"tD" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/space) -"tE" = (/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) -"tF" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/space) -"tG" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"tH" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/space) -"tI" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/space) -"tJ" = (/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) +"tg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"th" = (/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/hallway) +"ti" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tj" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/space) +"tk" = (/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/asteroid,/area/mine/explored) +"tl" = (/obj/machinery/light/small{dir = 4},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Airlock Entry"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"tm" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tn" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"to" = (/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/door/airlock/glass_engineering{name = "Telecommunications"; req_access = list(10)},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/hallway) +"tp" = (/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/tiled,/area/outpost/engineering/hallway) +"tq" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"tr" = (/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/tiled,/area/outpost/engineering/hallway) +"ts" = (/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/camera/network/engineering_outpost{c_tag = "Engineering Outpost Hallway West"; dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tt" = (/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{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tu" = (/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/tiled,/area/outpost/engineering/hallway) +"tv" = (/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{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tw" = (/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/tiled,/area/outpost/engineering/hallway) +"tx" = (/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) +"ty" = (/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/tiled,/area/outpost/engineering/hallway) +"tz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tA" = (/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/tiled,/area/outpost/engineering/hallway) +"tB" = (/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/tiled,/area/outpost/engineering/hallway) +"tC" = (/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/tiled,/area/outpost/engineering/hallway) +"tD" = (/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/tiled,/area/outpost/engineering/hallway) +"tE" = (/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/tiled,/area/outpost/engineering/hallway) +"tF" = (/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) +"tG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tH" = (/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 = "Power Distribution Center"; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tI" = (/obj/structure/cable{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/tiled,/area/outpost/engineering/hallway) +"tJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "tK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/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/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) "tL" = (/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) -"tM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) -"tN" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/outpost/engineering/storage) -"tO" = (/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) -"tP" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/outpost/engineering/storage) -"tQ" = (/obj/machinery/mining/drill,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) +"tM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tO" = (/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "edock_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10)},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"tQ" = (/obj/machinery/power/solar_control,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "tR" = (/obj/machinery/light{dir = 8},/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "tS" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "tT" = (/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/wood,/area/outpost/engineering/meeting) "tU" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{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/wood,/area/outpost/engineering/meeting) "tV" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"tW" = (/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) -"tX" = (/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) -"tY" = (/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) -"tZ" = (/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) -"ua" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/power) -"ub" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"ud" = (/obj/machinery/computer/shuttle_control/engineering,/turf/simulated/floor,/area/outpost/engineering/hallway) -"ue" = (/obj/machinery/mining/brace,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"uf" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) -"ug" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uh" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor,/area/outpost/engineering/hallway) -"ui" = (/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/hallway) -"uj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/outpost/engineering/hallway) -"uk" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating/airless,/area/space) -"ul" = (/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/airless{icon_state = "asteroidplating"},/area/mine/explored) -"um" = (/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) -"un" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uo" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/engineering/hallway) -"up" = (/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/door/airlock/glass_engineering{name = "Telecommunications"; req_access = list(10)},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/hallway) +"tW" = (/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/airless,/area/space) +"tX" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"tY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"tZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/machinery/light{dir = 1},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"ua" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_outer"; locked = 1; name = "Engineering Outpost"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"ub" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_inner"; locked = 1; name = "Engineering Outpost"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"uc" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"ud" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"ue" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uf" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"ug" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uh" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"ui" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eoutpost_main_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"uj" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uk" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"ul" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{tag = "icon-intact-supply (NORTHWEST)"; icon_state = "intact-supply"; dir = 9},/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 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"um" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"un" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"uo" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"up" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 200},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) "uq" = (/turf/simulated/wall,/area/outpost/engineering/hallway) -"ur" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"us" = (/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) -"ut" = (/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) -"uu" = (/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) +"ur" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"us" = (/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/tiled,/area/outpost/engineering/hallway) +"ut" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uu" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) "uv" = (/obj/structure/sign/electricshock,/turf/simulated/wall,/area/outpost/engineering/hallway) -"uw" = (/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 = "Power Distribution Center"; req_access = list(10)},/turf/simulated/floor,/area/outpost/engineering/hallway) -"ux" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/hallway) -"uy" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uz" = (/obj/machinery/power/solar_control,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uB" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uC" = (/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) -"uD" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) -"uE" = (/obj/machinery/mining/brace,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) -"uF" = (/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/space) -"uG" = (/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/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) -"uH" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/machinery/light{dir = 1},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor,/area/outpost/engineering/hallway) -"uI" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_outer"; locked = 1; name = "Engineering Outpost"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_inner"; locked = 1; name = "Engineering Outpost"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uK" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eoutpost_main_sensor"; pixel_x = 0; pixel_y = 25},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uL" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north) -"uM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/outpost/engineering/hallway) -"uN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,/turf/simulated/floor,/area/outpost/engineering/hallway) -"uO" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/outpost/engineering/hallway) -"uQ" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 200},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uR" = (/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) -"uS" = (/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) -"uT" = (/obj/machinery/light{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uU" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uV" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uW" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uX" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uY" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) -"uZ" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{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/outpost/engineering/hallway) -"va" = (/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) -"vb" = (/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) -"vc" = (/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) -"vd" = (/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) -"ve" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/hallway) -"vg" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vi" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vj" = (/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/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vk" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vl" = (/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/manifold/hidden/cyan{dir = 4},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vm" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"vn" = (/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/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) -"vo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"vp" = (/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/airless{icon_state = "asteroidplating"},/area/mine/explored) -"vq" = (/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/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_main_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"vr" = (/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) -"vs" = (/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) -"vt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_outer"; locked = 1; name = "Engineering Outpost"},/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) -"vu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_inner"; locked = 1; name = "Engineering Outpost"},/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) -"vv" = (/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) -"vw" = (/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) -"vx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eoutpost_main_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/vacuum{pixel_y = -32},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/outpost/engineering/hallway) -"vy" = (/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/outpost/engineering/hallway) -"vz" = (/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"},/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor,/area/outpost/engineering/hallway) -"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{dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vB" = (/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/outpost/engineering/hallway) -"vC" = (/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{dir = 1},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vD" = (/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},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vE" = (/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/engineering/hallway) -"vF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vG" = (/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) -"vH" = (/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) -"vI" = (/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) -"vJ" = (/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) -"vK" = (/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) -"vL" = (/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) -"vM" = (/obj/structure/cable{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,/area/outpost/engineering/hallway) -"vN" = (/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) -"vO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/light,/turf/simulated/floor,/area/outpost/engineering/hallway) -"vP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/engineering/hallway) -"vQ" = (/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"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "edock_pump"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"vR" = (/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) -"vS" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/outpost/engineering/hallway) -"vT" = (/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/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) -"vU" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) -"vV" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"vW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"vX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"vY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"vZ" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"wa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/turf/simulated/floor,/area/outpost/engineering/hallway) -"wb" = (/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/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"wc" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/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) -"wd" = (/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) -"we" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"uw" = (/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/tiled,/area/outpost/engineering/hallway) +"ux" = (/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uy" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uz" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uA" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uB" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"uC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"uD" = (/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/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"uE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"uG" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uH" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 15000},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uI" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"uJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"uK" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uL" = (/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/tiled,/area/outpost/engineering/atmospherics) +"uM" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uN" = (/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/tiled,/area/outpost/engineering/atmospherics) +"uO" = (/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/tiled,/area/outpost/engineering/atmospherics) +"uP" = (/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/asteroid,/area/mine/explored) +"uQ" = (/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/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_main_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/asteroid,/area/mine/explored) +"uR" = (/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/asteroid,/area/mine/explored) +"uS" = (/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/tiled,/area/outpost/engineering/hallway) +"uT" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_outer"; locked = 1; name = "Engineering Outpost"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"uV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_inner"; locked = 1; name = "Engineering Outpost"},/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/tiled,/area/outpost/engineering/hallway) +"uW" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uX" = (/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/tiled,/area/outpost/engineering/hallway) +"uY" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 4; tag_north = 1; tag_south = 2; tag_west = 3},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"uZ" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"va" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eoutpost_main_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/vacuum{pixel_y = -32},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"vb" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/asteroid,/area/mine/explored) +"vc" = (/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},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"vd" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"ve" = (/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/tiled,/area/outpost/engineering/hallway) +"vf" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vg" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vh" = (/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/tiled,/area/outpost/engineering/atmospherics) +"vi" = (/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/tiled,/area/outpost/engineering/hallway) +"vj" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vk" = (/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"vl" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "outpost_n2_in"; name = "N2 Tank Monitor"; output_tag = "outpost_n2_out"; sensors = list("outpost_n2_sensor" = "Tank")},/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_y = -32},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vm" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vn" = (/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/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"vo" = (/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"vp" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 5; tag_north = 1; tag_south = 2; tag_west = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vq" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"vr" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vv" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/phoron,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vw" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/carbon_dioxide,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vx" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/sleeping_agent,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vy" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"vA" = (/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/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/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/tiled,/area/outpost/engineering/hallway) +"vC" = (/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/tiled,/area/outpost/engineering/hallway) +"vD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vE" = (/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) +"vF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "edock_sensor"; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "edock_pump"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vG" = (/obj/machinery/power/emitter{anchored = 0; dir = 4; state = 0},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"vH" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"vI" = (/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/turf/simulated/floor/airless{icon_state = "asteroidplating"},/area/mine/explored) +"vJ" = (/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/turf/simulated/floor/airless{icon_state = "asteroidplating"},/area/mine/explored) +"vK" = (/obj/item/clothing/under/rank/miner,/obj/effect/decal/remains/human,/turf/simulated/floor/airless{icon_state = "asteroidplating"},/area/mine/explored) +"vL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vM" = (/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"vN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"vO" = (/obj/machinery/door/airlock{id_tag = "miningdorm1"; name = "Room 1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"vP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vQ" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"vR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"vS" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/asteroid,/area/mine/explored) +"vT" = (/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"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "edock_pump"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"vU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"vV" = (/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) +"vW" = (/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/outpost/engineering/hallway) +"vX" = (/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) +"vY" = (/obj/machinery/door/airlock{id_tag = "miningdorm2"; name = "Room 2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"vZ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "edock_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = 0; req_access = list(10)},/turf/space,/area/space) +"wa" = (/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) +"wb" = (/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/asteroid,/area/mine/explored) +"wc" = (/obj/machinery/meter,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) +"wd" = (/turf/space,/area/shuttle/constructionsite/site) +"we" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) "wf" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics) -"wg" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wh" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wi" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wj" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wk" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wl" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wm" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wn" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{tag = "icon-intact-supply (NORTHWEST)"; icon_state = "intact-supply"; dir = 9},/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 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wo" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wp" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"wq" = (/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) -"wr" = (/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/outpost/engineering/hallway) -"ws" = (/obj/machinery/power/emitter{anchored = 0; dir = 4; state = 0},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"wt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wu" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wv" = (/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"ww" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wx" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wy" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wz" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"wB" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"wC" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "edock_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = 0; req_access = list(10)},/turf/space,/area/space) -"wD" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wE" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wF" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 15000},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wG" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wH" = (/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) -"wI" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wJ" = (/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) -"wK" = (/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) -"wL" = (/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) -"wM" = (/obj/machinery/power/emitter{anchored = 1},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "delivery"},/area/outpost/research/isolation_monitoring) -"wN" = (/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) -"wO" = (/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/camera/network/engineering_outpost{c_tag = "Engineering Outpost Hallway West"; dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/outpost/engineering/hallway) -"wP" = (/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) -"wQ" = (/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) -"wR" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wS" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wT" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wU" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wV" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 4; tag_north = 1; tag_south = 2; tag_west = 3},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wW" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wX" = (/turf/space,/area/shuttle/constructionsite/site) -"wY" = (/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"wZ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xa" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xb" = (/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) -"xc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xd" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xe" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xf" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "outpost_n2_in"; name = "N2 Tank Monitor"; output_tag = "outpost_n2_out"; sensors = list("outpost_n2_sensor" = "Tank")},/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_y = -32},/obj/machinery/light,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xg" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xh" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 6},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xi" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xj" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 5; tag_north = 1; tag_south = 2; tag_west = 6},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xk" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) -"xl" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) -"xm" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) -"xn" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) -"xo" = (/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/space) -"xp" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/phoron,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xq" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/carbon_dioxide,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xr" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty/sleeping_agent,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"xs" = (/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) -"xt" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 1; frequency = 1441; id_tag = "outpost_o2_out"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/outpost/engineering/atmospherics) -"xu" = (/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) -"xv" = (/obj/structure/ore_box,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"xw" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 1; frequency = 1441; id_tag = "outpost_n2_out"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/outpost/engineering/atmospherics) -"xx" = (/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/outpost/engineering/atmospherics) -"xy" = (/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) -"xz" = (/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/outpost/engineering/atmospherics) -"xA" = (/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) -"xB" = (/obj/structure/grille,/obj/structure/lattice,/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) -"xC" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access = list(54)},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) +"wg" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) +"wh" = (/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) +"wi" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/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 = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) +"wj" = (/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/airless,/area/space) +"wk" = (/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/reinforced/oxygen,/area/outpost/engineering/atmospherics) +"wl" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 1; frequency = 1441; id_tag = "outpost_o2_out"},/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) +"wm" = (/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/reinforced/nitrogen,/area/outpost/engineering/atmospherics) +"wn" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 1; frequency = 1441; id_tag = "outpost_n2_out"},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) +"wo" = (/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) +"wp" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_o2_sensor"},/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) +"wq" = (/obj/item/weapon/pickaxe,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wr" = (/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) +"ws" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wt" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wu" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) +"wv" = (/obj/machinery/light{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"ww" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wx" = (/obj/structure/grille,/obj/structure/lattice,/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) +"wy" = (/obj/structure/table/rack,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wz" = (/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/mine/explored) +"wA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/explored) +"wB" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access = list(54)},/turf/simulated/floor/asteroid,/area/mine/explored) +"wC" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) +"wD" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light{dir = 1},/turf/space,/area/mine/explored) +"wE" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/mine/explored) +"wF" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/mine/explored) +"wG" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/space,/area/mine/explored) +"wH" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) +"wI" = (/obj/machinery/door/airlock{id_tag = "miningdorm3"; name = "Room 3"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"wJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/airless,/area/mine/explored) +"wK" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored) +"wL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless,/area/mine/explored) +"wM" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"wN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/mine/explored) +"wO" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) +"wP" = (/obj/structure/lattice,/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/explored) +"wQ" = (/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"wR" = (/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,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"wS" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"wT" = (/obj/item/weapon/shovel,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wU" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wV" = (/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wW" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/space,/area/mine/explored) +"wX" = (/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/tiled,/area/outpost/mining_west) +"wY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"wZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHEAST)"; icon_state = "carpet_edges"; dir = 6},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"xa" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (SOUTHWEST)"; icon_state = "carpet_edges"; dir = 10},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"xb" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xc" = (/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,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"xd" = (/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/outpost/mining_main/dorms) +"xe" = (/turf/simulated/floor/asteroid,/area/outpost/mining_west) +"xf" = (/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/dorms) +"xg" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/mech_recharger,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/outpost/mining_west) +"xh" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/mech_recharger,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/outpost/mining_west) +"xi" = (/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/outpost/mining_west) +"xj" = (/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/dorms) +"xk" = (/obj/machinery/light{dir = 1},/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/structure/table/steel_reinforced,/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHWEST)"; icon_state = "warning_dust"; dir = 9},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xl" = (/obj/machinery/mining/drill,/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xm" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"xn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"xo" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHEAST)"; icon_state = "warning_dust"; dir = 5},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xp" = (/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/tiled,/area/outpost/mining_main/eva) +"xq" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"xr" = (/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/outpost/mining_west) +"xs" = (/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/outpost/mining_west) +"xt" = (/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/outpost/mining_west) +"xu" = (/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"xv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"xw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"xx" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"xy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"xz" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"xA" = (/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,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (EAST)"; icon_state = "carpet_edges"; dir = 4},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHEAST)"; icon_state = "carpet_edges"; dir = 5},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) +"xB" = (/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/outpost/mining_main/west_hall) +"xC" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/tiled,/area/outpost/mining_west) "xD" = (/turf/simulated/wall,/area/outpost/mining_main/dorms) -"xE" = (/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) -"xF" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) -"xG" = (/turf/simulated/floor,/area/outpost/mining_main/dorms) -"xH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) -"xI" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/carpet,/area/outpost/mining_main/dorms) -"xJ" = (/obj/machinery/conveyor_switch{id = "mining_external"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) -"xK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/outpost/mining_main/dorms) -"xL" = (/obj/machinery/door/airlock{id_tag = "miningdorm1"; name = "Room 1"},/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/mining_main/dorms) -"xM" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/dorms) -"xN" = (/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) -"xO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/dorms) -"xP" = (/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/outpost/mining_main/dorms) -"xQ" = (/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/mining_west) -"xR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/dorms) -"xS" = (/obj/machinery/door/airlock{id_tag = "miningdorm2"; name = "Room 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/mining_main/dorms) -"xT" = (/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/dorms) -"xU" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/mining_west) -"xV" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/mining_west) -"xW" = (/turf/simulated/floor/mech_bay_recharge_floor{icon_state = "recharge_floor_asteroid"},/area/outpost/mining_west) +"xE" = (/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/outpost/mining_main/west_hall) +"xF" = (/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) +"xG" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"xH" = (/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/structure/table/steel_reinforced,/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xI" = (/obj/machinery/mining/brace,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xJ" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xK" = (/obj/structure/disposalpipe/segment,/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/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xL" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xM" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHWEST)"; icon_state = "warning_dust"; dir = 9},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xN" = (/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},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHEAST)"; icon_state = "warning_dust"; dir = 5},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"xO" = (/obj/machinery/recharge_station,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"xP" = (/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) +"xQ" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"xR" = (/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/tiled,/area/outpost/mining_west) +"xS" = (/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) +"xT" = (/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) +"xU" = (/obj/machinery/alarm{pixel_y = 24},/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/tiled,/area/outpost/mining_main/dorms) +"xV" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_west_outpost_pump"},/obj/structure/closet/walllocker/emerglocker/north,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"xW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) "xX" = (/obj/structure/disposalpipe/segment,/obj/structure/sign/deathsposal,/turf/simulated/wall,/area/outpost/mining_main/dorms) -"xY" = (/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/dorms) -"xZ" = (/obj/machinery/light{dir = 1},/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/structure/table/steel_reinforced,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) -"ya" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/explored) +"xY" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_y = 6},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"xZ" = (/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/tiled,/area/outpost/mining_main/dorms) +"ya" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) "yb" = (/turf/simulated/wall,/area/outpost/mining_west) -"yc" = (/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/outpost/mining_west) -"yd" = (/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/outpost/mining_west) -"ye" = (/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/outpost/mining_west) -"yf" = (/obj/machinery/vending/cigarette,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yg" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yh" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yi" = (/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) +"yc" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"yd" = (/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"ye" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"yf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"yg" = (/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Storage Room"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"yh" = (/obj/structure/bed/chair,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"yi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) "yj" = (/turf/simulated/wall,/area/outpost/mining_main/west_hall) -"yk" = (/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/outpost/mining_main/west_hall) -"yl" = (/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/outpost/mining_main/west_hall) -"ym" = (/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) -"yn" = (/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/structure/table/steel_reinforced,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) -"yo" = (/obj/structure/disposalpipe/segment,/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/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"yp" = (/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/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) -"yq" = (/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/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) -"yr" = (/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/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/explored) -"ys" = (/obj/item/weapon/pickaxe,/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/mining_west) -"yt" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor,/area/outpost/mining_west) -"yu" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor,/area/outpost/mining_west) -"yv" = (/obj/machinery/recharge_station,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/outpost/mining_west) -"yw" = (/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) -"yx" = (/obj/machinery/light{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor,/area/outpost/mining_west) -"yy" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/outpost/mining_west) -"yz" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/mining_west) -"yA" = (/obj/structure/table/rack,/turf/simulated/floor,/area/outpost/mining_west) -"yB" = (/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) -"yC" = (/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) -"yD" = (/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) -"yE" = (/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) -"yF" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_y = 6},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yG" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yH" = (/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yI" = (/turf/space,/area/shuttle/mining/outpost) -"yJ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yK" = (/obj/structure/bed/chair,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"yM" = (/obj/machinery/door/airlock{id_tag = "miningdorm3"; name = "Room 3"},/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/mining_main/dorms) -"yN" = (/obj/structure/ore_box,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"yO" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"yP" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"yQ" = (/obj/structure/closet/secure_closet/miner,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"yR" = (/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/outpost/mining_main/west_hall) -"yS" = (/obj/machinery/cell_charger,/obj/structure/table/steel_reinforced,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/explored) +"yk" = (/obj/structure/ore_box,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"yl" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"ym" = (/obj/structure/closet/secure_closet/miner,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"yn" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table/rack,/obj/item/weapon/rig/industrial/equipped,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"yo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"yp" = (/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/outpost/mining_main/west_hall) +"yq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"yr" = (/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"ys" = (/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/tiled,/area/outpost/mining_main/eva) +"yt" = (/obj/machinery/cell_charger,/obj/structure/table/steel_reinforced,/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (SOUTHWEST)"; icon_state = "warning_dust"; dir = 10},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"yu" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"yv" = (/obj/machinery/mining/brace,/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"yw" = (/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/outpost/mining_main/eva) +"yx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"yy" = (/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/outpost/mining_main/eva) +"yz" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"yA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"yB" = (/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/outpost/mining_west) +"yC" = (/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/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},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"yD" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"yE" = (/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/tiled,/area/outpost/mining_west) +"yF" = (/obj/machinery/alarm{pixel_y = 24},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/stack/flag/yellow,/obj/item/stack/flag/red,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"yG" = (/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},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"yH" = (/obj/item/weapon/storage/backpack/satchel,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"yI" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_outpost_inner"; locked = 1; name = "Mining External Access"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/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/tiled,/area/outpost/mining_west) +"yJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"yK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"yL" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_outpost_outer"; locked = 1; name = "Mining External Access"; req_access = list(10,13)},/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/tiled,/area/outpost/mining_west) +"yM" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"yN" = (/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},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"yO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"yP" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_west_outpost_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25},/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/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"yQ" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"yR" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"yS" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/outpost/mining_west) "yT" = (/turf/simulated/wall,/area/outpost/mining_main/eva) "yU" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/outpost/mining_main/eva) -"yV" = (/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/outpost/mining_main/eva) -"yW" = (/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/outpost/mining_main/eva) -"yX" = (/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/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) -"yY" = (/obj/item/weapon/shovel,/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/mining_west) -"yZ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"za" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor,/area/outpost/mining_west) -"zb" = (/turf/simulated/floor,/area/outpost/mining_west) -"zc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/outpost/mining_west) -"zd" = (/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/outpost/mining_west) -"ze" = (/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) -"zf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/mining_west) -"zg" = (/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/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},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor,/area/outpost/mining_west) -"zh" = (/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) -"zi" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_outpost_inner"; locked = 1; name = "Mining External Access"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/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) -"zj" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_outpost_outer"; locked = 1; name = "Mining External Access"; req_access = list(10,13)},/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,/area/outpost/mining_west) -"zk" = (/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) -"zl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"zm" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "mining_west_outpost_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25},/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/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"zn" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"zo" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"zp" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"zq" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"zr" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"zs" = (/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"zt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"zu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"zv" = (/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) -"zw" = (/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) -"zx" = (/obj/machinery/suit_cycler/mining,/turf/simulated/floor,/area/outpost/mining_main/eva) -"zy" = (/obj/machinery/light,/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/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) -"zz" = (/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/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) -"zA" = (/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/mining_west) -"zB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/outpost/mining_west) -"zC" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) -"zD" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/mining_west) -"zE" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor,/area/outpost/mining_west) -"zF" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access = list(54)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/mining_west) -"zG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor,/area/outpost/mining_west) -"zH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/outpost/mining_west) -"zI" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/mining_west) -"zJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/outpost/mining_west) -"zK" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_outpost_pump"; tag_exterior_door = "mining_west_outpost_outer"; frequency = 1379; id_tag = "mining_west_outpost_airlock"; tag_interior_door = "mining_west_outpost_inner"; pixel_x = 0; pixel_y = -25; tag_chamber_sensor = "mining_west_outpost_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_west_outpost_pump"},/turf/simulated/floor,/area/outpost/mining_west) -"zL" = (/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) -"zM" = (/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) -"zN" = (/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/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"zO" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"zP" = (/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) -"zQ" = (/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) -"zR" = (/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) -"zS" = (/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) -"zT" = (/obj/machinery/alarm{pixel_y = 24},/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/dorms) -"zU" = (/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 = 5},/turf/simulated/floor{icon_state = "bar"},/area/outpost/mining_main/dorms) -"zV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/dorms) -"zW" = (/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/dorms) -"zX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/mining_main/dorms) -"zY" = (/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/dorms) -"zZ" = (/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Storage Room"; dir = 1},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Aa" = (/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) -"Ab" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Ac" = (/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) +"yV" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"yW" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"yX" = (/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) +"yY" = (/obj/machinery/light,/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHWEST)"; icon_state = "warning_dust"; dir = 9},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"yZ" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"za" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zb" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access = list(54)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zc" = (/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},/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zd" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"ze" = (/obj/machinery/mineral/input,/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zf" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zh" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zi" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zj" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_outpost_pump"; tag_exterior_door = "mining_west_outpost_outer"; frequency = 1379; id_tag = "mining_west_outpost_airlock"; tag_interior_door = "mining_west_outpost_inner"; pixel_x = 0; pixel_y = -25; tag_chamber_sensor = "mining_west_outpost_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_west_outpost_pump"},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zk" = (/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) +"zl" = (/obj/structure/sink{pixel_y = 30},/obj/machinery/light/small,/obj/structure/mirror{pixel_y = -32},/turf/simulated/floor/tiled/freezer,/area/outpost/mining_main/west_hall) +"zm" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/tiled/freezer,/area/outpost/mining_main/west_hall) +"zn" = (/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"zo" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/tiled/freezer,/area/outpost/mining_main/west_hall) +"zp" = (/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/tiled,/area/outpost/mining_main/west_hall) +"zq" = (/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/tiled,/area/outpost/mining_main/west_hall) +"zr" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"zs" = (/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"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zt" = (/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/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"zu" = (/obj/structure/ore_box,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"zv" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"zw" = (/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},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"zx" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"zy" = (/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},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"zz" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"zA" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"zB" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"zC" = (/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 = 5},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) +"zD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"zE" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_mining{name = "Mining Station EVA"; req_access = list(54)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"zF" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"zG" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_east_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"zH" = (/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) +"zI" = (/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/outpost/mining_main/east_hall) +"zJ" = (/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/outpost/mining_main/east_hall) +"zK" = (/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/tiled,/area/outpost/mining_main/eva) +"zL" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"zM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"zP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"zQ" = (/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/tiled,/area/outpost/mining_main/west_hall) +"zR" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"zS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zT" = (/obj/machinery/conveyor_switch{id = "mining_west"; pixel_x = 5},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"zU" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/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/tiled,/area/outpost/mining_main/west_hall) +"zV" = (/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/outpost/mining_main/dorms) +"zW" = (/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/tiled,/area/outpost/mining_main/dorms) +"zX" = (/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/outpost/mining_main/dorms) +"zY" = (/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},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"zZ" = (/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/tiled,/area/outpost/mining_main/east_hall) +"Aa" = (/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},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Ab" = (/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},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Ac" = (/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/tiled,/area/outpost/mining_main/west_hall) "Ad" = (/turf/simulated/wall,/area/outpost/mining_main/east_hall) -"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/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/outpost/mining_main/east_hall) -"Ag" = (/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/outpost/mining_main/east_hall) -"Ah" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"Ai" = (/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) -"Aj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/outpost/mining_main/eva) -"Ak" = (/turf/simulated/floor,/area/outpost/mining_main/eva) -"Al" = (/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) -"Am" = (/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) -"An" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/mining_west) -"Ao" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/mining_west) -"Ap" = (/obj/structure/ore_box,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 6},/area/mine/explored) -"Aq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/outpost/mining_west) -"Ar" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/outpost/mining_west) -"As" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/outpost/mining_west) -"At" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/mining_west) -"Au" = (/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/outpost/mining_main/dorms) -"Av" = (/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) -"Aw" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) -"Ax" = (/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/outpost/mining_main/dorms) -"Ay" = (/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) -"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/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/outpost/mining_main/west_hall) -"AB" = (/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},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) -"AC" = (/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) -"AD" = (/obj/machinery/alarm{pixel_y = 24},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/stack/flag/yellow,/obj/item/stack/flag/red,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"AE" = (/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},/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"AF" = (/obj/item/weapon/storage/backpack/satchel,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/table/steel,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"AG" = (/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/eva) -"AH" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/eva) -"AI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/mining_main/eva) -"AJ" = (/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_main/eva) -"AK" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/outpost/mining_main/eva) -"AL" = (/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) -"AM" = (/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) -"AN" = (/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) -"AO" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/outpost/mining_west) -"AP" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor,/area/outpost/mining_west) -"AQ" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/outpost/mining_west) -"AR" = (/obj/machinery/conveyor_switch{id = "mining_west"; pixel_x = 5},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/outpost/mining_west) -"AS" = (/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) -"AT" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_west) -"AU" = (/obj/machinery/mineral/input,/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/turf/simulated/floor,/area/outpost/mining_west) -"AV" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_west) -"AW" = (/obj/machinery/conveyor{dir = 8; id = "mining_west"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_west) -"AX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) -"AY" = (/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) -"AZ" = (/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) -"Ba" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/mining_main/west_hall) -"Bb" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/outpost/mining_main/west_hall) -"Bc" = (/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) -"Bd" = (/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) -"Be" = (/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Bf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/outpost/mining_west) -"Bg" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor,/area/outpost/mining_west) -"Bh" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Bi" = (/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/outpost/mining_main/west_hall) -"Bj" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/outpost/mining_main/west_hall) -"Bk" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space) -"Bl" = (/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) -"Bm" = (/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/outpost/mining_main/east_hall) -"Bn" = (/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Bo" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/outpost/mining_main/east_hall) -"Bp" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Bq" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Br" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/outpost/mining_main/eva) -"Bs" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_mining{name = "Mining Station EVA"; req_access = list(54)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/mining_main/eva) -"Bt" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/eva) -"Bu" = (/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{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/eva) -"Bv" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_east_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/eva) -"Bw" = (/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) -"Bx" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/eva) -"By" = (/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) -"Bz" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_east_outer"; locked = 1; name = "Mining External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/outpost/mining_main/eva) -"BA" = (/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/outpost/mining_west) -"BB" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"BC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"BD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"BE" = (/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/west_hall) -"BF" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"BG" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor,/area/outpost/mining_west) -"BH" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"BI" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/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/west_hall) -"BJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor,/area/outpost/mining_west) -"BK" = (/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access = list(48)},/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/west_hall) -"BL" = (/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) -"BM" = (/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},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"BN" = (/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) -"BO" = (/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},/obj/machinery/light,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"BP" = (/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},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"BQ" = (/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access = list(48)},/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) -"BR" = (/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},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"BS" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"BT" = (/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) -"BU" = (/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) -"BV" = (/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) -"BW" = (/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) -"BX" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/outpost/mining_main/eva) -"BY" = (/obj/machinery/mech_bay_recharge_port,/turf/simulated/floor/plating,/area/outpost/mining_main/eva) -"BZ" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor,/area/outpost/mining_main/eva) -"Ca" = (/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) -"Cb" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_east_pump"; tag_exterior_door = "mining_east_outer"; frequency = 1379; id_tag = "mining_east_airlock"; tag_interior_door = "mining_east_inner"; pixel_x = 0; pixel_y = -25; tag_chamber_sensor = "mining_east_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor,/area/outpost/mining_main/eva) -"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/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) -"Ce" = (/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) -"Cf" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Cg" = (/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) -"Ch" = (/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) -"Ci" = (/obj/machinery/light,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Cj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Ck" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Cl" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Cm" = (/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) -"Cn" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/outpost/mining_main/west_hall) -"Co" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/space) -"Cp" = (/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/outpost/mining_main/east_hall) -"Cq" = (/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/outpost/mining_main/east_hall) -"Cr" = (/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) -"Cs" = (/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) -"Ct" = (/obj/structure/ore_box,/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) +"Ae" = (/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/outpost/mining_main/west_hall) +"Af" = (/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},/turf/simulated/floor/plating,/area/outpost/mining_main/west_hall) +"Ag" = (/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) +"Ah" = (/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},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Ai" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/eva) +"Aj" = (/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_main/eva) +"Ak" = (/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/tiled,/area/outpost/mining_main/eva) +"Al" = (/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/tiled,/area/outpost/mining_main/eva) +"Am" = (/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) +"An" = (/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/tiled,/area/outpost/mining_main/eva) +"Ao" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"Ap" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"Aq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"Ar" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"As" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_west) +"At" = (/obj/machinery/conveyor{dir = 8; id = "mining_west"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"Au" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"Av" = (/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) +"Aw" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Ax" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Ay" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Az" = (/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/tiled,/area/outpost/mining_main/west_hall) +"AA" = (/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Crew Area Hallway"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"AB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"AC" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"AD" = (/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/outpost/mining_main/west_hall) +"AE" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"AF" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space) +"AG" = (/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) +"AH" = (/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/outpost/mining_main/east_hall) +"AI" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"AJ" = (/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{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"AK" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"AL" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"AM" = (/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,/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"AN" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_east_outer"; locked = 1; name = "Mining External Access"; req_access = list(10,13)},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"AO" = (/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"AP" = (/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/tiled,/area/outpost/mining_main/east_hall) +"AQ" = (/obj/machinery/conveyor{backwards = 2; dir = 2; forwards = 1; id = "mining_west"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/tiled,/area/outpost/mining_west) +"AR" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"AS" = (/obj/structure/cable/blue{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/tiled,/area/outpost/mining_main/west_hall) +"AT" = (/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/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"AU" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"AV" = (/obj/machinery/atmospherics/binary/pump/on{dir = 2; target_pressure = 200},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"AW" = (/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},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"AX" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/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/tiled,/area/outpost/mining_main/east_hall) +"AY" = (/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access = list(48)},/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/tiled,/area/outpost/mining_main/west_hall) +"AZ" = (/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},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Ba" = (/obj/machinery/door/airlock/glass_mining{name = "Mining Station Bridge"; req_access = list(48)},/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/tiled,/area/outpost/mining_main/east_hall) +"Bb" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Bc" = (/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},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Bd" = (/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/tiled,/area/outpost/mining_main/east_hall) +"Be" = (/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) +"Bf" = (/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/tiled,/area/outpost/mining_main/eva) +"Bg" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_east_pump"; tag_exterior_door = "mining_east_outer"; frequency = 1379; id_tag = "mining_east_airlock"; tag_interior_door = "mining_east_inner"; pixel_x = 0; pixel_y = -25; tag_chamber_sensor = "mining_east_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) +"Bh" = (/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/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"Bi" = (/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) +"Bj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) +"Bk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) +"Bl" = (/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},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"Bm" = (/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/tiled/white,/area/outpost/mining_main/medbay) +"Bn" = (/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/tiled/white,/area/outpost/mining_main/medbay) +"Bo" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"Bp" = (/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/tiled,/area/outpost/mining_main/west_hall) +"Bq" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Br" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Bs" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Bt" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Bu" = (/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) +"Bv" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHEAST)"; icon_state = "warning"; dir = 6},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Bw" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/space) +"Bx" = (/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/outpost/mining_main/east_hall) +"By" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Bz" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"BA" = (/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},/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"BB" = (/obj/machinery/conveyor_switch{id = "mining_external"},/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"BC" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) +"BD" = (/obj/structure/ore_box,/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"BE" = (/obj/structure/ore_box,/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (SOUTHEAST)"; icon_state = "warning_dust"; dir = 6},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"BF" = (/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/medbay) +"BG" = (/obj/machinery/door/airlock/glass_medical{name = "Infirmary"},/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/tiled/white,/area/outpost/mining_main/medbay) +"BH" = (/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access = list(48)},/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/plating,/area/outpost/mining_main/maintenance) +"BI" = (/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/tiled,/area/outpost/mining_main/east_hall) +"BJ" = (/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) +"BK" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"BL" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"BM" = (/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/outpost/mining_main/west_hall) +"BN" = (/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/outpost/mining_main/east_hall) +"BO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"BP" = (/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/tiled,/area/outpost/mining_main/east_hall) +"BQ" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"BR" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"BS" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/outpost/mining_main/refinery) +"BT" = (/obj/machinery/conveyor{dir = 9; id = "mining_internal"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"BU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"BV" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/machinery/mineral/input,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"BW" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"BX" = (/obj/structure/closet/crate,/obj/structure/noticeboard{pixel_y = 27},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"BY" = (/obj/machinery/mineral/unloading_machine{icon_state = "unloader-corner"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"BZ" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/airless,/area/mine/explored) +"Ca" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Cb" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/airless,/area/mine/explored) +"Cc" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Mining"},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"Cd" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/structure/closet/walllocker/emerglocker/west,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Ce" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_west_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_pump"; tag_exterior_door = "mining_west_outer"; frequency = 1379; id_tag = "mining_west_airlock"; tag_interior_door = "mining_west_inner"; pixel_x = 25; pixel_y = 5; tag_chamber_sensor = "mining_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Cf" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"Cg" = (/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) +"Ch" = (/obj/machinery/door/window/westright{name = "Production Area"; req_access = list(48)},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Ci" = (/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Cj" = (/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/tiled,/area/outpost/mining_main/east_hall) +"Ck" = (/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,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Cl" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Cm" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Cn" = (/obj/structure/disposalpipe/segment,/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,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Co" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/machinery/mineral/output,/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) +"Cp" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/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/asteroid,/area/mine/explored) +"Cq" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Cr" = (/obj/machinery/door/window/westleft{name = "Production Area"; req_access = list(48)},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Cs" = (/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) +"Ct" = (/obj/machinery/sleeper{dir = 4},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHEAST)"; icon_state = "warning"; dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) "Cu" = (/turf/simulated/wall,/area/outpost/mining_main/medbay) -"Cv" = (/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/medbay) -"Cw" = (/obj/machinery/door/airlock/glass_medical{name = "Infirmary"},/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{icon_state = "white"},/area/outpost/mining_main/medbay) +"Cv" = (/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/tiled/white,/area/outpost/mining_main/medbay) +"Cw" = (/obj/structure/ore_box,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) "Cx" = (/turf/simulated/wall,/area/outpost/mining_main/maintenance) -"Cy" = (/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access = list(48)},/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/plating,/area/outpost/mining_main/maintenance) +"Cy" = (/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"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) "Cz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/outpost/mining_main/maintenance) -"CA" = (/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) -"CB" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"CC" = (/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/outpost/mining_main/west_hall) -"CD" = (/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/outpost/mining_main/east_hall) -"CE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"CF" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/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) -"CG" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) +"CA" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/mining_main/west_hall) +"CB" = (/turf/space,/area/shuttle/mining/outpost) +"CC" = (/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/tiled,/area/outpost/mining_main/east_hall) +"CD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"CE" = (/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"CF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"CG" = (/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) "CH" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/wall,/area/outpost/mining_main/refinery) -"CI" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"CJ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/outpost/mining_main/refinery) -"CK" = (/obj/machinery/conveyor{dir = 9; id = "mining_internal"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"CL" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/machinery/mineral/input,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"CM" = (/obj/machinery/mineral/unloading_machine{icon_state = "unloader-corner"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"CN" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/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/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) -"CO" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"CP" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored) -"CQ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay) -"CR" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay) -"CS" = (/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) -"CT" = (/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) -"CU" = (/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Mining"},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) +"CI" = (/obj/machinery/mineral/input,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"CJ" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"CK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"CL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"CM" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"CN" = (/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/asteroid,/area/mine/explored) +"CO" = (/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) +"CP" = (/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) +"CQ" = (/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/tiled,/area/outpost/mining_main/east_hall) +"CR" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"CS" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"CT" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"CU" = (/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) "CV" = (/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) "CW" = (/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) "CX" = (/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) "CY" = (/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) -"CZ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/structure/closet/walllocker/emerglocker/west,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/west_hall) -"Da" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_west_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_pump"; tag_exterior_door = "mining_west_outer"; frequency = 1379; id_tag = "mining_west_airlock"; tag_interior_door = "mining_west_inner"; pixel_x = 25; pixel_y = 5; tag_chamber_sensor = "mining_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Db" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/west_hall) -"Dc" = (/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) -"Dd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"De" = (/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) -"Df" = (/obj/machinery/camera/network/mining{c_tag = "Mining Outpost Crew Area Hallway"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor,/area/outpost/mining_main/west_hall) +"CZ" = (/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Da" = (/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/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"Db" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/east_hall) +"Dc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/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/outpost/mining_main/east_hall) +"Dd" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"De" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Df" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) "Dg" = (/turf/simulated/wall,/area/outpost/mining_main/refinery) -"Dh" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"Di" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/machinery/mineral/output,/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"Dj" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/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) -"Dk" = (/obj/machinery/sleep_console,/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/outpost/mining_main/medbay) -"Dl" = (/obj/machinery/sleeper,/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/outpost/mining_main/medbay) -"Dm" = (/obj/structure/table/standard,/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) -"Dn" = (/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) +"Dh" = (/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 = 10},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Di" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Dj" = (/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/tiled,/area/outpost/mining_main/refinery) +"Dk" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Dl" = (/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) +"Dm" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"Dn" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_outpost_inner"; locked = 1; name = "Mining Dock Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled/airless,/area/outpost/mining_main/east_hall) "Do" = (/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) "Dp" = (/obj/machinery/atmospherics/valve/digital/open{dir = 4},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "Dq" = (/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) "Dr" = (/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) "Ds" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) -"Dt" = (/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) -"Du" = (/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) -"Dv" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/outpost/mining_main/west_hall) -"Dw" = (/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) -"Dx" = (/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) -"Dy" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"Dz" = (/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) -"DA" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"DB" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/structure/plasticflaps/mining,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"DC" = (/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) +"Dt" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "mining_outpost_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13,48); tag_airpump = "mining_outpost_pump"; tag_chamber_sensor = "mining_outpost_sensor"; tag_exterior_door = "mining_outpost_outer"; tag_interior_door = "mining_outpost_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "mining_outpost_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "mining_outpost_pump"},/turf/simulated/floor/tiled/airless,/area/outpost/mining_main/east_hall) +"Du" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"Dv" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "mining_outpost_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = -25; req_one_access = list(13,48)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/tiled/airless,/area/outpost/mining_main/east_hall) +"Dw" = (/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/tiled,/area/outpost/mining_main/east_hall) +"Dx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Dy" = (/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/tiled,/area/outpost/mining_main/refinery) +"Dz" = (/obj/machinery/mineral/input,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"DA" = (/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 = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/refinery) +"DB" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (SOUTHWEST)"; icon_state = "warning_dust"; dir = 10},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"DC" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) "DD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "DE" = (/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) "DF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) "DG" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance) -"DH" = (/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) -"DI" = (/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) -"DJ" = (/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) -"DK" = (/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) -"DL" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"DM" = (/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) +"DH" = (/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"DI" = (/obj/machinery/mineral/processing_unit,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"DJ" = (/obj/structure/disposalpipe/segment{dir = 4},/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"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/asteroid,/area/mine/explored) +"DK" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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/asteroid,/area/mine/explored) +"DL" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "mining_outpost_airlock"; name = "exterior access button"; pixel_x = -8; pixel_y = 25; req_one_access = list(13,48)},/turf/space,/area/space) +"DM" = (/obj/machinery/computer/shuttle_control/mining,/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) "DN" = (/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) "DO" = (/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) -"DP" = (/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) -"DQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/east_hall) -"DR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/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/outpost/mining_main/east_hall) -"DS" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"DT" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/outpost/mining_main/east_hall) -"DU" = (/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) -"DV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"DW" = (/obj/structure/closet/crate,/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) -"DX" = (/obj/structure/closet/crate,/obj/structure/noticeboard{pixel_y = 27},/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) -"DY" = (/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 = 10},/turf/simulated/floor,/area/outpost/mining_main/refinery) -"DZ" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 24},/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/refinery) -"Ea" = (/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,/area/outpost/mining_main/refinery) -"Eb" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/outpost/mining_main/refinery) -"Ec" = (/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) -"Ed" = (/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/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) +"DP" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"DQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/outpost/mining_main/east_hall) +"DR" = (/obj/structure/window/reinforced,/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) +"DS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/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) +"DT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/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) +"DU" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/asteroid,/area/mine/explored) +"DV" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"DW" = (/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/asteroid,/area/mine/explored) +"DX" = (/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/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/airless{tag = "icon-asteroidfloor"; icon_state = "asteroidfloor"},/area/mine/explored) +"DY" = (/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/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/space,/area/mine/explored) +"DZ" = (/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/space,/area/space) +"Ea" = (/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) +"Eb" = (/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/space,/area/space) +"Ec" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/structure/plasticflaps,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Ed" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) "Ee" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_outpost_outer"; locked = 1; name = "Mining Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/outpost/mining_main/east_hall) -"Ef" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "mining_outpost_inner"; locked = 1; name = "Mining Dock Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Eg" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "mining_outpost_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13,48); tag_airpump = "mining_outpost_pump"; tag_chamber_sensor = "mining_outpost_sensor"; tag_exterior_door = "mining_outpost_outer"; tag_interior_door = "mining_outpost_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "mining_outpost_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "mining_outpost_pump"},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Eh" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Ei" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "mining_outpost_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = -25; req_one_access = list(13,48)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Ej" = (/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) -"Ek" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/refinery) -"El" = (/obj/machinery/door/window/westright{name = "Production Area"; req_access = list(48)},/turf/simulated/floor,/area/outpost/mining_main/refinery) -"Em" = (/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) -"En" = (/turf/simulated/floor,/area/outpost/mining_main/refinery) -"Eo" = (/obj/machinery/mineral/input,/turf/simulated/floor{icon_state = "loadingarea"},/area/outpost/mining_main/refinery) -"Ep" = (/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 = 2},/turf/simulated/floor/plating,/area/outpost/mining_main/refinery) -"Eq" = (/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/airless{icon_state = "asteroidwarning"; dir = 10},/area/mine/explored) -"Er" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/outpost/mining_main/east_hall) -"Es" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Et" = (/obj/structure/disposalpipe/segment,/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,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Eu" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/mining_main/refinery) -"Ev" = (/obj/machinery/door/window/westleft{name = "Production Area"; req_access = list(48)},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/mining_main/refinery) -"Ew" = (/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/outpost/mining_main/refinery) -"Ex" = (/obj/machinery/mineral/processing_unit,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) +"Ef" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Eg" = (/obj/machinery/conveyor{icon_state = "conveyor0"; dir = 10; id = "mining_internal"},/obj/machinery/mineral/input,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Eh" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"Ei" = (/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/space,/area/space) +"Ej" = (/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},/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/mine/explored) +"Ek" = (/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/space,/area/space) +"El" = (/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/asteroid,/area/mine/explored) +"Em" = (/turf/space,/area/skipjack_station/mining) "Ey" = (/obj/machinery/mineral/processing_unit_console,/turf/simulated/wall/r_wall,/area/outpost/mining_main/refinery) -"Ez" = (/obj/structure/disposalpipe/segment{dir = 4},/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"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"EA" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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/airless{icon_state = "asteroidplating"},/area/mine/explored) -"EB" = (/obj/structure/lattice,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "mining_outpost_airlock"; name = "exterior access button"; pixel_x = -8; pixel_y = 25; req_one_access = list(13,48)},/turf/space,/area/space) -"EC" = (/obj/machinery/computer/shuttle_control/mining,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"ED" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"EE" = (/obj/structure/closet/crate,/turf/simulated/floor,/area/outpost/mining_main/refinery) -"EF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/closet/crate,/turf/simulated/floor,/area/outpost/mining_main/refinery) -"EG" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"EH" = (/turf/space,/area/mine/explored) "EI" = (/turf/simulated/wall/r_wall,/area/outpost/mining_main/east_hall) -"EJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"EK" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"EL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"EM" = (/obj/structure/window/reinforced,/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) -"EN" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/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) "EO" = (/obj/machinery/mineral/stacking_unit_console,/turf/simulated/wall/r_wall,/area/outpost/mining_main/refinery) -"EP" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/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) -"EQ" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) -"ER" = (/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/airless{icon_state = "asteroidwarning"; dir = 8},/area/mine/explored) -"ES" = (/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/airless{icon_state = "asteroidplating"},/area/mine/explored) -"ET" = (/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/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored) -"EU" = (/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/airless,/area/mine/explored) -"EV" = (/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/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/airless,/area/mine/explored) -"EW" = (/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/airless,/area/space) -"EX" = (/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) -"EY" = (/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) -"EZ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Fa" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Fb" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/structure/plasticflaps,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"Fc" = (/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/outpost/mining_main/refinery) -"Fd" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"Fe" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"Ff" = (/obj/machinery/conveyor{icon_state = "conveyor0"; dir = 10; id = "mining_internal"},/obj/machinery/mineral/input,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/outpost/mining_main/refinery) -"Fg" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_main/refinery) -"Fh" = (/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,/area/space) -"Fi" = (/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},/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/mine/explored) -"Fj" = (/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/airless,/area/space) -"Fk" = (/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/airless{icon_state = "asteroidplating"},/area/mine/explored) -"Fl" = (/turf/space,/area/skipjack_station/mining) -"Fm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Fn" = (/obj/structure/cable/blue{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/outpost/mining_main/west_hall) -"Fo" = (/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/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Fp" = (/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},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor,/area/outpost/mining_main/west_hall) -"Fq" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Fr" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Fs" = (/obj/machinery/atmospherics/binary/pump/on{dir = 2; target_pressure = 200},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Ft" = (/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor,/area/outpost/mining_main/east_hall) -"Fu" = (/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,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor,/area/outpost/mining_main/east_hall) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1665,169 +1608,169 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababafabababaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababagababababababahaiaiajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababakakakakakabagababababababalamamanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababakaoaqapakakarakakakasasasasauatasasasasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababakavaxawazayaBaAaAaCaEaDaFaEaGamaEaHaDasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababaIaIaIaIaJaLaKaNaMaOaOaOaPaEaQaSaRaUaTaWaVaXasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaababababaIaIaZaYaIakakakakaAaAbababbaEaEaEaEbebcaEaEaEasbfbfbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgbibhaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababaIbjblbkbnbmbpbobrbqbtbsbvbuaEbwbxaEbzbyaEbAbCbBbDbAbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbGbFaeaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababaIbHbJbIaIbKbMbLbNbMbPbObvbQaEbRbTbSbVbUbXbWbZbYcbcabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccecdcfaeaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababaIbHchcgaIcibLcjclckakarakcmasasasascocnaEcpbZcbcbcqbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdldleucscrbFaeaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeabababaIbHcuctaIcvcxcwczcycBcAcDcCcFcEcGascIcHcJbAbAcKbAcLbfcMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQdRdSdTcOcNcPaeaeababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdaeaeaeaeaeaeaeaecQasasasasasascRasasasascSasascTcVcUcXcWcYasdacZdcdbdedddgdfdidhbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetdldlfydjcrdmabababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdaaaaaaexexexexexexexaEdodndqdpdsdrdudtdwdvdydxasdzdBdAdDdCdEasdGdFdcdbdbdbdbdbbfbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaedHdJdIdmabababababababababababababababababababababababababababababababababababababababababababababababababababababbdaaaaaaexexexexexexexdKdMdLdOdNdNdPdUdNdOdVdXdWdZdYebeaecfNeeedegefeiehekejelbfbfbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeenemepeodmababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaexexexexexexexeqdMereveseyeweAezeBaseDeCaseEeGeFeIeHeJaseMeKaEeNeNeNeNeOeQePbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeeSeReTdmeVeUdmdmdmdmabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexandMereveseXeWeAezeYasfaeZasfbasasasasdZasfdfcaEfefgfffifhfkfjfkfkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzfmflfofnfpbhcNfqdmfrfsdmabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexaEfuftfvesfwezeAfxfzasfBfAfDfCfFfEfGasfIfHfKfJaEfLgtfMfPfOfkbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefRfQfmfSfUfTfWfVfqfXfsfYfrdmabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaafZgbgagdgcgbgagfgeghgggigigigjgjgjgjgjgkfJgmglamgngoasgqgpgsgraEgvhhgugxgwgAasasgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagCfRgDfRflfleVgEfUdmeogFdmfsgGdmabababababababababababababababababababababababababababababababababababababababababababababababeLaaaaaaaaaagHgJgIgLgKgMgIgOgNgQgPgSgRgTgjgVgUgWgjgXfJgZgYhbhahcashehdhghfaEaEhOaEaEaEfJfJhigBgBgBgBhjgBgBgBgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaehlhkflhmhnfldIhofThphrhqdmdmdmdmdmdmababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaahshuhththththvhxhwhzhyhBhAhCgjhEhDhGhFhHgrhJhIfJfJhKfAfJfJgsgrhMhLiFhNhQhPfJfJhRgBhThSgBhUhWhVhXgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaehYiahZflhnibfSicfUiddmifiedmigihcNiidmabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaahsgIgIgIijgIikilgIimgPioinipgjhDiqisiriuitiwiviyixiAiziCiBiDixixixjmiEiHiGiJiIiLiKiNiMiPiOiRiQiSgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeababdmfpiTiViUhZiWiXfTigbhcNihdmigiTihiYdmababababababababababababababababababababababababababababababababababbdbdbdbdbdbdababababababkDkEaaaaaaiZgIgIjbjajdjcgOjejgjfjijhjjgjjljkjKgjgjjnjnjojqjpjrjqjsjqjujtjtjtjtjrjqjvjwjwjxgBjzjygBjAjCjBjDgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaedmdmdmdmdmdmfnfUjEiTfUhojFigigfVfqifdmigdIeojGdmababababababababababababababababababababababababababababababababbdbdbdgygygygybdbdbdababsEgygyaaaaaaaajHgbgagdjHjHjHjHjHjIjHjJjJjJgjjPgjjMjLjNjnkzjOjqjQjSjRjUjTjWjVjXjXjXjYjqjZkajwkckbkbkbkbkdkfkehXgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaedmkgfUhZkhdmhYkiiadmhpdmkkkjkldmcNkmidkndIepfUdmabababababababababababababababababababababababababababababababbdbdgygygygygygygygybdbdabgygyaaaaaaaaaaaaaaaeaekokqkpkskrkuktkwkvkykxkAmAkCkBkGkFkIkHjqkJkLkKkMjXjWkNkOjXjXkPjqkQkRjwkTkSkVkUkbgBgBgBgBgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdmkgdIhZdIkWkmiTkXiTkYcNcNkZfqcNdIdIdmfUknfUfUdmababababababababababababababababababababababababababababababbdbdgygygygygygygygygygymQmRgygyaaaaaaaaaaaaaaaaaekolblaldlclflelgkokolalhgjljlijnjnlllkjqlmlolnlqlplslrlultlwlvjqlxlyjwlAlzlzlBkbabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdmlChZfUdIlDdIlEeVdIlFkYlEihlGdIlHeodmlIdIhqcNdmabababababababababababababababababababababababababababababbdmRgygygygygygygygygygygynDlJgyaeaaaaaaaaaaaaaaaaaekolblalLlKlNlMmrlOkolPgjgjnNnOjnlQlSlRjqlTlVlUlXlWlZlYlmmamcmbjqmdmejwmgmfmfmfkbabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdmlCmhfUfpdmmidmmkmjdmdIdmmkmjdmfUkmdmeUmlidlIdmabababababababababababababababababababababababababababababbdomgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaaaekommlamnkrmpmopEmqkomsgjowoxoyjnmtmvmujqmxmzmyjUmCwMmBjXmDjXjXjqmEmFjwkbkbkbkbkbabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababdmdmdmdmdmdmmidmhqlHdIiWmGfUiWfUhqfSdmmHmJmImKdmabababababababababababababababababababababababababababababbdmQgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaeaekomMmLmNlcmOmomSmPkomTgjoYoxoyjnmUjnmVjqmWlnmXmZmYnbnamzmznckPjqndnejwababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababdmmidmlHeonfiWngdIihdmfUeodmnhnininjdmadababababababababababababababababababababababababababababbdbdgygygyprgygygygygygygygygygyaeaaaaaaaaaaaaaeaeaekokonknlkokonmnnnmkonogjowpBnpjnnqnsnrjqntnvnunxnwnznynBnAnCjXjqjwjwjwababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababdmmidmiWdIcrnEfUeohqdmmidmdmigfUninjnFadababababababababababababababababababababababababababababbdnGpLgypKnGpQgygygygygygygygygytjaaaaaaaaaaaetjtjtjgygyqdqeqfkonHnJnIkonKgjgynMnLjnnPnQnQnSnRnUnTnSnVnXnWnZnYoboanZababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababdmmidmdmdmdmdmdmdmdmdmmidmoccNfUcNnjodadababababababababababababababababababababababababababababbdnGgygygynGpQgygygygygygygyqwqCoesWsWsWsWsWsWofqwqCgygygygygykoogoiohkoojgygygygyjnokonolnSoooqopnSorotosnZouozovnZababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLababababababababababababababdmmimimimimimimimimimimidmigfUidfUiidmadababababababababababababababababababababababababababababbdgygygygyqMqNgygygygygygygygyoBqPqPqPqPqPqPqPqPoBgygygygygygykooCoDnmkooErigygygyoGoFnQnQnSoHoJoInSoKoMoLnZoNoPoOnZababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababdmdmdmdmdmdmdmdmdmdmdmdmdmdmmKoRoQdmdmadababababababababababababababababababababababababababababbdgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygyoSpBoTpCoVoUoXoWoWoWpaoZpcpbnSpdpfpenSpgpiphnZpjplpknZabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadaddmninifUdmadadababababababababababababababababababababababababababababbdnGpLgygygygygygygygygygyaaaaaaaaaaaaaaaabdbdbdbdbdbdbdbdgygygygygygypBpmpCgygybdjnjnjnjnnSnSnSnSnSpnpnpnnZnZnZnZnZabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadaddmpopppodmadabababababababababababababababababababababababababababababbdnGgygygygygygygygygygygyaaaaaaaaaaaaaaaabdbdbdababababbdbdbdbdbdbdbdgypqgygybdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababadaddmpsoRmKdmadabababababababababababababababababababababababababababababbdbdpVryptgygygygygybdbdbdaaaaaaaaaaaaaaaaaaababababababababbdbdbdbdbdgypqgygybdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababadadadrBrCrDadadababababababababababababababababababababababababababababababbdbdbdmRbdgygymQmQbdababaaaaaaaaaaaaaaaaaaababababababababababbdbdbdgypqgygybdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdababaaaaaaaaaaaaaaaaaaabababababababababababbdbdgypqgygybdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaababaaaaaaaaababababababababababbdbdgypupvgybdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaabababaaaaaaababababababababababbdbdgygypqgybdabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaababaaaaaaababababababababababbdbdbdgypqgybdbdbdbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababbdbdbdgypqgygygygyrHpwpwpwpwpwpwpwpwpwpwpwpwabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababbdbdbdgypqgygygygyrJpypxpDpApGpFpUpHpwpIpJpwababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaabababababababababbdbdbdgypNpMpMpMoWpOpRpPpTpSpXpWpZpYqbqaqgpwababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabaaaaaaaaababababababababababbdbdgyqcgygygygypwpwpwpwpwpwqhqjqipwqxqkpwababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaababababababababababbdbdgyqmqlqnslslqoqqqpqsqrquqtuLqvqzqyqApwababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaaaabababababababababbdbdgygygyqcgygypwpwpwpwqBpwpwpwpwpwpwpwpwabababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababbdbdbdbdgyqcgygygygysAmwsCsCbdababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababbdbdbdrJqDrigygygygygygygybdababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababbdbdbdpBqEpCgygygygygygygybdababababababababababababababababababababababababababababababaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaabababababababababbdbdbdgyqcgygygygygygygybdbdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaabaaaaabababababababababbdbdbdgyqcgygybdmQbdbdbdbdbdababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaababababababababbdbdbdgyqcgygybdbdbdababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaabababaaaaaaabababababababbdbdbdgyqcgybdbdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaababababababbdbdgyqcgybdbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababbdbdgyqcgygybdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaabdbdaaaaaaaaaaaaabababababbdbdgyqcgygybdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababeLbdbdbdaaaaaaaaaaaaabababababbdbdgyqmqGgybdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLabababababababababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababeLbdaaaaaaaaaaaaaaaaabababababbdbdgygyqcgybdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLabababababababababqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdaeaeaeaeaeaeaeaebdbdababababbdmRsEgyqcgybdababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdsHsHsHsHsHsHsHsHbdbdbdabababbdbdgygyqcgybdababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLabababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdaeaeaeaeaeaeaeaebdabababababbdgygygyqcgybdbdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaababababababbdgygygyqcgygybdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababababbdgygygyqcgygybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababbdgygyrJqDrigybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdgygypBqEpCgybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdgygyqcgygybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdgyqIqHgybdbdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababbdbdgyqcgygybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababbdgygyqcgybdbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbdbdgygyqcnDmRababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababababqLqLqLqLqLqLqLabababqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbdgygyqIqHgybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLababababqLqLqLqLqLqLqLababababababqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdbdbdgygyqcgygybdbdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababqLqLqLqLqLqLqLababababababqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdgygygygyqcgygygybdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababqLqLqLqLqLqLqLqLabababababqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygyqcgygygybdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababababqLqLqLqLqLqLqLqLababababababqLqLqLababababababqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygyqcgygygybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygyqcgygygybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygyqcgygygybdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygygyqcgygygybdbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqJqJqJqJqJqJqJqJqJqJqJqJqJqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygygygyqcgygygygybdbdbdbdbdababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaeaeaaaaaaaaaaaaaaaaaeaaaaaaaeaaaaaaaeaaaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygygygyqcgygygygygygygygybdbdabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaqOqKqQaaqOqKqQaaqOqKqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLabababababqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygygygyqcgyrJrigygygygygygybdababababababababababababababababababababababababababababababababababababababababababaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeqOqRqQaeqOqRqQaeqOqRqQaeqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygygygygygyqmqlqSqTqlqlqlqGgygybdbdbdababababababababababababababababababababababababababababababababrjrjrjrjrjrjababaaaaaaaaaeaaaaaaaaaaaeaaaaaeaeaaaaaaqOqRqQaaqOqRqQaaqOqRqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLabababababqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaagygygygygygygygypBpCgygygyqcgygygygybdababababababababababababababababababababababababababababababababrjqVqXqWoArjabababaaaaaaaeaaaaaaaeaaaeaaaeaeaeaeaaaaqOqRqQaaqOqRqQaaqOqRqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaabdbdgysLgygygygygygygygyqmqlqGgygybdbdabababababababababababababababababababababababababababababababrjqVrbrarjrjrjababaaaaaaaeaeaeaeaeaeaeaeaeaaaaaeaeaaqOqRqQaeqOqRqQaeqOqRqQaeqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabbdbdmRbdbdbdbdbdbdgygygygyqcgygygybdbdbdabababababababababababababababababababababababababababababrjqVrfrcqZqYrjabababaaaaaeaaaeaaaaaaaeaaaaaaaaaeaaaaqOqRqQaaqOqRqQaaqOqRqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababbdbdgygygyqcgygygygygybdbdababababababababababababababababababababababababrErErErErErjrkrjrjrjrjrjqUabbdaaaeaaaeaeaaaaaeaaaaaaaaaaaaaaqOqRqQaaqOqRqQaaqOqRqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdaeaeaeaeaeaeaeaeaeaeaebdbdbdbdabababababbdbdgygyqmqlqlqGgygygybdbdababababababbdbdbdababababababababababababababrErlrnrmrprorrrqrtrsruruqUbdbdrvaeaaaeaaaaaaaeaeaeaeaeaeaeaeqOqRqQaeqOqRqQaeqOqRqQaeqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdsHsHsHsHsHsHsHsHsHsHsHsHsHsHbdbdbdbdababababbdgygygygygyqcgygygygybdbdabababbdbdbdgybdababababababababababababababrErwrzrxrErArGrFrKrIrFrLrNrMrMdhaeaaaaaaaaaaaeaaaaaeaaaaaaaaqOqRqQaaqOqRqQaaqOqRqQaaaeaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaebdbdabababababbdbdgygygygyqmqlqlqGgygybdabbdbdbdgygygybdababababababababababababababrErOrQrPrSrRrGrTrVrUrXrWqUrYrYrYrYrYsarZsbuquqsasbuqaaaaaaaaqOqRqQaaqOqRqQaaqOqRqQaaqJqJqJaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdgysMgygyqcgygybdbdbdgygygygygypzpzpzpzabababababababsdsdsdsdrhserQsfshsgsirFsksjrXsmrjsnspsosrsqrgrgsvsusxswsysarZsbaaaaaeszaeaaaeszaeaaaeszaeaaaeaaqJaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaababababababababababbdbdmRgygyqcgygygygygygygygygygyAwsFsDpzabababababababsdsGsJsIrhsKrQsQtcsYrGrFtetdrFtfrjtktmtltqtntutrsvsutwtvtztytCtAtEtDsNsNsNsNsNsNsNsNsNsNtHtFtIaeqJaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLabqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaababababababababababababbdbdgyqmqlqGgygygygygygygygyAwAetJpzababscscscscabsdtKtMtLrhtNtPtOrEtRrGtStUtTrGtVrjtWtYtXuatZucubuguduiuhujsarZsbaaaaaeukaeaaaeukaeaaaeukaeaaaeaaqJaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaabababababababababababababbdgygygyulgygygygygygygygyAwAeumscscscscuounscscscscupscscuquququqursbuqusuqursbuqutuuuquwuvuyuxuAuzuquBuCscaaaaaaaaqOuFqQaaqOuFqQaaqOuFqQaaqJqJqJaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaabababababababababababababbdbdbdrJuGrigygygygygygygypBAzuDuIuHuKuJuMuNuQuOvguPuSuRuUuTuWuVuXuWuWuWuZuYuWuWvbvavdvcvfvevhvivkvjvzvltrvmaaaeaaaaqOuFqQaaqOuFqQaaqOuFqQaaaeaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaabababababababababababababababbdbdAwvovnvpvpvpvpvpvpvpvpvrvqvtvsvvvuvxvwvwvwwOvyvBvAvCvwvwvDvFvEvwvwvHvGvIvwvKvJvMvLvOvNvLvPsvsvvRssvSuiaeaeaeaeqOuFqQaeqOuFqQaeqOuFqQaeqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababaaaaaaaaaaaaabababababababababababababababababbdbdpBvTpCgygygygygygygyrJsCvUscscscscuquququqscvVvXvWvYvXvZuqwauqwbscuquququququququququqsarZsbuquqwcwduqaaaaaeaaqOuFqQaaqOuFqQaaqOuFqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLababababababababqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababbdbdbdbdgyulgygygygygygygygyAwowowbdabababababababwfwewhwgwjwiwlwkwnwmwowfababababababababababaaaaaaaawqwpstwqaaaaaeaaqOuFqQaaqOuFqQaaqOuFqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLabqLababababqLqLabababqLqLqLqLqLababababababababqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababbdbdbdbdbdbdgyulgygygygygygygygyAwwsbdbdabababababababwfwewuwtwwwvwvwvwywxwzwfababababababababababaaaaaaaawBwAvQwBaeaeaeaeqOuFqQaeqOuFqQaeqOuFqQaeqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababbdgygygygygygyulgygygygygygygygyAwwsbdababababababababwfwewEwDwDwFwHwGwJwIwKwfababababababababababaaaaaaaawrwLwNuqwCaawPaaqOuFqQaaqOuFqQaaqOuFqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababbdgyqIqlqlqlqlwQgybdbdgygygygybdbdbdbdababababababababwfwewRwvwvwvwTwSwVwUwWwfabababababababababaaaaaaaawXwXwXwXwXwXwXaaaaqOuFqQaaqOuFqQaaqOuFqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLabababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababababbdgyqcgygygygysLgybdbdbdbdbdbdbdabababababababababababwfwYxawZwZxbxdxcxfxexgwfababababababababaaaaaaaaaawXwXwXwXwXwXwXaaaaqOuFqQaeqOuFqQaeqOuFqQaeqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababababababababbdgyqcgybdbdbdmRbdbdabababababababababababababababababwfxhxjxiwvwfxlxkwfxmxnwfabababababababaaaaaaaaaaaawXwXwXwXwXwXwXaaaaqOxoqQaaqOxoqQaaqOxoqQaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababababababababababababbdgyqcgybdbdbdbdabababababababababababababababababababwfxpxrxqwvwfxtxswfxuxwwfababababababaaaaaaaaaaaaaawXwXwXwXwXwXwXaaaaaaaeaaaaaaaeaaaaaaaeaaaaqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLabababababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababbdgyqcgybdbdbdababababababababababababababababababababwfwfwfwfwfwfxyxxwfxzxAwfababababaaaaaaaaaaaaaaaaaawXwXwXwXwXwXwXaaxBqJqJqJqJqJqJqJqJqJqJqJqJqJaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLababababababqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaababababababababababbdbdgyqcgybdbdababababababababababababababababababababababababababwfwfwfwfwfwfwfababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLababababqLabqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababababbdgygyqcgybdbdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLabababqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaababababababababbdgygyqcgybdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLababababqLqLqLqLababababababqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdgyqIwQgybdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLababababqLqLqLababababababqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababbdgygyulgygybdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLabababqLqLqLabababqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababmRsErJuGrigybdababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababbdgypBvTpCgybdababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLbdbdbdqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababbdgygyulgygybdabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLbdbdbdbdqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdaeaeaeaeaeaeaeaeaeaebdbdabababababababbdbdgyulgybdbdbdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLabababqLqLqLqLqLqLgygybdbdqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdsNsNsNsNsNsNsNsNsNbdbdbdabababababababbdbdgyulgybdbdbdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLabababqLqLqLqLqLqLgygygybdqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdaeaeaeaeaebdbdaeaeaebdbdabababababababababbdgyulgybdbdbdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLabababababqLqLqLqLgygygygybdbdbdbdqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaabdbdbdbdaaaaaaababababababababababbdbdgyulgybdbdbdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLababababababqLqLqLqLgygygygygybdbdbdqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaabdbdbdbdaaaaaaaaababababababababababbdbdgyulgybdbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLababqLqLqLqLqLqLqLababqLqLqLqLabababqLqLqLqLqLqLqLgygygygygybdbdqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaabdbdaaaaaaaaaaabababababababababbdbdbdgyulgybdbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababababababqLqLqLqLqLababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLsOgysOgybdbdbdqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababbdbdbdgyulgybdbdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababababababqLqLqLqLqLababqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLsPxCsPgybdqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdgyulgybdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLababababababababqLqLqLqLqLabababqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLsRsSsTqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdgyulgybdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLababababababqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLsRsSsUqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdgyulgybdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLgygyqwqCsVsWsWsWsWsWsWsXsSsUqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdgyulnDmRababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLgygygygyxCsZsZsZsZsZsZsZtatbsUqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababbdbdbdbdgyulgybdabababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLbdgygygyqwtgrerererererethsStitjqLqLqLqLqLbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababbdbdbdgyulgybdabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLabababqLqLqLqLqLqLbdbdbdgygygygyqLqLqLqLqLqLsRsSsUqLqLqLbdbdbdbdabababababababababababababababababababababababababababababababababababababababababababababababababababababababababqFtotpabxDxDxDxDxDxDabababababababaaaaaaaaaaaaaaaaaaaaaaaaababababababababababbdbdbdgyulgybdbdababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLababbdbdgygygyqLqLqLqLqLqLqLsRsSsUqLgybdbdbdbdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababtstpttabxDxFxExDxGxDabababababababaaaaaaaaaaaaaaaaaaaaaaabababababababababababbdbdbdgyulgybdbdbdbdabababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababbdbdbdgygyqLqLqLqLqLqLqLtxsSsUgygybdbdbdbdbdbdabababababababababababababababababababababababababababababababababababababababababababababababababababababababababqFmRabxDxIxHxLxKxDabababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababbdbdgyulgygybdbdbdbdbdabababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLsOxCsOgygybdbdbdbdbdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababtBababxDxDxDxDxMxDbdbdbdbdmRbdbdaaaaaaaaaaaaaaaaaaaaaaababababababababababababbdbdgyulgygygybdbdbdbdbdababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLgygysPgysPgygygygygygybdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababsBababxDxFxNxDxOxPgygygygytGgybdbdaaaaaaaaaaaaaaaaaaaaababababababababababababbdbdgyulgygygygybdbdbdbdbdbdababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLababababababqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLgygygygygygygygyxQxQxQgybdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababsBababxDxIxHxSxRxTgygygygygygygygygyaaaaaaaaaaaaaaaaaaaaababababababkDmRmRmRmRmRgygyulgygygygygygygybdabbdbdabababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLababababababababqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLgygygygygygygygyxUxWxVgybdbdbdababababababababababababababababababababababababababababababbdbdbdbdbdbdbdababababababababababababababababababxDxXxDxDxDxDxDxDxOxYgygygygygygygygygygygyaaaaaaaaaaaaaaaaaaabababababmRxZsCtQtQyagyrJuGrigygygygygygygyadabbdababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLababababababqLqLqLqLqLqLqLababababababqLqLqLqLbdgyybybybybybybydycyeybybybybybgygygybdabababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdabababababababababababxDxDxDxDygyfyhxDxFyixDxMxDyjyjykymylyjgygygygygygyaaaaaaaaaaaaaaaaaaabababbdmRynowueueufgyAwyovnyqypypypyrgygygygygybdabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLababababababqLqLqLqLqLqLqLabababababqLqLbdbdbdgyybysyuytywyvyyyxyAyzyCyByEyDsCsCribdbdbdbdabababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdabababababababxDyFyHyGyKyJyLxDxIxHyMxRxDyNyPyOyQyOyRgygygygygygygyaaaaaaaaaaaaaaaaaabdbdbdmRySuDuEuEpCgyAwyUyTyWyVyTyTyXgygygygygybdababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLabababqLqLqLqLqLqLqLqLabababqLqLabbdbdbdgyybyYzbzazdzczfzezEzgzizhzkzjzmzlufbdbdbdbdbdbdabababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdababababababxDznyHzozqzpzrxDxDxDxDxOxDyNzszszuztzvgygygygygygygyaaaaaaaaaaaaaaaaaagygygygygygygygygygypByUzwzwzwzxyTzzzyypyrgynDmRbdabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabbdbdbdgyybzAzDzBzFzGzHzJArzIyCzKzMzLxvzNufbdbdbdbdbdbdbdbdbdabababababababababababababababababbdbdbdmRbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdabababxDzOzQzPzSzRzUzTzWzVzYzXxDyNzszZAbAaAcgygygygygygyaaaaaaaaaaaaaaaaaaaaaaaagygygygygyAdAdAgAfyUAiAkAjAlyTyTyTyTAmgygygybdbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababbdbdbdgyybAnAqAoywAsAtzbARybybybybybybzNufgygygygygygygybdbdbdbdabababababababababababababababbdbdgytGgygygygygygygygyrJrigygygygygygybdbdbdbdbdababxDxDxDxDxDxDxDAuAxAvAuAxxDyjyjyjAyyjyjyjABAAgygyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagygyACAfADAFAEAHAGAGAIAKAJAMALANAmgygygymQbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLabababbdbdgyybAOAQAPzdBfBGBgBJASAUATAWAVAYAXqTqlqlqlqlqlqGgybdbdbdbdbdbdababababababababababababbdbdbdgyqIqlqlqlqlqlqlqlqlqSqTqlqlqlqlqGgybdbdbdbdbdabababababyjBaAZBbzszsBczszsBeBdDdBSFmDfBhBhBjBiymylBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkAgBmBlBoBnBqBpBsBrBtBtBvBuBxBwBzBygygygymQbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababbdbdgyybybybybybybybybybybBAybybybybowufgygygygygyqcgygygygybdbdbdbdababababababababababbdbdgygygyqcgygygygygygygygypBpCgygygygyqcgybdbdbdbdbdbdbdbdbdabyjyjyjyjBBBDBCBEBEBEBFFnBEBHFoFpBIBLBKBMBKBNBNBNBOBNBNBNBPBNBNBNBOBNBNBNBQBRBQBTFqBUBnBWBVBYBXBZAJCbCaCdCcsCsCrigybdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLabababbdbdgygygygygygygygygygygyAwCeAhowowowufgysMgygygyqmqlqlqGgybdbdbdbdababababababababababbdgygyqIqlqHgygygygybdgygysMgygygygygygyqcgybdbdbdbdbdbdbdbdbdbdbdbdbdyjCfCgzszszszsChzsCiCkCjClzsCnCmymylCoCoCoCoCoCoCoCoCoCoCoCoCoCoCoAgBmCpCqFrCrBnyUyTyTyTyTyTyTyTyTCsuDxJpCqFmQbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbdbdbdbdbdbdbdbdbdgygygypBuDuDuDuDCtApbdmRbdbdgygygygyqcgybdbdbdbdbdabababababbdbdbdbdbdgyqIqHgygygybdbdbdbdbdbdmRbdbdbdbdbdgyqcgybdbdbdbdbdbdmRbdbdbdbdbdCuCuCvCwCvCxCxCzCyCxCxCxCACBCAyjCCgygygyaaaaaaaaaeaaaaaaaeaaaaaaaaaaaeaaCDAfFsCFCECHCGCICICKCJCMCLCOCNCPCPCPqFgybdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababbdbdbdbdbdbdbdbdbdbdbdbdabbdbdbdbdbdgyqcgygygygygybdbdbdbdbdbdbdbdbdbdbdgyqcgygybdbdbdabababababbdbdbdbdbdbdgyqcgygygyrJrigygytGgygybdbdbdCuCRCQCTCSCxCUCWCVCYCXCxCZDbDayjgygygygygygyaaaaaeaaaaaaDcaeaeaeaeaeDcaeaeAdFtFuDeDgDgDgDgDhDgDiDgDgDjqFqFqFqFgybdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababbdbdbdbdgyqmqlqlqlqGgygygygygygygygygygygygygyqcgybdbdabababababababbdbdbdbdbdbdgyqmqlqlqlqSqTqlqlqlqGgybdbdbdCuDlDkDnDmCxDoDqDpDsDrCxDtDvDuyjgygygygygygyaeaeaeaeaeaeaeyIyIyIyIyIaeaaaaAdDwDxBnDzDyDACICIDBCICKDgDCgygygygybdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababbdbdbdgygygygygyqmqGgygyrJrigygyqIqlqlqlqlqlqHgybdabababababababababbdbdbdbdbdgygygygygypBpCgygygyqcgygygygyCuCuCuCuCuCxDDDEDpDGDFCxDHDICAyjgygygygygygyaaaaaeaaaaaaaeyIyIyIyIyIaeaaACAfBnDKDJDgDgDgDgDgDgDMDLDgDCgygygybdbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababbdbdbdgysMgygyqmqlqlqSqTqlqlqHgygygygygygygybdabababababababababababbdbdbdbdbdbdbdgygygygybdgyqmqlqlqGgygygygygygyCxDNDOCzCxCxCxowDPufyZgygygygygyaaaaaaaeaaaaaaaeyIyIyIyIyIDQBmDRDTDSDVDUDXDWDZDYEbEaEcDLDgDCgygygybdbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababbdbdmRbdgygygygypBpCgygygygysMgybdbdbdbdbdababababababababababababababbdbdbdbdbdbdbdbdbdgygygygyqcgygygygygygygygyEdowowowowowowufgygygygygygyaeaeaeaeaeaeaeaeyIyIyIyIyIEeEgEfEiEhEjBnBnBnElEkEnEmEpEoDgDCgygygybdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdmRbdbdabababababababababababababababababababababababababbdbdbdbdbdgyqcgygygygygygygygyEquDuDuDuDuDuDpCgygygygygygygyaaaaaaaaaaaaaeyIyIyIyIyIAgBmCpErBnEtEsEsEsEvEuEuEwEyExDgDCgygyzCmRabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdababababababababababababababababababababababababababababbdbdbdbdgyqmqlqlqlqlqlqlqlqlEzqlqlqlqlqlqlqlqlEAgygygygygygyaaaaaaaaaaaeyIyIyIyIyIEBaaCDAfECEDBnBnBnEFEEEnEnDMEGDgDCgygygybdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababbdbdbdbdbdababababababababababababababababababababababababababababababababbdbdbdbdgygygygygygygygygygygygygygygygygygygyulgyrJrigygygypzEHaaaaaaDcyIyIyIyIyIDcaaaaaaEIEJDUELEKENEMEPEOEpDLDgDCgygygybdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdmRsEEQESERETESESESEVEUEWEWEWEWEWEWEWEWEWEWEWEWEYEXEZBnFaBnFcFbFeFdFgFfDgDCgybdbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdgygygypBpCgygygypzEHaeaaaaaaaaaaaaaaaaaaaaaaFhEIAdAgAfAdDgDgDgDgDgDgDgDCgybdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdgygygyaeaaaaaaaaaaaaaaaaaaaaaaFjFivpvpvpvpvpvpvpvpvpvpvpFkgybdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdgysMgygyaaaaaaaaaaaaaaaaaaaaaaaapzbdbdbdbdbdbdbdbdbdbdbdbdbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababamabababafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababauababababababaiajajalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababakakakakakabauababababababanayayataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababakaoaqapakakarakakakasasasasaBaAasasasasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababakavaxawazaCaMaPaPaOaEaDaFaEaRayaEaHaDasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababaIaIaIaIaJaLaKaGaTaWaWaWaYaEaQaSaNbbbaaUaVaXasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaababababaIaIbgbeaIakakakakaPaPbjbjaZaEaEaEaEbnbcaEaEaEasbfbfbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabobibhaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababaIbkbrbqbubtbxbwbzbyblbsbvbBaEbCbDaEbpbmaEbAbHbEbIbAbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMbGbFafaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababaIbJbQbPaIbRbTbSbUbTbKbObvbVaEbWbZbLbXbNcabYcccbchcgbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclcecdcfafaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababaIbJcncmaIcobScpcrcqakarakciasasasasckcjaEcsccchchctbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacudldlcvcxcwbFafaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababafafafafafafafafafabababaIbJcEcDaIcFcHcycKcJczcLcOcNcRcAcBascGcCcIbAbAcMbAcQbfcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacScYcYdTcUcTcPafafababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdafafafafafafafafcVasasasasasascWasasasascZasasdadpdodrdqdcasddfsdhdbdededgdfdidwbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadjdldldkdncwdmabababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdaaaaaadsdsdsdsdsdsdsaEdudtdDdvdydxdHdGdJdzdLdKasdMdOdNdQdAdBasdCdSdhdbdbdbdbdbbfbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafdEcxcTdmabababababababababababababababababababababababababababababababababababababababababababababababababababababbdaaaaaadsdsdsdsdsdsdsdFdYdXeadZdZebecdZeadIefeedPegeoenepdRerdUeuetdVehekejelbfbfbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafeddWcTcwdmababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaadsdsdsdsdsdsdseidYeCeveseyeweAezemaseGeFaseHeJeIeMeKeOaseReQaEeNeNeNeNeqeBexbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafeEeDeLdmcwePdmdmdmdmabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaadsdsdsdsdsdsdsatdYeCeveseXeWeAezeYaseTeSaseUasasasasdPasfkdSaEfeeVfffieZfbfafbfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaaaeaeaeaeaeaaaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffcfgfdfjfhfhflcTbGdmfpfpdmabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaadsdsdsdsdsdsdsaEfrfqfvesfwezeAfxfzasftfsfyfufmfAfCasfEfDfFdSaEfLfofnfGfBfbbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaaaeaeaeaeaeaaaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffIfHfgfJfKfKcTfMbGcwfpfpfpdmabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaafZfOfNfQfPfOfNfRgefTfSfUfUfUgjgjgjgjgjfWdSfYfXaygaghasgkgigmglaEgvgbfVgcgwgAasasgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaeaaaaaaaaaaaaaaaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagdfIgffIfdfdcwggfKdmfJgndmfpgsdmabababababababababababababababababababababababababababababababababababababababababababababababgoaaaaaaaaaagpgrgqgugtgxgqgzgygDgCgFgEgGgjgLgKgKgjgMdSgPgNgRgQgSasgUgTgIgHaEaEgJaEaEaEdSdSgYgBgBgBgBgOgBgBgBgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafgWgVfdgXgZfdfKfJcwhpcwcwdmdmdmdmdmdmababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaahahchbhbhbhbhdhfhehhhghjhihkgjhmhlhohnhvglhqhwdSdShxfsdSdSgmglhzhrhthshuhCdSdShDgBhAhygBhBhEhVhXgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafhFhGcwfdgZfdcThHfKiddmbGePdmigfKcwiidmabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaahagqgqgqhIgqhJhKgqhLgChNhMhOgjhlhPhQirhYhWhRhZicibifhSijihikibibibhTilhUiniqiaitieioimisipiviuiwgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafababdmfhcTixfdfKcTfKcwigflfJfJdmigfJcTiydmababababababababababababababababababababababababababababababababababbdbdbdbdbdbdababababababkDizaaaaaaiAgqgqiCiBiEiDgziFiHiGiJiIiKgjiMiLiNgjgjjnjnjojqiOiPjqiQjqiSiRiRiRiRiPjqjvjwjwiTgBiViUgBiWiYiXiZgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdmdmdmdmdmdmfhfKjcfJfJfKjFigigfMbGbGdmigcTcwiydmababababababababababababababababababababababababababababababababbdbdbdacacacacbdbdbdababjbacacaaaaaaaajHfOfNfQjHjHjHjHjHjdjHjJjJjJgjjegjjijfjNjnjpjOjqjgjjjhjljkjtjmjxjxjxjrjqjZkajwjzkbkbkbkbjsjukehXgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdmjyjAjAjBdmhFjChGdmhpdmjEjDjGdmcwbGididcTfKfJdmabababababababababababababababababababababababababababababababbdbdacacacacacacacacbdbdabacacaaaaaaaaaaaaaaafafkojKjIjMjLjQjPjSjRjUjTjWjVjXkBjYkgkikHjqkjklkkkmjxjtknkpjxjxmqjqkQkRjwkskrkukckbgBgBgBgBgBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdmjyfKfJfKkdbGjAfKjAcTjAfJkfbGcwcTcwdmcTidfJfKdmababababababababababababababababababababababababababababababbdbdacacacacacacacacacacagmRacacaaaaaaaaaaaaaaaaafkokqkhkvktkxkwkykokokhkzgjljlijnjnkAlkjqkGkJmlkLkKkNkMkPkOkTkCjqlxlyjwkVkUkUkEkbabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababdmkFfJcTjAkIcTfKjAfJkScTcTcwbGcwcwcTdmidcwfKcwdmabababababababababababababababababababababababababababababbdmRacacacacacacacacacacacackYacafaaaaaaaaaaaaaaaaafkokqkhkXkWlakZlclbkoldgjgjlflejnlQlSlRjqlllnlmlplolrlgkGlslultjqmdmejwlvlvlvlvkbabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababdmkFlhjAlqdmcTdmmkmjdmjAdmmkmjdmcwbGdmePidididdmabababababababababababababababababababababababababababababbdlwacacacacacacacacacacacacacacafaaaaaaaaaaaaaaaaafkolzkhlAjLlClBlElDkolFgjlGlMlIjnlHlOmujqlJlLlKjllTlUlNjxlPjxjxjqmEmFjwkbkbkbkbkbabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababdmdmdmdmdmdmcwdmcwfJjAjAfKfKfKcTcwfJdmlVlXlWlYdmabababababababababababababababababababababababababababababbdagacacacacacacacacacacacacacacafaaaaaaaaaaaaaaafafkomalZmbktmclBmgmfkomsgjmtlMlIjnmvjnmVjqmhmlmimnmmmpmolLlLmrmqjqndnejwababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababdmfKdmcwfKmwcTfKjAcTdmcwcTdmnhcwcwmxdmahababababababababababababababababababababababababababababbdbdacacacmyacacacacacacacacacacafaaaaaaaaaaaaafafafkokomzmAkokomKmOmKkomPgjlGmTmSjnmUmXmWjqmBmDmCmHmGmJmImMmLmNjxjqjwjwjwababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababdmcwdmcwfKjAjAjAfJjAdmfJdmdmigfKcwiymYahababababababababababababababababababababababababababababbdmQmZacnamQnbacacacacacacacacacnfaaaaaaaaaaafnfnfnfacacnglGnjkonknmnlkonngjacnqnpjnnrnsnsnSncnuntnSninwnvnZnonynxnZababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababdmfKdmdmdmdmdmdmdmdmdmcwdmfhcwcwfKiynzahababababababababababababababababababababababababababababbdmQacacacmQnbacacacacacacacnAnCnBnDnDnDnDnDnDnEnAnCacacacacackonFnHnGkonIacacacacjnnJnLnKnSnMnOnNnSnPnRnQnZnTnVnUnZababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWaaaaaaaaaanWababababababababababababababdmcwcwfKcwcwcwcwcwfJcwcwdmigcwidcwiidmahababababababababababababababababababababababababababababbdacacacacnYnXacacacacacacacacoboaoaoaoaoaoaoaoaobacacacacacackoocodmKkooeofacacacoGognsnsnSohojoinSokonolnZoooroqnZababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababdmdmdmdmdmdmdmdmdmdmdmdmdmdmlYowovdmdmahababababababababababababababababababababababababababababbdacacacacacacacacacacacacacnAnCoxoyoyoyoyoyoyoynAnCacacacacacozmToBoAoDoCoHoFoFoFpaoIoLoJnSomoNoMnSopoPoOnZosouotnZabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababahahahdmcwcwcwdmahahababababababababababababababababababababababababababababbdmQmZacacacacacacacacacacaaaaaaaaaaaaaaaabdbdbdbdbdbdbdbdacacacacacacmToQoAacacbdjnjnjnjnnSnSnSnSnSpnpnpnnZnZnZnZnZabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababahahahdmcwoRcwdmahabababababababababababababababababababababababababababababbdmQacacacacacacacacacacacaaaaaaaaaaaaaaaabdbdbdababababbdbdbdbdbdbdbdacoSacacbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababahahdmoToUlYdmahabababababababababababababababababababababababababababababbdbdoVoXoWacacacacacbdbdbdaaaaaaaaaaaaaaaaaaababababababababbdbdbdbdbdacoSacacbdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababahahahoYoYoYahahababababababababababababababababababababababababababababababbdbdbdmRbdacacagagbdababaaaaaaaaaaaaaaaaaaababababababababababbdbdbdacoSacacbdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdababaaaaaaaaaaaaaaaaaaabababababababababababbdbdacoSacacbdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaababaaaaaaaaababababababababababbdbdacoZpbacbdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaabababaaaaaaababababababababababbdbdacacoSacbdabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaababaaaaaaababababababababababbdbdbdacoSacbdbdbdbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababbdbdbdacoSacacacacoEpwpwpwpwpwpwpwpwpwpwpwpwabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababbdbdbdacoSacacacacpcpepdpgpfoKphpjpipwpIpJpwababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaabababababababababbdbdbdacplpkpkpkoFpmpppopsprpuptpxpvpApyqgpwababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabaaaaaaaaababababababababababbdbdacpBacacacacpwpwpwpwpwpwpCpEpDpwqxqkpwababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaababababababababababbdbdacpGpFpKpHpHpLpNpMpRpOpTpSpUpqpVqyqApwababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaaaabababababababababbdbdacacacpBacacpwpwpwpwpWpwpwpwpwpwpwpwpwabababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababbdbdbdbdacpBacacacacvSqbpXpXbdababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababbdbdbdpcqcofacacacacacacacbdababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababbdbdbdmTqdoAacacacacacacacbdababababababababababababababababababababababababababababababaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaabababababababababbdbdbdacpBacacacacacacacbdbdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaabaaaaabababababababababbdbdbdacpBacacbdagbdbdbdbdbdababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaababababababababbdbdbdacpBacacbdbdbdababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaabababaaaaaaabababababababbdbdbdacpBacbdbdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaababababababbdbdacpBacbdbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababbdbdacpBacacbdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaabdbdaaaaaaaaaaaaabababababbdbdacpBacacbdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgobdbdbdaaaaaaaaaaaaabababababbdbdacpGqnacbdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWabababababababababnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgobdaaaaaaaaaaaaaaaaabababababbdbdacacpBacbdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWabababababnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWabababababababababnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdafafafafafafafafbdbdababababbdmRjbacpBacbdababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWababababababnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWababababababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdqoqoqoqoqoqoqoqobdbdbdabababbdbdacacpBacbdababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWabababnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWabababababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdafafafafafafafafbdabababababbdacacacpBacbdbdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaababababababbdacacacpBacacbdabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababababbdacacacpBacacbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababbdacacpcqcofacbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdacacmTqdoAacbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdacacpBacacbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdacqvqracbdbdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababbdbdacpBacacbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababbdacacpBacbdbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWababababnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbdbdacacpBqwmRababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWabababababnWnWnWnWnWnWnWabababnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbdacacqvqracbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWababababnWnWnWnWnWnWnWababababababnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdbdbdacacpBacacbdbdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWababababnWnWnWnWnWnWnWababababababnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdacacacacpBacacacbdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWababababnWnWnWnWnWnWnWnWabababababnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacpBacacacbdabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWabababababnWnWnWnWnWnWnWnWababababababnWnWnWababababababnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacpBacacacbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacpBacacacbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacpBacacacbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaagoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacpBacacacbdbdababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzqzqzqzqzqzqzqzqzqzqzqzqzqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacpBacacacacbdbdbdbdbdababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaafafaaaaaaaaaaaaaaaaafaaaaaaafaaaaaaafaaaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacpBacacacacacacacacbdbdabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaqDqBqEaaqDqBqEaaqDqBqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWabababababnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacpBacpcofacacacacacacbdababababababababababababababababababababababababababababababababababababababababababafafafafafafafafafafafafafafafafafafqDqFqEafqDqFqEafqDqFqEafqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacpGpFqGqHpFpFpFqnacacbdbdbdababababababababababababababababababababababababababababababababrjrjrjrjrjrjababaaaaaaaaafaaaaaaaaaaafaaaaafafaaaaaaqDqFqEaaqDqFqEaaqDqFqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWabababababnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacmToAacacacpBacacacacbdababababababababababababababababababababababababababababababababrjqKqNqLpPrjabababaaaaaaafaaaaaaafaaafaaafafafafaaaaqDqFqEaaqDqFqEaaqDqFqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaabdbdacpQacacacacacacacacpGpFqnacacbdbdabababababababababababababababababababababababababababababababrjqKqSqRrjrjrjababaaaaaaafafafafafafafafafaaaaafafaaqDqFqEafqDqFqEafqDqFqEafqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabbdbdmRbdbdbdbdbdbdacacacacpBacacacbdbdbdabababababababababababababababababababababababababababababrjqKqWqTqYqXrjabababaaaaafaaafaaaaaaafaaaaaaaaafaaaaqDqFqEaaqDqFqEaaqDqFqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWabababnWnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababbdbdacacacpBacacacacacbdbdababababababababababababababababababababababababrErErErErErjqZrjrjrjrjrjqUabbdaaafaaafafaaaaafaaaaaaaaaaaaaaqDqFqEaaqDqFqEaaqDqFqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWababababnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdafafafafafafafafafafafbdbdbdbdabababababbdbdacacpGpFpFqnacacacbdbdababababababbdbdbdababababababababababababababrEpYqapZrarorrrqrdrcruruqUbdbdqeafaaafaaaaaaafafafafafafafafqDqFqEafqDqFqEafqDqFqEafqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWababababnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdqoqoqoqoqoqoqoqoqoqoqoqoqoqobdbdbdbdababababbdacacacacacpBacacacacbdbdabababbdbdbdacbdababababababababababababababrEqfqiqhrErArGrergrfrirLrNpHpHdwafaaaaaaaaaaafaaaaafaaaaaaaaqDqFqEaaqDqFqEaaqDqFqEaaafaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWabababnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdafafafafafafafafafafafafafafafafbdbdabababababbdbdacacacacpGpFpFqnacacbdabbdbdbdacacacbdababababababababababababababrEqjqmqlrwrRrGrxrCrUrDrWqUrYrYrYrYrYrHrFrIuquqrHrIuqaaaaaaaaqDqFqEaaqDqFqEaaqDqFqEaaqzqzqzaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWabababnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWabnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdacrJacacpBacacbdbdbdacacacacacpzpzpzpzabababababababsdsdsdsdrhqpqmqqrKsgsirMrOsjrDsmrjqsquqtrQrPrSrStOrTrVqCrXrHrFrIaaaaafrZafaaafrZafaaafrZafaaafaaqzaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWabababnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWababababababababnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaababababababababababbdbdmRacacpBacacacacacacacacacacsasfsepzabababababababsdsGqIsIrhqJqmqMshsYrGsosqspsstfrjstqPqOqQsusxtctOrTszqVsHsEsOsNrbsQqoqoqoqoqoqoqoqoqoqosSsRsTafqzaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababnWnWabnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaababababababababababababbdbdacpGpFqnacacacacacacacacsasXsUpzababscscscscabsdtKrktLrhrlrnrmrEtRrGtStUtTrGtVrjrprtrsrvtdtgterzrythrBtirHrFrIaaaaaftjafaaaftjafaaaftjafaaafaaqzaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaabababababababababababababbdacacactkacacacacacacacacsasXtlscscscsctntmscscscsctoscscuquququqtqrIuqtwuqtqrIuqtxtFuqtHuvtJsbsktQuqslsnscaaaaaaaaqDtWqEaaqDtWqEaaqDtWqEaaqzqzqzaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaabababababababababababababbdbdbdpctXofacacacacacacacmTtYpXuatZuiubunsrupuoswsvsAsysDsCsFursJsFsFsFsLsKsFsFussMsPuwuCuBsWsVsZuDtbtatcuFaaafaaaaqDtWqEaaqDtWqEaaqDtWqEaaafaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaabababababababababababababababbdbdsauJuIuPuPuPuPuPuPuPuPuRuQuUuSuXuVvatptptptstrtutttvtptpvctztytptptBtAtCtptEtDtItGtMvetGtNtOtOvitPvkthafafafafqDtWqEafqDtWqEafqDtWqEafqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababaaaaaaaaaaaaabababababababababababababababababbdbdmTvnoAacacacacacacacpcvqvoscscscscuquququqscvrvtvsvuvtvyuqvzuqvAscuquququququququququqrHrFrIuquqvBvCuqaaaaafaaqDtWqEaaqDtWqEaaqDtWqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWababababababababnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababbdbdbdbdactkacacacacacacacacsalGlGbdabababababababwfucueudugufujuhulukumwfababababababababababaaaaaaaavEvDvFvEaaaaafaaqDtWqEaaqDtWqEaaqDtWqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWabnWababababnWnWabababnWnWnWnWnWababababababababnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababbdbdbdbdbdbdactkacacacacacacacacsavGbdbdabababababababwfucuuutuyuxuxuxuAuzvHwfababababababababababaaaaaaaavPvLvTvPafafafafqDtWqEafqDtWqEafqDtWqEafqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababbdacacacacacactkacacacacacacacacsavGbdababababababababwfucuGuEuEuHuLuKuNuMuOwfababababababababababaaaaaaaavWvVvXuqvZaawaaaqDtWqEaaqDtWqEaaqDtWqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababbdacqvpFpFpFpFwbacbdbdacacacacbdbdbdbdababababababababwfucuTuxuxuxuWwcuYwcuZwfabababababababababaaaaaaaawdwdwdwdwdwdwdaaaaqDtWqEaaqDtWqEaaqDtWqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWabababababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababababbdacpBacacacacpQacbdbdbdbdbdbdbdabababababababababababwfvdvgvfvfvhvjvfvluxvmwfababababababababaaaaaaaaaawdwdwdwdwdwdwdaaaaqDtWqEafqDtWqEafqDtWqEafqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWababababababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababababababababbdacpBacbdbdbdmRbdbdabababababababababababababababababwfuxvpuxuxwfwgwewfwhwiwfabababababababaaaaaaaaaaaawdwdwdwdwdwdwdaaaaqDwjqEaaqDwjqEaaqDwjqEaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWababababababababnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababababababababababababbdacpBacbdbdbdbdabababababababababababababababababababwfvvvxvwuxwfwlwkwfwmwnwfababababababaaaaaaaaaaaaaawdwdwdwdwdwdwdaaaaaaafaaaaaaafaaaaaaafaaaaqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWababababababababnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWabababababnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababbdacpBacbdbdbdababababababababababababababababababababwfwfwfwfwfwfwpwowfwrwuwfababababaaaaaaaaaaaaaaaaaawdwdwdwdwdwdwdaawxqzqzqzqzqzqzqzqzqzqzqzqzqzaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWababababababnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaababababababababababbdbdacpBacbdbdababababababababababababababababababababababababababwfwfwfwfwfwfwfababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWababababnWabnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaabababababababababbdacacpBacbdbdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWabnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWabababnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaababababababababbdacacpBacbdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWababababnWnWnWnWababababababnWnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdacqvwbacbdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWababababnWnWnWababababababnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababbdacactkacacbdabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWabababnWnWnWabababnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababmRjbpctXofacbdababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababbdacmTvnoAacbdababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWbdbdbdnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababbdacactkacacbdabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWbdbdbdbdnWnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdafafafafafafafafafafbdbdabababababababbdbdactkacbdbdbdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWabababnWnWnWnWnWnWacacbdbdnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdaaaaaaaaaaaaaaaaaabdbdbdabababababababbdbdactkacbdbdbdababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWabababnWnWnWnWnWnWacacacbdnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdafafafafafbdbdafafafbdbdabababababababababbdactkacbdbdbdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWabababababnWnWnWnWacacacacbdbdbdbdnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaabdbdbdbdaaaaaaababababababababababbdbdactkacbdbdbdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWababababababnWnWnWnWacacacacacbdbdbdnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaabdbdbdbdaaaaaaaaababababababababababbdbdactkacbdbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWababababnWnWnWnWnWnWnWababnWnWnWnWnWnWnWababnWnWnWnWabababnWnWnWnWnWnWnWacacacacacbdbdnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaabdbdaaaaaaaaaaabababababababababbdbdbdactkacbdbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWabababababababnWnWnWnWnWababnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWwzacwzacbdbdbdnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababbdbdbdactkacbdbdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWabababababababnWnWnWnWnWababnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWwAwBwAacbdnWnWnWnWabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdactkacbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWababababababababnWnWnWnWnWabababnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWnWnWwCwEwDnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdactkacbdbdababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWababababababnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWabnWnWnWnWnWnWnWnWnWnWnWnWnWwCwEwFnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdactkacbdabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWababnWnWnWnWnWnWnWnWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWacacnAnCwGnDnDnDnDnDnDwHwEwFnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababbdbdbdbdactkqwmRababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababababnWnWnWnWnWnWnWnWnWnWacacacacwBwJwJwJwJwJwJwJwKwLwFnWnWnWnWnWnWababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababbdbdbdbdactkacbdabababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWbdacacacnAwNoyoyoyoyoyoywOwEwPnfnWnWnWnWnWbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababbdbdbdactkacbdabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWabababnWabababnWnWnWnWnWnWbdbdbdacacacacnWnWnWnWnWnWwCwEwFnWnWnWbdbdbdbdabababababababababababababababababababababababababababababababababababababababababababababababababababababababababadvJvIabxDxDxDxDxDxDabababababababaaaaaaaaaaaaaaaaaaaaaaaaababababababababababbdbdbdactkacbdbdababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWababnWnWnWnWnWnWnWnWnWnWababbdbdacacacnWnWnWnWnWnWnWwCwEwFnWacbdbdbdbdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababvKvIwQabxDwSwRxDvMxDabababababababaaaaaaaaaaaaaaaaaaaaaaabababababababababababbdbdbdactkacbdbdbdbdabababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababbdbdbdacacnWnWnWnWnWnWnWwWwEwFacacbdbdbdbdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababablGmRabxDxawZvOvNxDabababababababaaaaaaaaaaaaaaaaaaaaabababababababababababababbdbdactkacacbdbdbdbdbdabababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWnWnWwzwBwzacacbdbdbdbdbdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababxbababxDxDxDxDvQxDbdbdbdbdmRbdbdaaaaaaaaaaaaaaaaaaaaaaababababababababababababbdbdactkacacacbdbdbdbdbdababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWacacwAacwAacacacacacacbdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababsBababxDwSxcxDvRxdacacacacvSacbdbdaaaaaaaaaaaaaaaaaaaaababababababababababababbdbdactkacacacacbdbdbdbdbdbdababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWababababababnWnWnWnWnWnWnWnWnWnWabababababnWnWnWnWnWnWnWnWnWacacacacacacacacxexexeacbdbdbdababababababababababababababababababababababababababababababababababababababababababababababababababababababababsBababxDxawZvYvUxfacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababababababkDmRmRmRmRmRacactkacacacacacacacbdabbdbdabababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWababababababababnWnWnWnWnWnWnWababababababnWnWnWnWnWnWnWnWnWacacacacacacacacxgxixhacbdbdbdababababababababababababababababababababababababababababababbdbdbdbdbdbdbdababababababababababababababababababxDxXxDxDxDxDxDxDvRxjacacacacacacacacacacacaaaaaaaaaaaaaaaaaaabababababmRxkvqxlxlxoacpctXofacacacacacacacahabbdababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWababababababnWnWnWnWnWnWnWababababababnWnWnWnWbdacybybybybybybxsxrxtybybybybybacacacbdabababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdabababababababababababxDxDxDxDxyxxxzxDwSxAxDvQxDyjyjxBxFxEyjacacacacacacaaaaaaaaaaaaaaaaaaabababbdmRxHlGxIxIxJacsaxKuIxMxLxLxLxNacacacacacbdabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWababababababnWnWnWnWnWnWnWabababababnWnWbdbdbdacybwqwtwsxPxOwwwvwyxQxSxRxVxTvqvqofbdbdbdbdabababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdabababababababxDxYydycyhyeyixDxawZwIvUxDykylwMymwMypacacacacacacacaaaaaaaaaaaaaaaaaabdbdbdmRytpXyvyvoAacsayUyTyyywyTyTyzacacacacacbdababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWabababnWnWnWnWnWnWnWnWabababnWnWabbdbdbdacybwTwVwUyByAwYwXyDyCyIyEyNyLyPyOxJbdbdbdbdbdbdabababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdababababababxDyQydyRyQyVyWxDxDxDxDvRxDykznznxnxmyXacacacacacacacaaaaaaaaaaaaaaaaaaacacacacacacacacacacmTyUxpxpxpxqyTyZyYxLxNacqwmRbdabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWabababnWnWnWnWnWnWnWnWnWnWnWnWnWabbdbdbdacybxuxwxvzbzazgzfzizhxSzjzszkzuztxJbdbdbdbdbdbdbdbdbdabababababababababababababababababbdbdbdmRbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdabababxDzvzxzwzzzyzCxUxZxWyfyaxDykznygyoynzHacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaacacacacacAdAdzJzIyUzKyryqysyTyTyTyTzLacacacbdbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWnWnWnWnWababbdbdbdacybyuyxzMxPzNzSwVzTybybybybybybztxJacacacacacacacbdbdbdbdabababababababababababababababbdbdacvSacacacacacacacacpcofacacacacacacbdbdbdbdbdababxDxDxDxDxDxDxDzVzXzWzVzXxDyjyjyjAcyjyjyjAfAeacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacAgzIyFyHyGAiyJyJyKyMAjAlAkAmzLacacacagbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWnWnWnWnWnWnWnWabababbdbdacybySApAoyBAqArxGxCzczezdAtAsAvAuqHpFpFpFpFpFqnacbdbdbdbdbdbdababababababababababababbdbdbdacqvpFpFpFpFpFpFpFpFqGqHpFpFpFpFqnacbdbdbdbdbdabababababyjzmzlzoznznzpznznzrzqAxAwABAAACACAEADxFxEAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFzJAHAGAIAOzBzAzEzDzFzFzGAJALAKANAMacacacagbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWnWnWabababbdbdacybybybybybybybybybybAQybybybyblGxJacacacacacpBacacacacbdbdbdbdababababababababababbdbdacacacpBacacacacacacacacmToAacacacacpBacbdbdbdbdbdbdbdbdbdabyjyjyjyjARzPzOzQzQzQzRASzQAUATAWzUAZAYzYAYzZzZzZAazZzZzZAbzZzZzZAazZzZzZBaAhBaBcBbBdAOBeAnyryryrAjBgBfBiBhvqvqofacbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWnWabababbdbdacacacacacacacacacacacacBlBolGlGlGxJacrJacacacpGpFpFqnacbdbdbdbdababababababababababbdacacqvpFqracacacacbdacacrJacacacacacacpBacbdbdbdbdbdbdbdbdbdbdbdbdbdyjAyAzznznznznBpznBqBsBrBtznBvBuxFxEBwBwBwBwBwBwBwBwBwBwBwBwBwBwBwzJAHBxBzByAPAOyUyTyTyTyTyTyTyTyTBApXBBoAacagbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababbdbdbdbdbdbdbdbdbdacacacacmTpXpXpXBDBEbdmRbdbdacacacacpBacbdbdbdbdbdabababababbdbdbdbdbdacqvqracacacbdbdbdbdbdbdmRbdbdbdbdbdacpBacbdbdbdbdbdbdmRbdbdbdbdbdCuCuBFBGBFCxCxCzBHCxCxCxBJBLBJyjBMacacacaaaaaaaaafaaaaaaafaaaaaaaaaaafaaBNzIAVAXBOCHBQBRBRBTBSBYBVCaBZCbCbCbacacbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababbdbdbdbdbdbdbdbdbdbdbdbdabbdbdbdbdbdacpBacacacacacbdbdbdbdbdbdbdbdbdbdbdacpBacacbdbdbdabababababbdbdbdbdbdbdacpBacacacpcofacacvSacacbdbdbdCuBkBjBnBmCxCcCWCVCYCXCxCdCfCeyjacacacacacacaaaaafaaaaaaCgafafafafafCgafafAdCiCkCjDgDgDgDgCmDgCoDgDgCpacacacacacbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababbdbdbdbdacpGpFpFpFqnacacacacacacacacacacacacacpBacbdbdabababababababbdbdbdbdbdbdacpGpFpFpFqGqHpFpFpFqnacbdbdbdCuCtCsCvBCCxDoDqDpDsDrCxCwCACyyjacacacacacacafafafafafafafCBCBCBCBCBafaaaaAdBICCAOCIBKCJBRBRCMBRBTDgCNacacacacbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababbdbdbdacacacacacpGqnacacpcofacacqvpFpFpFpFpFqracbdabababababababababbdbdbdbdbdacacacacacmToAacacacpBacacacacCuCuCuCuCuCxDDDEDpDGDFCxCOCPBJyjacacacacacacaaaaafaaaaaaafCBCBCBCBCBafaaAgzIAOCQBPDgDgDgDgDgDgCUCTDgCNacacacbdbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababbdbdbdacrJacacpGpFpFqGqHpFpFqracacacacacacacbdabababababababababababbdbdbdbdbdbdbdacacacacbdacpGpFpFqnacacacacacacCxDNDOCzCxCxCxlGDaxJvbacacacacacaaaaaaafaaaaaaafCBCBCBCBCBDbAHDcDeDdDfBUBXBWDiDhDkDjDlCTDgCNacacacbdbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababbdbdmRbdacacacacmToAacacacacrJacbdbdbdbdbdababababababababababababababbdbdbdbdbdbdbdbdbdacacacacpBacacacacacacacacDmlGlGlGlGlGlGxJacacacacacacafafafafafafafafCBCBCBCBCBEeDtDnDvDuDwAOAOAOChDxCGDyDADzDgCNacacacbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdmRbdbdabababababababababababababababababababababababababbdbdbdbdbdacpBacacacacacacacacDBpXpXpXpXpXpXoAacacacacacacacaaaaaaaaaaaaafCBCBCBCBCBzJAHBxDCAOCnClClClCrCqCqDHEyDIDgCNacacjamRabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdababababababababababababababababababababababababababababbdbdbdbdacpGpFpFpFpFpFpFpFpFDJpFpFpFpFpFpFpFpFDKacacacacacacaaaaaaaaaaafCBCBCBCBCBDLaaBNzIDMCDAOAOAOCFCECGCGCUDPDgCNacacacbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababbdbdbdbdbdababababababababababababababababababababababababababababababababbdbdbdbdacacacacacacacacacacacacacacacacacacactkacpcofacacacpzacaaaaaaCgCBCBCBCBCBCgaaaaaaEIDQBUCLCKDSDRDTEODACTDgCNacacacbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdmRjbDUDWDVDXDWDWDWDYDWDZDZDZDZDZDZDZDZDZDZDZDZEbEaCRAOCSAOCZEcEfEdEhEgDgCNacbdbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdacacacmToAacacacpzacafaaaaaaaaaaaaaaaaaaaaaaEiEIAdzJzIAdDgDgDgDgDgDgDgCNacbdabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdacacacafaaaaaaaaaaaaaaaaaaaaaaEkEjuPuPuPuPuPuPuPuPuPuPuPElacbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdacrJacacaaaaaaaaaaaaaaaaaaaaaaaapzbdbdbdbdbdbdbdbdbdbdbdbdbdbdababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdbdbdmRbdbdaaaaaaaaaaaaaaaaaaaaaaaaaabdbdbdbdbdbdbdbdbdbdbdbdbdabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdbdababbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaabdbdbdbdbdbdbdbdbdbdbdbdabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbdbdbdbdbdbdbdbdbdbdbdabababbdbdbdaaaaaaaaaaaaaaaaaaaaaaaabdbdbdbdbdbdbdbdbdbdbdbdabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1843,25 +1786,25 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaFlaaaaFlaaaaaaFlaaaaaaaaaaFlaaaaaaFlaaaaFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaFlFlFlFlaaaaaaFlFlFlFlFlFlFlaaaaaaFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaFlFlFlFlaaaaFlFlFlFlFlFlFlFlFlaaaaFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaFlFlFlFlaaaaFlFlFlFlFlFlFlFlFlaaaaFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababaaaaaaaaababababababababababababababaaabababaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFlFlFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFlFlFlFlFlFlFlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaEmaaaaEmaaaaaaEmaaaaaaaaaaEmaaaaaaEmaaaaEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaEmEmEmEmaaaaaaEmEmEmEmEmEmEmaaaaaaEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaEmEmEmEmaaaaEmEmEmEmEmEmEmEmEmaaaaEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaEmEmEmEmaaaaEmEmEmEmEmEmEmEmEmaaaaEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababaaaaaaaaababababababababababababababaaabababaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEmEmEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEmEmEmEmEmEmEmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/overmap/bearcat/bearcat.dm b/maps/overmap/bearcat/bearcat.dm index 801d2c7c18c..7e5908e0a8f 100644 --- a/maps/overmap/bearcat/bearcat.dm +++ b/maps/overmap/bearcat/bearcat.dm @@ -58,7 +58,7 @@ icon_state = "entry" /area/ship/scrap/unused1 - name = "\improper Unused Compartment #1" + name = "\improper Atmos Equipment Comparment" icon_state = "green" /area/ship/scrap/unused2 @@ -80,7 +80,6 @@ /area/ship/scrap/maintenance/atmos name = "\improper Atmospherics Comparment" icon_state = "atmos" - music = list('sound/ambience/ambiatm1.ogg') /area/ship/scrap/maintenance/power name = "\improper Power Compartment" @@ -89,12 +88,10 @@ /area/ship/scrap/maintenance/engine name = "\improper Engine Compartments" icon_state = "engine" - music = list('sound/ambience/ambisin1.ogg','sound/ambience/ambisin2.ogg','sound/ambience/ambisin3.ogg') /area/ship/scrap/command name = "\improper Command Deck" icon_state = "centcom" - music = list('sound/ambience/signal.ogg') /area/ship/scrap/command/captain name = "\improper Captain's Quarters" @@ -103,7 +100,6 @@ /area/ship/scrap/comms name = "\improper Communications Relay" icon_state = "tcomsatcham" - music = list('sound/ambience/signal.ogg') /area/ship/scrap/shuttle/ requires_power = 0 diff --git a/maps/overmap/bearcat/bearcat.dmm b/maps/overmap/bearcat/bearcat.dmm index 27ee41d46f3..5fdbf935df7 100644 --- a/maps/overmap/bearcat/bearcat.dmm +++ b/maps/overmap/bearcat/bearcat.dmm @@ -1,407 +1,494 @@ -"aa" = (/turf/space,/area) +"aa" = (/turf/space,/area/space) "ab" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/space,/area/ship/scrap/command) -"ac" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor,/area/ship/scrap/command) -"ad" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor,/area/ship/scrap/command) -"ae" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor,/area/ship/scrap/command) -"af" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/space,/area/ship/scrap/command) -"ag" = (/obj/machinery/computer/communications,/turf/simulated/floor/bluegrid,/area/ship/scrap/command) -"ah" = (/obj/machinery/computer/helm,/turf/simulated/floor/bluegrid,/area/ship/scrap/command) -"ai" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/bluegrid,/area/ship/scrap/command) -"aj" = (/obj/effect/mapinfo/ship/bearcat,/turf/space,/area) -"ak" = (/obj/structure/table/standard,/obj/machinery/light,/obj/item/device/radio,/obj/item/device/radio/intercom{pixel_y = -32},/turf/simulated/floor{tag = "icon-gcircuit (SOUTHEAST)"; icon_state = "gcircuit"; dir = 6},/area/ship/scrap/command) -"al" = (/obj/structure/stool/bed/chair/comfy/teal{tag = "icon-comfychair_teal (NORTH)"; icon_state = "comfychair_teal"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor{tag = "icon-gcircuitoff"; icon_state = "gcircuitoff"; dir = 2},/area/ship/scrap/command) -"am" = (/obj/structure/table/standard,/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -32},/obj/machinery/door_control{id = "scraplock"; name = "External Lockdown"},/turf/simulated/floor{tag = "icon-gcircuit (SOUTHEAST)"; icon_state = "gcircuit"; dir = 6},/area/ship/scrap/command) -"an" = (/turf/simulated/wall/r_wall,/area/ship/scrap/command) -"ao" = (/obj/machinery/door/airlock/hatch,/obj/machinery/atmospherics/pipe/simple{dir = 2; icon_state = "intact"; level = 1; tag = "icon-intact"},/turf/simulated/floor,/area/ship/scrap/command) -"ap" = (/turf/simulated/wall/r_wall,/area/ship/scrap/comms) -"aq" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/comms) -"ar" = (/obj/machinery/light_switch{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/command) -"as" = (/turf/simulated/wall/r_wall,/area/ship/scrap/command/captain) -"at" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/command/captain) -"au" = (/obj/machinery/account_database,/turf/simulated/floor/bluegrid,/area/ship/scrap/comms) -"av" = (/turf/simulated/floor/bluegrid,/area/ship/scrap/comms) -"aw" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/power/apc{dir = 1; name = "Communications APC"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/light_switch{pixel_x = 28},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/ship/scrap/comms) -"ax" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/power/apc{dir = 4; name = "Bridge APC"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple{dir = 2; icon_state = "intact"; level = 1; tag = "icon-intact"},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/command) -"ay" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/item/weapon/gun/energy/stunrevolver,/obj/structure/closet/cabinet,/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"az" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"aA" = (/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/table/woodentable,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"aB" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/comms) -"aC" = (/obj/machinery/telecomms/allinone,/turf/simulated/floor/bluegrid,/area/ship/scrap/comms) -"aD" = (/obj/machinery/door/window/westleft,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; level = 2; on = 1},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/ship/scrap/comms) -"aE" = (/obj/machinery/door/airlock/hatch,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8; level = 1},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/comms) -"aF" = (/obj/structure/cable{tag = "icon-2-8"; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/command) -"aG" = (/obj/machinery/door/airlock/hatch,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/command/captain) -"aH" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8; level = 1},/obj/structure/cable{tag = "icon-6-8"; icon_state = "6-8"},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"aI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; level = 1; on = 1},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"aJ" = (/obj/structure/stool/bed/chair/comfy/brown,/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"aK" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -32; tag = "icon-alarm0 (NORTH)"},/turf/simulated/floor/bluegrid,/area/ship/scrap/comms) -"aL" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/window/reinforced{dir = 8},/obj/item/device/radio/intercom{pixel_y = -32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/ship/scrap/comms) -"aM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple{dir = 2; icon_state = "intact"; level = 1; tag = "icon-intact"},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/command) -"aN" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{pixel_x = -32},/obj/structure/table/standard,/obj/item/weapon/gun/projectile/shotgun/pump/combat{desc = "When words don't strike hard enough."; name = "Solid Argument"},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"aO" = (/obj/structure/cable{tag = "icon-4-9"; icon_state = "4-9"},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"aP" = (/obj/structure/table/woodentable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Captain's Quarters APC"},/turf/simulated/floor{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/ship/scrap/command/captain) -"aQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple{dir = 2; icon_state = "intact"; level = 1; tag = "icon-intact"},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/command) -"aR" = (/turf/simulated/wall/r_wall,/area/ship/scrap/dock) -"aS" = (/obj/machinery/door/airlock/hatch,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/ship/scrap/dock) -"aT" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"},/area/ship/scrap/shuttle/outgoing) -"aU" = (/obj/structure/shuttle/window{tag = "icon-3"; icon_state = "3"},/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) -"aV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"},/area/ship/scrap/shuttle/outgoing) -"aW" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/dock) -"aX" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; level = 2; on = 1},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"aY" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"aZ" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; dir = 10; pixel_x = 0; level = 2; initialize_directions = 10},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Docking Area APC"},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"ba" = (/turf/space,/area/ship/scrap/shuttle/ingoing) -"bb" = (/obj/structure/shuttle/window{tag = "icon-2"; icon_state = "2"},/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) -"bc" = (/obj/structure/stool/bed/chair{tag = "icon-chair (NORTH)"; icon_state = "chair"; dir = 1},/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) -"bd" = (/obj/machinery/computer/shuttle_control/explore/bearcat,/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) -"be" = (/obj/structure/window/reinforced,/turf/space,/area) -"bf" = (/obj/structure/window/reinforced,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/space,/area/ship/scrap/dock) -"bg" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/ship/scrap/dock) -"bh" = (/obj/machinery/computer/shuttle_control/explore/bearcat,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/dock) -"bi" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/dock) -"bj" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor,/area/ship/scrap/dock) -"bk" = (/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"bl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-plaque (SOUTHEAST)"; icon_state = "plaque"; dir = 6},/area/ship/scrap/dock) -"bm" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"bn" = (/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/dock) -"bo" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/ship/scrap/shuttle/outgoing) -"bp" = (/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) -"bq" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) -"br" = (/obj/machinery/door/airlock/external,/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"bs" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"bt" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"bu" = (/obj/machinery/door/airlock/external,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/dock) -"bv" = (/turf/simulated/floor{tag = "icon-loadingareadirty2 (EAST)"; icon_state = "loadingareadirty2"; dir = 4},/area/ship/scrap/dock) -"bw" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/dock) -"bx" = (/obj/structure/closet/walllocker/emerglocker/south,/obj/item/device/radio/intercom{pixel_x = -32},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"by" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"bz" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9; level = 2},/obj/machinery/light_switch{pixel_x = 28},/obj/machinery/light_switch{pixel_x = 28},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"bA" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/dock) -"bB" = (/turf/simulated/floor{tag = "icon-loadingareadirty1 (WEST)"; icon_state = "loadingareadirty1"; dir = 8},/area/ship/scrap/dock) -"bC" = (/obj/machinery/door/airlock/external,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/dock) -"bD" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area) -"bE" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area) -"bF" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6; level = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/dock) -"bG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; level = 2; on = 1},/obj/item/device/radio/intercom{pixel_y = -32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/dock) -"bH" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor,/area/ship/scrap/dock) -"bI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; level = 2; on = 1},/obj/item/device/radio/intercom{pixel_y = -32},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/dock) -"bJ" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; dir = 10; pixel_x = 0; level = 2; initialize_directions = 10},/turf/simulated/floor,/area/ship/scrap/dock) -"bK" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/space,/area/ship/scrap/dock) -"bL" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"},/area/ship/scrap/shuttle/outgoing) -"bM" = (/obj/structure/shuttle/engine/platform,/obj/structure/shuttle/engine/heater,/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/ship/scrap/shuttle/outgoing) -"bN" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"},/area/ship/scrap/shuttle/outgoing) -"bO" = (/obj/structure/lattice,/turf/space,/area) -"bP" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor/plating,/area/ship/scrap/dock) -"bQ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) -"bR" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-neutralfull (EAST)"; icon_state = "neutralfull"; dir = 4},/area/ship/scrap/crew) -"bS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) -"bT" = (/turf/space,/area/ship/scrap/shuttle/outgoing) -"bU" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/space,/area/ship/scrap/shuttle/outgoing) -"bV" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) -"bW" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor{tag = "icon-stage_stairs (SOUTHEAST)"; icon_state = "stage_stairs"; dir = 6},/area/ship/scrap/dock) -"bX" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) -"bY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-stage_stairs (SOUTHEAST)"; icon_state = "stage_stairs"; dir = 6},/area/ship/scrap/crew) +"ac" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/command) +"ad" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/ship/scrap/command) +"ae" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/ship/scrap/command) +"af" = (/obj/structure/grille,/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/command) +"ag" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/space,/area/ship/scrap/command) +"ah" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/command) +"ai" = (/obj/machinery/computer/communications,/turf/simulated/floor/bluegrid,/area/ship/scrap/command) +"aj" = (/obj/machinery/computer/helm,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/bluegrid,/area/ship/scrap/command) +"ak" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/bluegrid,/area/ship/scrap/command) +"al" = (/obj/effect/mapinfo/ship/bearcat,/turf/space,/area) +"am" = (/obj/structure/table/standard,/obj/machinery/light,/obj/item/device/radio,/obj/item/device/radio/intercom{pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off (EAST)"; icon_state = "off"; dir = 4; layer = 2.4; level = 2},/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"an" = (/obj/structure/bed/chair/comfy/teal{tag = "icon-comfychair_teal (NORTH)"; icon_state = "comfychair_teal"; dir = 1},/obj/effect/landmark/start{name = "Captain"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"ao" = (/obj/structure/table/standard,/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -32},/obj/machinery/button/remote/blast_door{id = "scraplock"; name = "External Lockdown"},/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"ap" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/ship/scrap/command) +"aq" = (/turf/simulated/wall/r_wall,/area/ship/scrap/command) +"ar" = (/obj/machinery/door/airlock/hatch,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"as" = (/turf/simulated/wall/r_wall,/area/ship/scrap/comms) +"at" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/comms) +"au" = (/obj/machinery/light_switch{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"av" = (/turf/simulated/wall/r_wall,/area/ship/scrap/command/captain) +"aw" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/command/captain) +"ax" = (/obj/machinery/account_database,/turf/simulated/floor/bluegrid,/area/ship/scrap/comms) +"ay" = (/turf/simulated/floor/bluegrid,/area/ship/scrap/comms) +"az" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/power/apc{dir = 1; name = "Communications APC"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/light_switch{pixel_x = 28},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/dark,/area/ship/scrap/comms) +"aA" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/power/apc{dir = 4; name = "Bridge APC"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"aB" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/item/weapon/gun/energy/stunrevolver,/obj/structure/closet/cabinet,/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aC" = (/obj/structure/bed,/obj/item/weapon/bedsheet/captain,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aD" = (/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/structure/table/woodentable,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aE" = (/obj/machinery/telecomms/allinone,/turf/simulated/floor/bluegrid,/area/ship/scrap/comms) +"aF" = (/obj/machinery/door/window/westleft,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/dark,/area/ship/scrap/comms) +"aG" = (/obj/machinery/door/airlock/hatch,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/ship/scrap/comms) +"aH" = (/obj/structure/cable{tag = "icon-2-8"; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"aI" = (/obj/machinery/door/airlock/hatch,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/ship/scrap/command/captain) +"aJ" = (/obj/structure/cable{tag = "icon-6-8"; icon_state = "6-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aL" = (/obj/structure/bed/chair/comfy/brown,/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aM" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -32; tag = "icon-alarm0 (NORTH)"},/turf/simulated/floor/bluegrid,/area/ship/scrap/comms) +"aN" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/window/reinforced{dir = 8},/obj/item/device/radio/intercom{pixel_y = -32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "off"; layer = 2.4; level = 2; tag = "icon-off (NORTH)"},/turf/simulated/floor/tiled/dark,/area/ship/scrap/comms) +"aO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"aP" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{pixel_x = -32},/obj/structure/table/standard,/obj/item/weapon/gun/projectile/shotgun/pump/combat{desc = "When words don't strike hard enough."; name = "Solid Argument"},/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aQ" = (/obj/structure/cable{tag = "icon-4-9"; icon_state = "4-9"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "off"; layer = 2.4; level = 2; tag = "icon-off (NORTH)"},/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aR" = (/obj/structure/table/woodentable,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Captain's Quarters APC"},/turf/simulated/floor/wood,/area/ship/scrap/command/captain) +"aS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/ship/scrap/command) +"aT" = (/turf/simulated/wall/r_wall,/area/ship/scrap/dock) +"aU" = (/obj/machinery/door/airlock/hatch,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/ship/scrap/dock) +"aV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s (EAST)"; icon_state = "swall_s"; dir = 4},/area/ship/scrap/shuttle/outgoing) +"aW" = (/obj/structure/shuttle/window{tag = "icon-3"; icon_state = "3"},/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) +"aX" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s"; dir = 2},/area/ship/scrap/shuttle/outgoing) +"aY" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/dock) +"aZ" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/dock) +"ba" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bc" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Docking Area APC"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bd" = (/turf/space,/area/ship/scrap/shuttle/ingoing) +"be" = (/obj/structure/shuttle/window{tag = "icon-2"; icon_state = "2"},/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) +"bf" = (/obj/structure/bed/chair{tag = "icon-chair (NORTH)"; icon_state = "chair"; dir = 1},/obj/structure/bed/chair{tag = "icon-chair_preview (NORTH)"; icon_state = "chair_preview"; dir = 1},/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) +"bg" = (/obj/machinery/computer/shuttle_control/explore/bearcat,/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) +"bh" = (/obj/structure/window/reinforced,/turf/space,/area) +"bi" = (/obj/structure/window/reinforced,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/space,/area/ship/scrap/dock) +"bj" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/ship/scrap/dock) +"bk" = (/obj/machinery/computer/shuttle_control/explore/bearcat,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bl" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bm" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/dock) +"bn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/floor_decal/plaque,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bq" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"br" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/dock) +"bs" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1},/area/ship/scrap/shuttle/outgoing) +"bt" = (/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) +"bu" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/ship/scrap/shuttle/outgoing) +"bv" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bw" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bx" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/effect/landmark{name = "JoinLate"},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"by" = (/obj/machinery/door/airlock/external,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bz" = (/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bA" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bB" = (/obj/structure/closet/walllocker/emerglocker/south,/obj/item/device/radio/intercom{pixel_x = -32},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off (EAST)"; icon_state = "off"; dir = 4; layer = 2.4; level = 2},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bD" = (/obj/machinery/light_switch{pixel_x = 28},/obj/machinery/light_switch{pixel_x = 28},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bE" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bF" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area) +"bG" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area) +"bH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bI" = (/obj/item/device/radio/intercom{pixel_y = -32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "off"; layer = 2.4; level = 2; tag = "icon-off (NORTH)"},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bK" = (/obj/item/device/radio/intercom{pixel_y = -32},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "off"; layer = 2.4; level = 2; tag = "icon-off (NORTH)"},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bL" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/space,/area/ship/scrap/dock) +"bM" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s"; dir = 1},/area/ship/scrap/shuttle/outgoing) +"bN" = (/obj/structure/shuttle/engine/platform,/obj/structure/shuttle/engine/heater,/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall_straight"; dir = 4},/area/ship/scrap/shuttle/outgoing) +"bO" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s"; dir = 8},/area/ship/scrap/shuttle/outgoing) +"bP" = (/obj/structure/lattice,/turf/space,/area) +"bQ" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bR" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) +"bS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"bT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) +"bU" = (/turf/space,/area/ship/scrap/shuttle/outgoing) +"bV" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/space,/area/ship/scrap/shuttle/outgoing) +"bW" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) +"bX" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/dock) +"bY" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) "bZ" = (/turf/simulated/wall,/area/ship/scrap/crew/toilets) "ca" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/toilets) -"cb" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/toilets) -"cc" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor/plating,/area/ship/scrap/crew) +"cb" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/toilets) +"cc" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/crew) "cd" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/saloon) -"ce" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/saloon) -"cf" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor/plating,/area/ship/scrap/crew) +"ce" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cf" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/ship/scrap/crew) "cg" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/dorms) "ch" = (/obj/structure/sign/poster,/turf/simulated/wall,/area/ship/scrap/crew/dorms) -"ci" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/dorms) +"ci" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/dorms) "cj" = (/turf/simulated/wall,/area/ship/scrap/crew/dorms) -"ck" = (/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 1},/obj/item/weapon/soap,/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cl" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/structure/toilet,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cm" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/structure/mirror{pixel_y = 29},/obj/structure/sink{pixel_y = 18},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cn" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor/plating,/area/ship/scrap/crew) +"ck" = (/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 1},/obj/item/weapon/soap,/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cl" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/structure/toilet,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cm" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/structure/mirror{pixel_y = 29},/obj/structure/sink{pixel_y = 18},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off"; icon_state = "off"; dir = 2; layer = 2.4; level = 2},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cn" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/ship/scrap/crew) "co" = (/turf/simulated/wall,/area/ship/scrap/crew/saloon) -"cp" = (/obj/machinery/vending/snack,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor{tag = "icon-orange (WEST)"; icon_state = "orange"; dir = 8},/area/ship/scrap/crew/saloon) -"cq" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/machinery/power/apc{dir = 1; name = "Crew Areas APC"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/saloon) -"cr" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/saloon) -"cs" = (/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor,/area/ship/scrap/crew/saloon) -"ct" = (/obj/machinery/vending/coffee,/turf/simulated/floor{tag = "icon-orange (EAST)"; icon_state = "orange"; dir = 4},/area/ship/scrap/crew/saloon) -"cu" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/dorms) -"cv" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor,/area/ship/scrap/crew/dorms) -"cw" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/ship/scrap/crew/dorms) -"cx" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/toilets) -"cy" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Reception Window"; opacity = 1; req_access_txt = "0"},/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cz" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Reception Window"; opacity = 1; req_access_txt = "0"},/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; level = 2; on = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cB" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/toilets) -"cC" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"cD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/saloon) -"cE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-orange (WEST)"; icon_state = "orange"; dir = 8},/area/ship/scrap/crew/saloon) -"cF" = (/obj/structure/stool,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/saloon) -"cG" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark{name = "Observer-Start"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/item/ashtray/glass,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/saloon) -"cH" = (/obj/structure/stool,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; level = 2; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/ship/scrap/crew/saloon) -"cI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-orange (EAST)"; icon_state = "orange"; dir = 4},/area/ship/scrap/crew/saloon) -"cJ" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"cK" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/dorms) -"cL" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/dorms) -"cM" = (/obj/structure/stool/bed,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; level = 2; on = 1},/obj/item/weapon/bedsheet/brown,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/dorms) -"cN" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor,/area/ship/scrap/crew/dorms) -"cO" = (/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted,/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cP" = (/obj/structure/toilet{tag = "icon-toilet00 (NORTH)"; icon_state = "toilet00"; dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cQ" = (/obj/structure/toilet{tag = "icon-toilet00 (NORTH)"; icon_state = "toilet00"; dir = 1},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted,/obj/effect/decal/cleanable/dirt,/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "Bathrooms APC"},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{tag = "icon-hydrofloor (SOUTHEAST)"; icon_state = "hydrofloor"; dir = 6},/area/ship/scrap/crew/toilets) -"cR" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (EAST)"; icon_state = "conpipe-c"; dir = 4},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"cS" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/ship/scrap/crew/saloon) -"cT" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/cigarette,/turf/simulated/floor{tag = "icon-orange (WEST)"; icon_state = "orange"; dir = 8},/area/ship/scrap/crew/saloon) -"cU" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/saloon) -"cV" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/saloon) -"cW" = (/obj/machinery/light/small,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{pixel_y = -32},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/saloon) -"cX" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/light_switch{pixel_x = 28},/turf/simulated/floor{tag = "icon-orange (EAST)"; icon_state = "orange"; dir = 4},/area/ship/scrap/crew/saloon) -"cY" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"cZ" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{pixel_x = -32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/ship/scrap/crew/dorms) -"da" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor,/area/ship/scrap/crew/dorms) +"cp" = (/obj/machinery/vending/snack,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cq" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/machinery/power/apc{dir = 1; name = "Crew Areas APC"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cr" = (/obj/item/weapon/stool/padded,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cs" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"ct" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cu" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"cv" = (/obj/structure/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off"; icon_state = "off"; dir = 2; layer = 2.4; level = 2},/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"cw" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"cx" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Reception Window"; opacity = 1},/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cy" = (/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Reception Window"; opacity = 1},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cz" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/crew/toilets) +"cB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"cC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cE" = (/obj/item/weapon/stool/padded,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cF" = (/obj/structure/table/standard,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark{name = "Observer-Start"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/item/weapon/material/ashtray/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"cI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/crew/dorms) +"cJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"cK" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"cL" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"cM" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/dorms) +"cN" = (/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted,/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cO" = (/obj/structure/toilet{tag = "icon-toilet00 (NORTH)"; icon_state = "toilet00"; dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cP" = (/obj/structure/toilet{tag = "icon-toilet00 (NORTH)"; icon_state = "toilet00"; dir = 1},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/obj/structure/window/reinforced/tinted{tag = "icon-twindow (EAST)"; icon_state = "twindow"; dir = 4},/obj/structure/window/reinforced/tinted,/obj/effect/decal/cleanable/dirt,/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "Bathrooms APC"},/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/toilets) +"cQ" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (EAST)"; icon_state = "conpipe-c"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"cR" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/ship/scrap/crew/saloon) +"cS" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/vending/cigarette,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cT" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off (EAST)"; icon_state = "off"; dir = 4; layer = 2.4; level = 2},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cU" = (/obj/item/weapon/stool/padded,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cV" = (/obj/machinery/light/small,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{pixel_y = -32},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/light_switch{pixel_x = 28},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/crew/saloon) +"cX" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"cY" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{pixel_x = -32},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"cZ" = (/obj/structure/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"da" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/dorms) "db" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/kitchen) "dc" = (/turf/simulated/wall,/area/ship/scrap/crew/kitchen) -"dd" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/disposalpipe/segment,/obj/structure/closet/walllocker/emerglocker/east,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) +"dd" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/walllocker/emerglocker/east,/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew) "de" = (/turf/simulated/wall,/area/ship/scrap/cargo) -"df" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor,/area/ship/scrap/cargo) -"dg" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor,/area/ship/scrap/crew) -"dh" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable,/obj/machinery/power/apc{name = "Dorms APC"},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor,/area/ship/scrap/crew/dorms) -"di" = (/obj/structure/stool/bed,/obj/structure/closet/walllocker/emerglocker/south,/obj/item/weapon/bedsheet/green,/turf/simulated/floor,/area/ship/scrap/crew/dorms) -"dj" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor,/area/ship/scrap/crew/dorms) -"dk" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/turf/simulated/floor{tag = "icon-bar (SOUTHEAST)"; icon_state = "bar"; dir = 6},/area/ship/scrap/crew/kitchen) -"dl" = (/obj/machinery/processor,/obj/item/device/radio/intercom{pixel_y = 32},/turf/simulated/floor{tag = "icon-bar (SOUTHEAST)"; icon_state = "bar"; dir = 6},/area/ship/scrap/crew/kitchen) -"dm" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/closet/secure_closet/freezer/fridge,/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor{tag = "icon-stage_bleft (SOUTHEAST)"; icon_state = "stage_bleft"; dir = 6},/area/ship/scrap/crew/kitchen) -"dn" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{dir = 4; name = "Crew Deck APC"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor,/area/ship/scrap/crew) -"do" = (/obj/structure/closet/crate,/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"dp" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/device/radio/intercom{pixel_y = 32},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"dq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/cargo) -"dr" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"ds" = (/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/start{name = "Cargo Technician"},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"dt" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"du" = (/turf/simulated/wall,/area/ship/scrap/crew/medbay) -"dv" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/medbay) -"dw" = (/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/engine) -"dx" = (/turf/simulated/floor{tag = "icon-wall_thermite"; icon_state = "wall_thermite"; dir = 2},/area/ship/scrap/maintenance/engine) -"dy" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/kitchen) -"dz" = (/obj/structure/table/standard,/turf/simulated/floor{tag = "icon-bar (SOUTHEAST)"; icon_state = "bar"; dir = 6},/area/ship/scrap/crew/kitchen) -"dA" = (/obj/effect/landmark/start{name = "Chef"},/obj/structure/stool,/turf/simulated/floor{tag = "icon-bar (SOUTHEAST)"; icon_state = "bar"; dir = 6},/area/ship/scrap/crew/kitchen) -"dB" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "Galley APC"},/turf/simulated/floor{tag = "icon-stage_bleft (SOUTHEAST)"; icon_state = "stage_bleft"; dir = 6},/area/ship/scrap/crew/kitchen) -"dC" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/disposalpipe/segment,/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"dD" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"dE" = (/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"dF" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor,/area/ship/scrap/cargo) -"dG" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"dH" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"dI" = (/obj/structure/sign/redcross,/turf/simulated/wall,/area/ship/scrap/crew/medbay) -"dJ" = (/obj/machinery/sleeper,/obj/structure/sign/nosmoking_2{pixel_y = 28},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"dK" = (/obj/machinery/sleep_console,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"dL" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/item/device/radio/intercom{pixel_y = 32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"dM" = (/turf/simulated/floor{tag = "icon-wall_thermite (SOUTHEAST)"; icon_state = "wall_thermite"; dir = 6},/area/ship/scrap/maintenance/engine) -"dN" = (/obj/structure/table/standard,/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{tag = "icon-bar (SOUTHEAST)"; icon_state = "bar"; dir = 6},/area/ship/scrap/crew/kitchen) -"dO" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-bar (SOUTHEAST)"; icon_state = "bar"; dir = 6},/area/ship/scrap/crew/kitchen) -"dP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; level = 2; on = 1},/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (EAST)"; icon_state = "conpipe-c"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{tag = "icon-stage_bleft (SOUTHEAST)"; icon_state = "stage_bleft"; dir = 6},/area/ship/scrap/crew/kitchen) -"dQ" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor,/area/ship/scrap/crew/kitchen) -"dR" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/structure/disposalpipe/junction,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor,/area/ship/scrap/crew) -"dS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor,/area/ship/scrap/cargo) -"dT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/cargo) -"dU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/ship/scrap/cargo) -"dV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/effect/landmark/start{name = "Quartermaster"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/ship/scrap/cargo) -"dW" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/cargo) -"dX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor,/area/ship/scrap/cargo) -"dY" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/ship/scrap/crew) -"dZ" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor,/area/ship/scrap/crew/medbay) -"ea" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"eb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; level = 2; on = 1},/obj/structure/stool,/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"ec" = (/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"ed" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"ee" = (/obj/structure/sign{tag = "icon-radiation"; icon_state = "radiation"},/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/engine) -"ef" = (/obj/item/weapon/storage/pill_bottle/happy,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/ship/scrap/maintenance/engine) -"eg" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/ship/scrap/maintenance/engine) -"eh" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"ei" = (/turf/simulated/floor{tag = "icon-platingdmg1"; icon_state = "platingdmg1"; dir = 2},/area) -"ej" = (/obj/structure/table/standard,/obj/machinery/microwave,/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor{tag = "icon-bar (SOUTHEAST)"; icon_state = "bar"; dir = 6},/area/ship/scrap/crew/kitchen) -"ek" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor{tag = "icon-bar (SOUTHEAST)"; icon_state = "bar"; dir = 6},/area/ship/scrap/crew/kitchen) -"el" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{tag = "icon-pipe-t (NORTH)"; icon_state = "pipe-t"; dir = 1},/obj/machinery/light_switch{pixel_x = 28},/turf/simulated/floor{tag = "icon-stage_bleft (SOUTHEAST)"; icon_state = "stage_bleft"; dir = 6},/area/ship/scrap/crew/kitchen) -"em" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/disposalpipe/segment,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"en" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"eo" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "Cargo Hold APC"},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"ep" = (/obj/structure/table/standard,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/box/syringes,/obj/structure/cable,/obj/machinery/power/apc{name = "Medical Bay APC"},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"eq" = (/obj/structure/table/standard,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/clothing/tie/stethoscope,/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"er" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/medbay) -"es" = (/obj/item/device/radio,/turf/simulated/floor/plating,/area) -"et" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/weapon/coin/gold,/obj/item/weapon/coin/silver,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/ship/scrap/maintenance/engine) -"eu" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/ship/scrap/maintenance/engine) -"ev" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/ship/scrap/maintenance/engine) -"ew" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor/plating/airless,/area/ship/scrap/maintenance/engine) -"ex" = (/obj/item/weapon/screwdriver,/turf/simulated/floor/plating,/area) -"ey" = (/turf/simulated/wall,/area/ship/scrap/crew/wash) -"ez" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"eA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor,/area/ship/scrap/cargo) -"eB" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small,/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) -"eC" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/ship/scrap/crew) -"eD" = (/turf/simulated/wall,/area/ship/scrap/unused2) -"eE" = (/turf/simulated/wall/r_wall,/area/ship/scrap/unused2) -"eF" = (/turf/simulated/wall,/area/ship/scrap/maintenance/engine) -"eG" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/ship/scrap/maintenance/engine) -"eH" = (/turf/simulated/floor{tag = "icon-platingdmg2"; icon_state = "platingdmg2"; dir = 2},/area) -"eI" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/wash) -"eJ" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/ship/scrap/crew/wash) -"eK" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/device/radio/intercom{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6; level = 2},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/ship/scrap/crew/wash) -"eL" = (/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (EAST)"; icon_state = "conpipe-c"; dir = 4},/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/machinery/power/apc{dir = 1; name = "Washroom APC"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/ship/scrap/crew/wash) -"eM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew/wash) -"eN" = (/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/junction,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"eO" = (/turf/simulated/wall,/area/ship/scrap/maintenance/storage) -"eP" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor,/area/ship/scrap/maintenance/storage) -"eQ" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-wall_thermite"; icon_state = "wall_thermite"; dir = 2},/area/ship/scrap/crew) -"eR" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor/plating,/area/ship/scrap/unused2) -"eS" = (/turf/simulated/floor{tag = "icon-platingdmg1"; icon_state = "platingdmg1"; dir = 2},/area/ship/scrap/unused2) -"eT" = (/turf/simulated/floor{tag = "icon-platingdmg3"; icon_state = "platingdmg3"; dir = 2},/area/ship/scrap/unused2) -"eU" = (/turf/simulated/floor/plating,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{tag = "icon-platingdmg2"; icon_state = "platingdmg2"; dir = 2},/area/ship/scrap/unused2) -"eV" = (/turf/simulated/floor/plating,/area) -"eW" = (/obj/structure/shuttle/engine/heater,/obj/effect/decal/cleanable/greenglow,/turf/simulated/floor/plating/airless,/area/ship/scrap/maintenance/engine) -"eX" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) -"eY" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/space,/area) -"eZ" = (/obj/structure/lattice,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) -"fa" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/wash) -"fb" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/ship/scrap/crew/wash) -"fc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pressure_checks = 0},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/ship/scrap/crew/wash) -"fd" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{tag = "icon-pipe-t (NORTH)"; icon_state = "pipe-t"; dir = 1},/obj/machinery/light_switch{pixel_x = 28},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/ship/scrap/crew/wash) -"fe" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{tag = "icon-stage_stairs (SOUTHEAST)"; icon_state = "stage_stairs"; dir = 6},/area/ship/scrap/crew) -"ff" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 7; pixel_y = 4},/obj/item/device/t_scanner,/obj/item/weapon/cell/high,/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor{tag = "icon-orange (WEST)"; icon_state = "orange"; dir = 8},/area/ship/scrap/maintenance/storage) -"fg" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/device/radio/intercom{pixel_y = 32},/obj/machinery/vending/tool,/turf/simulated/floor,/area/ship/scrap/maintenance/storage) -"fh" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-stage_stairs (SOUTHEAST)"; icon_state = "stage_stairs"; dir = 6},/area/ship/scrap/maintenance/storage) -"fi" = (/obj/structure/window/reinforced{dir = 8},/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/structure/table/standard,/turf/simulated/floor,/area/ship/scrap/maintenance/storage) -"fj" = (/obj/structure/table/standard,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/suit/space/rig,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig,/obj/item/clothing/mask/breath,/turf/simulated/floor{tag = "icon-orange (EAST)"; icon_state = "orange"; dir = 4},/area/ship/scrap/maintenance/storage) -"fk" = (/obj/structure/closet/walllocker/emerglocker/west,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-stage_stairs (SOUTHEAST)"; icon_state = "stage_stairs"; dir = 6},/area/ship/scrap/crew) -"fl" = (/obj/effect/decal/cleanable/generic,/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/ship/scrap/unused2) -"fm" = (/turf/simulated/floor/plating,/area/ship/scrap/unused2) -"fn" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/unused2) -"fo" = (/turf/simulated/floor{tag = "icon-platingdmg3"; icon_state = "platingdmg3"; dir = 2},/area) -"fp" = (/obj/machinery/washing_machine,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/ship/scrap/crew/wash) -"fq" = (/obj/structure/table/standard,/obj/machinery/light/small,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/ship/scrap/crew/wash) -"fr" = (/turf/simulated/floor{tag = "icon-wall_thermite"; icon_state = "wall_thermite"; dir = 2},/area/ship/scrap/crew/wash) -"fs" = (/obj/structure/closet/walllocker/emerglocker/east,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"ft" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 5; pixel_y = -7},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/head/welding,/obj/item/device/analyzer,/turf/simulated/floor{tag = "icon-orange (WEST)"; icon_state = "orange"; dir = 8},/area/ship/scrap/maintenance/storage) -"fu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/stool,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/storage) -"fv" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/ship/scrap/maintenance/storage) -"fw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; level = 2; on = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/storage) -"fx" = (/obj/structure/table/standard,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/suit/space/rig,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig,/obj/item/clothing/mask/breath,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{tag = "icon-orange (EAST)"; icon_state = "orange"; dir = 4},/area/ship/scrap/maintenance/storage) -"fy" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/ship/scrap/crew) -"fz" = (/turf/simulated/floor{tag = "icon-wall_thermite"; icon_state = "wall_thermite"; dir = 2},/area/ship/scrap/unused2) -"fA" = (/turf/simulated/wall/r_wall,/area/ship/scrap/unused1) -"fB" = (/turf/simulated/wall,/area/ship/scrap/unused1) -"fC" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/crew) -"fD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/storage) -"fE" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-orange (WEST)"; icon_state = "orange"; dir = 8},/area/ship/scrap/maintenance/storage) -"fF" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/effect/decal/cleanable/dirt,/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Interior Door"; req_access_txt = "0"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1; pressure_checks = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/ship/scrap/maintenance/storage) -"fG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/storage) -"fH" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/door/window/westleft,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/storage) -"fI" = (/turf/simulated/floor{tag = "icon-orange (EAST)"; icon_state = "orange"; dir = 4},/area/ship/scrap/maintenance/storage) -"fJ" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor,/area/ship/scrap/maintenance/storage) -"fK" = (/turf/simulated/floor/plating,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor{tag = "icon-platingdmg2"; icon_state = "platingdmg2"; dir = 2},/area/ship/scrap/crew) -"fL" = (/turf/simulated/wall/r_wall,/area/ship/scrap/unused3) -"fM" = (/turf/simulated/wall,/area/ship/scrap/unused3) -"fN" = (/obj/structure/closet/firecloset/full,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"fO" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"fP" = (/obj/structure/closet/walllocker/emerglocker/east,/obj/structure/reagent_dispensers,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"fQ" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"fR" = (/obj/structure/table/standard,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/storage/box/lights/bulbs,/obj/item/weapon/storage/box/lights/mixed,/obj/structure/cable,/obj/machinery/power/apc{name = "Tools Storage APC"},/turf/simulated/floor{tag = "icon-orange (WEST)"; icon_state = "orange"; dir = 8},/area/ship/scrap/maintenance/storage) -"fS" = (/obj/structure/table/standard,/obj/item/clothing/head/welding,/obj/item/device/radio,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/ship/scrap/maintenance/storage) -"fT" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/storage) -"fU" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/obj/structure/dispenser/oxygen,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/storage) -"fV" = (/obj/machinery/recharge_station,/turf/simulated/floor{tag = "icon-orange (EAST)"; icon_state = "orange"; dir = 4},/area/ship/scrap/maintenance/storage) -"fW" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor/plating,/area/ship/scrap/maintenance) -"fX" = (/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/ship/scrap/unused3) -"fY" = (/turf/simulated/floor/plating,/area/ship/scrap/unused3) -"fZ" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/unused1) -"ga" = (/obj/structure/closet/firecloset/full,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"gb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"gc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8; level = 1},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"gd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8; level = 1},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"ge" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold{dir = 4; icon_state = "manifold"; initialize_directions = 11; level = 2},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gf" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/ship/scrap/maintenance) -"gg" = (/obj/structure/falserwall,/turf/simulated/floor/plating,/area/ship/scrap/unused3) -"gh" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/ship/scrap/unused3) -"gi" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/obj/item/weapon/spacecash/c1000,/turf/simulated/floor/plating,/area/ship/scrap/unused3) -"gj" = (/obj/machinery/power/apc{name = "Fire Closet APC"},/obj/structure/cable,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"gk" = (/obj/structure/reagent_dispensers,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/unused1) -"gl" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gm" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/machinery/light/small,/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c"; icon_state = "conpipe-c"; dir = 2},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gn" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"go" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance) -"gp" = (/obj/machinery/atmospherics/pipe/manifold4w{level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8; icon_state = "bulb1"; pixel_y = 16; tag = "icon-bulb1 (WEST)"},/turf/simulated/floor,/area/ship/scrap/maintenance) -"gq" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/weapon/crowbar,/turf/simulated/floor/plating,/area/ship/scrap/maintenance) -"gr" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor{tag = "icon-wall_thermite"; icon_state = "wall_thermite"; dir = 2},/area/ship/scrap/maintenance) -"gs" = (/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/atmos) -"gt" = (/turf/simulated/wall,/area/ship/scrap/maintenance/atmos) -"gu" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/ship/scrap/maintenance) -"gv" = (/turf/simulated/wall,/area/ship/scrap/maintenance) -"gw" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gx" = (/obj/structure/sign/poster{serial_number = 9},/turf/simulated/wall,/area/ship/scrap/maintenance) -"gy" = (/turf/simulated/wall,/area/ship/scrap/maintenance/power) -"gz" = (/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/power) -"gA" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/atmos) -"gB" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/atmos) -"gC" = (/obj/machinery/pipedispenser,/obj/machinery/light/small{dir = 4},/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/atmos) -"gD" = (/obj/machinery/power/apc{dir = 1; name = "Maintenance APC"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/disposalpipe/segment,/obj/machinery/computer/engines,/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/maintenance) -"gE" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm{pixel_y = 32},/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/maintenance) -"gF" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/toolcloset,/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/maintenance) -"gG" = (/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact"; icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gH" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light_switch{pixel_y = 25},/obj/structure/table/standard,/obj/item/ashtray/plastic,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gI" = (/obj/structure/stool/bed/chair/comfy/brown,/obj/effect/landmark/start{name = "Chief Engineer"},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gJ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gK" = (/obj/machinery/power/port_gen/pacman/super,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Power APC"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"gL" = (/obj/structure/table/standard,/obj/item/device/flashlight,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 7; pixel_y = 4},/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"gM" = (/obj/structure/closet/crate,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/item/stack/sheet/mineral/uranium{amount = 50},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"gN" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/maintenance/atmos) -"gO" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/atmos) -"gP" = (/obj/machinery/atmospherics/pipe/manifold{icon_state = "manifold"; level = 2},/obj/effect/landmark/start{name = "Atmospheric Technician"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/atmos) -"gQ" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/atmos) -"gR" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/atmos) -"gS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/maintenance) -"gT" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/maintenance) -"gU" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2; tag = "icon-intact"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-bot"; icon_state = "bot"; dir = 2},/area/ship/scrap/maintenance) -"gV" = (/obj/structure/cable{tag = "icon-1-10"; icon_state = "1-10"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9; level = 2},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) -"gY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/power) -"gZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"ha" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"hb" = (/obj/structure/cable{tag = "icon-2-8"; icon_state = "2-8"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"hc" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/maintenance/power) -"hd" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/atmos) -"he" = (/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (EAST)"; icon_state = "conpipe-c"; dir = 4},/obj/structure/cable,/obj/machinery/power/apc{name = "Atmospherics APC"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/atmos) -"hf" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/atmos) -"hg" = (/obj/structure/closet/walllocker/emerglocker/west,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (WEST)"; icon_state = "pipe-j1"; dir = 8},/turf/simulated/floor{tag = "icon-warning"; icon_state = "warning"; dir = 2},/area/ship/scrap/maintenance) -"hh" = (/obj/structure/cable{tag = "icon-4-10"; icon_state = "4-10"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/radiation,/turf/simulated/floor{tag = "icon-warning"; icon_state = "warning"; dir = 2},/area/ship/scrap/maintenance) -"hi" = (/obj/structure/cable{tag = "icon-5-8"; icon_state = "5-8"},/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor{tag = "icon-warning"; icon_state = "warning"; dir = 2},/area/ship/scrap/maintenance) -"hj" = (/obj/machinery/light/small,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "off"; layer = 2.4; level = 2; on = 1; tag = "icon-off (NORTH)"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/monitor,/obj/structure/cable,/turf/simulated/floor{tag = "icon-warning"; icon_state = "warning"; dir = 2},/area/ship/scrap/maintenance) -"hk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/computer/station_alert,/turf/simulated/floor/plating,/area/ship/scrap/maintenance) -"hl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/secure_closet/engineering_welding,/turf/simulated/floor/plating,/area/ship/scrap/maintenance) -"hm" = (/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (WEST)"; icon_state = "conpipe-c"; dir = 8},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/ship/scrap/maintenance) -"hn" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -32; tag = "icon-alarm0 (NORTH)"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"ho" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"hp" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) -"hq" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/atmos) -"hr" = (/obj/structure/cable{tag = "icon-5-6"; icon_state = "5-6"},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{tag = "icon-floorgrime (SOUTHEAST)"; icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance/engine) -"hs" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{tag = "icon-pipe-t (NORTH)"; icon_state = "pipe-t"; dir = 1},/turf/space,/area) -"ht" = (/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hu" = (/obj/structure/cable{tag = "icon-4-9"; icon_state = "4-9"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hv" = (/obj/machinery/power/apc{dir = 1; name = "Engine APC"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hw" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hx" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hy" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hz" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/tank/phoron{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hA" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hB" = (/obj/machinery/atmospherics/tvalve{tag = "icon-tvalve0 (WEST)"; icon_state = "tvalve0"; dir = 8},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hC" = (/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{tag = "icon-manifold (WEST)"; icon_state = "manifold"; dir = 8},/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hD" = (/obj/machinery/atmospherics/pipe/tank/oxygen{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hE" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{tag = "icon-freezer_0 (EAST)"; icon_state = "freezer_0"; dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hF" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hG" = (/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hH" = (/obj/machinery/atmospherics/valve/open{tag = "icon-valve1 (EAST)"; icon_state = "valve1"; dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hI" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) -"hJ" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/structure/window/reinforced,/turf/simulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/ship/scrap/maintenance/engine) -"hK" = (/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/ship/scrap/maintenance/engine) -"hL" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers,/obj/structure/window/reinforced,/turf/simulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/ship/scrap/maintenance/engine) -"hM" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/structure/window/reinforced,/turf/simulated/floor{tag = "icon-warnplate"; icon_state = "warnplate"; dir = 2},/area/ship/scrap/maintenance/engine) -"hN" = (/obj/machinery/atmospherics/unary/engine{tag = "icon-nozzle (NORTH)"; icon_state = "nozzle"; dir = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/ship/scrap/maintenance/engine) +"df" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dg" = (/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"dh" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable,/obj/machinery/power/apc{name = "Dorms APC"},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"di" = (/obj/structure/bed,/obj/structure/closet/walllocker/emerglocker/south,/obj/item/weapon/bedsheet/green,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"dj" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/crew/dorms) +"dk" = (/turf/simulated/mineral,/area) +"dl" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"dm" = (/obj/item/device/radio/intercom{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off"; icon_state = "off"; dir = 2; layer = 2.4; level = 2},/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/vending/dinnerware,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"dn" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/closet/secure_closet/freezer/fridge,/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"do" = (/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{dir = 4; name = "Crew Deck APC"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"dp" = (/obj/structure/closet/crate,/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dq" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/device/radio/intercom{pixel_y = 32},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"ds" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dt" = (/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/start{name = "Cargo Technician"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"du" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/ship/scrap/crew) +"dv" = (/turf/simulated/wall,/area/ship/scrap/crew/medbay) +"dw" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/medbay) +"dx" = (/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/engine) +"dy" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/kitchen) +"dz" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/item/weapon/book/manual/chef_recipes,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"dA" = (/obj/effect/landmark/start{name = "Chef"},/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"dB" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "Galley APC"},/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"dC" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/directions/engineering{pixel_x = -32},/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"dD" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dE" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dF" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dG" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dH" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dI" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/directions/engineering{pixel_x = -32},/turf/simulated/floor,/area/ship/scrap/crew) +"dJ" = (/obj/structure/sign/redcross,/turf/simulated/wall,/area/ship/scrap/crew/medbay) +"dK" = (/obj/machinery/sleeper,/obj/structure/sign/nosmoking_2{pixel_y = 28},/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"dL" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off"; icon_state = "off"; dir = 2; layer = 2.4; level = 2},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"dM" = (/obj/structure/bed,/obj/item/weapon/bedsheet/medical,/obj/item/device/radio/intercom{pixel_y = 32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"dN" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/kitchen) +"dO" = (/obj/structure/table/standard,/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/item/weapon/storage/box/donkpockets,/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/material/kitchen/rollingpin,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"dP" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"dQ" = (/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (EAST)"; icon_state = "conpipe-c"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"dR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/crew/kitchen) +"dS" = (/obj/structure/disposalpipe/junction,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"dT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/cargo) +"dU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/landmark/start{name = "Quartermaster"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dX" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"dZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/ship/scrap/crew) +"ea" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/crew/medbay) +"eb" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"ec" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/bed/chair/office/light,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"ed" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/item/roller,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"ee" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"ef" = (/obj/structure/sign{tag = "icon-radiation"; icon_state = "radiation"},/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/engine) +"eg" = (/obj/item/weapon/storage/pill_bottle/happy,/turf/simulated/floor/airless,/area/ship/scrap/maintenance/engine) +"eh" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor/airless,/area/ship/scrap/maintenance/engine) +"ei" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"ej" = (/obj/structure/table/standard,/obj/machinery/microwave,/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"ek" = (/obj/structure/closet/secure_closet/freezer/meat,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"el" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{tag = "icon-pipe-t (NORTH)"; icon_state = "pipe-t"; dir = 1},/obj/machinery/light_switch{pixel_x = 28},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled,/area/ship/scrap/crew/kitchen) +"em" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"en" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/obj/machinery/light_switch{pixel_x = -25},/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"eo" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off (EAST)"; icon_state = "off"; dir = 4; layer = 2.4; level = 2},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"ep" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"eq" = (/obj/structure/closet/crate,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"er" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "Cargo Hold APC"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"es" = (/turf/simulated/floor,/area/ship/scrap/crew) +"et" = (/obj/structure/table/standard,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/box/syringes,/obj/structure/cable,/obj/machinery/power/apc{name = "Medical Bay APC"},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"eu" = (/obj/structure/table/standard,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"ev" = (/obj/structure/table/standard,/obj/item/device/healthanalyzer,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/medbay) +"ew" = (/obj/item/device/radio,/turf/simulated/floor/plating,/area) +"ex" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/weapon/coin/gold,/obj/item/weapon/coin/silver,/turf/simulated/floor/airless,/area/ship/scrap/maintenance/engine) +"ey" = (/turf/simulated/floor/airless,/area/ship/scrap/maintenance/engine) +"ez" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/ship/scrap/maintenance/engine) +"eA" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor/airless,/area/ship/scrap/maintenance/engine) +"eB" = (/obj/item/weapon/screwdriver,/turf/simulated/floor/plating,/area) +"eC" = (/turf/simulated/wall,/area/ship/scrap/crew/wash) +"eD" = (/obj/structure/closet/crate,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"eE" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"eF" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/beige{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/cargo) +"eG" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor,/area/ship/scrap/crew) +"eH" = (/turf/simulated/wall,/area/ship/scrap/unused2) +"eI" = (/turf/simulated/wall/r_wall,/area/ship/scrap/unused2) +"eJ" = (/turf/simulated/wall,/area/ship/scrap/maintenance/engine) +"eK" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/airless,/area/ship/scrap/maintenance/engine) +"eL" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/wash) +"eM" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/wash) +"eN" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/device/radio/intercom{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/wash) +"eO" = (/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (EAST)"; icon_state = "conpipe-c"; dir = 4},/obj/machinery/power/apc{dir = 1; name = "Washroom APC"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/wash) +"eP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/crew/wash) +"eQ" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/junction,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"eR" = (/turf/simulated/wall,/area/ship/scrap/maintenance/storage) +"eS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"eT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/ship/scrap/crew) +"eU" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/ship/scrap/unused2) +"eV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/ship/scrap/unused2) +"eW" = (/obj/machinery/light_switch{pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/ship/scrap/unused2) +"eX" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off (WEST)"; icon_state = "off"; dir = 8; layer = 2.4; level = 2},/turf/simulated/floor,/area/ship/scrap/unused2) +"eY" = (/turf/simulated/floor/plating,/area) +"eZ" = (/obj/structure/shuttle/engine/heater,/obj/effect/decal/cleanable/greenglow,/turf/simulated/floor/airless,/area/ship/scrap/maintenance/engine) +"fa" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) +"fb" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/space,/area) +"fc" = (/obj/structure/lattice,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/space,/area) +"fd" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/crew/wash) +"fe" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/wash) +"ff" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/wash) +"fg" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{tag = "icon-pipe-t (NORTH)"; icon_state = "pipe-t"; dir = 1},/obj/machinery/light_switch{pixel_x = 28},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/wash) +"fh" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/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/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = 32; pixel_z = -4},/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"fi" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 7; pixel_y = 4},/obj/item/device/t_scanner,/obj/item/weapon/cell/high,/obj/machinery/light_switch{pixel_y = 25},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fj" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/device/radio/intercom{pixel_y = 32},/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fl" = (/obj/structure/window/reinforced{dir = 8},/obj/item/stack/rods,/obj/item/stack/rods,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fm" = (/obj/structure/table/standard,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/suit/space/rig,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig,/obj/item/clothing/mask/breath,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fn" = (/obj/structure/closet/walllocker/emerglocker/west,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/ship/scrap/crew) +"fo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/ship/scrap/unused2) +"fp" = (/obj/effect/decal/cleanable/generic,/obj/item/device/flashlight,/turf/simulated/floor,/area/ship/scrap/unused2) +"fq" = (/turf/simulated/floor,/area/ship/scrap/unused2) +"fr" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/unused2) +"fs" = (/obj/machinery/washing_machine,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "off"; layer = 2.4; level = 2; tag = "icon-off (NORTH)"},/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/wash) +"ft" = (/obj/structure/table/standard,/obj/machinery/light/small,/turf/simulated/floor/tiled/freezer,/area/ship/scrap/crew/wash) +"fu" = (/obj/structure/closet/walllocker/emerglocker/east,/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/tiled,/area/ship/scrap/crew) +"fv" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 5; pixel_y = -7},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/head/welding,/obj/item/device/analyzer,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fw" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fy" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off (EAST)"; icon_state = "off"; dir = 4; layer = 2.4; level = 2},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fz" = (/obj/structure/table/standard,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/suit/space/rig,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig,/obj/item/clothing/mask/breath,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fA" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/ship/scrap/crew) +"fB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/ship/scrap/unused2) +"fC" = (/obj/machinery/power/apc{name = "Medical Bay APC"},/turf/simulated/floor,/area/ship/scrap/unused2) +"fD" = (/turf/simulated/wall/r_wall,/area/ship/scrap/unused1) +"fE" = (/turf/simulated/wall,/area/ship/scrap/unused1) +"fF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/crew) +"fG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fI" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/effect/decal/cleanable/dirt,/obj/machinery/door/window/westleft{base_state = "right"; dir = 4; icon_state = "right"; name = "Interior Door"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off (WEST)"; icon_state = "off"; dir = 8; layer = 2.4; level = 2},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fK" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/door/window/westleft,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fL" = (/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fM" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/ship/scrap/crew) +"fO" = (/turf/simulated/wall/r_wall,/area/ship/scrap/unused3) +"fP" = (/turf/simulated/wall,/area/ship/scrap/unused3) +"fQ" = (/obj/structure/closet/firecloset/full,/obj/effect/decal/cleanable/cobweb,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/yellow{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"fR" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"fS" = (/obj/structure/closet/walllocker/emerglocker/east,/obj/structure/reagent_dispensers,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off"; icon_state = "off"; dir = 2; layer = 2.4; level = 2},/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"fT" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"fU" = (/obj/structure/table/standard,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/storage/box/lights/bulbs,/obj/item/weapon/storage/box/lights/mixed,/obj/structure/cable,/obj/machinery/power/apc{name = "Tools Storage APC"},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fV" = (/obj/structure/table/standard,/obj/item/clothing/head/welding,/obj/item/device/radio,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fW" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small,/obj/effect/decal/cleanable/dirt,/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fX" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"fY" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/ship/scrap/maintenance) +"fZ" = (/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/ship/scrap/unused3) +"ga" = (/obj/machinery/light_switch{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/ship/scrap/unused3) +"gb" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/turf/space,/area) +"gc" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/unused1) +"gd" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/yellow{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"ge" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"gf" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"gg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/unused1) +"gh" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/storage) +"gj" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/sign/directions/medical{dir = 1; icon_state = "direction_med"; pixel_x = 30; pixel_z = 4},/turf/simulated/floor,/area/ship/scrap/maintenance) +"gk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall{can_open = 1},/area/ship/scrap/unused3) +"gl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/unused3) +"gm" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/ship/scrap/unused3) +"gn" = (/obj/structure/table/reinforced,/obj/item/device/flashlight/lamp,/obj/item/weapon/spacecash/c1000,/turf/simulated/floor/plating,/area/ship/scrap/unused3) +"go" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/yellow{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"gp" = (/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"gq" = (/obj/machinery/power/apc{name = "Fire Closet APC"},/obj/structure/cable,/obj/structure/dispenser,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled,/area/ship/scrap/unused1) +"gr" = (/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/tiled,/area/ship/scrap/maintenance) +"gs" = (/obj/machinery/light/small,/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c"; icon_state = "conpipe-c"; dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gt" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance) +"gv" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance) +"gx" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance) +"gy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/ship/scrap/maintenance) +"gz" = (/obj/machinery/power/apc{name = "Medical Bay APC"},/obj/structure/cable{tag = "icon-0-6"; icon_state = "0-6"},/turf/simulated/floor/plating,/area/ship/scrap/unused3) +"gA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "off"; layer = 2.4; level = 2; tag = "icon-off (NORTH)"},/turf/simulated/floor/plating,/area/ship/scrap/unused3) +"gB" = (/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/atmos) +"gC" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"gD" = (/turf/simulated/wall,/area/ship/scrap/maintenance/atmos) +"gE" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/ship/scrap/maintenance) +"gF" = (/turf/simulated/wall,/area/ship/scrap/maintenance) +"gG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gH" = (/turf/simulated/wall,/area/ship/scrap/maintenance/power) +"gI" = (/obj/structure/cable{tag = "icon-2-9"; icon_state = "2-9"},/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/power) +"gJ" = (/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/power) +"gK" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"gL" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 200},/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/structure/fireaxecabinet{pixel_y = 32},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"gM" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"gN" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/power/apc{dir = 1; name = "Engine APC"},/obj/effect/floor_decal/corner/blue{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"gO" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (SOUTHWEST)"; icon_state = "intact-scrubbers"; dir = 10},/obj/machinery/meter,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"gP" = (/obj/machinery/power/apc{dir = 1; name = "Maintenance APC"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/disposalpipe/segment,/obj/machinery/computer/engines,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gQ" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/alarm{pixel_y = 32},/obj/structure/closet/secure_closet/engineering_electrical,/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gR" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/toolcloset,/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gS" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gT" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light_switch{pixel_y = 25},/obj/structure/table/standard,/obj/item/weapon/material/ashtray/plastic,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gU" = (/obj/structure/bed/chair/comfy/brown,/obj/effect/landmark/start{name = "Chief Engineer"},/obj/structure/sign/poster{pixel_y = 32},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gV" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"gW" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Power APC"},/obj/machinery/atmospherics/unary/vent_pump{tag = "icon-off"; icon_state = "off"; dir = 2; layer = 2.4; level = 2},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"gX" = (/obj/structure/table/standard,/obj/item/device/flashlight,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 7; pixel_y = 4},/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"gY" = (/obj/structure/closet/crate,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/item/stack/material/uranium{amount = 50},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable{tag = "icon-1-10"; icon_state = "1-10"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"gZ" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"ha" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/obj/machinery/meter/turf,/turf/simulated/floor/reinforced/oxygen,/area/ship/scrap/maintenance/atmos) +"hb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/blue/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/simulated/floor/reinforced/oxygen,/area/ship/scrap/maintenance/atmos) +"hc" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/corner/blue{dir = 9},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hd" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{tag = "icon-intact-supply (SOUTHEAST)"; icon_state = "intact-supply"; dir = 6},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (NORTHEAST)"; icon_state = "intact-scrubbers"; dir = 5},/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"he" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/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; tag = ""},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hf" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable{tag = "icon-4-10"; icon_state = "4-10"},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hh" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hi" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/item/weapon/stool/padded,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/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/tiled,/area/ship/scrap/maintenance/power) +"hm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"hn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{tag = "icon-5-8"; icon_state = "5-8"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"ho" = (/obj/structure/cable{tag = "icon-2-8"; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/power/sensor{long_range = 1; name_tag = "Main Grid"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"hp" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/maintenance/power) +"hq" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 6},/obj/structure/closet/walllocker/emerglocker/west,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hr" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/effect/floor_decal/corner/blue{dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hs" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/outlet_injector{tag = "icon-map_injector (WEST)"; icon_state = "map_injector"; dir = 8; use_power = 1; frequency = 1441; id = "n2_in"},/turf/simulated/floor/reinforced/oxygen,/area/ship/scrap/maintenance/atmos) +"ht" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{tag = "icon-map_vent_in (EAST)"; icon_state = "map_vent_in"; dir = 4; use_power = 1; id_tag = "air_out"; pump_direction = 0; external_pressure_bound = 0; internal_pressure_bound = 2000; pressure_checks = 2; external_pressure_bound_default = 0; internal_pressure_bound_default = 2000; pressure_checks_default = 2; frequency = 1443},/turf/simulated/floor/reinforced/oxygen,/area/ship/scrap/maintenance/atmos) +"hu" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/obj/effect/floor_decal/corner/blue{dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hv" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hw" = (/obj/structure/closet/walllocker/emerglocker/west,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{tag = "icon-2-5"; icon_state = "2-5"},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/radiation,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; icon_state = "off"; layer = 2.4; level = 2; tag = "icon-off (NORTH)"},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hy" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/computer/atmos_alert,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hz" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/obj/structure/table/standard,/obj/machinery/button/remote/blast_door{id = "engwindow"; name = "Engine Observation"; pixel_x = 6},/obj/machinery/button/ignition{id = "engine"; pixel_x = -5},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/computer/station_alert,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/obj/machinery/light/small,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/secure_closet/engineering_welding,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hC" = (/obj/structure/disposalpipe/segment{tag = "icon-conpipe-c (WEST)"; icon_state = "conpipe-c"; dir = 8},/obj/structure/reagent_dispensers/fueltank,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance) +"hD" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -32; tag = "icon-alarm0 (NORTH)"},/obj/machinery/light/small{dir = 8},/obj/machinery/power/port_gen/pacman/super,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"hE" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"hF" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/power) +"hG" = (/turf/space,/area/ship/scrap/maintenance/atmos) +"hH" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/maintenance/atmos) +"hI" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hJ" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/reinforced/airmix,/area/ship/scrap/maintenance/atmos) +"hL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/airmix,/area/ship/scrap/maintenance/atmos) +"hM" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hN" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Ports"},/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/item/device/radio/intercom{dir = 8; pixel_x = 22},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hO" = (/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"hP" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "engwindow"; name = "blast door"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/maintenance/engine) +"hQ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; 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/airless,/area/ship/scrap/maintenance/atmos) +"hR" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/maintenance/atmos) +"hS" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 0; tag_south = 5; tag_west = 1; use_power = 1},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hT" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hU" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/white/diagonal,/obj/machinery/meter/turf,/turf/simulated/floor/reinforced/airmix,/area/ship/scrap/maintenance/atmos) +"hV" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/obj/effect/floor_decal/corner/white/diagonal,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/reinforced/airmix,/area/ship/scrap/maintenance/atmos) +"hW" = (/obj/machinery/atmospherics/omni/mixer{active_power_usage = 7500; tag_east = 1; tag_east_con = 0.79; tag_north = 1; tag_north_con = 0.21; tag_south = 2; tag_west = 0; use_power = 1},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hX" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/meter,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"hY" = (/obj/structure/closet/walllocker/emerglocker/west,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"hZ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Engine APC"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"ia" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"ib" = (/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"ic" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"id" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"ie" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"if" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"ig" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"ih" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/maintenance/atmos) +"ii" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHEAST)"; icon_state = "corner_white"; dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"ij" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/reinforced/airmix,/area/ship/scrap/maintenance/atmos) +"ik" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{tag = "icon-map_vent_in (EAST)"; icon_state = "map_vent_in"; dir = 4; use_power = 1; id_tag = "air_out"; pump_direction = 0; external_pressure_bound = 0; internal_pressure_bound = 2000; pressure_checks = 2; external_pressure_bound_default = 0; internal_pressure_bound_default = 2000; pressure_checks_default = 2; frequency = 1443},/turf/simulated/floor/reinforced/airmix,/area/ship/scrap/maintenance/atmos) +"il" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"im" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/blue{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"in" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"io" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/obj/machinery/meter,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"ip" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"iq" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"ir" = (/obj/machinery/atmospherics/omni/mixer{tag_north = 1; tag_north_con = 0.34; tag_south = 2; tag_west = 1; tag_west_con = 0.64},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"is" = (/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"it" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"iu" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"iv" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/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,/turf/simulated/floor/tiled{icon_state = "white"},/area/ship/scrap/maintenance/engine) +"iw" = (/obj/structure/grille,/turf/space,/area) +"ix" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/machinery/light/small,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"iy" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (WEST)"; icon_state = "intact"; dir = 8},/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"iz" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/outlet_injector{tag = "icon-map_injector (WEST)"; icon_state = "map_injector"; dir = 8; use_power = 1; frequency = 1441; id = "n2_in"},/turf/simulated/floor/reinforced/nitrogen,/area/ship/scrap/maintenance/atmos) +"iA" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{tag = "icon-map_vent_in (EAST)"; icon_state = "map_vent_in"; dir = 4; use_power = 1; id_tag = "air_out"; pump_direction = 0; external_pressure_bound = 0; internal_pressure_bound = 2000; pressure_checks = 2; external_pressure_bound_default = 0; internal_pressure_bound_default = 2000; pressure_checks_default = 2; frequency = 1443},/turf/simulated/floor/reinforced/nitrogen,/area/ship/scrap/maintenance/atmos) +"iB" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"iC" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"iD" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"iE" = (/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/turf/simulated/floor/reinforced/oxygen,/area/ship/scrap/maintenance/engine) +"iF" = (/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/obj/machinery/meter/turf,/turf/simulated/floor/reinforced/phoron,/area/ship/scrap/maintenance/engine) +"iG" = (/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction,/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; icon_state = "map_injector"; tag = "null"; use_power = 1},/turf/simulated/floor/reinforced/phoron,/area/ship/scrap/maintenance/engine) +"iH" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"iI" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"iJ" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"iK" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -24; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"iL" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"iM" = (/obj/machinery/light/small{dir = 4},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"iN" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"iO" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/meter/turf,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/reinforced/nitrogen,/area/ship/scrap/maintenance/atmos) +"iP" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/red/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor/reinforced/nitrogen,/area/ship/scrap/maintenance/atmos) +"iQ" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"iR" = (/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"iS" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"iT" = (/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/reinforced/oxygen,/area/ship/scrap/maintenance/engine) +"iU" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/machinery/igniter{id = "engine"},/turf/simulated/floor/reinforced/phoron,/area/ship/scrap/maintenance/engine) +"iV" = (/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/simulated/floor/reinforced/phoron,/area/ship/scrap/maintenance/engine) +"iW" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/item/device/radio/intercom{dir = 8; pixel_x = 22},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"iX" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/engine) +"iY" = (/obj/effect/floor_decal/corner/red{dir = 4},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"iZ" = (/obj/machinery/light/small,/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"ja" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"jb" = (/obj/effect/floor_decal/corner/red{dir = 1},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"jc" = (/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced,/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/reinforced/oxygen,/area/ship/scrap/maintenance/engine) +"jd" = (/obj/structure/window/phoronreinforced,/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/reinforced/phoron,/area/ship/scrap/maintenance/engine) +"je" = (/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/engine{dir = 4; external_pressure_bound = 4000; external_pressure_bound_default = 4000; icon_state = "map_vent"; pump_direction = 0; tag = "null"; use_power = 1},/turf/simulated/floor/reinforced/phoron,/area/ship/scrap/maintenance/engine) +"jf" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"jg" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 0; tag_south = 5; tag_west = 1; use_power = 1},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"jh" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"ji" = (/obj/structure/grille/broken,/obj/structure/lattice,/turf/space,/area) +"jj" = (/obj/structure/table/standard,/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,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"jk" = (/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{dir = 8},/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"jl" = (/obj/machinery/pipedispenser,/obj/effect/floor_decal/corner/yellow{tag = "icon-corner_white (EAST)"; icon_state = "corner_white"; dir = 4},/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/yellow{dir = 8},/turf/simulated/floor/tiled,/area/ship/scrap/maintenance/atmos) +"jm" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"jn" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"jo" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"jp" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/ship/scrap/maintenance/engine) +"jq" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/ship/scrap/maintenance/engine) +"jr" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/turf/simulated/floor,/area/ship/scrap/maintenance/engine) +"js" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor,/area/ship/scrap/maintenance/engine) +"jt" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/turf/simulated/floor,/area/ship/scrap/maintenance/engine) +"ju" = (/obj/machinery/atmospherics/unary/engine{tag = "icon-nozzle (NORTH)"; icon_state = "nozzle"; dir = 1},/turf/simulated/floor,/area/ship/scrap/maintenance/engine) +"jv" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/turf/simulated/floor,/area) +"jw" = (/turf/simulated/floor,/area) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -414,54 +501,54 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacadacaeafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacagahaiacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaacakalamacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacanaoanacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapapaqapaparasasatasasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapauavawapaxasayazaAasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaCavaDaEaFaGaHaIaJataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapaKavaLapaMasaNaOaPasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapapaBapapaQasasatasasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaRaRaSaRaRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaUaUaVaaaaaaaRaWaWaRaXaYaZaRaWaWaRaaaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbcbdbbbebebfbgbhbibjbkblbmbjbnbiaWbebebebabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabobpbpbqbrbsbtbubvbwaRbxbybzaRbAbBbCbtbsbrbabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbcbcbbbDbDbEaWbFbGaRaRbHaRaRbIbJbgbKbDbDbabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLbMbMbNaaaabOaRbPaRaRbQbRbSaRaRbPaRbOaaaababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTbUbUbTaaaabObVbWbXaabVbYbXaabVbWbXbObObObabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObZcacbcacacccdcdcdcecdcdcdcfcgchcicjcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacadaeadafagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaiajakahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaahamanaoahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapaqaraqapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasasatasasauavavawavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaxayazasaAavaBaCaDavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaataEayaFaGaHaIaJaKaLawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaMayaNasaOavaPaQaRavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasasatasasaSavavawavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaTaUaTaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVaWaWaXaaaaaaaTaYaZaTbabbbcaTaYaZaTaaaaaabdbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabebfbgbebhbhbibjbkblbmbnbobnbmbpbqbrbhbhbhbdbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbtbtbubvbwbxbybzbAaTbBbCbDaTbEbzbybxbwbvbdbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabebfbfbebFbFbGbrbHbIaTaTbJaTaTbKbzbjbLbFbFbdbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMbNbNbOaaaabPaTbQaTaTbRbSbTaTaTbQaTbPaaaabdbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbVbVbUaaaabPbWbXbYaabWbSbYaabWbXbYbPbPbPbdbdbdbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbZcacbcacacccdcdcdcecdcdcdcfcgchcicjcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZckclcmbZcncocpcqcrcsctcocncjcucvcwcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxcyczcAcBcCcDcEcFcGcHcIcDcJcKcLcMcNciaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacOcPcQbZcRcScTcUcVcWcXcocYcgcZdacNciaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbdcdcdcdcdddedededfdedededgcjdhdidjcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbdkdldmdcdndedodpdqdrdsdedtdududvdudvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwdxbObOdydzdAdBdcdCdedDdEdFdEdGdedHdIdJdKdLdvbObOdxdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadMdwdwdwbOdydNdOdPdQdRdSdTdUdVdWdXdSdYdZeaebecedbOdwdwdwdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeefegeheidcejekeldcemdeendrdqdoeodedtduepeqerdveseheteueeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwevewdwexeyeyeyeyeyemdeezdreAeBdEdeeCeDeDeEeDeEeieFevevdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadweGeGdweHeIeJeKeLeMeNeOeOeOePeOeOeOeQeReSeTeUeEeVdMeGeWdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXeYeYeZeVfafbfcfdeyfeeOfffgfhfifjeOfkeDeTflfmfnfoeZeYeYeXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOeyfbfpfqfrfseOftfufvfwfxeOfyeDfmfzeTeDbOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOfAfBfBfAfAfCfDfEfFfGfHfIfJfKfLfMfMfMfLbOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafAfNfOfPfAfQeOfRfSfTfUfVeOfWfLfXfYfXfLbOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZgagbgcgdgeeOeOeOePeOeOeOgfggfYghgifLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafAgagjgkfAglgmgngogpgogogqgrfLfYfYfXfLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafAgsgsgsgsgtgugvgvgwgvgxgvgygzgzgzgzfLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagsgAgBgCgtgDgEgFgGgHgIgJgygKgLgMgzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNgOgPgQgRgSgTgUgVgWgWgXgYgZhahbhcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagshdhdhehfhghhhihjhkhlhmgzhnhohpgzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagsgsgNhqdwhrdwdwdwdwdwdweFgzhcgzgzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahseFhthuhvhwhxhyhzeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeFhthththAhBhChDeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeFeFhEhFhGhHhIeFeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeFhJhKhLhKhMeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxhNhNhNhNhNdwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaeXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaeXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbcxcyczcAcBcCcDcEcFcEcGcCcHcIcJcKcLcMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacNcOcPbZcQcRcScTcUcVcWcocXcgcYcZcLdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbdcdcdcdcdddedededfdedededgcjdhdidjcgaaaaaadkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdkaaaaaadbdldmdndcdodedpdqdrdsdtdedudvdvdwdvdwaaaadkdkdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdkdxdxbPbPdydzdAdBdcdCdedDdEdFdGdHdedIdJdKdLdMdwbPbPdxdxdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdxdxdxdxbPdNdOdPdQdRdSdTdUdVdWdXdYdTdZeaebecedeebPdxdxdxdxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefegeheiaadcejekeldcemdeeneoepeqerdeesdveteuevdweweiexeyefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxezeAdxeBeCeCeCeCeCemdeeDdsdreEeFdeeGeHeHeIeHeIbPeJezezdxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadxeKeKdxaaeLeMeNeOePeQeReReReSeReReReTeUeVeWeXeIeYeJeKeZdxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafbfbfceYfdfefffgeCfheRfifjfkflfmeRfneHfofpfqfrbPfcfbfbfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbPeCfefsfteCfueRfvfwfxfyfzeRfAeHfBfCfqeHbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPfDfEfEfDfDfFfGfHfIfJfKfLfMfNfOfPfPfPfObPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafDfQfRfSfDfTeRfUfVfkfWfXeRfYfOfZgafZfObPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagbgcgdgegfgggheReReRgieReReRgjgkglgmgnfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafDgogpgqfEgrgsgtgugvgwgwgxgyfOgzgAfZfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagBgBgBgCgDgDgDgEgFgFgGgFgFgFgHgHgHgIgJfOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPgBgKgLgMgNgOgDgPgQgRgSgTgUgVgHgWgXgYgJbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPgBgBgZhahbhchdhehfhghhhihjhjhkhlhmhnhohpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPgBhqhrhshthuhvgBhwhxhyhzhAhBhCgJhDhEhFgJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahGhHhIhJhKhLhMhNgBhOdxdxhPdxdxdxeJgJgJgJgJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQhRhShThUhVhWhXgDhYhZiaibicidieeJififigdxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahGihhIiiijikilimgBibinioipibiqireiisitiuivaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiwbPgBixiyiziAiBiCgBiDiEiFiGiHiIiJeJiKiLiMdxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiwaagBgBiNiOiPiQiRgBiSiTiUiVibibiWeJififiXdxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiwbPbPgBiYiZjajbiRgDibjcjdjejfjgjheJdxivdxdxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajiaaaagBgBgBjjjkjlgBibjmiojnibjoibdxbPbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiwbPaagBgBgBgBdxjpjqjrjsjsjtibdxbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiwjiaabPaabPbPdxdxjujujujujudxdxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiwjiiwaaaajvjwjwjwjwjwjvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/overmap/example_sector2.dmm b/maps/overmap/example_sector2.dmm index 24f46b33bfc..f14465337cb 100644 --- a/maps/overmap/example_sector2.dmm +++ b/maps/overmap/example_sector2.dmm @@ -1,15 +1,15 @@ "aa" = (/turf/space,/area) -"ab" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"},/area/shuttle/overmap_examples/outpost) +"ab" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s"; dir = 14},/area/shuttle/overmap_examples/outpost) "ac" = (/obj/structure/shuttle/window{tag = "icon-3"; icon_state = "3"},/turf/simulated/shuttle/floor,/area/shuttle/overmap_examples/outpost) -"ad" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"},/area/shuttle/overmap_examples/outpost) -"ae" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/overmap_examples/outpost) +"ad" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s"; dir = 2},/area/shuttle/overmap_examples/outpost) +"ae" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall_straight"; dir = 1},/area/shuttle/overmap_examples/outpost) "af" = (/obj/machinery/computer/shuttle_control/explore{landing_type = /area/shuttle/overmap_examples/outpost},/turf/simulated/shuttle/floor,/area/shuttle/overmap_examples/outpost) "ag" = (/obj/effect/mapinfo/sector{icon = 'icons/obj/mining.dmi'; icon_state = "ore2"; landing_area = /area/shuttle/escape_pod2/centcom; name = "Abandoned Outpost"},/turf/space,/area) "ah" = (/turf/simulated/shuttle/floor,/area/shuttle/overmap_examples/outpost) "ai" = (/turf/space,/area/shuttle/escape_pod2/centcom) -"aj" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"},/area/shuttle/overmap_examples/outpost) +"aj" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s"; dir = 1},/area/shuttle/overmap_examples/outpost) "ak" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/overmap_examples/outpost) -"al" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"},/area/shuttle/overmap_examples/outpost) +"al" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s"; dir = 8},/area/shuttle/overmap_examples/outpost) "am" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/mine/abandoned) "an" = (/turf/simulated/floor,/area/mine/abandoned) "ao" = (/obj/structure/lattice,/turf/space,/area) diff --git a/nano/css/shared.css b/nano/css/shared.css index d1cea420b5d..816088a6856 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -555,6 +555,12 @@ th.sci { color: #ffffff; } +th.car { + background: #bb9040; + font-weight: bold; + color: #ffffff; +} + th.civ { background: #a32800; font-weight: bold; diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png index ea35b7f06d1..7bf42b163bd 100644 Binary files a/nano/images/nanomap_z1.png and b/nano/images/nanomap_z1.png differ diff --git a/nano/images/status_icons/alarm_green.gif b/nano/images/status_icons/alarm_green.gif new file mode 100644 index 00000000000..7c2570c8ce3 Binary files /dev/null and b/nano/images/status_icons/alarm_green.gif differ diff --git a/nano/images/status_icons/alarm_red.gif b/nano/images/status_icons/alarm_red.gif new file mode 100644 index 00000000000..327d58e4db8 Binary files /dev/null and b/nano/images/status_icons/alarm_red.gif differ diff --git a/nano/images/status_icons/batt_100.gif b/nano/images/status_icons/batt_100.gif new file mode 100644 index 00000000000..ccdbd4333e9 Binary files /dev/null and b/nano/images/status_icons/batt_100.gif differ diff --git a/nano/images/status_icons/batt_20.gif b/nano/images/status_icons/batt_20.gif new file mode 100644 index 00000000000..1d5e38fc888 Binary files /dev/null and b/nano/images/status_icons/batt_20.gif differ diff --git a/nano/images/status_icons/batt_40.gif b/nano/images/status_icons/batt_40.gif new file mode 100644 index 00000000000..d5cedb99675 Binary files /dev/null and b/nano/images/status_icons/batt_40.gif differ diff --git a/nano/images/status_icons/batt_5.gif b/nano/images/status_icons/batt_5.gif new file mode 100644 index 00000000000..ceac8f3a945 Binary files /dev/null and b/nano/images/status_icons/batt_5.gif differ diff --git a/nano/images/status_icons/batt_60.gif b/nano/images/status_icons/batt_60.gif new file mode 100644 index 00000000000..d39534c8cb0 Binary files /dev/null and b/nano/images/status_icons/batt_60.gif differ diff --git a/nano/images/status_icons/batt_80.gif b/nano/images/status_icons/batt_80.gif new file mode 100644 index 00000000000..9c299773f01 Binary files /dev/null and b/nano/images/status_icons/batt_80.gif differ diff --git a/nano/images/status_icons/charging.gif b/nano/images/status_icons/charging.gif new file mode 100644 index 00000000000..cf19ca72876 Binary files /dev/null and b/nano/images/status_icons/charging.gif differ diff --git a/nano/images/status_icons/downloader_finished.gif b/nano/images/status_icons/downloader_finished.gif new file mode 100644 index 00000000000..f01b7c42af8 Binary files /dev/null and b/nano/images/status_icons/downloader_finished.gif differ diff --git a/nano/images/status_icons/downloader_running.gif b/nano/images/status_icons/downloader_running.gif new file mode 100644 index 00000000000..68fb977c86d Binary files /dev/null and b/nano/images/status_icons/downloader_running.gif differ diff --git a/nano/images/status_icons/ntnrc_idle.gif b/nano/images/status_icons/ntnrc_idle.gif new file mode 100644 index 00000000000..d47c01d5800 Binary files /dev/null and b/nano/images/status_icons/ntnrc_idle.gif differ diff --git a/nano/images/status_icons/ntnrc_new.gif b/nano/images/status_icons/ntnrc_new.gif new file mode 100644 index 00000000000..af72a8b332f Binary files /dev/null and b/nano/images/status_icons/ntnrc_new.gif differ diff --git a/nano/images/status_icons/power_norm.gif b/nano/images/status_icons/power_norm.gif new file mode 100644 index 00000000000..2b8d60edfa5 Binary files /dev/null and b/nano/images/status_icons/power_norm.gif differ diff --git a/nano/images/status_icons/power_warn.gif b/nano/images/status_icons/power_warn.gif new file mode 100644 index 00000000000..0c85b3a85a1 Binary files /dev/null and b/nano/images/status_icons/power_warn.gif differ diff --git a/nano/images/status_icons/sig_high.gif b/nano/images/status_icons/sig_high.gif new file mode 100644 index 00000000000..efb20f67306 Binary files /dev/null and b/nano/images/status_icons/sig_high.gif differ diff --git a/nano/images/status_icons/sig_lan.gif b/nano/images/status_icons/sig_lan.gif new file mode 100644 index 00000000000..07ba929f7f3 Binary files /dev/null and b/nano/images/status_icons/sig_lan.gif differ diff --git a/nano/images/status_icons/sig_low.gif b/nano/images/status_icons/sig_low.gif new file mode 100644 index 00000000000..08f98baea8e Binary files /dev/null and b/nano/images/status_icons/sig_low.gif differ diff --git a/nano/images/status_icons/sig_none.gif b/nano/images/status_icons/sig_none.gif new file mode 100644 index 00000000000..79840d8a2bd Binary files /dev/null and b/nano/images/status_icons/sig_none.gif differ diff --git a/nano/templates/agent_id_card.tmpl b/nano/templates/agent_id_card.tmpl new file mode 100644 index 00000000000..7a41dcdf1b7 --- /dev/null +++ b/nano/templates/agent_id_card.tmpl @@ -0,0 +1,21 @@ + +{{:helper.syndicateMode()}} +

      Available Entries

      + +{{for data.entries}} + + + +{{/for}} +
      {{:helper.link('', 'gear', {'set' : value.name})}}{{:value.name}}{{:value.value}}
      + + + + + + + +
      Electronic warfare:{{:helper.link('Enabled', null, {'electronic_warfare' : 1}, data.electronic_warfare ? 'selected' : null)}}{{:helper.link('Disabled',null, {'electronic_warfare' : 0}, data.electronic_warfare ? null : 'selected')}}
      diff --git a/nano/templates/alarm_monitor.tmpl b/nano/templates/alarm_monitor.tmpl index 2591763fc04..f39f248f0d9 100644 --- a/nano/templates/alarm_monitor.tmpl +++ b/nano/templates/alarm_monitor.tmpl @@ -3,7 +3,6 @@ Title: Alarm Monitor Console (Main content) Used In File(s): \code\modules\nano\modules\alarm_monitor.dm "MD5 checks should be good enough" --> - {{for data.categories}}

      {{:value.category}}

      {{for value.alarms :alarmValue:alarmIndex}} diff --git a/nano/templates/apc.tmpl b/nano/templates/apc.tmpl index be630c6f041..2adb13e93b3 100644 --- a/nano/templates/apc.tmpl +++ b/nano/templates/apc.tmpl @@ -1,3 +1,11 @@ +{{if data.failTime}} +
      +

      SYSTEM FAILURE

      + I/O regulators malfunction detected! Waiting for system reboot...
      + Automatic reboot in {{:data.failTime}} seconds... + {{:helper.link('Reboot Now', 'refresh', {'reboot' : 1})}}


      +
      +{{else}}
      {{if data.siliconUser}}
      @@ -185,4 +193,4 @@ {{/if}}
      - \ No newline at end of file +{{/if}} \ No newline at end of file diff --git a/nano/templates/computer_fabricator.tmpl b/nano/templates/computer_fabricator.tmpl new file mode 100644 index 00000000000..fcc5cef147c --- /dev/null +++ b/nano/templates/computer_fabricator.tmpl @@ -0,0 +1,70 @@ +{{:helper.link('Clear Order', 'circle', { "clean_order" : 1 })}}

      +Your new computer device you always dreamed of is just four steps away...
      +{{if data.state == 0}} +
      +

      Step 1: Select your device type

      + {{:helper.link('Laptop', 'calc', { "pick_device" : 1 })}} + {{:helper.link('Tablet', 'calc', { "pick_device" : 2 })}} +
      +{{else data.state == 1}} +
      +

      Step 2: Personalise your device

      + + + + + + + + + + +
      Current Price: + {{:data.totalprice}} +
      Battery: + {{:helper.link('Standard', null, { "hw_battery" : 1 }, data.hw_battery == 1 ? 'selected' : null)}} + {{:helper.link('Upgraded', null, { "hw_battery" : 2 }, data.hw_battery == 2 ? 'selected' : null)}} + {{:helper.link('Advanced', null, { "hw_battery" : 3 }, data.hw_battery == 3 ? 'selected' : null)}} +
      Hard Drive: + {{:helper.link('Standard', null, { "hw_disk" : 1 }, data.hw_disk == 1 ? 'selected' : null)}} + {{:helper.link('Upgraded', null, { "hw_disk" : 2 }, data.hw_disk == 2 ? 'selected' : null)}} + {{:helper.link('Advanced', null, { "hw_disk" : 3 }, data.hw_disk == 3 ? 'selected' : null)}} +
      Network Card: + {{:helper.link('None', null, { "hw_netcard" : 0 }, data.hw_netcard == 0 ? 'selected' : null)}} + {{:helper.link('Standard', null, { "hw_netcard" : 1 }, data.hw_netcard == 1 ? 'selected' : null)}} + {{:helper.link('Advanced', null, { "hw_netcard" : 2 }, data.hw_netcard == 2 ? 'selected' : null)}} + {{if data.devtype != 2}} +
      Processor Unit: + {{:helper.link('Standard', null, { "hw_cpu" : 1 }, data.hw_cpu == 1 ? 'selected' : null)}} + {{:helper.link('Advanced', null, { "hw_cpu" : 2 }, data.hw_cpu == 2 ? 'selected' : null)}} +
      Tesla Relay: + {{:helper.link('None', null, { "hw_tesla" : 0 }, data.hw_tesla == 0 ? 'selected' : null)}} + {{:helper.link('Standard', null, { "hw_tesla" : 1 }, data.hw_tesla == 1 ? 'selected' : null)}} + {{/if}} +
      Nano Printer: + {{:helper.link('None', null, { "hw_nanoprint" : 0 }, data.hw_nanoprint == 0 ? 'selected' : null)}} + {{:helper.link('Standard', null, { "hw_nanoprint" : 1 }, data.hw_nanoprint == 1 ? 'selected' : null)}} +
      Card Reader: + {{:helper.link('None', null, { "hw_card" : 0 }, data.hw_card == 0 ? 'selected' : null)}} + {{:helper.link('Standard', null, { "hw_card" : 1 }, data.hw_card == 1 ? 'selected' : null)}} +
      Confirm Order: + {{:helper.link('CONFIRM', null, { "confirm_order" : 1 })}} +
      +
      + Battery allows your device to operate without external utility power source. Advanced batteries increase battery life.
      + Hard Drive stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.
      + Network Card allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.
      + Processor Unit is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.
      + Tesla Relay is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.
      + Nano Printer is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.
      + Card Reader adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards. +
      +{{else data.state == 2}} +

      Step 3: Payment

      + Your device is now ready for fabrication..
      + Please swipe your identification card to finish purchase.
      + Total price: {{:data.totalprice}} +{{else data.state == 3}} +

      Step 4: Thank you for your purchase

      + Should you experience any issues with your new device, contact technical support at support@computerservice.nt +{{/if}} \ No newline at end of file diff --git a/nano/templates/file_manager.tmpl b/nano/templates/file_manager.tmpl new file mode 100644 index 00000000000..a8bb22b208f --- /dev/null +++ b/nano/templates/file_manager.tmpl @@ -0,0 +1,58 @@ +{{if data.error}} +

      An error has occured and this program can not continue.

      + Additional information: {{:data.error}}
      + Please try again. If the problem persists contact your system administrator for assistance. + {{:helper.link('Restart program', null, { "PRG_closefile" : 1 })}} +{{else}} + {{if data.filename}} +

      Viewing file {{:data.filename}}

      +
      + {{:helper.link('CLOSE', null, { "PRG_closefile" : 1 })}} + {{:helper.link('EDIT', null, { "PRG_edit" : 1 })}} + {{:helper.link('PRINT', null, { "PRG_printfile" : 1 })}} +

      + {{:data.filedata}} + {{else}} +

      Available files (local):

      + +
      File name + File type + File size (GQ) + Operations + {{for data.files}} +
      {{:value.name}} + .{{:value.type}} + {{:value.size}}GQ + + {{:helper.link('VIEW', null, { "PRG_openfile" : value.name })}} + {{:helper.link('DELETE', null, { "PRG_deletefile" : value.name }, value.undeletable ? 'disabled' : null)}} + {{:helper.link('RENAME', null, { "PRG_rename" : value.name }, value.undeletable ? 'disabled' : null)}} + {{:helper.link('CLONE', null, { "PRG_clone" : value.name }, value.undeletable ? 'disabled' : null)}} + {{if data.usbconnected}} + {{:helper.link('EXPORT', null, { "PRG_copytousb" : value.name }, value.undeletable ? 'disabled' : null)}} + {{/if}} + {{/for}} +
      + {{if data.usbconnected}} +

      Available files (portable device):

      + +
      File name + File type + File size (GQ) + Operations + {{for data.usbfiles}} +
      {{:value.name}} + .{{:value.type}} + {{:value.size}}GQ + + {{:helper.link('DELETE', null, { "PRG_usbdeletefile" : value.name }, value.undeletable ? 'disabled' : null)}} + {{if data.usbconnected}} + {{:helper.link('IMPORT', null, { "PRG_copyfromusb" : value.name }, value.undeletable ? 'disabled' : null)}} + {{/if}} + {{/for}} +
      + {{/if}} + {{:helper.link('NEW DATA FILE', null, { "PRG_newtextfile" : 1 })}} + {{/if}} + +{{/if}} diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl index e783d9e3af4..9325723fae4 100644 --- a/nano/templates/identification_computer.tmpl +++ b/nano/templates/identification_computer.tmpl @@ -1,236 +1,191 @@ -{{if data.printing}} -
      The computer is currently busy.
      -
      -
      Printing...
      -
      -

      - Thank you for your patience! -

      +{{if data.have_id_slot}}{{:helper.link('Access Modification', 'home', {'action' : 'switchm', 'target' : 'mod'}, data.mmode ? 'disabled' : null)}}{{/if}} +{{:helper.link('Crew Manifest', 'folder-open', {'action' : 'switchm', 'target' : 'manifest'}, !data.mmode ? 'disabled' : null)}} +{{if data.have_printer}}{{:helper.link('Print', 'print', {'action' : 'print'}, (!data.mmode || data.has_id) ? null : 'disabled')}}{{/if}} + +{{if !data.mmode}} +
      +

      Crew Manifest

      +
      +
      + {{:data.manifest}} +
      {{else}} - {{:helper.link('Access Modification', 'home', {'choice' : 'mode', 'mode_target' : 0}, !data.mode ? 'disabled' : null)}} - {{:helper.link('Crew Manifest', 'folder-open', {'choice' : 'mode', 'mode_target' : 1}, data.mode ? 'disabled' : null)}} - {{:helper.link('Print', 'print', {'choice' : 'print'}, (data.mode || data.has_modify) ? null : 'disabled')}} +
      +

      Access Modification

      +
      - {{if data.mode}} -
      -

      Crew Manifest

      -
      -
      - {{:data.manifest}} -
      - {{else}} -
      -

      Access Modification

      -
      +{{if !data.has_id}} + Please insert the ID into the terminal to proceed.
      +{{/if}} - {{if !data.authenticated}} - Please insert the IDs into the terminal to proceed.
      - {{/if}} +
      +
      + Target Identity: +
      +
      + {{:helper.link(data.id_name, 'eject', {'action' : 'eject'})}} +
      +
      +
      -
      -
      - Target Identity: -
      -
      - {{:helper.link(data.target_name, 'eject', {'choice' : 'modify'})}} -
      -
      -
      -
      - Authorized Identity: -
      -
      - {{:helper.link(data.scan_name, 'eject', {'choice' : 'scan'})}} -
      -
      -
      +{{if data.authenticated}} + {{if data.has_id}} +
      +

      Details

      +
      - {{if data.authenticated}} - +
      +
      + Registered Name: +
      +
      + {{:helper.link(data.id_owner, 'pencil', {'action' : 'edit', 'name' : 1})}} +
      +
      - {{if data.has_modify}} -
      -

      Details

      -
      +
      +
      + Account Number: +
      +
      + {{:helper.link(data.id_account_number, 'pencil', {'action' : 'edit', 'account' : 1})}} +
      +
      + -
      -
      -
      - - - Registered Name: -
      -
      - - -
      -
      -
      +
      +
      + Terminations: +
      +
      + {{:helper.link('Terminate ' + data.id_owner, 'gear', {'action' : 'terminate'}, data.id_rank == "Terminated" ? 'disabled' : null, data.id_rank == "Terminated" ? 'disabled' : 'linkDanger')}} +
      +
      -
      -
      -
      - - - Account Number: -
      -
      - - -
      -
      -
      +
      +

      Assignment

      +
      + {{:helper.link(data.assignments ? "Hide assignments" : "Show assignments", 'gear', {'action' : 'togglea'})}} +
      + + + +
      +
      + {{if data.assignments}} +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{if data.centcom_access}} + + + + + {{/if}} +
      Command
      Special + {{:helper.link("Captain", '', {'action' : 'assign', 'assign_target' : 'Captain'}, data.id_rank == 'Captain' ? 'disabled' : null)}} + {{:helper.link("Custom", '', {'action' : 'assign', 'assign_target' : 'Custom'})}} +
      Engineering + {{for data.engineering_jobs}} + {{:helper.link(value.display_name, '', {'action' : 'assign', 'assign_target' : value.job}, data.id_rank == value.job ? 'disabled' : null)}} + {{/for}} +
      Medical + {{for data.medical_jobs}} + {{:helper.link(value.display_name, '', {'action' : 'assign', 'assign_target' : value.job}, data.id_rank == value.job ? 'disabled' : null)}} + {{/for}} +
      Science + {{for data.science_jobs}} + {{:helper.link(value.display_name, '', {'action' : 'assign', 'assign_target' : value.job}, data.id_rank == value.job ? 'disabled' : null)}} + {{/for}} +
      Security + {{for data.security_jobs}} + {{:helper.link(value.display_name, '', {'action' : 'assign', 'assign_target' : value.job}, data.id_rank == value.job ? 'disabled' : null)}} + {{/for}} +
      Cargo + {{for data.cargo_jobs}} + {{if index && index % 6 === 0}} +
      + {{/if}} + {{:helper.link(value.display_name, '', {'action' : 'assign', 'assign_target' : value.job}, data.id_rank == value.job ? 'disabled' : null)}} + {{/for}} +
      Civilian + {{for data.civilian_jobs}} + {{if index && index % 6 === 0}} +
      + {{/if}} + {{:helper.link(value.display_name, '', {'action' : 'assign', 'assign_target' : value.job}, data.id_rank == value.job ? 'disabled' : null)}} + {{/for}} +
      CentCom + {{for data.centcom_jobs}} + {{if index % 6 === 0}} +
      + {{/if}} -
      -
      - Terminations: -
      -
      - {{:helper.link('Terminate ' + data.target_owner, 'gear', {'choice' : 'terminate'}, data.target_rank == "Terminated" ? 'disabled' : null, data.target_rank == "Terminated" ? 'disabled' : 'linkDanger')}} -
      -
      + {{:helper.link(value.display_name, '', {'action' : 'assign', 'assign_target' : value.job}, data.id_rank == value.job ? 'disabled' : null)}} + {{/for}} +
      +
      + {{/if}} +
      -
      -

      Assignment

      -
      - - -
      - -
      - - {{if data.centcom_access}} -
      -

      Central Command

      -
      -
      - {{for data.all_centcom_access}} -
      - {{:helper.link(value.desc, '', {'choice' : 'access', 'access_target' : value.ref, 'allowed' : value.allowed}, null, value.allowed ? 'selected' : null)}} -
      - {{/for}} -
      - {{else}} -
      -

      {{:data.station_name}}

      -
      -
      - {{for data.regions}} -
      -
      {{:value.name}}
      - {{for value.accesses :accessValue:accessKey}} -
      - {{:helper.link(accessValue.desc, '', {'choice' : 'access', 'access_target' : accessValue.ref, 'allowed' : accessValue.allowed}, null, accessValue.allowed ? 'selected' : null)}} -
      - {{/for}} -
      - {{/for}} -
      - {{/if}} - {{/if}} - {{/if}} + {{if data.centcom_access}} +
      +

      Central Command

      +
      +
      + {{for data.all_centcom_access}} +
      + {{:helper.link(value.desc, '', {'action' : 'access', 'access_target' : value.ref, 'allowed' : value.allowed}, null, value.allowed ? 'selected' : null)}} +
      + {{/for}} +
      + {{else}} +
      +

      {{:data.station_name}}

      +
      +
      + {{for data.regions}} +
      +
      {{:value.name}}
      + {{for value.accesses :accessValue:accessKey}} +
      + {{:helper.link(accessValue.desc, '', {'action' : 'access', 'access_target' : accessValue.ref, 'allowed' : accessValue.allowed}, null, accessValue.allowed ? 'selected' : null)}} +
      + {{/for}} +
      + {{/for}} +
      + {{/if}} {{/if}} {{/if}} +{{/if}} \ No newline at end of file diff --git a/nano/templates/laptop_configuration.tmpl b/nano/templates/laptop_configuration.tmpl new file mode 100644 index 00000000000..69af3bd6c0f --- /dev/null +++ b/nano/templates/laptop_configuration.tmpl @@ -0,0 +1,70 @@ +Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.
      +

      Power Supply

      +
      + Battery Status: +
      +{{if data.battery_exists}} +
      + Active +
      +
      + Battery Rating: +
      +
      + {{:data.battery_rating}} +
      +
      + Battery Charge: +
      +
      + {{:helper.displayBar(data.battery_percent, 0, 100, (data.battery_percent <= 25) ? 'bad' : (data.battery_percent <= 50) ? 'average' : 'good')}} + {{:data.battery_percent}} % +
      +{{else}} +
      + Not Available +
      +{{/if}} +
      + Power Usage: +
      +
      + {{:data.power_usage}}W +
      +

      File System

      +
      + Used Capacity: +
      +
      + {{:helper.displayBar(data.disk_used, 0, data.disk_size, 'good')}} + {{:data.disk_used}}GQ / {{:data.disk_size}}GQ +
      +

      Computer Components

      +{{for data.hardware}} +

      {{:value.name}}

      + {{:value.desc}}
      +
      + State: +
      +
      + {{:value.enabled ? "Enabled" : "Disabled"}} +
      +
      + Power Usage: +
      +
      + {{:value.powerusage}}W +
      + {{if !value.critical}} +
      + Toggle Component: +
      +
      + {{:helper.link("ON", null, {'PC_enable_component' : value.name}, value.enabled ? 'disabled' : null)}} + {{:helper.link("OFF", null, {'PC_disable_component' : value.name}, value.enabled ? null : 'disabled')}} +
      + {{/if}} +

      +{{/for}} +

      +NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559 \ No newline at end of file diff --git a/nano/templates/laptop_mainscreen.tmpl b/nano/templates/laptop_mainscreen.tmpl new file mode 100644 index 00000000000..649d1d3b93a --- /dev/null +++ b/nano/templates/laptop_mainscreen.tmpl @@ -0,0 +1,6 @@ +No program loaded. Please select program from list below. + +{{for data.programs}} +
      {{:helper.link(value.desc, null, {'PC_runprogram' : value.name})}} +{{/for}} +
      \ No newline at end of file diff --git a/nano/templates/layout_default.tmpl b/nano/templates/layout_default.tmpl index ec3e225bb67..53701e30307 100644 --- a/nano/templates/layout_default.tmpl +++ b/nano/templates/layout_default.tmpl @@ -1,3 +1,40 @@ +{{if data.PC_hasheader}} +
      +
      + + {{if data.PC_batteryicon && data.PC_showbatteryicon}} +
      + {{/if}} + {{if data.PC_batterypercent && data.PC_showbatteryicon}} + {{:data.PC_batterypercent}} + {{/if}} + {{if data.PC_ntneticon}} + + {{/if}} + {{if data.PC_apclinkicon}} + + {{/if}} + {{if data.PC_stationtime}} + {{:data.PC_stationtime}} + {{/if}} + {{for data.PC_programheaders}} + + {{/for}} +
      +
      +
      +
      + +
      {{:helper.link('Shutdown', null, {'PC_shutdown' : 1})}} + {{if data.PC_showexitprogram}} + {{:helper.link('Exit Program', null, {'PC_exit' : 1})}} + {{:helper.link('Minimize Program', null, {'PC_minimize' : 1})}} + {{/if}} +
      +
      +
      +{{/if}} +
      {{:config.title}}